From a1f3604c9e8a94bad19e865bda0b1b48d8db1859 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Mon, 18 Jan 2016 19:07:09 +0000 Subject: Merged trunk revision 232535 into the hsa branch git-svn-id: https://gcc.gnu.org/svn/gcc/branches/hsa@232536 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 252 + gcc/DATESTAMP | 2 +- gcc/ada/ChangeLog | 96 + gcc/ada/adaint.c | 4 +- gcc/ada/gcc-interface/ada-tree.h | 16 +- gcc/ada/gcc-interface/cuintp.c | 8 +- gcc/ada/gcc-interface/decl.c | 51 +- gcc/ada/gcc-interface/gigi.h | 30 +- gcc/ada/gcc-interface/misc.c | 99 +- gcc/ada/gcc-interface/trans.c | 231 +- gcc/ada/gcc-interface/utils.c | 140 +- gcc/ada/gcc-interface/utils2.c | 99 +- gcc/c-family/ChangeLog | 19 +- gcc/c-family/c-common.c | 22 +- gcc/c-family/c-omp.c | 9 +- gcc/c-family/c-pragma.c | 5 +- gcc/config/aarch64/aarch64-builtins.c | 4 + gcc/config/aarch64/aarch64-simd-builtins.def | 46 +- gcc/config/aarch64/aarch64.c | 30 +- gcc/config/aarch64/arm_neon.h | 76 +- gcc/config/arm/arm.c | 13 +- gcc/config/i386/i386.c | 13 +- gcc/config/i386/i386.md | 17 + gcc/config/mips/mips.h | 7 +- gcc/cp/ChangeLog | 45 + gcc/cp/cp-array-notation.c | 4 +- gcc/cp/cp-gimplify.c | 137 +- gcc/cp/parser.c | 35 +- gcc/cp/parser.h | 3 +- gcc/cp/pt.c | 8 +- gcc/cp/tree.c | 6 +- gcc/diagnostic-show-locus.c | 3 +- gcc/doc/invoke.texi | 9356 ++++++++++---------- gcc/fold-const.c | 23 +- gcc/fortran/ChangeLog | 42 + gcc/fortran/resolve.c | 6 +- gcc/fortran/trans-array.c | 22 +- gcc/fortran/trans-decl.c | 46 +- gcc/fortran/trans-expr.c | 35 +- gcc/fortran/trans-stmt.c | 28 +- gcc/fortran/trans-types.c | 2 + gcc/fortran/trans.c | 12 +- gcc/gimple-ssa-strength-reduction.c | 12 +- gcc/gimple.c | 5 + gcc/haifa-sched.c | 4 +- gcc/hash-table.h | 10 +- gcc/lra-spills.c | 142 +- gcc/lto/ChangeLog | 11 + gcc/lto/lto-partition.c | 4 +- gcc/lto/lto-symtab.c | 3 + gcc/omp-low.c | 10 +- gcc/omp-low.h | 1 + gcc/passes.def | 8 +- gcc/testsuite/ChangeLog | 239 + gcc/testsuite/c-c++-common/cilk-plus/AN/an-if.c | 5 +- gcc/testsuite/c-c++-common/cilk-plus/AN/fn_ptr-2.c | 14 + gcc/testsuite/c-c++-common/cilk-plus/CK/pr60469.c | 5 +- .../c-c++-common/goacc/kernels-alias-ipa-pta-4.c | 21 + .../goacc/kernels-counter-vars-function-scope.c | 54 + .../goacc/kernels-double-reduction-n.c | 37 + .../c-c++-common/goacc/kernels-double-reduction.c | 37 + gcc/testsuite/c-c++-common/goacc/kernels-empty.c | 6 + gcc/testsuite/c-c++-common/goacc/kernels-eternal.c | 11 + gcc/testsuite/c-c++-common/goacc/kernels-loop-2.c | 70 + gcc/testsuite/c-c++-common/goacc/kernels-loop-3.c | 49 + gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c | 17 + .../c-c++-common/goacc/kernels-loop-mod-not-zero.c | 52 + gcc/testsuite/c-c++-common/goacc/kernels-loop-n.c | 56 + .../c-c++-common/goacc/kernels-loop-nest.c | 39 + gcc/testsuite/c-c++-common/goacc/kernels-loop.c | 56 + .../c-c++-common/goacc/kernels-noreturn.c | 12 + .../c-c++-common/goacc/kernels-one-counter-var.c | 54 + .../c-c++-common/goacc/kernels-reduction.c | 36 + gcc/testsuite/g++.dg/template/pr68936.C | 20 + gcc/testsuite/g++.dg/template/pr69091.C | 25 + gcc/testsuite/g++.dg/warn/Wnonnull2.C | 9 + gcc/testsuite/gcc.dg/autopar/outer-1.c | 4 +- gcc/testsuite/gcc.dg/autopar/outer-2.c | 4 +- gcc/testsuite/gcc.dg/autopar/outer-3.c | 4 +- gcc/testsuite/gcc.dg/autopar/outer-4.c | 6 +- gcc/testsuite/gcc.dg/autopar/outer-5.c | 4 +- gcc/testsuite/gcc.dg/autopar/outer-6.c | 6 +- gcc/testsuite/gcc.dg/autopar/parallelization-1.c | 4 +- .../autopar/parloops-exit-first-loop-alt-2.c | 21 + .../autopar/parloops-exit-first-loop-alt-3.c | 20 + .../autopar/parloops-exit-first-loop-alt-4.c | 22 + .../autopar/parloops-exit-first-loop-alt-5.c | 16 + .../autopar/parloops-exit-first-loop-alt-6.c | 16 + .../autopar/parloops-exit-first-loop-alt-7.c | 16 + .../autopar/parloops-exit-first-loop-alt-pr66652.c | 25 + .../gcc.dg/autopar/parloops-exit-first-loop-alt.c | 17 + gcc/testsuite/gcc.dg/autopar/pr39500-1.c | 4 +- gcc/testsuite/gcc.dg/autopar/pr39500-2.c | 4 +- gcc/testsuite/gcc.dg/autopar/pr46193.c | 4 +- gcc/testsuite/gcc.dg/autopar/pr46194.c | 4 +- gcc/testsuite/gcc.dg/autopar/pr49580.c | 4 +- gcc/testsuite/gcc.dg/autopar/pr49960-1.c | 4 +- gcc/testsuite/gcc.dg/autopar/pr49960.c | 4 +- gcc/testsuite/gcc.dg/autopar/pr68373.c | 4 +- gcc/testsuite/gcc.dg/autopar/reduc-1.c | 6 +- gcc/testsuite/gcc.dg/autopar/reduc-1char.c | 6 +- gcc/testsuite/gcc.dg/autopar/reduc-1short.c | 6 +- gcc/testsuite/gcc.dg/autopar/reduc-2.c | 6 +- gcc/testsuite/gcc.dg/autopar/reduc-2char.c | 10 +- gcc/testsuite/gcc.dg/autopar/reduc-2short.c | 10 +- gcc/testsuite/gcc.dg/autopar/reduc-3.c | 6 +- gcc/testsuite/gcc.dg/autopar/reduc-4.c | 2 +- gcc/testsuite/gcc.dg/autopar/reduc-6.c | 8 +- gcc/testsuite/gcc.dg/autopar/reduc-7.c | 6 +- gcc/testsuite/gcc.dg/autopar/reduc-8.c | 6 +- gcc/testsuite/gcc.dg/autopar/reduc-9.c | 6 +- gcc/testsuite/gcc.dg/autopar/uns-outer-4.c | 4 +- gcc/testsuite/gcc.dg/autopar/uns-outer-5.c | 4 +- gcc/testsuite/gcc.dg/autopar/uns-outer-6.c | 6 +- .../gcc.dg/parloops-exit-first-loop-alt-2.c | 22 - .../gcc.dg/parloops-exit-first-loop-alt-3.c | 21 - .../gcc.dg/parloops-exit-first-loop-alt-4.c | 23 - .../gcc.dg/parloops-exit-first-loop-alt-5.c | 17 - .../gcc.dg/parloops-exit-first-loop-alt-6.c | 17 - .../gcc.dg/parloops-exit-first-loop-alt-7.c | 17 - .../gcc.dg/parloops-exit-first-loop-alt-pr66652.c | 26 - .../gcc.dg/parloops-exit-first-loop-alt.c | 18 - gcc/testsuite/gcc.dg/pr69181-1.c | 7 + gcc/testsuite/gcc.dg/pr69181-2.c | 4 + gcc/testsuite/gcc.dg/torture/builtin-integral-1.c | 2 + gcc/testsuite/gcc.dg/torture/pr69170.c | 18 + gcc/testsuite/gcc.dg/tree-ssa/pr65447.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/pr69270-2.c | 52 + gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c | 26 + gcc/testsuite/gcc.dg/tree-ssa/sra-17.c | 19 + gcc/testsuite/gcc.dg/tree-ssa/sra-18.c | 28 + gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-2.c | 9 +- gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-5.c | 18 + gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-6.c | 20 + gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-7.c | 21 + .../vect/costmodel/x86_64/costmodel-pr69297.c | 83 + gcc/testsuite/gcc.target/aarch64/target_attr_17.c | 8 + gcc/testsuite/gcc.target/i386/pr65105-5.c | 2 +- gcc/testsuite/gcc.target/i386/pr69030.c | 28 + gcc/testsuite/gcc.target/mips/mips-3d-1.c | 2 +- gcc/testsuite/gcc.target/mips/mips-3d-2.c | 2 +- gcc/testsuite/gcc.target/mips/mips-3d-3.c | 2 +- gcc/testsuite/gcc.target/mips/mips-3d-4.c | 2 +- gcc/testsuite/gcc.target/mips/mips-3d-5.c | 2 +- gcc/testsuite/gcc.target/mips/mips-3d-6.c | 2 +- gcc/testsuite/gcc.target/mips/mips-3d-7.c | 2 +- gcc/testsuite/gcc.target/mips/mips-3d-8.c | 2 +- gcc/testsuite/gcc.target/mips/mips-3d-9.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-1.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-2.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-3.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-4.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-5.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-6.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-7.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-type-2.c | 2 +- gcc/testsuite/gcc.target/mips/mips-ps-type.c | 2 +- .../gcc.target/mips/mips16-attributes-6.c | 2 +- gcc/testsuite/gcc.target/powerpc/recip-1.c | 4 +- gcc/testsuite/gcc.target/powerpc/recip-2.c | 5 +- gcc/testsuite/gcc.target/powerpc/recip-3.c | 6 +- gcc/testsuite/gcc.target/powerpc/recip-4.c | 6 +- gcc/testsuite/gcc.target/powerpc/recip-6.c | 2 +- gcc/testsuite/gcc.target/powerpc/recip-7.c | 2 +- gcc/testsuite/gcc.target/powerpc/recip-sqrtf.c | 2 +- gcc/testsuite/gfortran.dg/allocate_error_5.f90 | 23 + .../gfortran.dg/deferred_character_10.f90 | 52 + .../gfortran.dg/deferred_character_11.f90 | 39 + .../gfortran.dg/deferred_character_12.f90 | 37 + .../gfortran.dg/deferred_character_13.f90 | 34 + .../gfortran.dg/deferred_character_14.f90 | 30 + gcc/testsuite/gfortran.dg/deferred_character_8.f90 | 84 + gcc/testsuite/gfortran.dg/deferred_character_9.f90 | 28 + .../gfortran.dg/parloops-exit-first-loop-alt-2.f95 | 4 +- .../gfortran.dg/parloops-exit-first-loop-alt.f95 | 4 +- gcc/testsuite/gnat.dg/inline12.adb | 23 + gcc/testsuite/lib/gcc-dg.exp | 36 +- gcc/testsuite/lib/multiline.exp | 22 +- gcc/tree-cfg.c | 27 +- gcc/tree-parloops.c | 772 +- gcc/tree-scalar-evolution.c | 50 +- gcc/tree-sra.c | 104 +- gcc/tree-ssa-dom.c | 33 - gcc/tree-ssa-scopedtables.c | 67 +- gcc/tree-ssa-uncprop.c | 21 +- gcc/tree-ssanames.c | 34 + gcc/tree-ssanames.h | 1 + gcc/tree-vect-slp.c | 24 +- gcc/tree-vrp.c | 5 +- libgfortran/ChangeLog | 5 + libgfortran/intrinsics/execute_command_line.c | 4 +- libgomp/ChangeLog | 31 + libgomp/task.c | 1 + .../libgomp.oacc-c-c++-common/kernels-loop-2.c | 47 + .../libgomp.oacc-c-c++-common/kernels-loop-3.c | 34 + .../kernels-loop-and-seq-2.c | 36 + .../kernels-loop-and-seq-3.c | 37 + .../kernels-loop-and-seq-4.c | 36 + .../kernels-loop-and-seq-5.c | 37 + .../kernels-loop-and-seq-6.c | 36 + .../kernels-loop-and-seq.c | 37 + .../kernels-loop-collapse.c | 40 + .../libgomp.oacc-c-c++-common/kernels-loop-g.c | 5 + .../kernels-loop-mod-not-zero.c | 41 + .../libgomp.oacc-c-c++-common/kernels-loop-n.c | 47 + .../libgomp.oacc-c-c++-common/kernels-loop-nest.c | 26 + .../libgomp.oacc-c-c++-common/kernels-loop.c | 41 + .../libgomp.oacc-c-c++-common/kernels-reduction.c | 37 + libitm/ChangeLog | 11 + libitm/method-gl.cc | 16 +- libitm/method-ml.cc | 15 + libitm/testsuite/libitm.c++/libstdc++-safeexc.C | 89 + libitm/testsuite/libitm.c/priv-1.c | 116 + libstdc++-v3/ChangeLog | 73 + libstdc++-v3/acinclude.m4 | 38 +- libstdc++-v3/config.h.in | 3 + .../abi/post/hppa-linux-gnu/baseline_symbols.txt | 1567 ++++ .../post/x86_64-linux-gnu/x32/baseline_symbols.txt | 6 + libstdc++-v3/config/abi/pre/gnu.ver | 41 + libstdc++-v3/configure | 135 +- libstdc++-v3/configure.ac | 3 + libstdc++-v3/include/Makefile.am | 13 +- libstdc++-v3/include/Makefile.in | 10 +- libstdc++-v3/include/bits/basic_string.h | 12 + libstdc++-v3/include/bits/c++config | 16 + libstdc++-v3/include/bits/uses_allocator.h | 7 +- libstdc++-v3/include/ext/random.tcc | 2 +- libstdc++-v3/include/std/functional | 8 +- libstdc++-v3/include/std/stdexcept | 54 +- libstdc++-v3/libsupc++/eh_exception.cc | 44 +- libstdc++-v3/libsupc++/exception | 10 +- libstdc++-v3/src/c++11/cow-stdexcept.cc | 290 + .../testsuite/20_util/function/cons/57465.cc | 24 +- .../20_util/scoped_allocator/69293_neg.cc | 51 + .../testsuite/20_util/uses_allocator/69293_neg.cc | 49 + .../testsuite/20_util/uses_allocator/cons_neg.cc | 2 +- .../testsuite/26_numerics/headers/cmath/60637.cc | 35 + libstdc++-v3/testsuite/util/testsuite_abi.cc | 3 +- 238 files changed, 12066 insertions(+), 5927 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/cilk-plus/AN/fn_ptr-2.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-alias-ipa-pta-4.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-counter-vars-function-scope.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-double-reduction-n.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-double-reduction.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-empty.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-eternal.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop-2.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop-3.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop-mod-not-zero.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop-n.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop-nest.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-loop.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-noreturn.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-one-counter-var.c create mode 100644 gcc/testsuite/c-c++-common/goacc/kernels-reduction.c create mode 100644 gcc/testsuite/g++.dg/template/pr68936.C create mode 100644 gcc/testsuite/g++.dg/template/pr69091.C create mode 100644 gcc/testsuite/g++.dg/warn/Wnonnull2.C create mode 100644 gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-2.c create mode 100644 gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-3.c create mode 100644 gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-4.c create mode 100644 gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-5.c create mode 100644 gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-6.c create mode 100644 gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-7.c create mode 100644 gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-pr66652.c create mode 100644 gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt.c delete mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-2.c delete mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c delete mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-4.c delete mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-5.c delete mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-6.c delete mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-7.c delete mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c delete mode 100644 gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt.c create mode 100644 gcc/testsuite/gcc.dg/pr69181-1.c create mode 100644 gcc/testsuite/gcc.dg/pr69181-2.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr69170.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr69270-2.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sra-17.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/sra-18.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-5.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-6.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-7.c create mode 100644 gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr69297.c create mode 100644 gcc/testsuite/gcc.target/aarch64/target_attr_17.c create mode 100644 gcc/testsuite/gcc.target/i386/pr69030.c create mode 100644 gcc/testsuite/gfortran.dg/allocate_error_5.f90 create mode 100644 gcc/testsuite/gfortran.dg/deferred_character_10.f90 create mode 100644 gcc/testsuite/gfortran.dg/deferred_character_11.f90 create mode 100644 gcc/testsuite/gfortran.dg/deferred_character_12.f90 create mode 100644 gcc/testsuite/gfortran.dg/deferred_character_13.f90 create mode 100644 gcc/testsuite/gfortran.dg/deferred_character_14.f90 create mode 100644 gcc/testsuite/gfortran.dg/deferred_character_8.f90 create mode 100644 gcc/testsuite/gfortran.dg/deferred_character_9.f90 create mode 100644 gcc/testsuite/gnat.dg/inline12.adb create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-2.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-3.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-2.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-3.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-4.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-5.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-6.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-collapse.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-g.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-mod-not-zero.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-n.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-nest.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop.c create mode 100644 libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-reduction.c create mode 100644 libitm/testsuite/libitm.c++/libstdc++-safeexc.C create mode 100644 libitm/testsuite/libitm.c/priv-1.c create mode 100644 libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc create mode 100644 libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc create mode 100644 libstdc++-v3/testsuite/26_numerics/headers/cmath/60637.cc diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 609b135dbb5..10ad8352397 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,255 @@ +2016-01-18 Richard Biener + + PR tree-optimization/69297 + * tree-vect-slp.c (vect_bb_slp_scalar_cost): Count each scalar + stmt at most once. + (vect_bb_vectorization_profitable_p): Clear visited flag again. + +2016-01-18 Yuri Rumyantsev + + PR middle-end/68542 + * fold-const.c (fold_binary_op_with_conditional_arg): Bail out for case + of mixind vector and scalar types. + (fold_relational_const): Add handling of vector + comparison with boolean result. + * tree-cfg.c (verify_gimple_comparison): Add argument CODE, allow + comparison of vector operands with boolean result for EQ/NE only. + (verify_gimple_assign_binary): Adjust call for verify_gimple_comparison. + (verify_gimple_cond): Likewise. + * tree-vrp.c (extract_code_and_val_from_cond_with_ops): Modify check on + valid type of VAL. + +2016-01-18 Joseph Myers + + * config/mips/mips.h (ISA_HAS_PAIRED_SINGLE): Require + !TARGET_OCTEON. + +2016-01-18 Richard Biener + + PR middle-end/69308 + * gimple.c (gimple_could_trap_p_1): Handle GIMPLE_COND. + +2016-01-18 Tom de Vries + + * passes.def: Add pass_parallelize_loops to pass_oacc_kernels. + +2016-01-18 Tom de Vries + + * omp-low.c (set_oacc_fn_attrib): Make extern. + * omp-low.h (set_oacc_fn_attrib): Declare. + * tree-parloops.c (struct reduction_info): Add reduc_addr field. + (create_call_for_reduction_1): Handle case that reduc_addr is non-NULL. + (create_parallel_loop, gen_parallel_loop, try_create_reduction_list): + Add and handle function parameter oacc_kernels_p. + (find_reduc_addr, get_omp_data_i_param): New function. + (ref_conflicts_with_region, oacc_entry_exit_ok_1) + (oacc_entry_exit_single_gang, oacc_entry_exit_ok): New function. + (parallelize_loops): Add and handle function parameter oacc_kernels_p. + Calculate dominance info. Skip loops that are not in a kernels region + in oacc_kernels_p mode. Skip inner loops of parallelized loops. + (pass_parallelize_loops::execute): Call parallelize_loops with + oacc_kernels_p argument. + (pass_parallelize_loops::clone, pass_parallelize_loops::set_pass_param): + New member function. + (pass_parallelize_loops::bool oacc_kernels_p): New member var. + * passes.def: Add argument to pass_parallelize_loops instantation. + +2016-01-18 Tom de Vries + + * tree-parloops.c (pass_parallelize_loops::execute): Allow + pass_parallelize_loops to be run outside the loop pipeline. + +2016-01-18 Alan Lawrence + + * tree-scalar-evolution.c (follow_copies_to_constant): New. + (analyze_initial_condition, analyze_scalar_evolution_1): Call previous. + +2016-01-18 Alan Lawrence + + PR target/63679 + * tree-ssa-scopedtables.c (avail_expr_hash): Hash MEM_REF and ARRAY_REF + using get_ref_base_and_extent. + (equal_mem_array_ref_p): New. + (hashable_expr_equal_p): Add call to previous. + +2016-01-18 Alan Lawrence + + PR target/63679 + * tree-sra.c (disqualified_constants, constant_decl_p): New. + (sra_initialize): Allocate disqualified_constants. + (sra_deinitialize): Free disqualified_constants. + (disqualify_candidate): Update disqualified_constants when appropriate. + (create_access): Scan for constant-pool entries as we go along. + (scalarizable_type_p): Add check against type_contains_placeholder_p. + (maybe_add_sra_candidate): Allow constant-pool entries. + (load_assign_lhs_subreplacements): Bind debug for constant pool vars. + (initialize_constant_pool_replacements): New. + (sra_modify_assign): Avoid mangling assignments created by previous, + and don't generate writes into constant pool. + (sra_modify_function_body): Call initialize_constant_pool_replacements. + +2016-01-18 Ilya Enkovich + + * config/i386/i386.c (scalar_to_vector_candidate_p): Support + andnot instruction. + (scalar_chain::convert_op): Likewise. + * config/i386/i386.md (*andndi3_doubleword): New. + +2016-01-18 Richard Biener + + PR tree-optimization/69170 + * tree-vect-slp.c (vect_build_slp_tree): Verify we are not + building a vector from scalar results of a pattern stmt. + +2016-01-18 Jakub Jelinek + + * haifa-sched.c (autopref_multipass_init): Work around + -Wmaybe-uninitialized warning. + +2016-01-18 Thomas Preud'homme + + * config/arm/arm.c (thumb1_reorg): Check that the comparison is + against the constant 0. + +2016-01-17 Bill Schmidt + + PR tree-optimization/68799 + * gimple-ssa-strength-reduction.c (create_phi_basis): Directly + look up phi candidates in the statement-candidate map. + (phi_add_costs): Likewise. + (record_phi_increments): Likewise. + (phi_incr_cost): Likewise. + (ncd_with_phi): Likewise. + (all_phi_incrs_profitable): Likewise. + +2016-01-17 Jakub Jelinek + + * omp-low.c (mark_loops_in_oacc_kernels_region): Work around + -Wmaybe-uninitialized warning. + +2016-01-16 Sandra Loosemore + + * doc/invoke.texi (Invoking GCC): Add new section to menu. + (Option Summary): Update to reflect new section and moved options. + (C++ Dialect Options): Move -fvtable-verify and related options. + (Debugging Options): Move Sanitizer, Pointer Bounds Checker, + and profiling-related options. + (Optimization Options): Move profile generation options and + -fstack-protector and related options. + (Instrumentation Options): New section incorporating moved options. + (Code Generation Options): Move -finstrument-functions and + related options, -fstack-check, -fstack-limit*, and -fbounds-check. + +2016-01-16 Tom de Vries + + * passes.def: Move pass_expand_omp_ssa out of pass_parallelize_loops. + +2016-01-16 Tom de Vries + + * omp-low.c (expand_omp_atomic_fetch_op): Release defs of update stmt. + +2016-01-16 Richard Sandiford + + * hash-table.h (hash_table::empty): Turn into an inline wrapper + that checks whether the table is already empty. Rename the + original implementation to... + (hash_table::empty_slot): ...this new private function. + +2016-01-15 David Malcolm + + PR diagnostic/68899 + * diagnostic-show-locus.c (layout::print_source_line): Move x + offset of line until after call to + get_line_width_without_trailing_whitespace. + +2016-01-15 Jeff Law + + PR tree-optimization/69270 + * tree-ssanames.c (ssa_name_has_boolean_range): Moved here from + tree-ssa-dom.c. Improve test for [0..1] ranve from VRP. + * tree-ssa-dom.c (ssa_name_has_boolean_range): Remove. + * tree-ssanames.h (ssa_name_has_boolean_range): Prototype. + * tree-ssa-uncprop.c (associate_equivalences_with_edges): Use + ssa_name_has_boolean_range and constant_boolean_node. + +2016-01-15 Vladimir Makarov + + PR rtl-optimization/69030 + * lra-spills.c (remove_pseudos): Check nrefs and make the function + returning bool. + (spill_pseudos): Delete debug insn for dead pseudo. + (lra_spill): Initiate spill_hard_reg and slots memory separately. + +2016-01-15 Jiong Wang + + * config/aarch64/aarch64-builtins.c (aarch64_types_unopus_qualifiers): + New. + (TYPES_UNOPUS): Likewise. + * config/aarch64/aarch64-simd-builtins.def (lbtruncuv2sf): Correct + builtin type, from UNOP to UNOPUS. + (lbtruncuv4sf): Likewise. + (lbtruncuv2df): Likewise. + (lrounduv2sf): Likewise. + (lrounduv4sf): Likewise. + (lrounduv2df): Likewise. + (lroundusf): Likewise. + (lroundusf): Likewise. + (lceiluv2sf): Likewise. + (lceiluv4sf): Likewise. + (lceiluv2df): Likewise. + (lceilusf): Likewise. + (lceiludf): Likewise. + (lflooruv2sf): Likewise. + (lflooruv4sf): Likewise. + (lflooruv2df): Likewise. + (lfloorusf): Likewise. + (lfloorudf): Likewise. + (lfrintnuv2sf): Likewise. + (lfrintnuv4sf): Likewise. + (lfrintnuv2df): Likewise. + (lfrintnusf): Likewise. + (lfrintnudf): Likewise. + * config/aarch64/arm_neon.h (vcvt_u32_f32): Remove unncessary type + conversion. + (vcvtq_u32_f32): Likewise. + (vcvtq_u64_f64): Likewise. + (vcvta_u32_f32): Likewise. + (vcvtaq_u32_f32): Likewise. + (vcvtaq_u64_f64): Likewise. + (vcvtm_u32_f32): Likewise. + (vcvtmq_u32_f32): Likewise. + (vcvtmq_u64_f64): Likewise. + (vcvtn_u32_f32): Likwise. + (vcvtnq_u32_f32): Likewise. + (vcvtnq_u64_f64): Likewise. + (vcvtp_u32_f32): Likewise. + (vcvtpq_u32_f32): Likewise. + (vcvtpq_u64_f64): Likewise. + (vcvtmd_u64_f64): Likewise. + (vcvtms_u32_f32): Likewise. + (vcvtad_u64_f64): Likewise. + (vcvtas_u32_f32): Likewise. + (vcvtnd_u64_f64): Likewise. + (vcvtns_u32_f32): Likewise. + (vcvtpd_u64_f64): Likewise. + (vcvtps_u32_f32): Likewise. + +2016-01-15 Kyrylo Tkachov + + * config/aarch64/aarch64.c (aarch64_if_then_else_costs): Handle + CSEL of zero_extended registers. + +2016-01-15 Kyrylo Tkachov + + * config/aarch64/aarch64.c (aarch64_rtx_costs, COMPARE case): + Handle COMPARE of ZERO_EXTRACT against zero form of TST-immediate. + +2016-01-15 Kyrylo Tkachov + + * config/aarch64/aarch64.c (aarch64_process_one_target_attr): Return + false when argument string is not found in the attributes table + at all. + 2016-01-15 David Edelsohn PR target/68609 diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index e2bfc1c7114..a2a340da9d6 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20160115 +20160118 diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index f2b46b35db7..64e4c711145 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,99 @@ +2016-01-18 Eric Botcazou + + * gcc-interface/gigi.h (build_call_raise_column): Adjust prototype. + (build_call_raise_range): Likewise. + (gnat_unsigned_type): Delete. + (gnat_signed_type): Likewise. + (gnat_signed_or_unsigned_type_for): New prototype. + (gnat_unsigned_type_for): New inline function. + (gnat_signed_type_for): Likewise. + * gcc-interface/cuintp.c (build_cst_from_int): Call build_int_cst. + * gcc-interface/decl.c (gnat_to_gnu_entity): Likewise. + (gnat_to_gnu_entity) : Always translate the index types + and compute their base type from that. + : Remove duplicate declaration. + * gcc-interface/misc.c (get_array_bit_stride): Call build_int_cst. + * gcc-interface/trans.c (get_type_length): Likewise. + (Attribute_to_gnu): Likewise. + (Loop_Statement_to_gnu): Likewise. + (Call_to_gnu): Likewise. + (gnat_to_gnu): Call build_real, build_int_cst, gnat_unsigned_type_for + and gnat_signed_type_for. Minor tweaks. + (build_binary_op_trapv): Likewise. + (emit_check): Likewise. + (convert_with_check): Likewise. + (Raise_Error_to_gnu): Adjust calls to the build_call_raise family of + functions. Minor tweaks. + (Case_Statement_to_gnu): Remove dead code. + (gnat_to_gnu): Call gnat_unsigned_type_for and gnat_signed_type_for. + (init_code_table): Minor reordering. + * gcc-interface/utils.c (gnat_unsigned_type): Delete. + (gnat_signed_type): Likewise. + (gnat_signed_or_unsigned_type_for): New function. + (unchecked_convert): Use directly the size in the test for precision + vs size adjustments. + (install_builtin_elementary_types): Call gnat_signed_type_for. + * gcc-interface/utils2.c (nonbinary_modular_operation): Call + build_int_cst. + (build_goto_raise): New function taken from... + (build_call_raise): ...here. Call it. + (build_call_raise_column): Add KIND parameter and call it. + (build_call_raise_range): Likewise. + +2016-01-18 Eric Botcazou + + * gcc-interface/ada-tree.h (TYPE_IMPLEMENTS_PACKED_ARRAY_P): Rename to + (TYPE_IMPL_PACKED_ARRAY_P): ...this. + (TYPE_CAN_HAVE_DEBUG_TYPE_P): Do not test TYPE_DEBUG_TYPE. + * gcc-interface/decl.c (gnat_to_gnu_entity): Simplify NULL_TREE tests + and tweak gnat_encodings tests throughout. + (initial_value_needs_conversion): Likewise. + (intrin_arglists_compatible_p): Likewise. + * gcc-interface/misc.c (gnat_print_type): Likewise. + (gnat_get_debug_type): Likewise. + (gnat_get_fixed_point_type_info): Likewise. + (gnat_get_array_descr_info): Likewise. + (get_array_bit_stride): Likewise. + (gnat_get_type_bias): Fix formatting. + (enumerate_modes): Likewise. + * gcc-interface/trans.c (gnat_to_gnu): Likewise. + (add_decl_expr): Simplify NULL_TREE test. + (end_stmt_group): Likewise. + (build_binary_op_trapv): Fix formatting. + (get_exception_label): Use switch statement. + (init_code_table): Move around. + * gcc-interface/utils.c (global_bindings_p): Simplify NULL_TREE test. + (gnat_poplevel): Likewise. + (gnat_set_type_context): Likewise. + (defer_or_set_type_context): Fix formatting. + (gnat_pushdecl): Simplify NULL_TREE test. + (maybe_pad_type): Likewise. + (add_parallel_type): Likewise. + (create_range_type): Likewise. + (process_deferred_decl_context): Likewise. + (convert): Likewise. + (def_builtin_1): Likewise. + * gcc-interface/utils2.c (find_common_type): Likewise. + (build_binary_op): Likewise. + (gnat_rewrite_reference): Likewise. + (get_inner_constant_reference): Likewise. + +2016-01-18 Eric Botcazou + + PR ada/69219 + * gcc-interface/trans.c (check_inlining_for_nested_subprog): Consider + the parent function instead of the current function in order to issue + the warning or the error. Add guard for ignored functions. + +2016-01-17 Jakub Jelinek + + * adaint.c (__gnat_killprocesstree): Avoid -Wparentheses warning. + +2016-01-15 Jakub Jelinek + + * adaint.c (__gnat_locate_exec_on_path): Use const char * instead + of char * for path_val to avoid warnings. + 2016-01-06 Pierre-Marie de Rodat * gcc-interface/utils.c: Bump copyright year. diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 5a0bdd951df..3053c69f504 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -2791,7 +2791,7 @@ __gnat_locate_exec_on_path (char *exec_name) WS2SC (apath_val, wapath_val, EXPAND_BUFFER_SIZE); #else - char *path_val = getenv ("PATH"); + const char *path_val = getenv ("PATH"); /* If PATH is not defined, proceed with __gnat_locate_exec anyway, so we can find files that contain directory names. */ @@ -3281,7 +3281,7 @@ void __gnat_killprocesstree (int pid, int sig_num) /* kill child processes first */ - while (d = readdir (dir)) + while ((d = readdir (dir)) != NULL) { if ((d->d_type & DT_DIR) == DT_DIR) { diff --git a/gcc/ada/gcc-interface/ada-tree.h b/gcc/ada/gcc-interface/ada-tree.h index 715fbadc968..ceabd175ae4 100644 --- a/gcc/ada/gcc-interface/ada-tree.h +++ b/gcc/ada/gcc-interface/ada-tree.h @@ -6,7 +6,7 @@ * * * C Header File * * * - * Copyright (C) 1992-2015, Free Software Foundation, Inc. * + * Copyright (C) 1992-2016, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -189,14 +189,12 @@ do { \ /* True for types that implement a packed array and for original packed array types. */ -#define TYPE_IMPLEMENTS_PACKED_ARRAY_P(NODE) \ - ((TREE_CODE (NODE) == ARRAY_TYPE && TYPE_PACKED (NODE)) \ - || (TREE_CODE (NODE) == INTEGER_TYPE && TYPE_PACKED_ARRAY_TYPE_P (NODE))) \ +#define TYPE_IMPL_PACKED_ARRAY_P(NODE) \ + ((TREE_CODE (NODE) == ARRAY_TYPE && TYPE_PACKED (NODE)) \ + || (TREE_CODE (NODE) == INTEGER_TYPE && TYPE_PACKED_ARRAY_TYPE_P (NODE))) /* True for types that can hold a debug type. */ -#define TYPE_CAN_HAVE_DEBUG_TYPE_P(NODE) \ - (!TYPE_IMPLEMENTS_PACKED_ARRAY_P (NODE) \ - && TYPE_DEBUG_TYPE (NODE) != NULL_TREE) +#define TYPE_CAN_HAVE_DEBUG_TYPE_P(NODE) (!TYPE_IMPL_PACKED_ARRAY_P (NODE)) /* For an UNCONSTRAINED_ARRAY_TYPE, this is the record containing both the template and the object. @@ -385,8 +383,8 @@ do { \ #define SET_TYPE_DEBUG_TYPE(NODE, X) \ SET_TYPE_LANG_SPECIFIC2 (NODE, X) -/* For types with TYPE_IMPLEMENTS_PACKED_ARRAY_P, this is the original packed - array type. Note that this predicate is trou for original packed array +/* For types with TYPE_IMPL_PACKED_ARRAY_P, this is the original packed + array type. Note that this predicate is true for original packed array types, so these cannot have a debug type. */ #define TYPE_ORIGINAL_PACKED_ARRAY(NODE) \ GET_TYPE_LANG_SPECIFIC2 (NODE) diff --git a/gcc/ada/gcc-interface/cuintp.c b/gcc/ada/gcc-interface/cuintp.c index 347658e0e4e..a22662e8af4 100644 --- a/gcc/ada/gcc-interface/cuintp.c +++ b/gcc/ada/gcc-interface/cuintp.c @@ -6,7 +6,7 @@ * * * C Implementation File * * * - * Copyright (C) 1992-2015, Free Software Foundation, Inc. * + * Copyright (C) 1992-2016, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -52,8 +52,8 @@ the integer value itself. The origin of the Uints_Ptr table is adjusted so that a Uint value of Uint_Bias indexes the first element. - First define a utility function that operates like build_int_cst_type for - integral types and does a conversion for floating-point types. */ + First define a utility function that is build_int_cst for integral types and + does a conversion for floating-point types. */ static tree build_cst_from_int (tree type, HOST_WIDE_INT low) @@ -61,7 +61,7 @@ build_cst_from_int (tree type, HOST_WIDE_INT low) if (SCALAR_FLOAT_TYPE_P (type)) return convert (type, build_int_cst (gnat_type_for_size (32, 0), low)); else - return build_int_cst_type (type, low); + return build_int_cst (type, low); } /* Similar to UI_To_Int, but return a GCC INTEGER_CST or REAL_CST node, diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 0b1cd6f18bf..556f079690d 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -6,7 +6,7 @@ * * * C Implementation File * * * - * Copyright (C) 1992-2015, Free Software Foundation, Inc. * + * Copyright (C) 1992-2016, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -1002,7 +1002,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) /* We cannot evaluate the first arm of a COMPOUND_EXPR in the correct place for this case, hence the above test. */ - gcc_assert (init == NULL_TREE); + gcc_assert (!init); /* No DECL_EXPR will be created so the expression needs to be marked manually because it will likely be shared. */ @@ -1716,7 +1716,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) TYPE_MODULAR_P (gnu_type) = 1; SET_TYPE_MODULUS (gnu_type, gnu_modulus); gnu_high = fold_build2 (MINUS_EXPR, gnu_type, gnu_modulus, - convert (gnu_type, integer_one_node)); + build_int_cst (gnu_type, 1)); } /* If the upper bound is not maximal, make an extra subtype. */ @@ -2113,8 +2113,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) gnat_index = Next_Index (gnat_index)) { char field_name[16]; - tree gnu_index_base_type - = get_unpadded_type (Base_Type (Etype (gnat_index))); + tree gnu_index_type = get_unpadded_type (Etype (gnat_index)); + tree gnu_index_base_type = get_base_type (gnu_index_type); tree gnu_lb_field, gnu_hb_field, gnu_orig_min, gnu_orig_max; tree gnu_min, gnu_max, gnu_high; @@ -2173,7 +2173,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) /* Update the maximum size of the array in elements. */ if (gnu_max_size) { - tree gnu_index_type = get_unpadded_type (Etype (gnat_index)); tree gnu_min = convert (sizetype, TYPE_MIN_VALUE (gnu_index_type)); tree gnu_max @@ -2495,8 +2494,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) { tree gnu_base_min = convert (sizetype, gnu_base_orig_min); tree gnu_base_max = convert (sizetype, gnu_base_orig_max); - tree gnu_base_index_base_type - = get_base_type (gnu_base_index_type); tree gnu_base_base_min = convert (sizetype, TYPE_MIN_VALUE (gnu_base_index_base_type)); @@ -2551,14 +2548,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) types, are biased or are wider than sizetype. These are GNAT encodings, so we have to include them only when all encodings are requested. */ - if (gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL - && (TREE_CODE (gnu_orig_min) != INTEGER_CST - || TREE_CODE (gnu_orig_max) != INTEGER_CST - || TREE_CODE (gnu_index_type) != INTEGER_TYPE - || (TREE_TYPE (gnu_index_type) - && TREE_CODE (TREE_TYPE (gnu_index_type)) - != INTEGER_TYPE) - || TYPE_BIASED_REPRESENTATION_P (gnu_index_type))) + if ((TREE_CODE (gnu_orig_min) != INTEGER_CST + || TREE_CODE (gnu_orig_max) != INTEGER_CST + || TREE_CODE (gnu_index_type) != INTEGER_TYPE + || (TREE_TYPE (gnu_index_type) + && TREE_CODE (TREE_TYPE (gnu_index_type)) + != INTEGER_TYPE) + || TYPE_BIASED_REPRESENTATION_P (gnu_index_type)) + && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL) need_index_type_struct = true; } @@ -2621,8 +2618,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) } /* Strip the ___XP suffix for standard DWARF. */ - if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL - && Is_Packed_Array_Impl_Type (gnat_entity)) + if (Is_Packed_Array_Impl_Type (gnat_entity) + && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL) { Entity_Id gnat_original_array_type = Underlying_Type (Original_Array_Type (gnat_entity)); @@ -2717,8 +2714,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) { tree gnu_base_decl = gnat_to_gnu_entity (Etype (gnat_entity), NULL_TREE, 0); - if (gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL - && !DECL_ARTIFICIAL (gnu_base_decl)) + if (!DECL_ARTIFICIAL (gnu_base_decl) + && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL) add_parallel_type (gnu_type, TREE_TYPE (TREE_TYPE (gnu_base_decl))); } @@ -4279,7 +4276,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) && Present (gnat_renamed) && (Ekind (gnat_renamed) == E_Function || Ekind (gnat_renamed) == E_Procedure) - && gnu_decl != NULL_TREE + && gnu_decl && TREE_CODE (gnu_decl) == FUNCTION_DECL) { tree decl = build_decl (input_location, IMPORTED_DECL, @@ -4306,7 +4303,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) to let developers be notified on demand without risking false positives with common default sets of options. */ - if (gnu_builtin_decl == NULL_TREE && warn_shadow) + if (!gnu_builtin_decl && warn_shadow) post_error ("?gcc intrinsic not found for&!", gnat_entity); } @@ -6171,8 +6168,8 @@ initial_value_needs_conversion (tree gnu_type, tree gnu_expr) without one, to keep the object simpler. */ if (TREE_CODE (gnu_type) == RECORD_TYPE && TREE_CODE (TREE_TYPE (gnu_expr)) == RECORD_TYPE - && get_variant_part (gnu_type) != NULL_TREE - && get_variant_part (TREE_TYPE (gnu_expr)) == NULL_TREE) + && get_variant_part (gnu_type) + && !get_variant_part (TREE_TYPE (gnu_expr))) return false; /* In all the other cases, convert the expression to the object's type. */ @@ -8527,17 +8524,17 @@ intrin_arglists_compatible_p (intrin_binding_t * inb) /* Sequence position of the last argument we checked. */ int argpos = 0; - while (1) + while (true) { tree ada_type = function_args_iter_cond (&ada_iter); tree btin_type = function_args_iter_cond (&btin_iter); /* If we've exhausted both lists simultaneously, we're done. */ - if (ada_type == NULL_TREE && btin_type == NULL_TREE) + if (!ada_type && !btin_type) break; /* If one list is shorter than the other, they fail to match. */ - if (ada_type == NULL_TREE || btin_type == NULL_TREE) + if (!ada_type || !btin_type) return false; /* If we're done with the Ada args and not with the internal builtin diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h index cef9341ccb6..cd3d5b6ed7c 100644 --- a/gcc/ada/gcc-interface/gigi.h +++ b/gcc/ada/gcc-interface/gigi.h @@ -6,7 +6,7 @@ * * * C Header File * * * - * Copyright (C) 1992-2015, Free Software Foundation, Inc. * + * Copyright (C) 1992-2016, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -538,11 +538,9 @@ extern tree gnat_type_for_mode (machine_mode mode, int unsignedp); /* Perform final processing on global declarations. */ extern void gnat_write_global_declarations (void); -/* Return the unsigned version of a TYPE_NODE, a scalar type. */ -extern tree gnat_unsigned_type (tree type_node); - -/* Return the signed version of a TYPE_NODE, a scalar type. */ -extern tree gnat_signed_type (tree type_node); +/* Return the signed or unsigned version of TYPE_NODE, a scalar type, the + signedness being specified by UNSIGNEDP. */ +extern tree gnat_signed_or_unsigned_type_for (int unsignedp, tree type_node); /* Return 1 if the types T1 and T2 are compatible, i.e. if they can be transparently converted to each other. */ @@ -898,11 +896,11 @@ extern tree build_call_raise (int msg, Node_Id gnat_node, char kind); /* Similar to build_call_raise, with extra information about the column where the check failed. */ -extern tree build_call_raise_column (int msg, Node_Id gnat_node); +extern tree build_call_raise_column (int msg, Node_Id gnat_node, char kind); /* Similar to build_call_raise_column, for an index or range check exception , with extra information of the form "INDEX out of range FIRST..LAST". */ -extern tree build_call_raise_range (int msg, Node_Id gnat_node, +extern tree build_call_raise_range (int msg, Node_Id gnat_node, char kind, tree index, tree first, tree last); /* Return a CONSTRUCTOR of TYPE whose elements are V. This is not the @@ -1120,3 +1118,19 @@ return_type_with_variable_size_p (tree type) return false; } + +/* Return the unsigned version of TYPE_NODE, a scalar type. */ + +static inline tree +gnat_unsigned_type_for (tree type_node) +{ + return gnat_signed_or_unsigned_type_for (1, type_node); +} + +/* Return the signed version of TYPE_NODE, a scalar type. */ + +static inline tree +gnat_signed_type_for (tree type_node) +{ + return gnat_signed_or_unsigned_type_for (0, type_node); +} diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index adaea7f6465..33839f32eaa 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -6,7 +6,7 @@ * * * C Implementation File * * * - * Copyright (C) 1992-2015, Free Software Foundation, Inc. * + * Copyright (C) 1992-2016, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -112,8 +112,8 @@ gnat_parse_file (void) /* ??? Call the SEH initialization routine. This is to workaround a bootstrap path problem. The call below should be removed at some - point and the SEH pointer passed to __gnat_initialize() above. */ - __gnat_install_SEH_handler((void *)seh); + point and the SEH pointer passed to __gnat_initialize above. */ + __gnat_install_SEH_handler ((void *)seh); /* Call the front-end elaboration procedures. */ adainit (); @@ -528,10 +528,10 @@ gnat_print_type (FILE *file, tree node, int indent) break; } - if (TYPE_CAN_HAVE_DEBUG_TYPE_P (node) && TYPE_DEBUG_TYPE (node) != NULL_TREE) + if (TYPE_CAN_HAVE_DEBUG_TYPE_P (node) && TYPE_DEBUG_TYPE (node)) print_node_brief (file, "debug type", TYPE_DEBUG_TYPE (node), indent + 4); - else if (TYPE_IMPLEMENTS_PACKED_ARRAY_P (node) - && TYPE_ORIGINAL_PACKED_ARRAY (node) != NULL_TREE) + + if (TYPE_IMPL_PACKED_ARRAY_P (node) && TYPE_ORIGINAL_PACKED_ARRAY (node)) print_node_brief (file, "original packed array", TYPE_ORIGINAL_PACKED_ARRAY (node), indent + 4); } @@ -575,23 +575,25 @@ gnat_descriptive_type (const_tree type) return NULL_TREE; } -/* Return the type to used for debugging information instead of TYPE, if any. +/* Return the type to be used for debugging information instead of TYPE or NULL_TREE if TYPE is fine. */ static tree gnat_get_debug_type (const_tree type) { - if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type)) + if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type) && TYPE_DEBUG_TYPE (type)) { type = TYPE_DEBUG_TYPE (type); - /* ??? Kludge: the get_debug_type language hook is processed after the - array descriptor language hook, so if there is an array behind this - type, the latter is supposed to handle it. Still, we can get here - with a type we are not supposed to handle (when the DWARF back-end + + /* ??? The get_debug_type language hook is processed after the array + descriptor language hook, so if there is an array behind this type, + the latter is supposed to handle it. Still, we can get here with + a type we are not supposed to handle (e.g. when the DWARF back-end processes the type of a variable), so keep this guard. */ - if (type != NULL_TREE && !TYPE_IMPLEMENTS_PACKED_ARRAY_P (type)) + if (type && TYPE_CAN_HAVE_DEBUG_TYPE_P (type)) return const_cast (type); } + return NULL_TREE; } @@ -606,8 +608,8 @@ gnat_get_fixed_point_type_info (const_tree type, /* GDB cannot handle fixed-point types yet, so rely on GNAT encodings instead for it. */ - if (gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL - || !TYPE_IS_FIXED_POINT_P (type)) + if (!TYPE_IS_FIXED_POINT_P (type) + || gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL) return false; scale_factor = TYPE_SCALE_FACTOR (type); @@ -640,6 +642,7 @@ gnat_get_fixed_point_type_info (const_tree type, gcc_assert (num == integer_one_node && TREE_CODE (base) == INTEGER_CST && TREE_CODE (exponent) == INTEGER_CST); + switch (tree_to_shwi (base)) { case 2: @@ -661,6 +664,7 @@ gnat_get_fixed_point_type_info (const_tree type, expect N / D with constant operands. */ gcc_assert (TREE_CODE (num) == INTEGER_CST && TREE_CODE (den) == INTEGER_CST); + info->scale_factor_kind = fixed_point_scale_factor_arbitrary; info->scale_factor.arbitrary.numerator = tree_to_uhwi (num); info->scale_factor.arbitrary.denominator = tree_to_shwi (den); @@ -746,7 +750,7 @@ gnat_type_max_size (const_tree gnu_type) return max_unitsize; } -static tree get_array_bit_stride (tree comp_type); +static tree get_array_bit_stride (tree); /* Provide information in INFO for debug output about the TYPE array type. Return whether TYPE is handled. */ @@ -759,9 +763,7 @@ gnat_get_array_descr_info (const_tree const_type, bool is_array = false; bool is_fat_ptr = false; bool is_packed_array = false; - tree type = const_cast (const_type); - const_tree first_dimen = NULL_TREE; const_tree last_dimen = NULL_TREE; const_tree dimen; @@ -774,18 +776,16 @@ gnat_get_array_descr_info (const_tree const_type, tree thinptr_template_expr = NULL_TREE; tree thinptr_bound_field = NULL_TREE; - /* ??? Kludge: see gnat_get_debug_type. */ - if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type) - && TYPE_DEBUG_TYPE (type) != NULL_TREE) + /* ??? See gnat_get_debug_type. */ + if (TYPE_CAN_HAVE_DEBUG_TYPE_P (type) && TYPE_DEBUG_TYPE (type)) type = TYPE_DEBUG_TYPE (type); /* If we have an implementation type for a packed array, get the orignial array type. */ - if (TYPE_IMPLEMENTS_PACKED_ARRAY_P (type) - && TYPE_ORIGINAL_PACKED_ARRAY (type) != NULL_TREE) + if (TYPE_IMPL_PACKED_ARRAY_P (type) && TYPE_ORIGINAL_PACKED_ARRAY (type)) { - is_packed_array = true; type = TYPE_ORIGINAL_PACKED_ARRAY (type); + is_packed_array = true; } /* First pass: gather all information about this array except everything @@ -801,8 +801,8 @@ gnat_get_array_descr_info (const_tree const_type, info->data_location = NULL_TREE; } - else if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL - && TYPE_IS_FAT_POINTER_P (type)) + else if (TYPE_IS_FAT_POINTER_P (type) + && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL) { const tree ua_type = TYPE_UNCONSTRAINED_ARRAY (type); @@ -828,9 +828,9 @@ gnat_get_array_descr_info (const_tree const_type, them to appear in the debug info as pointers to an array type. That's why we match only the RECORD_TYPE here instead of the POINTER_TYPE with the TYPE_IS_THIN_POINTER_P predicate. */ - else if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL - && TREE_CODE (type) == RECORD_TYPE - && TYPE_CONTAINS_TEMPLATE_P (type)) + else if (TREE_CODE (type) == RECORD_TYPE + && TYPE_CONTAINS_TEMPLATE_P (type) + && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL) { /* This will be our base object address. Note that we assume that pointers to these will actually point to the array field (thin @@ -910,9 +910,7 @@ gnat_get_array_descr_info (const_tree const_type, structure. */ for (i = (convention_fortran_p ? info->ndimensions - 1 : 0), dimen = first_dimen; - 0 <= i && i < info->ndimensions; - i += (convention_fortran_p ? -1 : 1), dimen = TREE_TYPE (dimen)) { @@ -927,12 +925,10 @@ gnat_get_array_descr_info (const_tree const_type, there are two cases where we generate self-referencial bound expressions: arrays that are constrained by record discriminants and XUA types. */ - const bool is_xua_type = - (TYPE_CONTEXT (first_dimen) != NULL_TREE - && TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE - && contains_placeholder_p (TYPE_MIN_VALUE (index_type))); - - if (is_xua_type && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL) + if (TYPE_CONTEXT (first_dimen) + && TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE + && contains_placeholder_p (TYPE_MIN_VALUE (index_type)) + && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL) { info->dimen[i].lower_bound = NULL_TREE; info->dimen[i].upper_bound = NULL_TREE; @@ -960,9 +956,10 @@ gnat_get_array_descr_info (const_tree const_type, /* The DWARF back-end will output exactly INDEX_TYPE as the array index' "root" type, so pell subtypes when possible. */ - while (TREE_TYPE (index_type) != NULL_TREE + while (TREE_TYPE (index_type) && !subrange_type_for_debug_p (index_type, NULL, NULL)) index_type = TREE_TYPE (index_type); + info->dimen[i].bounds_type = index_type; info->dimen[i].stride = NULL_TREE; } @@ -980,9 +977,9 @@ gnat_get_array_descr_info (const_tree const_type, element. This is why we emit a stride in such situations. */ tree source_element_type = info->element_type; - while (1) + while (true) { - if (TYPE_DEBUG_TYPE (source_element_type) != NULL_TREE) + if (TYPE_DEBUG_TYPE (source_element_type)) source_element_type = TYPE_DEBUG_TYPE (source_element_type); else if (TYPE_IS_PADDING_P (source_element_type)) source_element_type @@ -1024,11 +1021,9 @@ get_array_bit_stride (tree comp_type) if (INTEGRAL_TYPE_P (comp_type)) return TYPE_RM_SIZE (comp_type); - /* Otherwise, see if this is an array we can analyze. */ + /* Otherwise, see if this is an array we can analyze; if it's not, punt. */ memset (&info, 0, sizeof (info)); - if (!gnat_get_array_descr_info (comp_type, &info) - || info.stride == NULL_TREE) - /* If it's not, give it up. */ + if (!gnat_get_array_descr_info (comp_type, &info) || !info.stride) return NULL_TREE; /* Otherwise, the array stride is the inner array's stride multiplied by the @@ -1040,15 +1035,14 @@ get_array_bit_stride (tree comp_type) { stride = fold_convert (bitsizetype, stride); stride = build_binary_op (MULT_EXPR, bitsizetype, - stride, build_int_cstu (bitsizetype, 8)); + stride, build_int_cst (bitsizetype, 8)); } for (int i = 0; i < info.ndimensions; ++i) { tree count; - if (info.dimen[i].lower_bound == NULL_TREE - || info.dimen[i].upper_bound == NULL_TREE) + if (!info.dimen[i].lower_bound || !info.dimen[i].upper_bound) return NULL_TREE; /* Put in count an expression that computes the length of this @@ -1059,10 +1053,10 @@ get_array_bit_stride (tree comp_type) fold_convert (sbitsizetype, info.dimen[i].lower_bound)), count = build_binary_op (PLUS_EXPR, sbitsizetype, - count, build_int_cstu (sbitsizetype, 1)); + count, build_int_cst (sbitsizetype, 1)); count = build_binary_op (MAX_EXPR, sbitsizetype, count, - build_int_cstu (sbitsizetype, 0)); + build_int_cst (sbitsizetype, 0)); count = fold_convert (bitsizetype, count); stride = build_binary_op (MULT_EXPR, bitsizetype, stride, count); } @@ -1080,13 +1074,16 @@ gnat_get_subrange_bounds (const_tree gnu_type, tree *lowval, tree *highval) *highval = TYPE_MAX_VALUE (gnu_type); } +/* Return the bias of GNU_TYPE, if any. */ + static tree gnat_get_type_bias (const_tree gnu_type) { if (TREE_CODE (gnu_type) == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (gnu_type) && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL) - return TYPE_RM_MIN_VALUE(gnu_type); + return TYPE_RM_MIN_VALUE (gnu_type); + return NULL_TREE; } @@ -1240,7 +1237,7 @@ enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int)) digs = fmt->p; else - gcc_unreachable(); + gcc_unreachable (); } /* First register any C types for this mode that the front end diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index ae1d287d443..eacab82ca29 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -6,7 +6,7 @@ * * * C Implementation File * * * - * Copyright (C) 1992-2015, Free Software Foundation, Inc. * + * Copyright (C) 1992-2016, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -1487,7 +1487,7 @@ Pragma_to_gnu (Node_Id gnat_node) } -/* Check the inlining status of nested function FNDECL in the current context. +/* Check the inline status of nested function FNDECL wrt its parent function. If a non-inline nested function is referenced from an inline external function, we cannot honor both requests at the same time without cloning @@ -1495,24 +1495,27 @@ Pragma_to_gnu (Node_Id gnat_node) We could inline it as well but it's probably better to err on the side of too little inlining. - This must be invoked only on nested functions present in the source code + This must be done only on nested functions present in the source code and not on nested functions generated by the compiler, e.g. finalizers, - because they are not marked inline and we don't want them to block the - inlining of the parent function. */ + because they may be not marked inline and we don't want them to block + the inlining of the parent function. */ static void check_inlining_for_nested_subprog (tree fndecl) { - if (!DECL_DECLARED_INLINE_P (fndecl) - && current_function_decl - && DECL_EXTERNAL (current_function_decl) - && DECL_DECLARED_INLINE_P (current_function_decl)) + if (DECL_IGNORED_P (current_function_decl) || DECL_IGNORED_P (fndecl)) + return; + + if (DECL_DECLARED_INLINE_P (fndecl)) + return; + + tree parent_decl = decl_function_context (fndecl); + if (DECL_EXTERNAL (parent_decl) && DECL_DECLARED_INLINE_P (parent_decl)) { const location_t loc1 = DECL_SOURCE_LOCATION (fndecl); - const location_t loc2 = DECL_SOURCE_LOCATION (current_function_decl); + const location_t loc2 = DECL_SOURCE_LOCATION (parent_decl); - if (lookup_attribute ("always_inline", - DECL_ATTRIBUTES (current_function_decl))) + if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (parent_decl))) { error_at (loc1, "subprogram %q+F not marked Inline_Always", fndecl); error_at (loc2, "parent subprogram cannot be inlined"); @@ -1524,8 +1527,8 @@ check_inlining_for_nested_subprog (tree fndecl) warning_at (loc2, OPT_Winline, "parent subprogram cannot be inlined"); } - DECL_DECLARED_INLINE_P (current_function_decl) = 0; - DECL_UNINLINABLE (current_function_decl) = 1; + DECL_DECLARED_INLINE_P (parent_decl) = 0; + DECL_UNINLINABLE (parent_decl) = 1; } } @@ -1552,12 +1555,12 @@ get_type_length (tree type, tree result_type) build_binary_op (MINUS_EXPR, comp_type, convert (comp_type, hb), convert (comp_type, lb)), - convert (comp_type, integer_one_node)); + build_int_cst (comp_type, 1)); length = build_cond_expr (result_type, build_binary_op (GE_EXPR, boolean_type_node, hb, lb), convert (result_type, length), - convert (result_type, integer_zero_node)); + build_int_cst (result_type, 0)); return length; } @@ -1634,7 +1637,7 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) gnu_result = build_binary_op (attribute == Attr_Pred ? MINUS_EXPR : PLUS_EXPR, gnu_result_type, gnu_expr, - convert (gnu_result_type, integer_one_node)); + build_int_cst (gnu_result_type, 1)); break; case Attr_Address: @@ -2505,22 +2508,6 @@ Case_Statement_to_gnu (Node_Id gnat_node) gnu_expr = gnat_to_gnu (Expression (gnat_node)); gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr); - /* The range of values in a case statement is determined by the rules in - RM 5.4(7-9). In almost all cases, this range is represented by the Etype - of the expression. One exception arises in the case of a simple name that - is parenthesized. This still has the Etype of the name, but since it is - not a name, para 7 does not apply, and we need to go to the base type. - This is the only case where parenthesization affects the dynamic - semantics (i.e. the range of possible values at run time that is covered - by the others alternative). - - Another exception is if the subtype of the expression is non-static. In - that case, we also have to use the base type. */ - if (Paren_Count (Expression (gnat_node)) != 0 - || !Is_OK_Static_Subtype (Underlying_Type - (Etype (Expression (gnat_node))))) - gnu_expr = convert (get_base_type (TREE_TYPE (gnu_expr)), gnu_expr); - /* We build a SWITCH_EXPR that contains the code with interspersed CASE_LABEL_EXPRs for each label. */ if (!Sloc_to_locus (End_Location (gnat_node), &end_locus)) @@ -2891,7 +2878,7 @@ Loop_Statement_to_gnu (Node_Id gnat_node) Entity_Id gnat_type = Etype (gnat_loop_var); tree gnu_type = get_unpadded_type (gnat_type); tree gnu_base_type = get_base_type (gnu_type); - tree gnu_one_node = convert (gnu_base_type, integer_one_node); + tree gnu_one_node = build_int_cst (gnu_base_type, 1); tree gnu_loop_var, gnu_loop_iv, gnu_first, gnu_last, gnu_stmt; enum tree_code update_code, test_code, shift_code; bool reverse = Reverse_Present (gnat_loop_spec), use_iv = false; @@ -2987,7 +2974,7 @@ Loop_Statement_to_gnu (Node_Id gnat_node) gnu_first = convert (gnu_base_type, gnu_first); gnu_last = convert (gnu_base_type, gnu_last); - gnu_one_node = convert (gnu_base_type, integer_one_node); + gnu_one_node = build_int_cst (gnu_base_type, 1); use_iv = true; } @@ -4679,12 +4666,14 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, && (gnu_size = TYPE_SIZE (TREE_TYPE (gnu_actual))) && TREE_CODE (gnu_size) == INTEGER_CST && compare_tree_int (gnu_size, BITS_PER_WORD) <= 0) - gnu_actual - = unchecked_convert (DECL_ARG_TYPE (gnu_formal), - convert (gnat_type_for_size - (TREE_INT_CST_LOW (gnu_size), 1), - integer_zero_node), - false); + { + tree type_for_size + = gnat_type_for_size (TREE_INT_CST_LOW (gnu_size), 1); + gnu_actual + = unchecked_convert (DECL_ARG_TYPE (gnu_formal), + build_int_cst (type_for_size, 0), + false); + } else gnu_actual = convert (DECL_ARG_TYPE (gnu_formal), gnu_actual); } @@ -5494,10 +5483,9 @@ build_noreturn_cond (tree cond) return build1 (NOP_EXPR, boolean_type_node, t); } -/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Raise_xxx_Error, - to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer to where - we should place the result type. LABEL_P is true if there is a label to - branch to for the exception. */ +/* Subroutine of gnat_to_gnu to translate GNAT_NODE, an N_Raise_xxx_Error, + to a GCC tree and return it. GNU_RESULT_TYPE_P is a pointer to where + we should place the result type. */ static tree Raise_Error_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) @@ -5511,13 +5499,13 @@ Raise_Error_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) && !get_exception_label (kind); tree gnu_result = NULL_TREE, gnu_cond = NULL_TREE; - *gnu_result_type_p = get_unpadded_type (Etype (gnat_node)); - + /* The following processing is not required for correctness. Its purpose is + to give more precise error messages and to record some information. */ switch (reason) { case CE_Access_Check_Failed: if (with_extra_info) - gnu_result = build_call_raise_column (reason, gnat_node); + gnu_result = build_call_raise_column (reason, gnat_node, kind); break; case CE_Index_Check_Failed: @@ -5563,7 +5551,7 @@ Raise_Error_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) && Known_Esize (gnat_type) && UI_To_Int (Esize (gnat_type)) <= 32) gnu_result - = build_call_raise_range (reason, gnat_node, gnu_index, + = build_call_raise_range (reason, gnat_node, kind, gnu_index, gnu_low_bound, gnu_high_bound); /* If optimization is enabled and we are inside a loop, we try to @@ -5633,11 +5621,14 @@ Raise_Error_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) break; } + /* The following processing does the common work. */ common: if (!gnu_result) gnu_result = build_call_raise (reason, gnat_node, kind); set_expr_location_from_node (gnu_result, gnat_node); + *gnu_result_type_p = get_unpadded_type (Etype (gnat_node)); + /* If the type is VOID, this is a statement, so we need to generate the code for the call. Handle a condition, if there is one. */ if (VOID_TYPE_P (*gnu_result_type_p)) @@ -5861,8 +5852,8 @@ gnat_to_gnu (Node_Id gnat_node) gnu_result = DECL_INITIAL (get_gnu_tree (Entity (gnat_node))); else gnu_result - = build_int_cst_type - (gnu_result_type, UI_To_CC (Char_Literal_Value (gnat_node))); + = build_int_cst (gnu_result_type, + UI_To_CC (Char_Literal_Value (gnat_node))); break; case N_Real_Literal: @@ -5890,7 +5881,7 @@ gnat_to_gnu (Node_Id gnat_node) ur_realval, Round_Even, gnat_node); if (UR_Is_Zero (ur_realval)) - gnu_result = convert (gnu_result_type, integer_zero_node); + gnu_result = build_real (gnu_result_type, dconst0); else { REAL_VALUE_TYPE tmp; @@ -6024,7 +6015,7 @@ gnat_to_gnu (Node_Id gnat_node) full view since the clause is on the partial view and we cannot have 2 different GCC trees for the object. The only bits of the full view we will use is the initializer, but it will be directly fetched. */ - if (Ekind(gnat_temp) == E_Constant + if (Ekind (gnat_temp) == E_Constant && Present (Address_Clause (gnat_temp)) && Present (Full_View (gnat_temp))) save_gnu_tree (Full_View (gnat_temp), error_mark_node, true); @@ -6606,7 +6597,9 @@ gnat_to_gnu (Node_Id gnat_node) gnu_result_type, gnu_lhs, gnu_rhs); break; - case N_Op_Or: case N_Op_And: case N_Op_Xor: + case N_Op_And: + case N_Op_Or: + case N_Op_Xor: /* These can either be operations on booleans or on modular types. Fall through for boolean types since that's the way GNU_CODES is set up. */ @@ -6627,16 +6620,24 @@ gnat_to_gnu (Node_Id gnat_node) /* ... fall through ... */ - case N_Op_Eq: case N_Op_Ne: case N_Op_Lt: - case N_Op_Le: case N_Op_Gt: case N_Op_Ge: - case N_Op_Add: case N_Op_Subtract: case N_Op_Multiply: - case N_Op_Mod: case N_Op_Rem: + case N_Op_Eq: + case N_Op_Ne: + case N_Op_Lt: + case N_Op_Le: + case N_Op_Gt: + case N_Op_Ge: + case N_Op_Add: + case N_Op_Subtract: + case N_Op_Multiply: + case N_Op_Mod: + case N_Op_Rem: case N_Op_Rotate_Left: case N_Op_Rotate_Right: case N_Op_Shift_Left: case N_Op_Shift_Right: case N_Op_Shift_Right_Arithmetic: - case N_And_Then: case N_Or_Else: + case N_And_Then: + case N_Or_Else: { enum tree_code code = gnu_codes[kind]; bool ignore_lhs_overflow = false; @@ -6679,8 +6680,7 @@ gnat_to_gnu (Node_Id gnat_node) build_binary_op (MINUS_EXPR, gnu_count_type, gnu_max_shift, - convert (gnu_count_type, - integer_one_node)), + build_int_cst (gnu_count_type, 1)), gnu_rhs); } @@ -6690,13 +6690,13 @@ gnat_to_gnu (Node_Id gnat_node) the way down and causes a CE to be explicitly raised. */ if (kind == N_Op_Shift_Right && !TYPE_UNSIGNED (gnu_type)) { - gnu_type = gnat_unsigned_type (gnu_type); + gnu_type = gnat_unsigned_type_for (gnu_type); ignore_lhs_overflow = true; } else if (kind == N_Op_Shift_Right_Arithmetic && TYPE_UNSIGNED (gnu_type)) { - gnu_type = gnat_signed_type (gnu_type); + gnu_type = gnat_signed_type_for (gnu_type); ignore_lhs_overflow = true; } @@ -6712,13 +6712,12 @@ gnat_to_gnu (Node_Id gnat_node) /* Instead of expanding overflow checks for addition, subtraction and multiplication itself, the front end will leave this to the back end when Backend_Overflow_Checks_On_Target is set. - As the GCC back end itself does not know yet how to properly + As the back end itself does not know yet how to properly do overflow checking, do it here. The goal is to push the expansions further into the back end over time. */ - if (Do_Overflow_Check (gnat_node) && Backend_Overflow_Checks_On_Target - && (kind == N_Op_Add - || kind == N_Op_Subtract - || kind == N_Op_Multiply) + if (Do_Overflow_Check (gnat_node) + && Backend_Overflow_Checks_On_Target + && (code == PLUS_EXPR || code == MINUS_EXPR || code == MULT_EXPR) && !TYPE_UNSIGNED (gnu_type) && !FLOAT_TYPE_P (gnu_type)) gnu_result = build_binary_op_trapv (code, gnu_type, @@ -6743,7 +6742,7 @@ gnat_to_gnu (Node_Id gnat_node) gnu_rhs, convert (TREE_TYPE (gnu_rhs), TYPE_SIZE (gnu_type))), - convert (gnu_type, integer_zero_node), + build_int_cst (gnu_type, 0), gnu_result); } break; @@ -6781,7 +6780,8 @@ gnat_to_gnu (Node_Id gnat_node) /* ... fall through ... */ - case N_Op_Minus: case N_Op_Abs: + case N_Op_Minus: + case N_Op_Abs: gnu_expr = gnat_to_gnu (Right_Opnd (gnat_node)); gnu_result_type = get_unpadded_type (Etype (gnat_node)); @@ -7379,7 +7379,7 @@ gnat_to_gnu (Node_Id gnat_node) true, true, NULL, gnat_node); add_stmt (build_binary_op (MODIFY_EXPR, NULL_TREE, gnu_incoming_exc_ptr, - convert (ptr_type_node, integer_zero_node))); + build_int_cst (ptr_type_node, 0))); add_stmt (build_call_n_expr (reraise_zcx_decl, 1, gnu_expr)); gnat_poplevel (); gnu_result = end_stmt_group (); @@ -8032,7 +8032,7 @@ add_decl_expr (tree gnu_decl, Entity_Id gnat_entity) /* If this is a variable and an initializer is attached to it, it must be valid for the context. Similar to init_const in create_var_decl. */ if (TREE_CODE (gnu_decl) == VAR_DECL - && (gnu_init = DECL_INITIAL (gnu_decl)) != NULL_TREE + && (gnu_init = DECL_INITIAL (gnu_decl)) && (!gnat_types_compatible_p (type, TREE_TYPE (gnu_init)) || (TREE_STATIC (gnu_decl) && !initializer_constant_valid_p (gnu_init, @@ -8125,7 +8125,7 @@ end_stmt_group (void) are cleanups, make a TRY_FINALLY_EXPR. Last, if there is a BLOCK, make a BIND_EXPR. Note that we nest in that because the cleanup may reference variables in the block. */ - if (gnu_retval == NULL_TREE) + if (!gnu_retval) gnu_retval = alloc_stmt_list (); if (group->cleanups) @@ -8858,7 +8858,7 @@ build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left, tree rhs = gnat_protect_expr (right); tree type_max = TYPE_MAX_VALUE (gnu_type); tree type_min = TYPE_MIN_VALUE (gnu_type); - tree zero = convert (gnu_type, integer_zero_node); + tree zero = build_int_cst (gnu_type, 0); tree gnu_expr, rhs_lt_zero, tmp1, tmp2; tree check_pos, check_neg, check; @@ -9020,7 +9020,7 @@ build_binary_op_trapv (enum tree_code code, tree gnu_type, tree left, break; default: - gcc_unreachable(); + gcc_unreachable (); } check = fold_build3 (COND_EXPR, boolean_type_node, rhs_lt_zero, check_neg, @@ -9148,7 +9148,9 @@ emit_check (tree gnu_cond, tree gnu_expr, int reason, Node_Id gnat_node) return fold_build3 (COND_EXPR, TREE_TYPE (gnu_expr), gnu_cond, build2 (COMPOUND_EXPR, TREE_TYPE (gnu_expr), gnu_call, - convert (TREE_TYPE (gnu_expr), integer_zero_node)), + SCALAR_FLOAT_TYPE_P (TREE_TYPE (gnu_expr)) + ? build_real (TREE_TYPE (gnu_expr), dconst0) + : build_int_cst (TREE_TYPE (gnu_expr), 0)), gnu_expr); } @@ -9204,17 +9206,21 @@ convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflowp, comparing them properly. Likewise, convert the upper bounds to unsigned types. */ if (INTEGRAL_TYPE_P (gnu_in_basetype) && TYPE_UNSIGNED (gnu_in_basetype)) - gnu_in_lb = convert (gnat_signed_type (gnu_in_basetype), gnu_in_lb); + gnu_in_lb + = convert (gnat_signed_type_for (gnu_in_basetype), gnu_in_lb); if (INTEGRAL_TYPE_P (gnu_in_basetype) && !TYPE_UNSIGNED (gnu_in_basetype)) - gnu_in_ub = convert (gnat_unsigned_type (gnu_in_basetype), gnu_in_ub); + gnu_in_ub + = convert (gnat_unsigned_type_for (gnu_in_basetype), gnu_in_ub); if (INTEGRAL_TYPE_P (gnu_base_type) && TYPE_UNSIGNED (gnu_base_type)) - gnu_out_lb = convert (gnat_signed_type (gnu_base_type), gnu_out_lb); + gnu_out_lb + = convert (gnat_signed_type_for (gnu_base_type), gnu_out_lb); if (INTEGRAL_TYPE_P (gnu_base_type) && !TYPE_UNSIGNED (gnu_base_type)) - gnu_out_ub = convert (gnat_unsigned_type (gnu_base_type), gnu_out_ub); + gnu_out_ub + = convert (gnat_unsigned_type_for (gnu_base_type), gnu_out_ub); /* Check each bound separately and only if the result bound is tighter than the bound on the input type. Note that all the @@ -9298,7 +9304,7 @@ convert_with_check (Entity_Id gnat_type, tree gnu_expr, bool overflowp, to be scheduled in parallel with retrieval of the constant and conversion of the input to the calc_type (if necessary). */ - gnu_zero = convert (gnu_in_basetype, integer_zero_node); + gnu_zero = build_real (gnu_in_basetype, dconst0); gnu_result = gnat_protect_expr (gnu_result); gnu_conv = convert (calc_type, gnu_result); gnu_comp @@ -10080,16 +10086,45 @@ post_error_ne_tree_2 (const char *msg, Node_Id node, Entity_Id ent, tree t, Error_Msg_Uint_2 = UI_From_Int (num); post_error_ne_tree (msg, node, ent, t); } - + +/* Return a label to branch to for the exception type in KIND or NULL_TREE + if none. */ + +tree +get_exception_label (char kind) +{ + switch (kind) + { + case N_Raise_Constraint_Error: + return gnu_constraint_error_label_stack->last (); + + case N_Raise_Storage_Error: + return gnu_storage_error_label_stack->last (); + + case N_Raise_Program_Error: + return gnu_program_error_label_stack->last (); + + default: + break; + } + + return NULL_TREE; +} + +/* Return the decl for the current elaboration procedure. */ + +tree +get_elaboration_procedure (void) +{ + return gnu_elab_proc_stack->last (); +} + /* Initialize the table that maps GNAT codes to GCC codes for simple binary and unary operations. */ static void init_code_table (void) { - gnu_codes[N_And_Then] = TRUTH_ANDIF_EXPR; - gnu_codes[N_Or_Else] = TRUTH_ORIF_EXPR; - gnu_codes[N_Op_And] = TRUTH_AND_EXPR; gnu_codes[N_Op_Or] = TRUTH_OR_EXPR; gnu_codes[N_Op_Xor] = TRUTH_XOR_EXPR; @@ -10112,30 +10147,8 @@ init_code_table (void) gnu_codes[N_Op_Shift_Left] = LSHIFT_EXPR; gnu_codes[N_Op_Shift_Right] = RSHIFT_EXPR; gnu_codes[N_Op_Shift_Right_Arithmetic] = RSHIFT_EXPR; -} - -/* Return a label to branch to for the exception type in KIND or NULL_TREE - if none. */ - -tree -get_exception_label (char kind) -{ - if (kind == N_Raise_Constraint_Error) - return gnu_constraint_error_label_stack->last (); - else if (kind == N_Raise_Storage_Error) - return gnu_storage_error_label_stack->last (); - else if (kind == N_Raise_Program_Error) - return gnu_program_error_label_stack->last (); - else - return NULL_TREE; -} - -/* Return the decl for the current elaboration procedure. */ - -tree -get_elaboration_procedure (void) -{ - return gnu_elab_proc_stack->last (); + gnu_codes[N_And_Then] = TRUTH_ANDIF_EXPR; + gnu_codes[N_Or_Else] = TRUTH_ORIF_EXPR; } #include "gt-ada-trans.h" diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 18d2106771f..95886f78d0b 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -429,7 +429,7 @@ build_dummy_unc_pointer_types (Entity_Id gnat_desig_type, tree gnu_desig_type) bool global_bindings_p (void) { - return force_global || current_function_decl == NULL_TREE; + return force_global || !current_function_decl; } /* Enter a new binding level. */ @@ -515,7 +515,7 @@ gnat_poplevel (void) parent block. Otherwise, add it to the list of its parent. */ if (TREE_CODE (BLOCK_SUPERCONTEXT (block)) == FUNCTION_DECL) ; - else if (BLOCK_VARS (block) == NULL_TREE) + else if (!BLOCK_VARS (block)) { BLOCK_SUBBLOCKS (level->chain->block) = block_chainon (BLOCK_SUBBLOCKS (block), @@ -570,9 +570,9 @@ gnat_set_type_context (tree type, tree context) /* Give a context to the parallel types and their stub decl, if any. Some parallel types seems to be present in multiple parallel type chains, so don't mess with their context if they already have one. */ - if (TYPE_CONTEXT (parallel_type) == NULL_TREE) + if (!TYPE_CONTEXT (parallel_type)) { - if (TYPE_STUB_DECL (parallel_type) != NULL_TREE) + if (TYPE_STUB_DECL (parallel_type)) DECL_CONTEXT (TYPE_STUB_DECL (parallel_type)) = context; TYPE_CONTEXT (parallel_type) = context; } @@ -625,17 +625,18 @@ get_debug_scope (Node_Id gnat_node, bool *is_subprogram) the outer one. */ break; } + gnat_entity = Scope (gnat_entity); } + return Empty; } -/* If N is NULL, set TYPE's context to CONTEXT. Defer this to the processing of - N otherwise. */ +/* If N is NULL, set TYPE's context to CONTEXT. Defer this to the processing + of N otherwise. */ static void -defer_or_set_type_context (tree type, - tree context, +defer_or_set_type_context (tree type, tree context, struct deferred_decl_context_node *n) { if (n) @@ -644,7 +645,7 @@ defer_or_set_type_context (tree type, gnat_set_type_context (type, context); } -/* Return global_context. Create it if needed, first. */ +/* Return global_context, but create it first if need be. */ static tree get_global_context (void) @@ -654,6 +655,7 @@ get_global_context (void) global_context = build_translation_unit_decl (NULL_TREE); debug_hooks->register_main_translation_unit (global_context); } + return global_context; } @@ -694,14 +696,14 @@ gnat_pushdecl (tree decl, Node_Id gnat_node) /* External declarations (when force_global > 0) may not be in a local context. */ - else if (current_function_decl != NULL_TREE && force_global == 0) + else if (current_function_decl && force_global == 0) context = current_function_decl; } /* If either we are forced to be in global mode or if both the GNAT scope and - the current_function_decl did not help determining the context, use the + the current_function_decl did not help in determining the context, use the global scope. */ - if (!deferred_decl_context && context == NULL_TREE) + if (!deferred_decl_context && !context) context = get_global_context (); /* Functions imported in another function are not really nested. @@ -710,9 +712,9 @@ gnat_pushdecl (tree decl, Node_Id gnat_node) lower_nested_functions will then recompute it. */ if (TREE_CODE (decl) == FUNCTION_DECL && !TREE_PUBLIC (decl) - && context != NULL_TREE + && context && (TREE_CODE (context) == FUNCTION_DECL - || decl_function_context (context) != NULL_TREE)) + || decl_function_context (context))) DECL_STATIC_CHAIN (decl) = 1; if (!deferred_decl_context) @@ -1281,16 +1283,15 @@ maybe_pad_type (tree type, tree size, unsigned int align, if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL) SET_TYPE_DEBUG_TYPE (record, type); - /* ??? Kludge: padding types around packed array implementation types will be + /* ??? Padding types around packed array implementation types will be considered as root types in the array descriptor language hook (see gnat_get_array_descr_info). Give them the original packed array type name so that the one coming from sources appears in the debugging information. */ - if (gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL - && TYPE_IMPLEMENTS_PACKED_ARRAY_P (type) - && TYPE_ORIGINAL_PACKED_ARRAY (type) != NULL_TREE) - TYPE_NAME (record) - = TYPE_NAME (TYPE_ORIGINAL_PACKED_ARRAY (type)); + if (TYPE_IMPL_PACKED_ARRAY_P (type) + && TYPE_ORIGINAL_PACKED_ARRAY (type) + && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL) + TYPE_NAME (record) = TYPE_NAME (TYPE_ORIGINAL_PACKED_ARRAY (type)); else if (Present (gnat_entity)) TYPE_NAME (record) = create_concat_name (gnat_entity, "PAD"); @@ -1855,17 +1856,17 @@ add_parallel_type (tree type, tree parallel_type) SET_DECL_PARALLEL_TYPE (decl, parallel_type); /* If PARALLEL_TYPE already has a context, we are done. */ - if (TYPE_CONTEXT (parallel_type) != NULL_TREE) + if (TYPE_CONTEXT (parallel_type)) return; - /* Otherwise, try to get one from TYPE's context. */ - if (TYPE_CONTEXT (type) != NULL_TREE) - /* TYPE already has a context, so simply propagate it to PARALLEL_TYPE. */ + /* Otherwise, try to get one from TYPE's context. If so, simply propagate + it to PARALLEL_TYPE. */ + if (TYPE_CONTEXT (type)) gnat_set_type_context (parallel_type, TYPE_CONTEXT (type)); - /* ... otherwise TYPE has not context yet. We know it will thanks to - gnat_pushdecl, and then its context will be propagated to PARALLEL_TYPE. - So we have nothing to do in this case. */ + /* Otherwise TYPE has not context yet. We know it will have one thanks to + gnat_pushdecl and then its context will be propagated to PARALLEL_TYPE, + so we have nothing to do in this case. */ } /* Return true if TYPE has a parallel type. */ @@ -2269,7 +2270,7 @@ create_range_type (tree type, tree min, tree max) { tree range_type; - if (type == NULL_TREE) + if (!type) type = sizetype; /* First build a type with the base range. */ @@ -2905,32 +2906,30 @@ process_deferred_decl_context (bool force) while (Present (gnat_scope)) { context = compute_deferred_decl_context (gnat_scope); - if (!force || context != NULL_TREE) + if (!force || context) break; gnat_scope = get_debug_scope (gnat_scope, NULL); } /* Imported declarations must not be in a local context (i.e. not inside a function). */ - if (context != NULL_TREE && node->force_global > 0) + if (context && node->force_global > 0) { tree ctx = context; - while (ctx != NULL_TREE) + while (ctx) { gcc_assert (TREE_CODE (ctx) != FUNCTION_DECL); - ctx = (DECL_P (ctx)) - ? DECL_CONTEXT (ctx) - : TYPE_CONTEXT (ctx); + ctx = DECL_P (ctx) ? DECL_CONTEXT (ctx) : TYPE_CONTEXT (ctx); } } /* If FORCE, we want to get rid of all nodes in the queue: in case there was no elaborated scope, use the global context. */ - if (force && context == NULL_TREE) + if (force && !context) context = get_global_context (); - if (context != NULL_TREE) + if (context) { tree t; int i; @@ -3355,35 +3354,13 @@ gnat_type_for_mode (machine_mode mode, int unsignedp) return NULL_TREE; } -/* Return the unsigned version of a TYPE_NODE, a scalar type. */ - -tree -gnat_unsigned_type (tree type_node) -{ - tree type = gnat_type_for_size (TYPE_PRECISION (type_node), 1); - - if (TREE_CODE (type_node) == INTEGER_TYPE && TYPE_MODULAR_P (type_node)) - { - type = copy_node (type); - TREE_TYPE (type) = type_node; - } - else if (TREE_TYPE (type_node) - && TREE_CODE (TREE_TYPE (type_node)) == INTEGER_TYPE - && TYPE_MODULAR_P (TREE_TYPE (type_node))) - { - type = copy_node (type); - TREE_TYPE (type) = TREE_TYPE (type_node); - } - - return type; -} - -/* Return the signed version of a TYPE_NODE, a scalar type. */ +/* Return the signed or unsigned version of TYPE_NODE, a scalar type, the + signedness being specified by UNSIGNEDP. */ tree -gnat_signed_type (tree type_node) +gnat_signed_or_unsigned_type_for (int unsignedp, tree type_node) { - tree type = gnat_type_for_size (TYPE_PRECISION (type_node), 0); + tree type = gnat_type_for_size (TYPE_PRECISION (type_node), unsignedp); if (TREE_CODE (type_node) == INTEGER_TYPE && TYPE_MODULAR_P (type_node)) { @@ -4514,11 +4491,11 @@ convert (tree type, tree expr) if (TYPE_IS_THIN_POINTER_P (etype) && TYPE_IS_THIN_POINTER_P (type)) { tree etype_pos - = TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (etype)) != NULL_TREE + = TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (etype)) ? byte_position (DECL_CHAIN (TYPE_FIELDS (TREE_TYPE (etype)))) : size_zero_node; tree type_pos - = TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)) != NULL_TREE + = TYPE_UNCONSTRAINED_ARRAY (TREE_TYPE (type)) ? byte_position (DECL_CHAIN (TYPE_FIELDS (TREE_TYPE (type)))) : size_zero_node; tree byte_diff = size_diffop (type_pos, etype_pos); @@ -4937,8 +4914,8 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) are no considerations of precision or size involved. */ else if (INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type) - && (0 != compare_tree_int (TYPE_RM_SIZE (type), - GET_MODE_BITSIZE (TYPE_MODE (type))) + && (tree_int_cst_compare (TYPE_RM_SIZE (type), + TYPE_SIZE (type)) < 0 || (AGGREGATE_TYPE_P (etype) && TYPE_REVERSE_STORAGE_ORDER (etype)))) { @@ -4974,8 +4951,8 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) type with reverse storage order and we also proceed similarly. */ else if (INTEGRAL_TYPE_P (etype) && TYPE_RM_SIZE (etype) - && (0 != compare_tree_int (TYPE_RM_SIZE (etype), - GET_MODE_BITSIZE (TYPE_MODE (etype))) + && (tree_int_cst_compare (TYPE_RM_SIZE (etype), + TYPE_SIZE (etype)) < 0 || (AGGREGATE_TYPE_P (type) && TYPE_REVERSE_STORAGE_ORDER (type)))) { @@ -5095,26 +5072,25 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) is an integral type of the same precision and signedness or if the output is a biased type or if both the input and output are unsigned. */ if (!notrunc_p - && INTEGRAL_TYPE_P (type) && TYPE_RM_SIZE (type) - && !(code == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (type)) - && 0 != compare_tree_int (TYPE_RM_SIZE (type), - GET_MODE_BITSIZE (TYPE_MODE (type))) + && INTEGRAL_TYPE_P (type) + && TYPE_RM_SIZE (type) + && tree_int_cst_compare (TYPE_RM_SIZE (type), TYPE_SIZE (type)) < 0 && !(INTEGRAL_TYPE_P (etype) && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (etype) - && operand_equal_p (TYPE_RM_SIZE (type), - (TYPE_RM_SIZE (etype) != 0 - ? TYPE_RM_SIZE (etype) : TYPE_SIZE (etype)), - 0)) + && tree_int_cst_compare (TYPE_RM_SIZE (type), + TYPE_RM_SIZE (etype) + ? TYPE_RM_SIZE (etype) + : TYPE_SIZE (etype)) == 0) + && !(code == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (type)) && !(TYPE_UNSIGNED (type) && TYPE_UNSIGNED (etype))) { tree base_type - = gnat_type_for_mode (TYPE_MODE (type), TYPE_UNSIGNED (type)); + = gnat_type_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)), + TYPE_UNSIGNED (type)); tree shift_expr = convert (base_type, size_binop (MINUS_EXPR, - bitsize_int - (GET_MODE_BITSIZE (TYPE_MODE (type))), - TYPE_RM_SIZE (type))); + TYPE_SIZE (type), TYPE_RM_SIZE (type))); expr = convert (type, build_binary_op (RSHIFT_EXPR, base_type, @@ -5435,7 +5411,7 @@ builtin_type_for_size (int size, bool unsignedp) static void install_builtin_elementary_types (void) { - signed_size_type_node = gnat_signed_type (size_type_node); + signed_size_type_node = gnat_signed_type_for (size_type_node); pid_type_node = integer_type_node; void_list_node = build_void_list_node (); @@ -6107,7 +6083,7 @@ def_builtin_1 (enum built_in_function fncode, /* Preserve an already installed decl. It most likely was setup in advance (e.g. as part of the internal builtins) for specific reasons. */ - if (builtin_decl_explicit (fncode) != NULL_TREE) + if (builtin_decl_explicit (fncode)) return; gcc_assert ((!both_p && !fallback_p) diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index feed1cb0175..efeb1473fdc 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -6,7 +6,7 @@ * * * C Implementation File * * * - * Copyright (C) 1992-2015, Free Software Foundation, Inc. * + * Copyright (C) 1992-2016, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -223,8 +223,8 @@ find_common_type (tree t1, tree t2) || (TYPE_SIZE (t1) == TYPE_SIZE (t2) && !(TREE_CODE (t1) == RECORD_TYPE && TREE_CODE (t2) == RECORD_TYPE - && get_variant_part (t1) != NULL_TREE - && get_variant_part (t2) == NULL_TREE)))) + && get_variant_part (t1) + && !get_variant_part (t2))))) return t1; /* Otherwise, if the lhs type is non-BLKmode, use it. Note that we know @@ -592,7 +592,7 @@ nonbinary_modular_operation (enum tree_code op_code, tree type, tree lhs, result = gnat_protect_expr (result); result = fold_build3 (COND_EXPR, op_type, fold_build2 (LT_EXPR, boolean_type_node, result, - convert (op_type, integer_zero_node)), + build_int_cst (op_type, 0)), fold_build2 (PLUS_EXPR, op_type, result, modulus), result); } @@ -852,7 +852,7 @@ build_binary_op (enum tree_code op_code, tree result_type, { case INIT_EXPR: case MODIFY_EXPR: - gcc_checking_assert (result_type == NULL_TREE); + gcc_checking_assert (!result_type); /* If there were integral or pointer conversions on the LHS, remove them; we'll be putting them back below if needed. Likewise for @@ -1601,8 +1601,8 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) { if (integer_pow2p (fold_build2 (PLUS_EXPR, operation_type, modulus, - convert (operation_type, - integer_one_node)))) + build_int_cst (operation_type, + 1)))) result = fold_build2 (BIT_XOR_EXPR, operation_type, operand, modulus); else @@ -1613,9 +1613,8 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) fold_build2 (NE_EXPR, boolean_type_node, operand, - convert - (operation_type, - integer_zero_node)), + build_int_cst + (operation_type, 0)), result, operand); } else @@ -1626,8 +1625,7 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) that constant for nonbinary modulus. */ tree cnst = fold_build2 (MINUS_EXPR, operation_type, modulus, - convert (operation_type, - integer_one_node)); + build_int_cst (operation_type, 1)); if (mod_pow2) result = fold_build2 (BIT_XOR_EXPR, operation_type, @@ -1748,6 +1746,32 @@ build_call_n_expr (tree fndecl, int n, ...) return fn; } +/* Build a goto to LABEL for a raise, with an optional call to Local_Raise. + MSG gives the exception's identity for the call to Local_Raise, if any. */ + +static tree +build_goto_raise (tree label, int msg) +{ + tree gnu_result = build1 (GOTO_EXPR, void_type_node, label); + Entity_Id local_raise = Get_Local_Raise_Call_Entity (); + + /* If Local_Raise is present, build Local_Raise (Exception'Identity). */ + if (Present (local_raise)) + { + tree gnu_local_raise = gnat_to_gnu_entity (local_raise, NULL_TREE, 0); + tree gnu_exception_entity + = gnat_to_gnu_entity (Get_RT_Exception_Entity (msg), NULL_TREE, 0); + tree gnu_call + = build_call_n_expr (gnu_local_raise, 1, + build_unary_op (ADDR_EXPR, NULL_TREE, + gnu_exception_entity)); + gnu_result + = build2 (COMPOUND_EXPR, void_type_node, gnu_call, gnu_result); + } + + return gnu_result; +} + /* Expand the SLOC of GNAT_NODE, if present, into tree location information pointed to by FILENAME, LINE and COL. Fall back to the current location if GNAT_NODE is absent or has no SLOC. */ @@ -1803,27 +1827,7 @@ build_call_raise (int msg, Node_Id gnat_node, char kind) /* If this is to be done as a goto, handle that case. */ if (label) - { - Entity_Id local_raise = Get_Local_Raise_Call_Entity (); - tree gnu_result = build1 (GOTO_EXPR, void_type_node, label); - - /* If Local_Raise is present, build Local_Raise (Exception'Identity). */ - if (Present (local_raise)) - { - tree gnu_local_raise - = gnat_to_gnu_entity (local_raise, NULL_TREE, 0); - tree gnu_exception_entity - = gnat_to_gnu_entity (Get_RT_Exception_Entity (msg), NULL_TREE, 0); - tree gnu_call - = build_call_n_expr (gnu_local_raise, 1, - build_unary_op (ADDR_EXPR, NULL_TREE, - gnu_exception_entity)); - gnu_result - = build2 (COMPOUND_EXPR, void_type_node, gnu_call, gnu_result); - } - - return gnu_result; - } + return build_goto_raise (label, msg); expand_sloc (gnat_node, &filename, &line, NULL); @@ -1839,11 +1843,16 @@ build_call_raise (int msg, Node_Id gnat_node, char kind) where the check failed. */ tree -build_call_raise_column (int msg, Node_Id gnat_node) +build_call_raise_column (int msg, Node_Id gnat_node, char kind) { tree fndecl = gnat_raise_decls_ext[msg]; + tree label = get_exception_label (kind); tree filename, line, col; + /* If this is to be done as a goto, handle that case. */ + if (label) + return build_goto_raise (label, msg); + expand_sloc (gnat_node, &filename, &line, &col); return @@ -1858,12 +1867,17 @@ build_call_raise_column (int msg, Node_Id gnat_node) with extra information of the form "INDEX out of range FIRST..LAST". */ tree -build_call_raise_range (int msg, Node_Id gnat_node, +build_call_raise_range (int msg, Node_Id gnat_node, char kind, tree index, tree first, tree last) { tree fndecl = gnat_raise_decls_ext[msg]; + tree label = get_exception_label (kind); tree filename, line, col; + /* If this is to be done as a goto, handle that case. */ + if (label) + return build_goto_raise (label, msg); + expand_sloc (gnat_node, &filename, &line, &col); return @@ -2408,7 +2422,7 @@ build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc, } /* Indicate that we need to take the address of T and that it therefore - should not be allocated in a register. Returns true if successful. */ + should not be allocated in a register. Return true if successful. */ bool gnat_mark_addressable (tree t) @@ -2704,7 +2718,7 @@ gnat_rewrite_reference (tree ref, rewrite_fn func, void *data, tree *init) break; case COMPOUND_EXPR: - gcc_assert (*init == NULL_TREE); + gcc_assert (!*init); *init = TREE_OPERAND (ref, 0); /* We expect only the pattern built in Call_to_gnu. */ gcc_assert (DECL_P (TREE_OPERAND (ref, 1)) @@ -2778,7 +2792,7 @@ get_inner_constant_reference (tree exp) break; case COMPONENT_REF: - if (TREE_OPERAND (exp, 2) != NULL_TREE) + if (TREE_OPERAND (exp, 2)) return NULL_TREE; if (!TREE_CONSTANT (DECL_FIELD_OFFSET (TREE_OPERAND (exp, 1)))) @@ -2788,8 +2802,7 @@ get_inner_constant_reference (tree exp) case ARRAY_REF: case ARRAY_RANGE_REF: { - if (TREE_OPERAND (exp, 2) != NULL_TREE - || TREE_OPERAND (exp, 3) != NULL_TREE) + if (TREE_OPERAND (exp, 2) || TREE_OPERAND (exp, 3)) return NULL_TREE; tree array_type = TREE_TYPE (TREE_OPERAND (exp, 0)); @@ -2917,7 +2930,7 @@ gnat_invariant_expr (tree expr) switch (TREE_CODE (t)) { case COMPONENT_REF: - if (TREE_OPERAND (t, 2) != NULL_TREE) + if (TREE_OPERAND (t, 2)) return NULL_TREE; invariant_p |= DECL_INVARIANT_P (TREE_OPERAND (t, 1)); break; @@ -2925,8 +2938,8 @@ gnat_invariant_expr (tree expr) case ARRAY_REF: case ARRAY_RANGE_REF: if (!TREE_CONSTANT (TREE_OPERAND (t, 1)) - || TREE_OPERAND (t, 2) != NULL_TREE - || TREE_OPERAND (t, 3) != NULL_TREE) + || TREE_OPERAND (t, 2) + || TREE_OPERAND (t, 3)) return NULL_TREE; break; diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 45ed356b055..a22485fcbd6 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,4 +1,21 @@ -2015-01-14 Ryan Burn +2016-01-18 Jason Merrill + + PR c++/68767 + * c-common.c (check_function_arguments_recurse): Fold the whole + COND_EXPR, not just the condition. + +2016-01-18 Tom de Vries + + * c-omp.c (c_oacc_split_loop_clauses): Don't copy OMP_CLAUSE_REDUCTION, + classify as loop clause. + +2016-01-15 Jakub Jelinek + + PR bootstrap/68271 + * c-pragma.c (c_register_pragma_1): Adjust comment to note that + C++ FE no longer has limit on number of pragmas. + +2015-01-14 Ryan Burn PR c++/69048 * cilk.c (create_cilk_wrapper_body): Call fold_build_cleanup_point_expr diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 0bfa1f6879e..1a2c21b8939 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -9765,15 +9765,19 @@ check_function_arguments_recurse (void (*callback) if (TREE_CODE (param) == COND_EXPR) { - tree cond = fold_for_warn (TREE_OPERAND (param, 0)); - /* Check both halves of the conditional expression. */ - if (!integer_zerop (cond)) - check_function_arguments_recurse (callback, ctx, - TREE_OPERAND (param, 1), param_num); - if (!integer_nonzerop (cond)) - check_function_arguments_recurse (callback, ctx, - TREE_OPERAND (param, 2), param_num); - return; + /* Simplify to avoid warning for an impossible case. */ + param = fold_for_warn (param); + if (TREE_CODE (param) == COND_EXPR) + { + /* Check both halves of the conditional expression. */ + check_function_arguments_recurse (callback, ctx, + TREE_OPERAND (param, 1), + param_num); + check_function_arguments_recurse (callback, ctx, + TREE_OPERAND (param, 2), + param_num); + return; + } } (*callback) (ctx, param, param_num); diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c index 81fb30a1c49..5469d0d5625 100644 --- a/gcc/c-family/c-omp.c +++ b/gcc/c-family/c-omp.c @@ -863,7 +863,7 @@ c_omp_check_loop_iv_exprs (location_t stmt_loc, tree declv, tree decl, tree c_oacc_split_loop_clauses (tree clauses, tree *not_loop_clauses) { - tree next, loop_clauses, t; + tree next, loop_clauses; loop_clauses = *not_loop_clauses = NULL_TREE; for (; clauses ; clauses = next) @@ -882,16 +882,11 @@ c_oacc_split_loop_clauses (tree clauses, tree *not_loop_clauses) case OMP_CLAUSE_SEQ: case OMP_CLAUSE_INDEPENDENT: case OMP_CLAUSE_PRIVATE: + case OMP_CLAUSE_REDUCTION: OMP_CLAUSE_CHAIN (clauses) = loop_clauses; loop_clauses = clauses; break; - /* Reductions belong in both constructs. */ - case OMP_CLAUSE_REDUCTION: - t = copy_node (clauses); - OMP_CLAUSE_CHAIN (t) = loop_clauses; - loop_clauses = t; - /* Parallel/kernels clauses. */ default: OMP_CLAUSE_CHAIN (clauses) = *not_loop_clauses; diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c index b873664ef40..4e72f65581c 100644 --- a/gcc/c-family/c-pragma.c +++ b/gcc/c-family/c-pragma.c @@ -1372,8 +1372,9 @@ c_register_pragma_1 (const char *space, const char *name, id = registered_pragmas.length (); id += PRAGMA_FIRST_EXTERNAL - 1; - /* The C++ front end allocates 8 bits in cp_token; the C front end - allocates 8 bits in c_token. At present this is sufficient. */ + /* The C front end allocates 8 bits in c_token. The C++ front end + keeps the pragma kind in the form of INTEGER_CST, so no small + limit applies. At present this is sufficient. */ gcc_assert (id < 256); } diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index bd7a8dd272e..925034b626c 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -119,6 +119,10 @@ aarch64_types_unopu_qualifiers[SIMD_MAX_BUILTIN_ARGS] = { qualifier_unsigned, qualifier_unsigned }; #define TYPES_UNOPU (aarch64_types_unopu_qualifiers) static enum aarch64_type_qualifiers +aarch64_types_unopus_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_unsigned, qualifier_none }; +#define TYPES_UNOPUS (aarch64_types_unopus_qualifiers) +static enum aarch64_type_qualifiers aarch64_types_binop_qualifiers[SIMD_MAX_BUILTIN_ARGS] = { qualifier_none, qualifier_none, qualifier_maybe_immediate }; #define TYPES_BINOP (aarch64_types_binop_qualifiers) diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index c780ada6942..dd045792b21 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -275,9 +275,9 @@ VAR1 (UNOP, lbtruncv4sf, 2, v4si) VAR1 (UNOP, lbtruncv2df, 2, v2di) - VAR1 (UNOP, lbtruncuv2sf, 2, v2si) - VAR1 (UNOP, lbtruncuv4sf, 2, v4si) - VAR1 (UNOP, lbtruncuv2df, 2, v2di) + VAR1 (UNOPUS, lbtruncuv2sf, 2, v2si) + VAR1 (UNOPUS, lbtruncuv4sf, 2, v4si) + VAR1 (UNOPUS, lbtruncuv2df, 2, v2di) VAR1 (UNOP, lroundv2sf, 2, v2si) VAR1 (UNOP, lroundv4sf, 2, v4si) @@ -286,31 +286,31 @@ VAR1 (UNOP, lroundsf, 2, si) VAR1 (UNOP, lrounddf, 2, di) - VAR1 (UNOP, lrounduv2sf, 2, v2si) - VAR1 (UNOP, lrounduv4sf, 2, v4si) - VAR1 (UNOP, lrounduv2df, 2, v2di) - VAR1 (UNOP, lroundusf, 2, si) - VAR1 (UNOP, lroundudf, 2, di) + VAR1 (UNOPUS, lrounduv2sf, 2, v2si) + VAR1 (UNOPUS, lrounduv4sf, 2, v4si) + VAR1 (UNOPUS, lrounduv2df, 2, v2di) + VAR1 (UNOPUS, lroundusf, 2, si) + VAR1 (UNOPUS, lroundudf, 2, di) VAR1 (UNOP, lceilv2sf, 2, v2si) VAR1 (UNOP, lceilv4sf, 2, v4si) VAR1 (UNOP, lceilv2df, 2, v2di) - VAR1 (UNOP, lceiluv2sf, 2, v2si) - VAR1 (UNOP, lceiluv4sf, 2, v4si) - VAR1 (UNOP, lceiluv2df, 2, v2di) - VAR1 (UNOP, lceilusf, 2, si) - VAR1 (UNOP, lceiludf, 2, di) + VAR1 (UNOPUS, lceiluv2sf, 2, v2si) + VAR1 (UNOPUS, lceiluv4sf, 2, v4si) + VAR1 (UNOPUS, lceiluv2df, 2, v2di) + VAR1 (UNOPUS, lceilusf, 2, si) + VAR1 (UNOPUS, lceiludf, 2, di) VAR1 (UNOP, lfloorv2sf, 2, v2si) VAR1 (UNOP, lfloorv4sf, 2, v4si) VAR1 (UNOP, lfloorv2df, 2, v2di) - VAR1 (UNOP, lflooruv2sf, 2, v2si) - VAR1 (UNOP, lflooruv4sf, 2, v4si) - VAR1 (UNOP, lflooruv2df, 2, v2di) - VAR1 (UNOP, lfloorusf, 2, si) - VAR1 (UNOP, lfloorudf, 2, di) + VAR1 (UNOPUS, lflooruv2sf, 2, v2si) + VAR1 (UNOPUS, lflooruv4sf, 2, v4si) + VAR1 (UNOPUS, lflooruv2df, 2, v2di) + VAR1 (UNOPUS, lfloorusf, 2, si) + VAR1 (UNOPUS, lfloorudf, 2, di) VAR1 (UNOP, lfrintnv2sf, 2, v2si) VAR1 (UNOP, lfrintnv4sf, 2, v4si) @@ -318,11 +318,11 @@ VAR1 (UNOP, lfrintnsf, 2, si) VAR1 (UNOP, lfrintndf, 2, di) - VAR1 (UNOP, lfrintnuv2sf, 2, v2si) - VAR1 (UNOP, lfrintnuv4sf, 2, v4si) - VAR1 (UNOP, lfrintnuv2df, 2, v2di) - VAR1 (UNOP, lfrintnusf, 2, si) - VAR1 (UNOP, lfrintnudf, 2, di) + VAR1 (UNOPUS, lfrintnuv2sf, 2, v2si) + VAR1 (UNOPUS, lfrintnuv4sf, 2, v4si) + VAR1 (UNOPUS, lfrintnuv2df, 2, v2di) + VAR1 (UNOPUS, lfrintnusf, 2, si) + VAR1 (UNOPUS, lfrintnudf, 2, di) /* Implemented by 2. */ VAR1 (UNOP, floatv2si, 2, v2sf) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 6853b0abebd..73ef7e5a554 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -6145,6 +6145,12 @@ aarch64_if_then_else_costs (rtx op0, rtx op1, rtx op2, int *cost, bool speed) || GET_CODE (op1) == NOT || (GET_CODE (op1) == PLUS && XEXP (op1, 1) == const1_rtx)) op1 = XEXP (op1, 0); + else if (GET_CODE (op1) == ZERO_EXTEND && GET_CODE (op2) == ZERO_EXTEND) + { + /* CSEL with zero-extension (*cmovdi_insn_uxtw). */ + op1 = XEXP (op1, 0); + op2 = XEXP (op2, 0); + } *cost += rtx_cost (op1, VOIDmode, IF_THEN_ELSE, 1, speed); *cost += rtx_cost (op2, VOIDmode, IF_THEN_ELSE, 2, speed); @@ -6490,6 +6496,23 @@ aarch64_rtx_costs (rtx x, machine_mode mode, int outer ATTRIBUTE_UNUSED, goto cost_minus; } + if (GET_CODE (op0) == ZERO_EXTRACT && op1 == const0_rtx + && GET_MODE (x) == CC_NZmode && CONST_INT_P (XEXP (op0, 1)) + && CONST_INT_P (XEXP (op0, 2))) + { + /* COMPARE of ZERO_EXTRACT form of TST-immediate. + Handle it here directly rather than going to cost_logic + since we know the immediate generated for the TST is valid + so we can avoid creating an intermediate rtx for it only + for costing purposes. */ + if (speed) + *cost += extra_cost->alu.logical; + + *cost += rtx_cost (XEXP (op0, 0), GET_MODE (op0), + ZERO_EXTRACT, 0, speed); + return true; + } + if (GET_CODE (op1) == NEG) { /* CMN. */ @@ -8898,6 +8921,7 @@ aarch64_process_one_target_attr (char *arg_str, const char* pragma_or_attr) arg++; } const struct aarch64_attribute_info *p_attr; + bool found = false; for (p_attr = aarch64_attributes; p_attr->name; p_attr++) { /* If the names don't match up, or the user has given an argument @@ -8906,6 +8930,7 @@ aarch64_process_one_target_attr (char *arg_str, const char* pragma_or_attr) if (strcmp (str_to_check, p_attr->name) != 0) continue; + found = true; bool attr_need_arg_p = p_attr->attr_type == aarch64_attr_custom || p_attr->attr_type == aarch64_attr_enum; @@ -8985,7 +9010,10 @@ aarch64_process_one_target_attr (char *arg_str, const char* pragma_or_attr) } } - return true; + /* If we reached here we either have found an attribute and validated + it or didn't match any. If we matched an attribute but its arguments + were malformed we will have returned false already. */ + return found; } /* Count how many times the character C appears in diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index 4f53f7d0f06..1334d64c7b4 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -13203,9 +13203,7 @@ vcvt_s32_f32 (float32x2_t __a) __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) vcvt_u32_f32 (float32x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x2_t) __builtin_aarch64_lbtruncuv2sfv2si (__a); + return __builtin_aarch64_lbtruncuv2sfv2si_us (__a); } __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) @@ -13217,9 +13215,7 @@ vcvtq_s32_f32 (float32x4_t __a) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) vcvtq_u32_f32 (float32x4_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x4_t) __builtin_aarch64_lbtruncuv4sfv4si (__a); + return __builtin_aarch64_lbtruncuv4sfv4si_us (__a); } __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) @@ -13231,9 +13227,7 @@ vcvtq_s64_f64 (float64x2_t __a) __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) vcvtq_u64_f64 (float64x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint64x2_t) __builtin_aarch64_lbtruncuv2dfv2di (__a); + return __builtin_aarch64_lbtruncuv2dfv2di_us (__a); } /* vcvta */ @@ -13247,7 +13241,7 @@ vcvtad_s64_f64 (float64_t __a) __extension__ static __inline uint64_t __attribute__ ((__always_inline__)) vcvtad_u64_f64 (float64_t __a) { - return __builtin_aarch64_lroundudfdi (__a); + return __builtin_aarch64_lroundudfdi_us (__a); } __extension__ static __inline int32_t __attribute__ ((__always_inline__)) @@ -13259,7 +13253,7 @@ vcvtas_s32_f32 (float32_t __a) __extension__ static __inline uint32_t __attribute__ ((__always_inline__)) vcvtas_u32_f32 (float32_t __a) { - return __builtin_aarch64_lroundusfsi (__a); + return __builtin_aarch64_lroundusfsi_us (__a); } __extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) @@ -13271,9 +13265,7 @@ vcvta_s32_f32 (float32x2_t __a) __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) vcvta_u32_f32 (float32x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x2_t) __builtin_aarch64_lrounduv2sfv2si (__a); + return __builtin_aarch64_lrounduv2sfv2si_us (__a); } __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) @@ -13285,9 +13277,7 @@ vcvtaq_s32_f32 (float32x4_t __a) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) vcvtaq_u32_f32 (float32x4_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x4_t) __builtin_aarch64_lrounduv4sfv4si (__a); + return __builtin_aarch64_lrounduv4sfv4si_us (__a); } __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) @@ -13299,9 +13289,7 @@ vcvtaq_s64_f64 (float64x2_t __a) __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) vcvtaq_u64_f64 (float64x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint64x2_t) __builtin_aarch64_lrounduv2dfv2di (__a); + return __builtin_aarch64_lrounduv2dfv2di_us (__a); } /* vcvtm */ @@ -13315,7 +13303,7 @@ vcvtmd_s64_f64 (float64_t __a) __extension__ static __inline uint64_t __attribute__ ((__always_inline__)) vcvtmd_u64_f64 (float64_t __a) { - return __builtin_aarch64_lfloorudfdi (__a); + return __builtin_aarch64_lfloorudfdi_us (__a); } __extension__ static __inline int32_t __attribute__ ((__always_inline__)) @@ -13327,7 +13315,7 @@ vcvtms_s32_f32 (float32_t __a) __extension__ static __inline uint32_t __attribute__ ((__always_inline__)) vcvtms_u32_f32 (float32_t __a) { - return __builtin_aarch64_lfloorusfsi (__a); + return __builtin_aarch64_lfloorusfsi_us (__a); } __extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) @@ -13339,9 +13327,7 @@ vcvtm_s32_f32 (float32x2_t __a) __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) vcvtm_u32_f32 (float32x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x2_t) __builtin_aarch64_lflooruv2sfv2si (__a); + return __builtin_aarch64_lflooruv2sfv2si_us (__a); } __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) @@ -13353,9 +13339,7 @@ vcvtmq_s32_f32 (float32x4_t __a) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) vcvtmq_u32_f32 (float32x4_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x4_t) __builtin_aarch64_lflooruv4sfv4si (__a); + return __builtin_aarch64_lflooruv4sfv4si_us (__a); } __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) @@ -13367,9 +13351,7 @@ vcvtmq_s64_f64 (float64x2_t __a) __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) vcvtmq_u64_f64 (float64x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint64x2_t) __builtin_aarch64_lflooruv2dfv2di (__a); + return __builtin_aarch64_lflooruv2dfv2di_us (__a); } /* vcvtn */ @@ -13383,7 +13365,7 @@ vcvtnd_s64_f64 (float64_t __a) __extension__ static __inline uint64_t __attribute__ ((__always_inline__)) vcvtnd_u64_f64 (float64_t __a) { - return __builtin_aarch64_lfrintnudfdi (__a); + return __builtin_aarch64_lfrintnudfdi_us (__a); } __extension__ static __inline int32_t __attribute__ ((__always_inline__)) @@ -13395,7 +13377,7 @@ vcvtns_s32_f32 (float32_t __a) __extension__ static __inline uint32_t __attribute__ ((__always_inline__)) vcvtns_u32_f32 (float32_t __a) { - return __builtin_aarch64_lfrintnusfsi (__a); + return __builtin_aarch64_lfrintnusfsi_us (__a); } __extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) @@ -13407,9 +13389,7 @@ vcvtn_s32_f32 (float32x2_t __a) __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) vcvtn_u32_f32 (float32x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x2_t) __builtin_aarch64_lfrintnuv2sfv2si (__a); + return __builtin_aarch64_lfrintnuv2sfv2si_us (__a); } __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) @@ -13421,9 +13401,7 @@ vcvtnq_s32_f32 (float32x4_t __a) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) vcvtnq_u32_f32 (float32x4_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x4_t) __builtin_aarch64_lfrintnuv4sfv4si (__a); + return __builtin_aarch64_lfrintnuv4sfv4si_us (__a); } __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) @@ -13435,9 +13413,7 @@ vcvtnq_s64_f64 (float64x2_t __a) __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) vcvtnq_u64_f64 (float64x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint64x2_t) __builtin_aarch64_lfrintnuv2dfv2di (__a); + return __builtin_aarch64_lfrintnuv2dfv2di_us (__a); } /* vcvtp */ @@ -13451,7 +13427,7 @@ vcvtpd_s64_f64 (float64_t __a) __extension__ static __inline uint64_t __attribute__ ((__always_inline__)) vcvtpd_u64_f64 (float64_t __a) { - return __builtin_aarch64_lceiludfdi (__a); + return __builtin_aarch64_lceiludfdi_us (__a); } __extension__ static __inline int32_t __attribute__ ((__always_inline__)) @@ -13463,7 +13439,7 @@ vcvtps_s32_f32 (float32_t __a) __extension__ static __inline uint32_t __attribute__ ((__always_inline__)) vcvtps_u32_f32 (float32_t __a) { - return __builtin_aarch64_lceilusfsi (__a); + return __builtin_aarch64_lceilusfsi_us (__a); } __extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) @@ -13475,9 +13451,7 @@ vcvtp_s32_f32 (float32x2_t __a) __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) vcvtp_u32_f32 (float32x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x2_t) __builtin_aarch64_lceiluv2sfv2si (__a); + return __builtin_aarch64_lceiluv2sfv2si_us (__a); } __extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) @@ -13489,9 +13463,7 @@ vcvtpq_s32_f32 (float32x4_t __a) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) vcvtpq_u32_f32 (float32x4_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint32x4_t) __builtin_aarch64_lceiluv4sfv4si (__a); + return __builtin_aarch64_lceiluv4sfv4si_us (__a); } __extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) @@ -13503,9 +13475,7 @@ vcvtpq_s64_f64 (float64x2_t __a) __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) vcvtpq_u64_f64 (float64x2_t __a) { - /* TODO: This cast should go away when builtins have - their correct types. */ - return (uint64x2_t) __builtin_aarch64_lceiluv2dfv2di (__a); + return __builtin_aarch64_lceiluv2dfv2di_us (__a); } /* vdup_n */ diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 1bbaa4a2b02..f152afa4019 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -17206,7 +17206,7 @@ thumb1_reorg (void) FOR_EACH_BB_FN (bb, cfun) { rtx dest, src; - rtx pat, op0, set = NULL; + rtx cmp, op0, op1, set = NULL; rtx_insn *prev, *insn = BB_END (bb); bool insn_clobbered = false; @@ -17219,8 +17219,13 @@ thumb1_reorg (void) continue; /* Get the register with which we are comparing. */ - pat = PATTERN (insn); - op0 = XEXP (XEXP (SET_SRC (pat), 0), 0); + cmp = XEXP (SET_SRC (PATTERN (insn)), 0); + op0 = XEXP (cmp, 0); + op1 = XEXP (cmp, 1); + + /* Check that comparison is against ZERO. */ + if (!CONST_INT_P (op1) || INTVAL (op1) != 0) + continue; /* Find the first flag setting insn before INSN in basic block BB. */ gcc_assert (insn != BB_HEAD (bb)); @@ -17260,7 +17265,7 @@ thumb1_reorg (void) PATTERN (prev) = gen_rtx_SET (dest, src); INSN_CODE (prev) = -1; /* Set test register in INSN to dest. */ - XEXP (XEXP (SET_SRC (pat), 0), 0) = copy_rtx (dest); + XEXP (cmp, 0) = copy_rtx (dest); INSN_CODE (insn) = -1; } } diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index ff976dd937e..92d8ee1a88f 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2815,7 +2815,11 @@ scalar_to_vector_candidate_p (rtx_insn *insn) return false; } - if (!REG_P (XEXP (src, 0)) && !MEM_P (XEXP (src, 0))) + if (!REG_P (XEXP (src, 0)) && !MEM_P (XEXP (src, 0)) + /* Check for andnot case. */ + && (GET_CODE (src) != AND + || GET_CODE (XEXP (src, 0)) != NOT + || !REG_P (XEXP (XEXP (src, 0), 0)))) return false; if (!REG_P (XEXP (src, 1)) && !MEM_P (XEXP (src, 1))) @@ -3383,7 +3387,12 @@ scalar_chain::convert_op (rtx *op, rtx_insn *insn) { *op = copy_rtx_if_shared (*op); - if (MEM_P (*op)) + if (GET_CODE (*op) == NOT) + { + convert_op (&XEXP (*op, 0), insn); + PUT_MODE (*op, V2DImode); + } + else if (MEM_P (*op)) { rtx tmp = gen_reg_rtx (DImode); diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 71941d05091..f16b42ab884 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -8645,6 +8645,23 @@ (clobber (reg:CC FLAGS_REG))])] "split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);") +(define_insn_and_split "*andndi3_doubleword" + [(set (match_operand:DI 0 "register_operand" "=r,r") + (and:DI + (not:DI (match_operand:DI 1 "register_operand" "r,r")) + (match_operand:DI 2 "nonimmediate_operand" "r,m"))) + (clobber (reg:CC FLAGS_REG))] + "TARGET_BMI && !TARGET_64BIT && TARGET_STV && TARGET_SSE" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (and:SI (not:SI (match_dup 1)) (match_dup 2))) + (clobber (reg:CC FLAGS_REG))]) + (parallel [(set (match_dup 3) + (and:SI (not:SI (match_dup 4)) (match_dup 5))) + (clobber (reg:CC FLAGS_REG))])] + "split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);") + (define_insn "*hi_1" [(set (match_operand:HI 0 "nonimmediate_operand" "=r,rm,!k") (any_or:HI diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 3097a416668..803ab98e760 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -1014,9 +1014,10 @@ struct mips_cpu_info { #define ISA_HAS_LXC1_SXC1 ISA_HAS_FP4 /* ISA has paired-single instructions. */ -#define ISA_HAS_PAIRED_SINGLE (ISA_MIPS64 \ - || (mips_isa_rev >= 2 \ - && mips_isa_rev <= 5)) +#define ISA_HAS_PAIRED_SINGLE ((ISA_MIPS64 \ + || (mips_isa_rev >= 2 \ + && mips_isa_rev <= 5)) \ + && !TARGET_OCTEON) /* ISA has conditional trap instructions. */ #define ISA_HAS_COND_TRAP (!ISA_MIPS1 \ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0ad384a74ab..9325bb0bf3c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,48 @@ +2016-01-18 Jason Merrill + + * cp-gimplify.c (cp_fold) [CONSTRUCTOR]: Don't clobber the input. + + * cp-gimplify.c (cp_fold): Remove unnecessary special cases. + + PR c++/68767 + * cp-gimplify.c (cp_fold) [COND_EXPR]: Simplify. Do fold COND_EXPR. + (contains_label_1, contains_label_p): Remove. + +2016-01-16 Patrick Palka + + PR c++/69091 + * pt.c (type_dependent_expression_p): For a function template + specialization, a type is dependent iff any of its template + arguments are. + +2016-01-16 Patrick Palka + + * cp-array-notation.c (cp_expand_cond_array_notations): Return + error_mark_node only if find_rank failed, not if it was + successful. + +2016-01-16 Patrick Palka + + PR c++/68936 + * tree.c (build_min_non_dep_call_vec): Don't retain the + KOENIG_LOOKUP_P flag of the non-dependent expression that's + been built. + (build_min_non_dep_op_overload): Instead, do it here. + +2016-01-15 Jakub Jelinek + + PR bootstrap/68271 + * parser.h (cp_token): Remove pragma_kind field. Add comment + with number of unused bits. + * parser.c (eof_token): Remove pragma_kind field initializer. + (cp_lexer_get_preprocessor_token): Don't set pragma_kind + field, don't clear CPP_PRAGMA u.value. + (cp_parser_pragma_kind): New function. + (cp_parser_omp_sections_scope, cp_parser_oacc_kernels_parallel, + cp_parser_omp_construct, cp_parser_initial_pragma, + cp_parser_pragma): Use cp_parser_pragma_kind instead of accessing + pragma_kind field. + 2016-01-15 Jason Merrill PR c++/68847 diff --git a/gcc/cp/cp-array-notation.c b/gcc/cp/cp-array-notation.c index f7a45985798..4687ced6729 100644 --- a/gcc/cp/cp-array-notation.c +++ b/gcc/cp/cp-array-notation.c @@ -807,8 +807,8 @@ cp_expand_cond_array_notations (tree orig_stmt) if (!find_rank (EXPR_LOCATION (cond), cond, cond, true, &cond_rank) || !find_rank (EXPR_LOCATION (yes_expr), yes_expr, yes_expr, true, &yes_rank) - || find_rank (EXPR_LOCATION (no_expr), no_expr, no_expr, true, - &no_rank)) + || !find_rank (EXPR_LOCATION (no_expr), no_expr, no_expr, true, + &no_rank)) return error_mark_node; /* If the condition has a zero rank, then handle array notations in body separately. */ diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index c0ee8e43466..5c4d3c1bb1f 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -1851,38 +1851,6 @@ cxx_omp_disregard_value_expr (tree decl, bool shared) && DECL_OMP_PRIVATIZED_MEMBER (decl); } -/* Callback for walk_tree, looking for LABEL_EXPR. Return *TP if it is - a LABEL_EXPR; otherwise return NULL_TREE. Do not check the subtrees - of GOTO_EXPR. */ - -static tree -contains_label_1 (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) -{ - switch (TREE_CODE (*tp)) - { - case LABEL_EXPR: - return *tp; - - case GOTO_EXPR: - *walk_subtrees = 0; - - /* ... fall through ... */ - - default: - return NULL_TREE; - } -} - -/* Return whether the sub-tree ST contains a label which is accessible from - outside the sub-tree. */ - -static bool -contains_label_p (tree st) -{ - return - walk_tree_without_duplicates (&st, contains_label_1 , NULL) != NULL_TREE; -} - /* Perform folding on expression X. */ tree @@ -1974,19 +1942,8 @@ cp_fold (tree x) if (VOID_TYPE_P (TREE_TYPE (x))) return x; - if (!TREE_OPERAND (x, 0) - || TREE_CODE (TREE_OPERAND (x, 0)) == NON_LVALUE_EXPR) - return x; - loc = EXPR_LOCATION (x); - op0 = TREE_OPERAND (x, 0); - - if (TREE_CODE (x) == NOP_EXPR - && TREE_OVERFLOW_P (op0) - && TREE_TYPE (x) == TREE_TYPE (op0)) - return x; - - op0 = cp_fold_maybe_rvalue (op0, rval_ops); + op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops); if (op0 != TREE_OPERAND (x, 0)) x = fold_build1_loc (loc, code, TREE_TYPE (x), op0); @@ -2032,16 +1989,6 @@ cp_fold (tree x) case POSTDECREMENT_EXPR: case POSTINCREMENT_EXPR: case INIT_EXPR: - - loc = EXPR_LOCATION (x); - op0 = cp_fold (TREE_OPERAND (x, 0)); - op1 = cp_fold_rvalue (TREE_OPERAND (x, 1)); - - if (TREE_OPERAND (x, 0) != op0 || TREE_OPERAND (x, 1) != op1) - x = build2_loc (loc, code, TREE_TYPE (x), op0, op1); - - break; - case PREDECREMENT_EXPR: case PREINCREMENT_EXPR: case COMPOUND_EXPR: @@ -2086,78 +2033,33 @@ cp_fold (tree x) loc = EXPR_LOCATION (x); op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops); op1 = cp_fold_rvalue (TREE_OPERAND (x, 1)); - if ((code == COMPOUND_EXPR || code == MODIFY_EXPR) - && ((op1 && TREE_SIDE_EFFECTS (op1)) - || (op0 && TREE_SIDE_EFFECTS (op0)))) - { - if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1)) - x = build2_loc (loc, code, TREE_TYPE (x), op0, op1); - break; - } - if (TREE_CODE (x) == COMPOUND_EXPR && !op0) - op0 = build_empty_stmt (loc); if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1)) x = fold_build2_loc (loc, code, TREE_TYPE (x), op0, op1); else x = fold (x); - if (TREE_CODE (x) == COMPOUND_EXPR && TREE_OPERAND (x, 0) == NULL_TREE - && TREE_OPERAND (x, 1)) - return TREE_OPERAND (x, 1); break; case VEC_COND_EXPR: case COND_EXPR: + /* Don't bother folding a void condition, since it can't produce a + constant value. Also, some statement-level uses of COND_EXPR leave + one of the branches NULL, so folding would crash. */ + if (VOID_TYPE_P (TREE_TYPE (x))) + return x; + loc = EXPR_LOCATION (x); op0 = cp_fold_rvalue (TREE_OPERAND (x, 0)); - - if (TREE_SIDE_EFFECTS (op0)) - break; - op1 = cp_fold (TREE_OPERAND (x, 1)); op2 = cp_fold (TREE_OPERAND (x, 2)); - if (TREE_CODE (op0) == INTEGER_CST) - { - tree un; - - if (integer_zerop (op0)) - { - un = op1; - r = op2; - } - else - { - un = op2; - r = op1; - } - - if ((!TREE_SIDE_EFFECTS (un) || !contains_label_p (un)) - && (! VOID_TYPE_P (TREE_TYPE (r)) || VOID_TYPE_P (x))) - { - if (CAN_HAVE_LOCATION_P (r) - && EXPR_LOCATION (r) != loc - && !(TREE_CODE (r) == SAVE_EXPR - || TREE_CODE (r) == TARGET_EXPR - || TREE_CODE (r) == BIND_EXPR)) - { - r = copy_node (r); - SET_EXPR_LOCATION (r, loc); - } - x = r; - } - - break; - } - - if (VOID_TYPE_P (TREE_TYPE (x))) - break; - - x = build3_loc (loc, code, TREE_TYPE (x), op0, op1, op2); - - if (code != COND_EXPR) + if (op0 != TREE_OPERAND (x, 0) + || op1 != TREE_OPERAND (x, 1) + || op2 != TREE_OPERAND (x, 2)) + x = fold_build3_loc (loc, code, TREE_TYPE (x), op0, op1, op2); + else x = fold (x); break; @@ -2223,9 +2125,22 @@ cp_fold (tree x) { unsigned i; constructor_elt *p; + bool changed = false; vec *elts = CONSTRUCTOR_ELTS (x); + vec *nelts = NULL; + vec_safe_reserve (nelts, vec_safe_length (elts)); FOR_EACH_VEC_SAFE_ELT (elts, i, p) - p->value = cp_fold (p->value); + { + tree op = cp_fold (p->value); + constructor_elt e = { p->index, op }; + nelts->quick_push (e); + if (op != p->value) + changed = true; + } + if (changed) + x = build_constructor (TREE_TYPE (x), nelts); + else + vec_free (nelts); break; } case TREE_VEC: diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index f2d49a1bbde..8dd7e498f7f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -48,7 +48,7 @@ along with GCC; see the file COPYING3. If not see static cp_token eof_token = { - CPP_EOF, RID_MAX, 0, PRAGMA_NONE, false, false, false, 0, { NULL } + CPP_EOF, RID_MAX, 0, false, false, false, 0, { NULL } }; /* The various kinds of non integral constant we encounter. */ @@ -782,7 +782,6 @@ cp_lexer_get_preprocessor_token (cp_lexer *lexer, cp_token *token) = c_lex_with_flags (&token->u.value, &token->location, &token->flags, lexer == NULL ? 0 : C_LEX_STRING_NO_JOIN); token->keyword = RID_MAX; - token->pragma_kind = PRAGMA_NONE; token->purged_p = false; token->error_reported = false; @@ -848,13 +847,6 @@ cp_lexer_get_preprocessor_token (cp_lexer *lexer, cp_token *token) default: token->keyword = C_RID_CODE (token->u.value); } } - else if (token->type == CPP_PRAGMA) - { - /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST. */ - token->pragma_kind = ((enum pragma_kind) - TREE_INT_CST_LOW (token->u.value)); - token->u.value = NULL_TREE; - } } /* Update the globals input_location and the input file stack from TOKEN. */ @@ -2689,6 +2681,18 @@ cp_parser_is_keyword (cp_token* token, enum rid keyword) return token->keyword == keyword; } +/* Return TOKEN's pragma_kind if it is CPP_PRAGMA, otherwise + PRAGMA_NONE. */ + +static enum pragma_kind +cp_parser_pragma_kind (cp_token *token) +{ + if (token->type != CPP_PRAGMA) + return PRAGMA_NONE; + /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST. */ + return (enum pragma_kind) TREE_INT_CST_LOW (token->u.value); +} + /* Helper function for cp_parser_error. Having peeked a token of kind TOK1_KIND that might signify a conflict marker, peek successor tokens to determine @@ -33937,7 +33941,8 @@ cp_parser_omp_sections_scope (cp_parser *parser) stmt = push_stmt_list (); - if (cp_lexer_peek_token (parser->lexer)->pragma_kind != PRAGMA_OMP_SECTION) + if (cp_parser_pragma_kind (cp_lexer_peek_token (parser->lexer)) + != PRAGMA_OMP_SECTION) { substmt = cp_parser_omp_structured_block (parser); substmt = build1 (OMP_SECTION, void_type_node, substmt); @@ -33952,7 +33957,7 @@ cp_parser_omp_sections_scope (cp_parser *parser) if (tok->type == CPP_EOF) break; - if (tok->pragma_kind == PRAGMA_OMP_SECTION) + if (cp_parser_pragma_kind (tok) == PRAGMA_OMP_SECTION) { cp_lexer_consume_token (parser->lexer); cp_parser_require_pragma_eol (parser, tok); @@ -35356,7 +35361,7 @@ cp_parser_oacc_kernels_parallel (cp_parser *parser, cp_token *pragma_tok, { omp_clause_mask mask; enum tree_code code; - switch (pragma_tok->pragma_kind) + switch (cp_parser_pragma_kind (pragma_tok)) { case PRAGMA_OACC_KERNELS: strcat (p_name, " kernels"); @@ -36572,7 +36577,7 @@ cp_parser_omp_construct (cp_parser *parser, cp_token *pragma_tok) char p_name[sizeof "#pragma omp teams distribute parallel for simd"]; omp_clause_mask mask (0); - switch (pragma_tok->pragma_kind) + switch (cp_parser_pragma_kind (pragma_tok)) { case PRAGMA_OACC_ATOMIC: cp_parser_omp_atomic (parser, pragma_tok); @@ -36971,7 +36976,7 @@ cp_parser_initial_pragma (cp_token *first_token) tree name = NULL; cp_lexer_get_preprocessor_token (NULL, first_token); - if (first_token->pragma_kind != PRAGMA_GCC_PCH_PREPROCESS) + if (cp_parser_pragma_kind (first_token) != PRAGMA_GCC_PCH_PREPROCESS) return; cp_lexer_get_preprocessor_token (NULL, first_token); @@ -37046,7 +37051,7 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context) gcc_assert (pragma_tok->type == CPP_PRAGMA); parser->lexer->in_pragma = true; - id = pragma_tok->pragma_kind; + id = cp_parser_pragma_kind (pragma_tok); if (id != PRAGMA_OMP_DECLARE_REDUCTION && id != PRAGMA_OACC_ROUTINE) cp_ensure_no_omp_declare_simd (parser); switch (id) diff --git a/gcc/cp/parser.h b/gcc/cp/parser.h index 4396e331287..ccbace9e0bf 100644 --- a/gcc/cp/parser.h +++ b/gcc/cp/parser.h @@ -47,8 +47,6 @@ struct GTY (()) cp_token { ENUM_BITFIELD (rid) keyword : 8; /* Token flags. */ unsigned char flags; - /* Identifier for the pragma. */ - ENUM_BITFIELD (pragma_kind) pragma_kind : 8; /* True if this token is from a context where it is implicitly extern "C" */ BOOL_BITFIELD implicit_extern_c : 1; /* True if an error has already been reported for this token, such as a @@ -59,6 +57,7 @@ struct GTY (()) cp_token { it is no longer a valid token and it should be considered deleted. */ BOOL_BITFIELD purged_p : 1; + /* 5 unused bits. */ /* The location at which this token was found. */ location_t location; /* The value associated with this token, if any. */ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index edec774a0c9..403c5ac0bea 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -22759,12 +22759,12 @@ type_dependent_expression_p (tree expression) || dependent_scope_p (scope)); } + /* A function template specialization is type-dependent if it has any + dependent template arguments. */ if (TREE_CODE (expression) == FUNCTION_DECL && DECL_LANG_SPECIFIC (expression) - && DECL_TEMPLATE_INFO (expression) - && (any_dependent_template_arguments_p - (INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression))))) - return true; + && DECL_TEMPLATE_INFO (expression)) + return any_dependent_template_arguments_p (DECL_TI_ARGS (expression)); if (TREE_CODE (expression) == TEMPLATE_DECL && !DECL_TEMPLATE_TEMPLATE_PARM_P (expression)) diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index e918252bb1b..d4cf3102a03 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2747,7 +2747,6 @@ build_min_non_dep_call_vec (tree non_dep, tree fn, vec *argvec) non_dep = TREE_OPERAND (non_dep, 0); TREE_TYPE (t) = TREE_TYPE (non_dep); TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (non_dep); - KOENIG_LOOKUP_P (t) = KOENIG_LOOKUP_P (non_dep); return convert_from_reference (t); } @@ -2810,6 +2809,11 @@ build_min_non_dep_op_overload (enum tree_code op, call = build_min_non_dep_call_vec (non_dep, fn, args); release_tree_vector (args); + tree call_expr = call; + if (REFERENCE_REF_P (call_expr)) + call_expr = TREE_OPERAND (call_expr, 0); + KOENIG_LOOKUP_P (call_expr) = KOENIG_LOOKUP_P (non_dep); + return call; } diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c index 3ef00525ed8..e32325486af 100644 --- a/gcc/diagnostic-show-locus.c +++ b/gcc/diagnostic-show-locus.c @@ -524,14 +524,13 @@ layout::print_source_line (int row, line_bounds *lbounds_out) if (!line) return false; - line += m_x_offset; - m_colorizer.set_normal_text (); /* We will stop printing the source line at any trailing whitespace. */ line_width = get_line_width_without_trailing_whitespace (line, line_width); + line += m_x_offset; pp_space (m_pp); int first_non_ws = INT_MAX; diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 6ce2f9e6f5c..2d5561d00ac 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -140,6 +140,7 @@ only one of these two forms, whichever one is not the default. * Warning Options:: How picky should the compiler be? * Debugging Options:: Symbol tables, measurements, and debugging dumps. * Optimize Options:: How much optimization? +* Instrumentation Options:: Enabling profiling and extra run-time error checking. * Preprocessor Options:: Controlling header files and macro definitions. Also, getting dependency information for Make. * Assembler Options:: Passing options to the assembler. @@ -203,8 +204,6 @@ in the following sections. -fno-threadsafe-statics -fuse-cxa-atexit @gol -fno-weak -nostdinc++ @gol -fvisibility-inlines-hidden @gol --fvtable-verify=@r{[}std@r{|}preinit@r{|}none@r{]} @gol --fvtv-counts -fvtv-debug @gol -fvisibility-ms-compat @gol -fext-numeric-literals @gol -Wabi=@var{n} -Wabi-tag -Wconversion-null -Wctor-dtor-privacy @gol @@ -316,19 +315,7 @@ Objective-C and Objective-C++ Dialects}. @item Debugging Options @xref{Debugging Options,,Options for Debugging Your Program or GCC}. @gccoptlist{-d@var{letters} -dumpspecs -dumpmachine -dumpversion @gol --fsanitize=@var{style} -fsanitize-recover -fsanitize-recover=@var{style} @gol --fasan-shadow-offset=@var{number} -fsanitize-sections=@var{s1},@var{s2},... @gol --fsanitize-undefined-trap-on-error @gol --fcheck-pointer-bounds -fchecking -fchkp-check-incomplete-type @gol --fchkp-first-field-has-own-bounds -fchkp-narrow-bounds @gol --fchkp-narrow-to-innermost-array -fchkp-optimize @gol --fchkp-use-fast-string-functions -fchkp-use-nochk-string-functions @gol --fchkp-use-static-bounds -fchkp-use-static-const-bounds @gol --fchkp-treat-zero-dynamic-size-as-infinite -fchkp-check-read @gol --fchkp-check-read -fchkp-check-write -fchkp-store-bounds @gol --fchkp-instrument-calls -fchkp-instrument-marked-only @gol --fchkp-use-wrappers @gol --fdbg-cnt-list -fdbg-cnt=@var{counter-value-list} @gol +-fchecking -fdbg-cnt-list -fdbg-cnt=@var{counter-value-list} @gol -fdisable-ipa-@var{pass_name} @gol -fdisable-rtl-@var{pass_name} @gol -fdisable-rtl-@var{pass-name}=@var{range-list} @gol @@ -370,12 +357,13 @@ Objective-C and Objective-C++ Dialects}. -fenable-@var{kind}-@var{pass} @gol -fenable-@var{kind}-@var{pass}=@var{range-list} @gol -fdebug-types-section -fmem-report-wpa @gol --fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report -fprofile-arcs @gol +-fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report @gol -fopt-info @gol -fopt-info-@var{options}@r{[}=@var{file}@r{]} @gol +-fprofile-report @gol -frandom-seed=@var{string} -fsched-verbose=@var{n} @gol -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose @gol --fstack-usage -ftest-coverage -ftime-report -fvar-tracking @gol +-fstack-usage -ftime-report -fvar-tracking @gol -fvar-tracking-assignments -fvar-tracking-assignments-toggle @gol -g -g@var{level} -gtoggle -gcoff -gdwarf-@var{version} @gol -ggdb -grecord-gcc-switches -gno-record-gcc-switches @gol @@ -385,7 +373,7 @@ Objective-C and Objective-C++ Dialects}. -fdebug-prefix-map=@var{old}=@var{new} @gol -femit-struct-debug-baseonly -femit-struct-debug-reduced @gol -femit-struct-debug-detailed@r{[}=@var{spec-list}@r{]} @gol --p -pg -print-file-name=@var{library} -print-libgcc-file-name @gol +-print-file-name=@var{library} -print-libgcc-file-name @gol -print-multi-directory -print-multi-lib -print-multi-os-directory @gol -print-prog-name=@var{program} -print-search-dirs -Q @gol -print-sysroot -print-sysroot-headers-suffix @gol @@ -435,9 +423,8 @@ Objective-C and Objective-C++ Dialects}. -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss @gol -fomit-frame-pointer -foptimize-sibling-calls @gol -fpartial-inlining -fpeel-loops -fpredictive-commoning @gol --fprefetch-loop-arrays -fprofile-report @gol --fprofile-correction -fprofile-dir=@var{path} -fprofile-generate @gol --fprofile-generate=@var{path} @gol +-fprefetch-loop-arrays @gol +-fprofile-correction @gol -fprofile-use -fprofile-use=@var{path} -fprofile-values @gol -fprofile-reorder-functions @gol -freciprocal-math -free -frename-registers -freorder-blocks @gol @@ -458,8 +445,7 @@ Objective-C and Objective-C++ Dialects}. -fsingle-precision-constant -fsplit-ivs-in-unroller @gol -fsplit-paths @gol -fsplit-wide-types -fssa-backprop -fssa-phiopt @gol --fstack-protector -fstack-protector-all -fstack-protector-strong @gol --fstack-protector-explicit -fstdarg-opt -fstrict-aliasing @gol +-fstdarg-opt -fstrict-aliasing @gol -fstrict-overflow -fthread-jumps -ftracer -ftree-bit-ccp @gol -ftree-builtin-call-dce -ftree-ccp -ftree-ch @gol -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts @gol @@ -479,6 +465,32 @@ Objective-C and Objective-C++ Dialects}. --param @var{name}=@var{value} -O -O0 -O1 -O2 -O3 -Os -Ofast -Og} +@item Program Instrumentation Options +@xref{Instrumentation Options,,Program Instrumentation Options}. +@gccoptlist{-p -pg -fprofile-arcs --coverage -ftest-coverage @gol +-fprofile-dir=@var{path} -fprofile-generate -fprofile-generate=@var{path} @gol +-fsanitize=@var{style} -fsanitize-recover -fsanitize-recover=@var{style} @gol +-fasan-shadow-offset=@var{number} -fsanitize-sections=@var{s1},@var{s2},... @gol +-fsanitize-undefined-trap-on-error -fbounds-check @gol +-fcheck-pointer-bounds -fchkp-check-incomplete-type @gol +-fchkp-first-field-has-own-bounds -fchkp-narrow-bounds @gol +-fchkp-narrow-to-innermost-array -fchkp-optimize @gol +-fchkp-use-fast-string-functions -fchkp-use-nochk-string-functions @gol +-fchkp-use-static-bounds -fchkp-use-static-const-bounds @gol +-fchkp-treat-zero-dynamic-size-as-infinite -fchkp-check-read @gol +-fchkp-check-read -fchkp-check-write -fchkp-store-bounds @gol +-fchkp-instrument-calls -fchkp-instrument-marked-only @gol +-fchkp-use-wrappers @gol +-fstack-protector -fstack-protector-all -fstack-protector-strong @gol +-fstack-protector-explicit -fstack-check @gol +-fstack-limit-register=@var{reg} -fstack-limit-symbol=@var{sym} @gol +-fno-stack-limit -fsplit-stack @gol +-fvtable-verify=@r{[}std@r{|}preinit@r{|}none@r{]} @gol +-fvtv-counts -fvtv-debug @gol +-finstrument-functions @gol +-finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} @gol +-finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{}} + @item Preprocessor Options @xref{Preprocessor Options,,Options Controlling the Preprocessor}. @gccoptlist{-A@var{question}=@var{answer} @gol @@ -523,21 +535,16 @@ Objective-C and Objective-C++ Dialects}. -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables @gol -fasynchronous-unwind-tables @gol -fno-gnu-unique @gol --finhibit-size-directive -finstrument-functions @gol --finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} @gol --finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{} @gol --fno-common -fno-ident @gol +-finhibit-size-directive -fno-common -fno-ident @gol -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt @gol -fno-jump-tables @gol -frecord-gcc-switches @gol -freg-struct-return -fshort-enums @gol -fshort-double -fshort-wchar @gol --fverbose-asm -fpack-struct[=@var{n}] -fstack-check @gol --fstack-limit-register=@var{reg} -fstack-limit-symbol=@var{sym} @gol --fno-stack-limit -fsplit-stack @gol +-fverbose-asm -fpack-struct[=@var{n}] @gol -fleading-underscore -ftls-model=@var{model} @gol -fstack-reuse=@var{reuse_level} @gol --ftrapv -fwrapv -fbounds-check @gol +-ftrapv -fwrapv @gol -fvisibility=@r{[}default@r{|}internal@r{|}hidden@r{|}protected@r{]} @gol -fstrict-volatile-bitfields -fsync-libcalls} @@ -2537,61 +2544,6 @@ and that pointers to function members defined in different shared objects may not compare equal. When this flag is given, it is a violation of the ODR to define types with the same name differently. -@item -fvtable-verify=@r{[}std@r{|}preinit@r{|}none@r{]} -@opindex fvtable-verify -Turn on (or off, if using @option{-fvtable-verify=none}) the security -feature that verifies at run time, for every virtual call, that -the vtable pointer through which the call is made is valid for the type of -the object, and has not been corrupted or overwritten. If an invalid vtable -pointer is detected at run time, an error is reported and execution of the -program is immediately halted. - -This option causes run-time data structures to be built at program startup, -which are used for verifying the vtable pointers. -The options @samp{std} and @samp{preinit} -control the timing of when these data structures are built. In both cases the -data structures are built before execution reaches @code{main}. Using -@option{-fvtable-verify=std} causes the data structures to be built after -shared libraries have been loaded and initialized. -@option{-fvtable-verify=preinit} causes them to be built before shared -libraries have been loaded and initialized. - -If this option appears multiple times in the command line with different -values specified, @samp{none} takes highest priority over both @samp{std} and -@samp{preinit}; @samp{preinit} takes priority over @samp{std}. - -@item -fvtv-debug -@opindex fvtv-debug -When used in conjunction with @option{-fvtable-verify=std} or -@option{-fvtable-verify=preinit}, causes debug versions of the -runtime functions for the vtable verification feature to be called. -This flag also causes the compiler to log information about which -vtable pointers it finds for each class. -This information is written to a file named @file{vtv_set_ptr_data.log} -in the directory named by the environment variable @env{VTV_LOGS_DIR} -if that is defined or the current working directory otherwise. - -Note: This feature @emph{appends} data to the log file. If you want a fresh log -file, be sure to delete any existing one. - -@item -fvtv-counts -@opindex fvtv-counts -This is a debugging flag. When used in conjunction with -@option{-fvtable-verify=std} or @option{-fvtable-verify=preinit}, this -causes the compiler to keep track of the total number of virtual calls -it encounters and the number of verifications it inserts. It also -counts the number of calls to certain run-time library functions -that it inserts and logs this information for each compilation unit. -The compiler writes this information to a file named -@file{vtv_count_data.log} in the directory named by the environment -variable @env{VTV_LOGS_DIR} if that is defined or the current working -directory otherwise. It also counts the size of the vtable pointer sets -for each class, and writes this information to @file{vtv_class_set_sizes.log} -in the same directory. - -Note: This feature @emph{appends} data to the log files. To get fresh log -files, be sure to delete any existing ones. - @item -fno-weak @opindex fno-weak Do not use weak symbol support, even if it is provided by the linker. @@ -5958,5346 +5910,5597 @@ other options are processed, and it does so only once, no matter how many times it is given. This is mainly intended to be used with @option{-fcompare-debug}. -@item -fsanitize=address -@opindex fsanitize=address -Enable AddressSanitizer, a fast memory error detector. -Memory access instructions are instrumented to detect -out-of-bounds and use-after-free bugs. -See @uref{https://github.com/google/sanitizers/wiki/AddressSanitizer} for -more details. The run-time behavior can be influenced using the -@env{ASAN_OPTIONS} environment variable. When set to @code{help=1}, -the available options are shown at startup of the instrumended program. See -@url{https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags} -for a list of supported options. +@item -fchecking +@opindex fchecking +@opindex fno-checking +Enable internal consistency checking. The default depends on +the compiler configuration. -@item -fsanitize=kernel-address -@opindex fsanitize=kernel-address -Enable AddressSanitizer for Linux kernel. -See @uref{https://github.com/google/kasan/wiki} for more details. +@item -fdump-final-insns@r{[}=@var{file}@r{]} +@opindex fdump-final-insns +Dump the final internal representation (RTL) to @var{file}. If the +optional argument is omitted (or if @var{file} is @code{.}), the name +of the dump file is determined by appending @code{.gkd} to the +compilation output file name. -@item -fsanitize=thread -@opindex fsanitize=thread -Enable ThreadSanitizer, a fast data race detector. -Memory access instructions are instrumented to detect -data race bugs. See @uref{https://github.com/google/sanitizers/wiki#threadsanitizer} for more -details. The run-time behavior can be influenced using the @env{TSAN_OPTIONS} -environment variable; see -@url{https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags} for a list of -supported options. +@item -fcompare-debug@r{[}=@var{opts}@r{]} +@opindex fcompare-debug +@opindex fno-compare-debug +If no error occurs during compilation, run the compiler a second time, +adding @var{opts} and @option{-fcompare-debug-second} to the arguments +passed to the second compilation. Dump the final internal +representation in both compilations, and print an error if they differ. -@item -fsanitize=leak -@opindex fsanitize=leak -Enable LeakSanitizer, a memory leak detector. -This option only matters for linking of executables and if neither -@option{-fsanitize=address} nor @option{-fsanitize=thread} is used. In that -case the executable is linked against a library that overrides @code{malloc} -and other allocator functions. See -@uref{https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer} for more -details. The run-time behavior can be influenced using the -@env{LSAN_OPTIONS} environment variable. +If the equal sign is omitted, the default @option{-gtoggle} is used. -@item -fsanitize=undefined -@opindex fsanitize=undefined -Enable UndefinedBehaviorSanitizer, a fast undefined behavior detector. -Various computations are instrumented to detect undefined behavior -at runtime. Current suboptions are: +The environment variable @env{GCC_COMPARE_DEBUG}, if defined, non-empty +and nonzero, implicitly enables @option{-fcompare-debug}. If +@env{GCC_COMPARE_DEBUG} is defined to a string starting with a dash, +then it is used for @var{opts}, otherwise the default @option{-gtoggle} +is used. -@table @gcctabopt +@option{-fcompare-debug=}, with the equal sign but without @var{opts}, +is equivalent to @option{-fno-compare-debug}, which disables the dumping +of the final representation and the second compilation, preventing even +@env{GCC_COMPARE_DEBUG} from taking effect. -@item -fsanitize=shift -@opindex fsanitize=shift -This option enables checking that the result of a shift operation is -not undefined. Note that what exactly is considered undefined differs -slightly between C and C++, as well as between ISO C90 and C99, etc. +To verify full coverage during @option{-fcompare-debug} testing, set +@env{GCC_COMPARE_DEBUG} to say @option{-fcompare-debug-not-overridden}, +which GCC rejects as an invalid option in any actual compilation +(rather than preprocessing, assembly or linking). To get just a +warning, setting @env{GCC_COMPARE_DEBUG} to @samp{-w%n-fcompare-debug +not overridden} will do. -@item -fsanitize=integer-divide-by-zero -@opindex fsanitize=integer-divide-by-zero -Detect integer division by zero as well as @code{INT_MIN / -1} division. +@item -fcompare-debug-second +@opindex fcompare-debug-second +This option is implicitly passed to the compiler for the second +compilation requested by @option{-fcompare-debug}, along with options to +silence warnings, and omitting other options that would cause +side-effect compiler outputs to files or to the standard output. Dump +files and preserved temporary files are renamed so as to contain the +@code{.gk} additional extension during the second compilation, to avoid +overwriting those generated by the first. -@item -fsanitize=unreachable -@opindex fsanitize=unreachable -With this option, the compiler turns the @code{__builtin_unreachable} -call into a diagnostics message call instead. When reaching the -@code{__builtin_unreachable} call, the behavior is undefined. +When this option is passed to the compiler driver, it causes the +@emph{first} compilation to be skipped, which makes it useful for little +other than debugging the compiler proper. -@item -fsanitize=vla-bound -@opindex fsanitize=vla-bound -This option instructs the compiler to check that the size of a variable -length array is positive. +@item -feliminate-dwarf2-dups +@opindex feliminate-dwarf2-dups +Compress DWARF 2 debugging information by eliminating duplicated +information about each symbol. This option only makes sense when +generating DWARF 2 debugging information with @option{-gdwarf-2}. -@item -fsanitize=null -@opindex fsanitize=null -This option enables pointer checking. Particularly, the application -built with this option turned on will issue an error message when it -tries to dereference a NULL pointer, or if a reference (possibly an -rvalue reference) is bound to a NULL pointer, or if a method is invoked -on an object pointed by a NULL pointer. +@item -femit-struct-debug-baseonly +@opindex femit-struct-debug-baseonly +Emit debug information for struct-like types +only when the base name of the compilation source file +matches the base name of file in which the struct is defined. -@item -fsanitize=return -@opindex fsanitize=return -This option enables return statement checking. Programs -built with this option turned on will issue an error message -when the end of a non-void function is reached without actually -returning a value. This option works in C++ only. +This option substantially reduces the size of debugging information, +but at significant potential loss in type information to the debugger. +See @option{-femit-struct-debug-reduced} for a less aggressive option. +See @option{-femit-struct-debug-detailed} for more detailed control. -@item -fsanitize=signed-integer-overflow -@opindex fsanitize=signed-integer-overflow -This option enables signed integer overflow checking. We check that -the result of @code{+}, @code{*}, and both unary and binary @code{-} -does not overflow in the signed arithmetics. Note, integer promotion -rules must be taken into account. That is, the following is not an -overflow: -@smallexample -signed char a = SCHAR_MAX; -a++; -@end smallexample +This option works only with DWARF 2. -@item -fsanitize=bounds -@opindex fsanitize=bounds -This option enables instrumentation of array bounds. Various out of bounds -accesses are detected. Flexible array members, flexible array member-like -arrays, and initializers of variables with static storage are not instrumented. +@item -femit-struct-debug-reduced +@opindex femit-struct-debug-reduced +Emit debug information for struct-like types +only when the base name of the compilation source file +matches the base name of file in which the type is defined, +unless the struct is a template or defined in a system header. -@item -fsanitize=bounds-strict -@opindex fsanitize=bounds-strict -This option enables strict instrumentation of array bounds. Most out of bounds -accesses are detected, including flexible array members and flexible array -member-like arrays. Initializers of variables with static storage are not -instrumented. +This option significantly reduces the size of debugging information, +with some potential loss in type information to the debugger. +See @option{-femit-struct-debug-baseonly} for a more aggressive option. +See @option{-femit-struct-debug-detailed} for more detailed control. -@item -fsanitize=alignment -@opindex fsanitize=alignment +This option works only with DWARF 2. -This option enables checking of alignment of pointers when they are -dereferenced, or when a reference is bound to insufficiently aligned target, -or when a method or constructor is invoked on insufficiently aligned object. +@item -femit-struct-debug-detailed@r{[}=@var{spec-list}@r{]} +@opindex femit-struct-debug-detailed +Specify the struct-like types +for which the compiler generates debug information. +The intent is to reduce duplicate struct debug information +between different object files within the same program. -@item -fsanitize=object-size -@opindex fsanitize=object-size -This option enables instrumentation of memory references using the -@code{__builtin_object_size} function. Various out of bounds pointer -accesses are detected. +This option is a detailed version of +@option{-femit-struct-debug-reduced} and @option{-femit-struct-debug-baseonly}, +which serves for most needs. -@item -fsanitize=float-divide-by-zero -@opindex fsanitize=float-divide-by-zero -Detect floating-point division by zero. Unlike other similar options, -@option{-fsanitize=float-divide-by-zero} is not enabled by -@option{-fsanitize=undefined}, since floating-point division by zero can -be a legitimate way of obtaining infinities and NaNs. +A specification has the syntax@* +[@samp{dir:}|@samp{ind:}][@samp{ord:}|@samp{gen:}](@samp{any}|@samp{sys}|@samp{base}|@samp{none}) -@item -fsanitize=float-cast-overflow -@opindex fsanitize=float-cast-overflow -This option enables floating-point type to integer conversion checking. -We check that the result of the conversion does not overflow. -Unlike other similar options, @option{-fsanitize=float-cast-overflow} is -not enabled by @option{-fsanitize=undefined}. -This option does not work well with @code{FE_INVALID} exceptions enabled. +The optional first word limits the specification to +structs that are used directly (@samp{dir:}) or used indirectly (@samp{ind:}). +A struct type is used directly when it is the type of a variable, member. +Indirect uses arise through pointers to structs. +That is, when use of an incomplete struct is valid, the use is indirect. +An example is +@samp{struct one direct; struct two * indirect;}. -@item -fsanitize=nonnull-attribute -@opindex fsanitize=nonnull-attribute +The optional second word limits the specification to +ordinary structs (@samp{ord:}) or generic structs (@samp{gen:}). +Generic structs are a bit complicated to explain. +For C++, these are non-explicit specializations of template classes, +or non-template classes within the above. +Other programming languages have generics, +but @option{-femit-struct-debug-detailed} does not yet implement them. -This option enables instrumentation of calls, checking whether null values -are not passed to arguments marked as requiring a non-null value by the -@code{nonnull} function attribute. +The third word specifies the source files for those +structs for which the compiler should emit debug information. +The values @samp{none} and @samp{any} have the normal meaning. +The value @samp{base} means that +the base of name of the file in which the type declaration appears +must match the base of the name of the main compilation file. +In practice, this means that when compiling @file{foo.c}, debug information +is generated for types declared in that file and @file{foo.h}, +but not other header files. +The value @samp{sys} means those types satisfying @samp{base} +or declared in system or compiler headers. -@item -fsanitize=returns-nonnull-attribute -@opindex fsanitize=returns-nonnull-attribute +You may need to experiment to determine the best settings for your application. -This option enables instrumentation of return statements in functions -marked with @code{returns_nonnull} function attribute, to detect returning -of null values from such functions. +The default is @option{-femit-struct-debug-detailed=all}. -@item -fsanitize=bool -@opindex fsanitize=bool +This option works only with DWARF 2. -This option enables instrumentation of loads from bool. If a value other -than 0/1 is loaded, a run-time error is issued. +@item -fno-merge-debug-strings +@opindex fmerge-debug-strings +@opindex fno-merge-debug-strings +Direct the linker to not merge together strings in the debugging +information that are identical in different object files. Merging is +not supported by all assemblers or linkers. Merging decreases the size +of the debug information in the output file at the cost of increasing +link processing time. Merging is enabled by default. -@item -fsanitize=enum -@opindex fsanitize=enum +@item -fdebug-prefix-map=@var{old}=@var{new} +@opindex fdebug-prefix-map +When compiling files in directory @file{@var{old}}, record debugging +information describing them as in @file{@var{new}} instead. -This option enables instrumentation of loads from an enum type. If -a value outside the range of values for the enum type is loaded, -a run-time error is issued. +@item -fno-dwarf2-cfi-asm +@opindex fdwarf2-cfi-asm +@opindex fno-dwarf2-cfi-asm +Emit DWARF 2 unwind info as compiler generated @code{.eh_frame} section +instead of using GAS @code{.cfi_*} directives. -@item -fsanitize=vptr -@opindex fsanitize=vptr +@item -Q +@opindex Q +Makes the compiler print out each function name as it is compiled, and +print some statistics about each pass when it finishes. -This option enables instrumentation of C++ member function calls, member -accesses and some conversions between pointers to base and derived classes, -to verify the referenced object has the correct dynamic type. +@item -ftime-report +@opindex ftime-report +Makes the compiler print some statistics about the time consumed by each +pass when it finishes. -@end table +@item -fmem-report +@opindex fmem-report +Makes the compiler print some statistics about permanent memory +allocation when it finishes. -While @option{-ftrapv} causes traps for signed overflows to be emitted, -@option{-fsanitize=undefined} gives a diagnostic message. -This currently works only for the C family of languages. +@item -fmem-report-wpa +@opindex fmem-report-wpa +Makes the compiler print some statistics about permanent memory +allocation for the WPA phase only. -@item -fno-sanitize=all -@opindex fno-sanitize=all +@item -fpre-ipa-mem-report +@opindex fpre-ipa-mem-report +@item -fpost-ipa-mem-report +@opindex fpost-ipa-mem-report +Makes the compiler print some statistics about permanent memory +allocation before or after interprocedural optimization. -This option disables all previously enabled sanitizers. -@option{-fsanitize=all} is not allowed, as some sanitizers cannot be used -together. +@item -fprofile-report +@opindex fprofile-report +Makes the compiler print some statistics about consistency of the +(estimated) profile and effect of individual passes. -@item -fasan-shadow-offset=@var{number} -@opindex fasan-shadow-offset -This option forces GCC to use custom shadow offset in AddressSanitizer checks. -It is useful for experimenting with different shadow memory layouts in -Kernel AddressSanitizer. +@item -fstack-usage +@opindex fstack-usage +Makes the compiler output stack usage information for the program, on a +per-function basis. The filename for the dump is made by appending +@file{.su} to the @var{auxname}. @var{auxname} is generated from the name of +the output file, if explicitly specified and it is not an executable, +otherwise it is the basename of the source file. An entry is made up +of three fields: -@item -fsanitize-sections=@var{s1},@var{s2},... -@opindex fsanitize-sections -Sanitize global variables in selected user-defined sections. @var{si} may -contain wildcards. +@itemize +@item +The name of the function. +@item +A number of bytes. +@item +One or more qualifiers: @code{static}, @code{dynamic}, @code{bounded}. +@end itemize -@item -fsanitize-recover@r{[}=@var{opts}@r{]} -@opindex fsanitize-recover -@opindex fno-sanitize-recover -@option{-fsanitize-recover=} controls error recovery mode for sanitizers -mentioned in comma-separated list of @var{opts}. Enabling this option -for a sanitizer component causes it to attempt to continue -running the program as if no error happened. This means multiple -runtime errors can be reported in a single program run, and the exit -code of the program may indicate success even when errors -have been reported. The @option{-fno-sanitize-recover=} option -can be used to alter -this behavior: only the first detected error is reported -and program then exits with a non-zero exit code. +The qualifier @code{static} means that the function manipulates the stack +statically: a fixed number of bytes are allocated for the frame on function +entry and released on function exit; no stack adjustments are otherwise made +in the function. The second field is this fixed number of bytes. -Currently this feature only works for @option{-fsanitize=undefined} (and its suboptions -except for @option{-fsanitize=unreachable} and @option{-fsanitize=return}), -@option{-fsanitize=float-cast-overflow}, @option{-fsanitize=float-divide-by-zero}, -@option{-fsanitize=kernel-address} and @option{-fsanitize=address}. -For these sanitizers error recovery is turned on by default, except @option{-fsanitize=address}, -for which this feature is experimental. -@option{-fsanitize-recover=all} and @option{-fno-sanitize-recover=all} is also -accepted, the former enables recovery for all sanitizers that support it, -the latter disables recovery for all sanitizers that support it. +The qualifier @code{dynamic} means that the function manipulates the stack +dynamically: in addition to the static allocation described above, stack +adjustments are made in the body of the function, for example to push/pop +arguments around function calls. If the qualifier @code{bounded} is also +present, the amount of these adjustments is bounded at compile time and +the second field is an upper bound of the total amount of stack used by +the function. If it is not present, the amount of these adjustments is +not bounded at compile time and the second field only represents the +bounded part. -Syntax without explicit @var{opts} parameter is deprecated. It is equivalent to -@smallexample --fsanitize-recover=undefined,float-cast-overflow,float-divide-by-zero -@end smallexample -@noindent -Similarly @option{-fno-sanitize-recover} is equivalent to -@smallexample --fno-sanitize-recover=undefined,float-cast-overflow,float-divide-by-zero -@end smallexample +@item -fdbg-cnt-list +@opindex fdbg-cnt-list +Print the name and the counter upper bound for all debug counters. -@item -fsanitize-undefined-trap-on-error -@opindex fsanitize-undefined-trap-on-error -The @option{-fsanitize-undefined-trap-on-error} option instructs the compiler to -report undefined behavior using @code{__builtin_trap} rather than -a @code{libubsan} library routine. The advantage of this is that the -@code{libubsan} library is not needed and is not linked in, so this -is usable even in freestanding environments. -@item -fsanitize-coverage=trace-pc -@opindex fsanitize-coverage=trace-pc -Enable coverage-guided fuzzing code instrumentation. -Inserts call to __sanitizer_cov_trace_pc into every basic block. +@item -fdbg-cnt=@var{counter-value-list} +@opindex fdbg-cnt +Set the internal debug counter upper bound. @var{counter-value-list} +is a comma-separated list of @var{name}:@var{value} pairs +which sets the upper bound of each debug counter @var{name} to @var{value}. +All debug counters have the initial upper bound of @code{UINT_MAX}; +thus @code{dbg_cnt} returns true always unless the upper bound +is set by this option. +For example, with @option{-fdbg-cnt=dce:10,tail_call:0}, +@code{dbg_cnt(dce)} returns true only for first 10 invocations. -@item -fcheck-pointer-bounds -@opindex fcheck-pointer-bounds -@opindex fno-check-pointer-bounds -@cindex Pointer Bounds Checker options -Enable Pointer Bounds Checker instrumentation. Each memory reference -is instrumented with checks of the pointer used for memory access against -bounds associated with that pointer. +@item -fenable-@var{kind}-@var{pass} +@itemx -fdisable-@var{kind}-@var{pass}=@var{range-list} +@opindex fdisable- +@opindex fenable- -Currently there -is only an implementation for Intel MPX available, thus x86 target -and @option{-mmpx} are required to enable this feature. -MPX-based instrumentation requires -a runtime library to enable MPX in hardware and handle bounds -violation signals. By default when @option{-fcheck-pointer-bounds} -and @option{-mmpx} options are used to link a program, the GCC driver -links against the @file{libmpx} runtime library and @file{libmpxwrappers} -library. It also passes '-z bndplt' to a linker in case it supports this -option (which is checked on libmpx configuration). Note that old versions -of linker may ignore option. Gold linker doesn't support '-z bndplt' -option. With no '-z bndplt' support in linker all calls to dynamic libraries -lose passed bounds reducing overall protection level. It's highly -recommended to use linker with '-z bndplt' support. In case such linker -is not available it is adviced to always use @option{-static-libmpxwrappers} -for better protection level or use @option{-static} to completely avoid -external calls to dynamic libraries. MPX-based instrumentation -may be used for debugging and also may be included in production code -to increase program security. Depending on usage, you may -have different requirements for the runtime library. The current version -of the MPX runtime library is more oriented for use as a debugging -tool. MPX runtime library usage implies @option{-lpthread}. See -also @option{-static-libmpx}. The runtime library behavior can be -influenced using various @env{CHKP_RT_*} environment variables. See -@uref{https://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler} -for more details. +This is a set of options that are used to explicitly disable/enable +optimization passes. These options are intended for use for debugging GCC. +Compiler users should use regular options for enabling/disabling +passes instead. -Generated instrumentation may be controlled by various -@option{-fchkp-*} options and by the @code{bnd_variable_size} -structure field attribute (@pxref{Type Attributes}) and -@code{bnd_legacy}, and @code{bnd_instrument} function attributes -(@pxref{Function Attributes}). GCC also provides a number of built-in -functions for controlling the Pointer Bounds Checker. @xref{Pointer -Bounds Checker builtins}, for more information. +@table @gcctabopt -@item -fchecking -@opindex fchecking -@opindex fno-checking -Enable internal consistency checking. The default depends on -the compiler configuration. +@item -fdisable-ipa-@var{pass} +Disable IPA pass @var{pass}. @var{pass} is the pass name. If the same pass is +statically invoked in the compiler multiple times, the pass name should be +appended with a sequential number starting from 1. -@item -fchkp-check-incomplete-type -@opindex fchkp-check-incomplete-type -@opindex fno-chkp-check-incomplete-type -Generate pointer bounds checks for variables with incomplete type. -Enabled by default. +@item -fdisable-rtl-@var{pass} +@itemx -fdisable-rtl-@var{pass}=@var{range-list} +Disable RTL pass @var{pass}. @var{pass} is the pass name. If the same pass is +statically invoked in the compiler multiple times, the pass name should be +appended with a sequential number starting from 1. @var{range-list} is a +comma-separated list of function ranges or assembler names. Each range is a number +pair separated by a colon. The range is inclusive in both ends. If the range +is trivial, the number pair can be simplified as a single number. If the +function's call graph node's @var{uid} falls within one of the specified ranges, +the @var{pass} is disabled for that function. The @var{uid} is shown in the +function header of a dump file, and the pass names can be dumped by using +option @option{-fdump-passes}. -@item -fchkp-narrow-bounds -@opindex fchkp-narrow-bounds -@opindex fno-chkp-narrow-bounds -Controls bounds used by Pointer Bounds Checker for pointers to object -fields. If narrowing is enabled then field bounds are used. Otherwise -object bounds are used. See also @option{-fchkp-narrow-to-innermost-array} -and @option{-fchkp-first-field-has-own-bounds}. Enabled by default. +@item -fdisable-tree-@var{pass} +@itemx -fdisable-tree-@var{pass}=@var{range-list} +Disable tree pass @var{pass}. See @option{-fdisable-rtl} for the description of +option arguments. -@item -fchkp-first-field-has-own-bounds -@opindex fchkp-first-field-has-own-bounds -@opindex fno-chkp-first-field-has-own-bounds -Forces Pointer Bounds Checker to use narrowed bounds for the address of the -first field in the structure. By default a pointer to the first field has -the same bounds as a pointer to the whole structure. +@item -fenable-ipa-@var{pass} +Enable IPA pass @var{pass}. @var{pass} is the pass name. If the same pass is +statically invoked in the compiler multiple times, the pass name should be +appended with a sequential number starting from 1. -@item -fchkp-narrow-to-innermost-array -@opindex fchkp-narrow-to-innermost-array -@opindex fno-chkp-narrow-to-innermost-array -Forces Pointer Bounds Checker to use bounds of the innermost arrays in -case of nested static array access. By default this option is disabled and -bounds of the outermost array are used. +@item -fenable-rtl-@var{pass} +@itemx -fenable-rtl-@var{pass}=@var{range-list} +Enable RTL pass @var{pass}. See @option{-fdisable-rtl} for option argument +description and examples. -@item -fchkp-optimize -@opindex fchkp-optimize -@opindex fno-chkp-optimize -Enables Pointer Bounds Checker optimizations. Enabled by default at -optimization levels @option{-O}, @option{-O2}, @option{-O3}. +@item -fenable-tree-@var{pass} +@itemx -fenable-tree-@var{pass}=@var{range-list} +Enable tree pass @var{pass}. See @option{-fdisable-rtl} for the description +of option arguments. -@item -fchkp-use-fast-string-functions -@opindex fchkp-use-fast-string-functions -@opindex fno-chkp-use-fast-string-functions -Enables use of @code{*_nobnd} versions of string functions (not copying bounds) -by Pointer Bounds Checker. Disabled by default. +@end table -@item -fchkp-use-nochk-string-functions -@opindex fchkp-use-nochk-string-functions -@opindex fno-chkp-use-nochk-string-functions -Enables use of @code{*_nochk} versions of string functions (not checking bounds) -by Pointer Bounds Checker. Disabled by default. +Here are some examples showing uses of these options. -@item -fchkp-use-static-bounds -@opindex fchkp-use-static-bounds -@opindex fno-chkp-use-static-bounds -Allow Pointer Bounds Checker to generate static bounds holding -bounds of static variables. Enabled by default. +@smallexample -@item -fchkp-use-static-const-bounds -@opindex fchkp-use-static-const-bounds -@opindex fno-chkp-use-static-const-bounds -Use statically-initialized bounds for constant bounds instead of -generating them each time they are required. By default enabled when -@option{-fchkp-use-static-bounds} is enabled. +# disable ccp1 for all functions + -fdisable-tree-ccp1 +# disable complete unroll for function whose cgraph node uid is 1 + -fenable-tree-cunroll=1 +# disable gcse2 for functions at the following ranges [1,1], +# [300,400], and [400,1000] +# disable gcse2 for functions foo and foo2 + -fdisable-rtl-gcse2=foo,foo2 +# disable early inlining + -fdisable-tree-einline +# disable ipa inlining + -fdisable-ipa-inline +# enable tree full unroll + -fenable-tree-unroll -@item -fchkp-treat-zero-dynamic-size-as-infinite -@opindex fchkp-treat-zero-dynamic-size-as-infinite -@opindex fno-chkp-treat-zero-dynamic-size-as-infinite -With this option, objects with incomplete type whose -dynamically-obtained size is zero are treated as having infinite size -instead by Pointer Bounds -Checker. This option may be helpful if a program is linked with a library -missing size information for some symbols. Disabled by default. +@end smallexample -@item -fchkp-check-read -@opindex fchkp-check-read -@opindex fno-chkp-check-read -Instructs Pointer Bounds Checker to generate checks for all read -accesses to memory. Enabled by default. +@item -d@var{letters} +@itemx -fdump-rtl-@var{pass} +@itemx -fdump-rtl-@var{pass}=@var{filename} +@opindex d +@opindex fdump-rtl-@var{pass} +Says to make debugging dumps during compilation at times specified by +@var{letters}. This is used for debugging the RTL-based passes of the +compiler. The file names for most of the dumps are made by appending +a pass number and a word to the @var{dumpname}, and the files are +created in the directory of the output file. In case of +@option{=@var{filename}} option, the dump is output on the given file +instead of the pass numbered dump files. Note that the pass number is +assigned as passes are registered into the pass manager. Most passes +are registered in the order that they will execute and for these passes +the number corresponds to the pass execution order. However, passes +registered by plugins, passes specific to compilation targets, or +passes that are otherwise registered after all the other passes are +numbered higher than a pass named "final", even if they are executed +earlier. @var{dumpname} is generated from the name of the output +file if explicitly specified and not an executable, otherwise it is +the basename of the source file. These switches may have different +effects when @option{-E} is used for preprocessing. -@item -fchkp-check-write -@opindex fchkp-check-write -@opindex fno-chkp-check-write -Instructs Pointer Bounds Checker to generate checks for all write -accesses to memory. Enabled by default. +Debug dumps can be enabled with a @option{-fdump-rtl} switch or some +@option{-d} option @var{letters}. Here are the possible +letters for use in @var{pass} and @var{letters}, and their meanings: -@item -fchkp-store-bounds -@opindex fchkp-store-bounds -@opindex fno-chkp-store-bounds -Instructs Pointer Bounds Checker to generate bounds stores for -pointer writes. Enabled by default. +@table @gcctabopt -@item -fchkp-instrument-calls -@opindex fchkp-instrument-calls -@opindex fno-chkp-instrument-calls -Instructs Pointer Bounds Checker to pass pointer bounds to calls. -Enabled by default. +@item -fdump-rtl-alignments +@opindex fdump-rtl-alignments +Dump after branch alignments have been computed. -@item -fchkp-instrument-marked-only -@opindex fchkp-instrument-marked-only -@opindex fno-chkp-instrument-marked-only -Instructs Pointer Bounds Checker to instrument only functions -marked with the @code{bnd_instrument} attribute -(@pxref{Function Attributes}). Disabled by default. +@item -fdump-rtl-asmcons +@opindex fdump-rtl-asmcons +Dump after fixing rtl statements that have unsatisfied in/out constraints. -@item -fchkp-use-wrappers -@opindex fchkp-use-wrappers -@opindex fno-chkp-use-wrappers -Allows Pointer Bounds Checker to replace calls to built-in functions -with calls to wrapper functions. When @option{-fchkp-use-wrappers} -is used to link a program, the GCC driver automatically links -against @file{libmpxwrappers}. See also @option{-static-libmpxwrappers}. -Enabled by default. +@item -fdump-rtl-auto_inc_dec +@opindex fdump-rtl-auto_inc_dec +Dump after auto-inc-dec discovery. This pass is only run on +architectures that have auto inc or auto dec instructions. -@item -fdump-final-insns@r{[}=@var{file}@r{]} -@opindex fdump-final-insns -Dump the final internal representation (RTL) to @var{file}. If the -optional argument is omitted (or if @var{file} is @code{.}), the name -of the dump file is determined by appending @code{.gkd} to the -compilation output file name. +@item -fdump-rtl-barriers +@opindex fdump-rtl-barriers +Dump after cleaning up the barrier instructions. -@item -fcompare-debug@r{[}=@var{opts}@r{]} -@opindex fcompare-debug -@opindex fno-compare-debug -If no error occurs during compilation, run the compiler a second time, -adding @var{opts} and @option{-fcompare-debug-second} to the arguments -passed to the second compilation. Dump the final internal -representation in both compilations, and print an error if they differ. +@item -fdump-rtl-bbpart +@opindex fdump-rtl-bbpart +Dump after partitioning hot and cold basic blocks. -If the equal sign is omitted, the default @option{-gtoggle} is used. +@item -fdump-rtl-bbro +@opindex fdump-rtl-bbro +Dump after block reordering. -The environment variable @env{GCC_COMPARE_DEBUG}, if defined, non-empty -and nonzero, implicitly enables @option{-fcompare-debug}. If -@env{GCC_COMPARE_DEBUG} is defined to a string starting with a dash, -then it is used for @var{opts}, otherwise the default @option{-gtoggle} -is used. +@item -fdump-rtl-btl1 +@itemx -fdump-rtl-btl2 +@opindex fdump-rtl-btl2 +@opindex fdump-rtl-btl2 +@option{-fdump-rtl-btl1} and @option{-fdump-rtl-btl2} enable dumping +after the two branch +target load optimization passes. -@option{-fcompare-debug=}, with the equal sign but without @var{opts}, -is equivalent to @option{-fno-compare-debug}, which disables the dumping -of the final representation and the second compilation, preventing even -@env{GCC_COMPARE_DEBUG} from taking effect. +@item -fdump-rtl-bypass +@opindex fdump-rtl-bypass +Dump after jump bypassing and control flow optimizations. -To verify full coverage during @option{-fcompare-debug} testing, set -@env{GCC_COMPARE_DEBUG} to say @option{-fcompare-debug-not-overridden}, -which GCC rejects as an invalid option in any actual compilation -(rather than preprocessing, assembly or linking). To get just a -warning, setting @env{GCC_COMPARE_DEBUG} to @samp{-w%n-fcompare-debug -not overridden} will do. +@item -fdump-rtl-combine +@opindex fdump-rtl-combine +Dump after the RTL instruction combination pass. -@item -fcompare-debug-second -@opindex fcompare-debug-second -This option is implicitly passed to the compiler for the second -compilation requested by @option{-fcompare-debug}, along with options to -silence warnings, and omitting other options that would cause -side-effect compiler outputs to files or to the standard output. Dump -files and preserved temporary files are renamed so as to contain the -@code{.gk} additional extension during the second compilation, to avoid -overwriting those generated by the first. +@item -fdump-rtl-compgotos +@opindex fdump-rtl-compgotos +Dump after duplicating the computed gotos. -When this option is passed to the compiler driver, it causes the -@emph{first} compilation to be skipped, which makes it useful for little -other than debugging the compiler proper. +@item -fdump-rtl-ce1 +@itemx -fdump-rtl-ce2 +@itemx -fdump-rtl-ce3 +@opindex fdump-rtl-ce1 +@opindex fdump-rtl-ce2 +@opindex fdump-rtl-ce3 +@option{-fdump-rtl-ce1}, @option{-fdump-rtl-ce2}, and +@option{-fdump-rtl-ce3} enable dumping after the three +if conversion passes. -@item -feliminate-dwarf2-dups -@opindex feliminate-dwarf2-dups -Compress DWARF 2 debugging information by eliminating duplicated -information about each symbol. This option only makes sense when -generating DWARF 2 debugging information with @option{-gdwarf-2}. +@item -fdump-rtl-cprop_hardreg +@opindex fdump-rtl-cprop_hardreg +Dump after hard register copy propagation. -@item -femit-struct-debug-baseonly -@opindex femit-struct-debug-baseonly -Emit debug information for struct-like types -only when the base name of the compilation source file -matches the base name of file in which the struct is defined. +@item -fdump-rtl-csa +@opindex fdump-rtl-csa +Dump after combining stack adjustments. -This option substantially reduces the size of debugging information, -but at significant potential loss in type information to the debugger. -See @option{-femit-struct-debug-reduced} for a less aggressive option. -See @option{-femit-struct-debug-detailed} for more detailed control. +@item -fdump-rtl-cse1 +@itemx -fdump-rtl-cse2 +@opindex fdump-rtl-cse1 +@opindex fdump-rtl-cse2 +@option{-fdump-rtl-cse1} and @option{-fdump-rtl-cse2} enable dumping after +the two common subexpression elimination passes. -This option works only with DWARF 2. +@item -fdump-rtl-dce +@opindex fdump-rtl-dce +Dump after the standalone dead code elimination passes. -@item -femit-struct-debug-reduced -@opindex femit-struct-debug-reduced -Emit debug information for struct-like types -only when the base name of the compilation source file -matches the base name of file in which the type is defined, -unless the struct is a template or defined in a system header. +@item -fdump-rtl-dbr +@opindex fdump-rtl-dbr +Dump after delayed branch scheduling. -This option significantly reduces the size of debugging information, -with some potential loss in type information to the debugger. -See @option{-femit-struct-debug-baseonly} for a more aggressive option. -See @option{-femit-struct-debug-detailed} for more detailed control. +@item -fdump-rtl-dce1 +@itemx -fdump-rtl-dce2 +@opindex fdump-rtl-dce1 +@opindex fdump-rtl-dce2 +@option{-fdump-rtl-dce1} and @option{-fdump-rtl-dce2} enable dumping after +the two dead store elimination passes. -This option works only with DWARF 2. +@item -fdump-rtl-eh +@opindex fdump-rtl-eh +Dump after finalization of EH handling code. -@item -femit-struct-debug-detailed@r{[}=@var{spec-list}@r{]} -@opindex femit-struct-debug-detailed -Specify the struct-like types -for which the compiler generates debug information. -The intent is to reduce duplicate struct debug information -between different object files within the same program. +@item -fdump-rtl-eh_ranges +@opindex fdump-rtl-eh_ranges +Dump after conversion of EH handling range regions. -This option is a detailed version of -@option{-femit-struct-debug-reduced} and @option{-femit-struct-debug-baseonly}, -which serves for most needs. +@item -fdump-rtl-expand +@opindex fdump-rtl-expand +Dump after RTL generation. -A specification has the syntax@* -[@samp{dir:}|@samp{ind:}][@samp{ord:}|@samp{gen:}](@samp{any}|@samp{sys}|@samp{base}|@samp{none}) +@item -fdump-rtl-fwprop1 +@itemx -fdump-rtl-fwprop2 +@opindex fdump-rtl-fwprop1 +@opindex fdump-rtl-fwprop2 +@option{-fdump-rtl-fwprop1} and @option{-fdump-rtl-fwprop2} enable +dumping after the two forward propagation passes. -The optional first word limits the specification to -structs that are used directly (@samp{dir:}) or used indirectly (@samp{ind:}). -A struct type is used directly when it is the type of a variable, member. -Indirect uses arise through pointers to structs. -That is, when use of an incomplete struct is valid, the use is indirect. -An example is -@samp{struct one direct; struct two * indirect;}. +@item -fdump-rtl-gcse1 +@itemx -fdump-rtl-gcse2 +@opindex fdump-rtl-gcse1 +@opindex fdump-rtl-gcse2 +@option{-fdump-rtl-gcse1} and @option{-fdump-rtl-gcse2} enable dumping +after global common subexpression elimination. -The optional second word limits the specification to -ordinary structs (@samp{ord:}) or generic structs (@samp{gen:}). -Generic structs are a bit complicated to explain. -For C++, these are non-explicit specializations of template classes, -or non-template classes within the above. -Other programming languages have generics, -but @option{-femit-struct-debug-detailed} does not yet implement them. +@item -fdump-rtl-init-regs +@opindex fdump-rtl-init-regs +Dump after the initialization of the registers. -The third word specifies the source files for those -structs for which the compiler should emit debug information. -The values @samp{none} and @samp{any} have the normal meaning. -The value @samp{base} means that -the base of name of the file in which the type declaration appears -must match the base of the name of the main compilation file. -In practice, this means that when compiling @file{foo.c}, debug information -is generated for types declared in that file and @file{foo.h}, -but not other header files. -The value @samp{sys} means those types satisfying @samp{base} -or declared in system or compiler headers. +@item -fdump-rtl-initvals +@opindex fdump-rtl-initvals +Dump after the computation of the initial value sets. -You may need to experiment to determine the best settings for your application. +@item -fdump-rtl-into_cfglayout +@opindex fdump-rtl-into_cfglayout +Dump after converting to cfglayout mode. -The default is @option{-femit-struct-debug-detailed=all}. +@item -fdump-rtl-ira +@opindex fdump-rtl-ira +Dump after iterated register allocation. -This option works only with DWARF 2. +@item -fdump-rtl-jump +@opindex fdump-rtl-jump +Dump after the second jump optimization. -@item -fno-merge-debug-strings -@opindex fmerge-debug-strings -@opindex fno-merge-debug-strings -Direct the linker to not merge together strings in the debugging -information that are identical in different object files. Merging is -not supported by all assemblers or linkers. Merging decreases the size -of the debug information in the output file at the cost of increasing -link processing time. Merging is enabled by default. +@item -fdump-rtl-loop2 +@opindex fdump-rtl-loop2 +@option{-fdump-rtl-loop2} enables dumping after the rtl +loop optimization passes. -@item -fdebug-prefix-map=@var{old}=@var{new} -@opindex fdebug-prefix-map -When compiling files in directory @file{@var{old}}, record debugging -information describing them as in @file{@var{new}} instead. +@item -fdump-rtl-mach +@opindex fdump-rtl-mach +Dump after performing the machine dependent reorganization pass, if that +pass exists. -@item -fno-dwarf2-cfi-asm -@opindex fdwarf2-cfi-asm -@opindex fno-dwarf2-cfi-asm -Emit DWARF 2 unwind info as compiler generated @code{.eh_frame} section -instead of using GAS @code{.cfi_*} directives. +@item -fdump-rtl-mode_sw +@opindex fdump-rtl-mode_sw +Dump after removing redundant mode switches. -@cindex @command{prof} -@item -p -@opindex p -Generate extra code to write profile information suitable for the -analysis program @command{prof}. You must use this option when compiling -the source files you want data about, and you must also use it when -linking. +@item -fdump-rtl-rnreg +@opindex fdump-rtl-rnreg +Dump after register renumbering. -@cindex @command{gprof} -@item -pg -@opindex pg -Generate extra code to write profile information suitable for the -analysis program @command{gprof}. You must use this option when compiling -the source files you want data about, and you must also use it when -linking. +@item -fdump-rtl-outof_cfglayout +@opindex fdump-rtl-outof_cfglayout +Dump after converting from cfglayout mode. -@item -Q -@opindex Q -Makes the compiler print out each function name as it is compiled, and -print some statistics about each pass when it finishes. +@item -fdump-rtl-peephole2 +@opindex fdump-rtl-peephole2 +Dump after the peephole pass. -@item -ftime-report -@opindex ftime-report -Makes the compiler print some statistics about the time consumed by each -pass when it finishes. +@item -fdump-rtl-postreload +@opindex fdump-rtl-postreload +Dump after post-reload optimizations. -@item -fmem-report -@opindex fmem-report -Makes the compiler print some statistics about permanent memory -allocation when it finishes. +@item -fdump-rtl-pro_and_epilogue +@opindex fdump-rtl-pro_and_epilogue +Dump after generating the function prologues and epilogues. -@item -fmem-report-wpa -@opindex fmem-report-wpa -Makes the compiler print some statistics about permanent memory -allocation for the WPA phase only. +@item -fdump-rtl-sched1 +@itemx -fdump-rtl-sched2 +@opindex fdump-rtl-sched1 +@opindex fdump-rtl-sched2 +@option{-fdump-rtl-sched1} and @option{-fdump-rtl-sched2} enable dumping +after the basic block scheduling passes. -@item -fpre-ipa-mem-report -@opindex fpre-ipa-mem-report -@item -fpost-ipa-mem-report -@opindex fpost-ipa-mem-report -Makes the compiler print some statistics about permanent memory -allocation before or after interprocedural optimization. +@item -fdump-rtl-ree +@opindex fdump-rtl-ree +Dump after sign/zero extension elimination. -@item -fprofile-report -@opindex fprofile-report -Makes the compiler print some statistics about consistency of the -(estimated) profile and effect of individual passes. +@item -fdump-rtl-seqabstr +@opindex fdump-rtl-seqabstr +Dump after common sequence discovery. -@item -fstack-usage -@opindex fstack-usage -Makes the compiler output stack usage information for the program, on a -per-function basis. The filename for the dump is made by appending -@file{.su} to the @var{auxname}. @var{auxname} is generated from the name of -the output file, if explicitly specified and it is not an executable, -otherwise it is the basename of the source file. An entry is made up -of three fields: +@item -fdump-rtl-shorten +@opindex fdump-rtl-shorten +Dump after shortening branches. -@itemize -@item -The name of the function. -@item -A number of bytes. -@item -One or more qualifiers: @code{static}, @code{dynamic}, @code{bounded}. -@end itemize - -The qualifier @code{static} means that the function manipulates the stack -statically: a fixed number of bytes are allocated for the frame on function -entry and released on function exit; no stack adjustments are otherwise made -in the function. The second field is this fixed number of bytes. +@item -fdump-rtl-sibling +@opindex fdump-rtl-sibling +Dump after sibling call optimizations. -The qualifier @code{dynamic} means that the function manipulates the stack -dynamically: in addition to the static allocation described above, stack -adjustments are made in the body of the function, for example to push/pop -arguments around function calls. If the qualifier @code{bounded} is also -present, the amount of these adjustments is bounded at compile time and -the second field is an upper bound of the total amount of stack used by -the function. If it is not present, the amount of these adjustments is -not bounded at compile time and the second field only represents the -bounded part. +@item -fdump-rtl-split1 +@itemx -fdump-rtl-split2 +@itemx -fdump-rtl-split3 +@itemx -fdump-rtl-split4 +@itemx -fdump-rtl-split5 +@opindex fdump-rtl-split1 +@opindex fdump-rtl-split2 +@opindex fdump-rtl-split3 +@opindex fdump-rtl-split4 +@opindex fdump-rtl-split5 +These options enable dumping after five rounds of +instruction splitting. -@item -fprofile-arcs -@opindex fprofile-arcs -Add code so that program flow @dfn{arcs} are instrumented. During -execution the program records how many times each branch and call is -executed and how many times it is taken or returns. When the compiled -program exits it saves this data to a file called -@file{@var{auxname}.gcda} for each source file. The data may be used for -profile-directed optimizations (@option{-fbranch-probabilities}), or for -test coverage analysis (@option{-ftest-coverage}). Each object file's -@var{auxname} is generated from the name of the output file, if -explicitly specified and it is not the final executable, otherwise it is -the basename of the source file. In both cases any suffix is removed -(e.g.@: @file{foo.gcda} for input file @file{dir/foo.c}, or -@file{dir/foo.gcda} for output file specified as @option{-o dir/foo.o}). -@xref{Cross-profiling}. +@item -fdump-rtl-sms +@opindex fdump-rtl-sms +Dump after modulo scheduling. This pass is only run on some +architectures. -@cindex @command{gcov} -@item --coverage -@opindex coverage +@item -fdump-rtl-stack +@opindex fdump-rtl-stack +Dump after conversion from GCC's ``flat register file'' registers to the +x87's stack-like registers. This pass is only run on x86 variants. -This option is used to compile and link code instrumented for coverage -analysis. The option is a synonym for @option{-fprofile-arcs} -@option{-ftest-coverage} (when compiling) and @option{-lgcov} (when -linking). See the documentation for those options for more details. +@item -fdump-rtl-subreg1 +@itemx -fdump-rtl-subreg2 +@opindex fdump-rtl-subreg1 +@opindex fdump-rtl-subreg2 +@option{-fdump-rtl-subreg1} and @option{-fdump-rtl-subreg2} enable dumping after +the two subreg expansion passes. -@itemize +@item -fdump-rtl-unshare +@opindex fdump-rtl-unshare +Dump after all rtl has been unshared. -@item -Compile the source files with @option{-fprofile-arcs} plus optimization -and code generation options. For test coverage analysis, use the -additional @option{-ftest-coverage} option. You do not need to profile -every source file in a program. +@item -fdump-rtl-vartrack +@opindex fdump-rtl-vartrack +Dump after variable tracking. -@item -Link your object files with @option{-lgcov} or @option{-fprofile-arcs} -(the latter implies the former). +@item -fdump-rtl-vregs +@opindex fdump-rtl-vregs +Dump after converting virtual registers to hard registers. -@item -Run the program on a representative workload to generate the arc profile -information. This may be repeated any number of times. You can run -concurrent instances of your program, and provided that the file system -supports locking, the data files will be correctly updated. Also -@code{fork} calls are detected and correctly handled (double counting -will not happen). +@item -fdump-rtl-web +@opindex fdump-rtl-web +Dump after live range splitting. -@item -For profile-directed optimizations, compile the source files again with -the same optimization and code generation options plus -@option{-fbranch-probabilities} (@pxref{Optimize Options,,Options that -Control Optimization}). +@item -fdump-rtl-regclass +@itemx -fdump-rtl-subregs_of_mode_init +@itemx -fdump-rtl-subregs_of_mode_finish +@itemx -fdump-rtl-dfinit +@itemx -fdump-rtl-dfinish +@opindex fdump-rtl-regclass +@opindex fdump-rtl-subregs_of_mode_init +@opindex fdump-rtl-subregs_of_mode_finish +@opindex fdump-rtl-dfinit +@opindex fdump-rtl-dfinish +These dumps are defined but always produce empty files. -@item -For test coverage analysis, use @command{gcov} to produce human readable -information from the @file{.gcno} and @file{.gcda} files. Refer to the -@command{gcov} documentation for further information. +@item -da +@itemx -fdump-rtl-all +@opindex da +@opindex fdump-rtl-all +Produce all the dumps listed above. -@end itemize +@item -dA +@opindex dA +Annotate the assembler output with miscellaneous debugging information. -With @option{-fprofile-arcs}, for each function of your program GCC -creates a program flow graph, then finds a spanning tree for the graph. -Only arcs that are not on the spanning tree have to be instrumented: the -compiler adds code to count the number of times that these arcs are -executed. When an arc is the only exit or only entrance to a block, the -instrumentation code can be added to the block; otherwise, a new basic -block must be created to hold the instrumentation code. +@item -dD +@opindex dD +Dump all macro definitions, at the end of preprocessing, in addition to +normal output. -@need 2000 -@item -ftest-coverage -@opindex ftest-coverage -Produce a notes file that the @command{gcov} code-coverage utility -(@pxref{Gcov,, @command{gcov}---a Test Coverage Program}) can use to -show program coverage. Each source file's note file is called -@file{@var{auxname}.gcno}. Refer to the @option{-fprofile-arcs} option -above for a description of @var{auxname} and instructions on how to -generate test coverage data. Coverage data matches the source files -more closely if you do not optimize. +@item -dH +@opindex dH +Produce a core dump whenever an error occurs. -@item -fdbg-cnt-list -@opindex fdbg-cnt-list -Print the name and the counter upper bound for all debug counters. +@item -dp +@opindex dp +Annotate the assembler output with a comment indicating which +pattern and alternative is used. The length of each instruction is +also printed. +@item -dP +@opindex dP +Dump the RTL in the assembler output as a comment before each instruction. +Also turns on @option{-dp} annotation. -@item -fdbg-cnt=@var{counter-value-list} -@opindex fdbg-cnt -Set the internal debug counter upper bound. @var{counter-value-list} -is a comma-separated list of @var{name}:@var{value} pairs -which sets the upper bound of each debug counter @var{name} to @var{value}. -All debug counters have the initial upper bound of @code{UINT_MAX}; -thus @code{dbg_cnt} returns true always unless the upper bound -is set by this option. -For example, with @option{-fdbg-cnt=dce:10,tail_call:0}, -@code{dbg_cnt(dce)} returns true only for first 10 invocations. +@item -dx +@opindex dx +Just generate RTL for a function instead of compiling it. Usually used +with @option{-fdump-rtl-expand}. +@end table -@item -fenable-@var{kind}-@var{pass} -@itemx -fdisable-@var{kind}-@var{pass}=@var{range-list} -@opindex fdisable- -@opindex fenable- +@item -fdump-noaddr +@opindex fdump-noaddr +When doing debugging dumps, suppress address output. This makes it more +feasible to use diff on debugging dumps for compiler invocations with +different compiler binaries and/or different +text / bss / data / heap / stack / dso start locations. -This is a set of options that are used to explicitly disable/enable -optimization passes. These options are intended for use for debugging GCC. -Compiler users should use regular options for enabling/disabling -passes instead. +@item -freport-bug +@opindex freport-bug +Collect and dump debug information into temporary file if ICE in C/C++ +compiler occured. -@table @gcctabopt +@item -fdump-unnumbered +@opindex fdump-unnumbered +When doing debugging dumps, suppress instruction numbers and address output. +This makes it more feasible to use diff on debugging dumps for compiler +invocations with different options, in particular with and without +@option{-g}. -@item -fdisable-ipa-@var{pass} -Disable IPA pass @var{pass}. @var{pass} is the pass name. If the same pass is -statically invoked in the compiler multiple times, the pass name should be -appended with a sequential number starting from 1. +@item -fdump-unnumbered-links +@opindex fdump-unnumbered-links +When doing debugging dumps (see @option{-d} option above), suppress +instruction numbers for the links to the previous and next instructions +in a sequence. -@item -fdisable-rtl-@var{pass} -@itemx -fdisable-rtl-@var{pass}=@var{range-list} -Disable RTL pass @var{pass}. @var{pass} is the pass name. If the same pass is -statically invoked in the compiler multiple times, the pass name should be -appended with a sequential number starting from 1. @var{range-list} is a -comma-separated list of function ranges or assembler names. Each range is a number -pair separated by a colon. The range is inclusive in both ends. If the range -is trivial, the number pair can be simplified as a single number. If the -function's call graph node's @var{uid} falls within one of the specified ranges, -the @var{pass} is disabled for that function. The @var{uid} is shown in the -function header of a dump file, and the pass names can be dumped by using -option @option{-fdump-passes}. +@item -fdump-translation-unit @r{(C++ only)} +@itemx -fdump-translation-unit-@var{options} @r{(C++ only)} +@opindex fdump-translation-unit +Dump a representation of the tree structure for the entire translation +unit to a file. The file name is made by appending @file{.tu} to the +source file name, and the file is created in the same directory as the +output file. If the @samp{-@var{options}} form is used, @var{options} +controls the details of the dump as described for the +@option{-fdump-tree} options. -@item -fdisable-tree-@var{pass} -@itemx -fdisable-tree-@var{pass}=@var{range-list} -Disable tree pass @var{pass}. See @option{-fdisable-rtl} for the description of -option arguments. +@item -fdump-class-hierarchy @r{(C++ only)} +@itemx -fdump-class-hierarchy-@var{options} @r{(C++ only)} +@opindex fdump-class-hierarchy +Dump a representation of each class's hierarchy and virtual function +table layout to a file. The file name is made by appending +@file{.class} to the source file name, and the file is created in the +same directory as the output file. If the @samp{-@var{options}} form +is used, @var{options} controls the details of the dump as described +for the @option{-fdump-tree} options. -@item -fenable-ipa-@var{pass} -Enable IPA pass @var{pass}. @var{pass} is the pass name. If the same pass is -statically invoked in the compiler multiple times, the pass name should be -appended with a sequential number starting from 1. +@item -fdump-ipa-@var{switch} +@opindex fdump-ipa +Control the dumping at various stages of inter-procedural analysis +language tree to a file. The file name is generated by appending a +switch specific suffix to the source file name, and the file is created +in the same directory as the output file. The following dumps are +possible: -@item -fenable-rtl-@var{pass} -@itemx -fenable-rtl-@var{pass}=@var{range-list} -Enable RTL pass @var{pass}. See @option{-fdisable-rtl} for option argument -description and examples. - -@item -fenable-tree-@var{pass} -@itemx -fenable-tree-@var{pass}=@var{range-list} -Enable tree pass @var{pass}. See @option{-fdisable-rtl} for the description -of option arguments. +@table @samp +@item all +Enables all inter-procedural analysis dumps. -@end table +@item cgraph +Dumps information about call-graph optimization, unused function removal, +and inlining decisions. -Here are some examples showing uses of these options. +@item inline +Dump after function inlining. -@smallexample +@end table -# disable ccp1 for all functions - -fdisable-tree-ccp1 -# disable complete unroll for function whose cgraph node uid is 1 - -fenable-tree-cunroll=1 -# disable gcse2 for functions at the following ranges [1,1], -# [300,400], and [400,1000] -# disable gcse2 for functions foo and foo2 - -fdisable-rtl-gcse2=foo,foo2 -# disable early inlining - -fdisable-tree-einline -# disable ipa inlining - -fdisable-ipa-inline -# enable tree full unroll - -fenable-tree-unroll +@item -fdump-passes +@opindex fdump-passes +Dump the list of optimization passes that are turned on and off by +the current command-line options. -@end smallexample +@item -fdump-statistics-@var{option} +@opindex fdump-statistics +Enable and control dumping of pass statistics in a separate file. The +file name is generated by appending a suffix ending in +@samp{.statistics} to the source file name, and the file is created in +the same directory as the output file. If the @samp{-@var{option}} +form is used, @samp{-stats} causes counters to be summed over the +whole compilation unit while @samp{-details} dumps every event as +the passes generate them. The default with no option is to sum +counters for each function compiled. -@item -d@var{letters} -@itemx -fdump-rtl-@var{pass} -@itemx -fdump-rtl-@var{pass}=@var{filename} -@opindex d -@opindex fdump-rtl-@var{pass} -Says to make debugging dumps during compilation at times specified by -@var{letters}. This is used for debugging the RTL-based passes of the -compiler. The file names for most of the dumps are made by appending -a pass number and a word to the @var{dumpname}, and the files are -created in the directory of the output file. In case of +@item -fdump-tree-@var{switch} +@itemx -fdump-tree-@var{switch}-@var{options} +@itemx -fdump-tree-@var{switch}-@var{options}=@var{filename} +@opindex fdump-tree +Control the dumping at various stages of processing the intermediate +language tree to a file. The file name is generated by appending a +switch-specific suffix to the source file name, and the file is +created in the same directory as the output file. In case of @option{=@var{filename}} option, the dump is output on the given file -instead of the pass numbered dump files. Note that the pass number is -assigned as passes are registered into the pass manager. Most passes -are registered in the order that they will execute and for these passes -the number corresponds to the pass execution order. However, passes -registered by plugins, passes specific to compilation targets, or -passes that are otherwise registered after all the other passes are -numbered higher than a pass named "final", even if they are executed -earlier. @var{dumpname} is generated from the name of the output -file if explicitly specified and not an executable, otherwise it is -the basename of the source file. These switches may have different -effects when @option{-E} is used for preprocessing. - -Debug dumps can be enabled with a @option{-fdump-rtl} switch or some -@option{-d} option @var{letters}. Here are the possible -letters for use in @var{pass} and @var{letters}, and their meanings: +instead of the auto named dump files. If the @samp{-@var{options}} +form is used, @var{options} is a list of @samp{-} separated options +which control the details of the dump. Not all options are applicable +to all dumps; those that are not meaningful are ignored. The +following options are available -@table @gcctabopt +@table @samp +@item address +Print the address of each node. Usually this is not meaningful as it +changes according to the environment and source file. Its primary use +is for tying up a dump file with a debug environment. +@item asmname +If @code{DECL_ASSEMBLER_NAME} has been set for a given decl, use that +in the dump instead of @code{DECL_NAME}. Its primary use is ease of +use working backward from mangled names in the assembly file. +@item slim +When dumping front-end intermediate representations, inhibit dumping +of members of a scope or body of a function merely because that scope +has been reached. Only dump such items when they are directly reachable +by some other path. -@item -fdump-rtl-alignments -@opindex fdump-rtl-alignments -Dump after branch alignments have been computed. +When dumping pretty-printed trees, this option inhibits dumping the +bodies of control structures. -@item -fdump-rtl-asmcons -@opindex fdump-rtl-asmcons -Dump after fixing rtl statements that have unsatisfied in/out constraints. +When dumping RTL, print the RTL in slim (condensed) form instead of +the default LISP-like representation. +@item raw +Print a raw representation of the tree. By default, trees are +pretty-printed into a C-like representation. +@item details +Enable more detailed dumps (not honored by every dump option). Also +include information from the optimization passes. +@item stats +Enable dumping various statistics about the pass (not honored by every dump +option). +@item blocks +Enable showing basic block boundaries (disabled in raw dumps). +@item graph +For each of the other indicated dump files (@option{-fdump-rtl-@var{pass}}), +dump a representation of the control flow graph suitable for viewing with +GraphViz to @file{@var{file}.@var{passid}.@var{pass}.dot}. Each function in +the file is pretty-printed as a subgraph, so that GraphViz can render them +all in a single plot. -@item -fdump-rtl-auto_inc_dec -@opindex fdump-rtl-auto_inc_dec -Dump after auto-inc-dec discovery. This pass is only run on -architectures that have auto inc or auto dec instructions. +This option currently only works for RTL dumps, and the RTL is always +dumped in slim form. +@item vops +Enable showing virtual operands for every statement. +@item lineno +Enable showing line numbers for statements. +@item uid +Enable showing the unique ID (@code{DECL_UID}) for each variable. +@item verbose +Enable showing the tree dump for each statement. +@item eh +Enable showing the EH region number holding each statement. +@item scev +Enable showing scalar evolution analysis details. +@item optimized +Enable showing optimization information (only available in certain +passes). +@item missed +Enable showing missed optimization information (only available in certain +passes). +@item note +Enable other detailed optimization information (only available in +certain passes). +@item =@var{filename} +Instead of an auto named dump file, output into the given file +name. The file names @file{stdout} and @file{stderr} are treated +specially and are considered already open standard streams. For +example, -@item -fdump-rtl-barriers -@opindex fdump-rtl-barriers -Dump after cleaning up the barrier instructions. +@smallexample +gcc -O2 -ftree-vectorize -fdump-tree-vect-blocks=foo.dump + -fdump-tree-pre=stderr file.c +@end smallexample -@item -fdump-rtl-bbpart -@opindex fdump-rtl-bbpart -Dump after partitioning hot and cold basic blocks. +outputs vectorizer dump into @file{foo.dump}, while the PRE dump is +output on to @file{stderr}. If two conflicting dump filenames are +given for the same pass, then the latter option overrides the earlier +one. -@item -fdump-rtl-bbro -@opindex fdump-rtl-bbro -Dump after block reordering. +@item split-paths +@opindex fdump-tree-split-paths +Dump each function after splitting paths to loop backedges. The file +name is made by appending @file{.split-paths} to the source file name. -@item -fdump-rtl-btl1 -@itemx -fdump-rtl-btl2 -@opindex fdump-rtl-btl2 -@opindex fdump-rtl-btl2 -@option{-fdump-rtl-btl1} and @option{-fdump-rtl-btl2} enable dumping -after the two branch -target load optimization passes. +@item all +Turn on all options, except @option{raw}, @option{slim}, @option{verbose} +and @option{lineno}. -@item -fdump-rtl-bypass -@opindex fdump-rtl-bypass -Dump after jump bypassing and control flow optimizations. +@item optall +Turn on all optimization options, i.e., @option{optimized}, +@option{missed}, and @option{note}. +@end table -@item -fdump-rtl-combine -@opindex fdump-rtl-combine -Dump after the RTL instruction combination pass. +The following tree dumps are possible: +@table @samp -@item -fdump-rtl-compgotos -@opindex fdump-rtl-compgotos -Dump after duplicating the computed gotos. +@item original +@opindex fdump-tree-original +Dump before any tree based optimization, to @file{@var{file}.original}. -@item -fdump-rtl-ce1 -@itemx -fdump-rtl-ce2 -@itemx -fdump-rtl-ce3 -@opindex fdump-rtl-ce1 -@opindex fdump-rtl-ce2 -@opindex fdump-rtl-ce3 -@option{-fdump-rtl-ce1}, @option{-fdump-rtl-ce2}, and -@option{-fdump-rtl-ce3} enable dumping after the three -if conversion passes. +@item optimized +@opindex fdump-tree-optimized +Dump after all tree based optimization, to @file{@var{file}.optimized}. -@item -fdump-rtl-cprop_hardreg -@opindex fdump-rtl-cprop_hardreg -Dump after hard register copy propagation. +@item gimple +@opindex fdump-tree-gimple +Dump each function before and after the gimplification pass to a file. The +file name is made by appending @file{.gimple} to the source file name. -@item -fdump-rtl-csa -@opindex fdump-rtl-csa -Dump after combining stack adjustments. +@item cfg +@opindex fdump-tree-cfg +Dump the control flow graph of each function to a file. The file name is +made by appending @file{.cfg} to the source file name. -@item -fdump-rtl-cse1 -@itemx -fdump-rtl-cse2 -@opindex fdump-rtl-cse1 -@opindex fdump-rtl-cse2 -@option{-fdump-rtl-cse1} and @option{-fdump-rtl-cse2} enable dumping after -the two common subexpression elimination passes. +@item ch +@opindex fdump-tree-ch +Dump each function after copying loop headers. The file name is made by +appending @file{.ch} to the source file name. -@item -fdump-rtl-dce -@opindex fdump-rtl-dce -Dump after the standalone dead code elimination passes. +@item ssa +@opindex fdump-tree-ssa +Dump SSA related information to a file. The file name is made by appending +@file{.ssa} to the source file name. -@item -fdump-rtl-dbr -@opindex fdump-rtl-dbr -Dump after delayed branch scheduling. +@item alias +@opindex fdump-tree-alias +Dump aliasing information for each function. The file name is made by +appending @file{.alias} to the source file name. -@item -fdump-rtl-dce1 -@itemx -fdump-rtl-dce2 -@opindex fdump-rtl-dce1 -@opindex fdump-rtl-dce2 -@option{-fdump-rtl-dce1} and @option{-fdump-rtl-dce2} enable dumping after -the two dead store elimination passes. +@item ccp +@opindex fdump-tree-ccp +Dump each function after CCP@. The file name is made by appending +@file{.ccp} to the source file name. -@item -fdump-rtl-eh -@opindex fdump-rtl-eh -Dump after finalization of EH handling code. +@item storeccp +@opindex fdump-tree-storeccp +Dump each function after STORE-CCP@. The file name is made by appending +@file{.storeccp} to the source file name. -@item -fdump-rtl-eh_ranges -@opindex fdump-rtl-eh_ranges -Dump after conversion of EH handling range regions. +@item pre +@opindex fdump-tree-pre +Dump trees after partial redundancy elimination. The file name is made +by appending @file{.pre} to the source file name. -@item -fdump-rtl-expand -@opindex fdump-rtl-expand -Dump after RTL generation. +@item fre +@opindex fdump-tree-fre +Dump trees after full redundancy elimination. The file name is made +by appending @file{.fre} to the source file name. -@item -fdump-rtl-fwprop1 -@itemx -fdump-rtl-fwprop2 -@opindex fdump-rtl-fwprop1 -@opindex fdump-rtl-fwprop2 -@option{-fdump-rtl-fwprop1} and @option{-fdump-rtl-fwprop2} enable -dumping after the two forward propagation passes. +@item copyprop +@opindex fdump-tree-copyprop +Dump trees after copy propagation. The file name is made +by appending @file{.copyprop} to the source file name. -@item -fdump-rtl-gcse1 -@itemx -fdump-rtl-gcse2 -@opindex fdump-rtl-gcse1 -@opindex fdump-rtl-gcse2 -@option{-fdump-rtl-gcse1} and @option{-fdump-rtl-gcse2} enable dumping -after global common subexpression elimination. +@item store_copyprop +@opindex fdump-tree-store_copyprop +Dump trees after store copy-propagation. The file name is made +by appending @file{.store_copyprop} to the source file name. -@item -fdump-rtl-init-regs -@opindex fdump-rtl-init-regs -Dump after the initialization of the registers. +@item dce +@opindex fdump-tree-dce +Dump each function after dead code elimination. The file name is made by +appending @file{.dce} to the source file name. -@item -fdump-rtl-initvals -@opindex fdump-rtl-initvals -Dump after the computation of the initial value sets. +@item sra +@opindex fdump-tree-sra +Dump each function after performing scalar replacement of aggregates. The +file name is made by appending @file{.sra} to the source file name. -@item -fdump-rtl-into_cfglayout -@opindex fdump-rtl-into_cfglayout -Dump after converting to cfglayout mode. +@item sink +@opindex fdump-tree-sink +Dump each function after performing code sinking. The file name is made +by appending @file{.sink} to the source file name. -@item -fdump-rtl-ira -@opindex fdump-rtl-ira -Dump after iterated register allocation. +@item dom +@opindex fdump-tree-dom +Dump each function after applying dominator tree optimizations. The file +name is made by appending @file{.dom} to the source file name. -@item -fdump-rtl-jump -@opindex fdump-rtl-jump -Dump after the second jump optimization. +@item dse +@opindex fdump-tree-dse +Dump each function after applying dead store elimination. The file +name is made by appending @file{.dse} to the source file name. -@item -fdump-rtl-loop2 -@opindex fdump-rtl-loop2 -@option{-fdump-rtl-loop2} enables dumping after the rtl -loop optimization passes. +@item phiopt +@opindex fdump-tree-phiopt +Dump each function after optimizing PHI nodes into straightline code. The file +name is made by appending @file{.phiopt} to the source file name. -@item -fdump-rtl-mach -@opindex fdump-rtl-mach -Dump after performing the machine dependent reorganization pass, if that -pass exists. +@item backprop +@opindex fdump-tree-backprop +Dump each function after back-propagating use information up the definition +chain. The file name is made by appending @file{.backprop} to the +source file name. -@item -fdump-rtl-mode_sw -@opindex fdump-rtl-mode_sw -Dump after removing redundant mode switches. +@item forwprop +@opindex fdump-tree-forwprop +Dump each function after forward propagating single use variables. The file +name is made by appending @file{.forwprop} to the source file name. -@item -fdump-rtl-rnreg -@opindex fdump-rtl-rnreg -Dump after register renumbering. +@item nrv +@opindex fdump-tree-nrv +Dump each function after applying the named return value optimization on +generic trees. The file name is made by appending @file{.nrv} to the source +file name. -@item -fdump-rtl-outof_cfglayout -@opindex fdump-rtl-outof_cfglayout -Dump after converting from cfglayout mode. +@item vect +@opindex fdump-tree-vect +Dump each function after applying vectorization of loops. The file name is +made by appending @file{.vect} to the source file name. -@item -fdump-rtl-peephole2 -@opindex fdump-rtl-peephole2 -Dump after the peephole pass. +@item slp +@opindex fdump-tree-slp +Dump each function after applying vectorization of basic blocks. The file name +is made by appending @file{.slp} to the source file name. -@item -fdump-rtl-postreload -@opindex fdump-rtl-postreload -Dump after post-reload optimizations. +@item vrp +@opindex fdump-tree-vrp +Dump each function after Value Range Propagation (VRP). The file name +is made by appending @file{.vrp} to the source file name. -@item -fdump-rtl-pro_and_epilogue -@opindex fdump-rtl-pro_and_epilogue -Dump after generating the function prologues and epilogues. +@item oaccdevlow +@opindex fdump-tree-oaccdevlow +Dump each function after applying device-specific OpenACC transformations. +The file name is made by appending @file{.oaccdevlow} to the source file name. -@item -fdump-rtl-sched1 -@itemx -fdump-rtl-sched2 -@opindex fdump-rtl-sched1 -@opindex fdump-rtl-sched2 -@option{-fdump-rtl-sched1} and @option{-fdump-rtl-sched2} enable dumping -after the basic block scheduling passes. +@item all +@opindex fdump-tree-all +Enable all the available tree dumps with the flags provided in this option. +@end table -@item -fdump-rtl-ree -@opindex fdump-rtl-ree -Dump after sign/zero extension elimination. +@item -fopt-info +@itemx -fopt-info-@var{options} +@itemx -fopt-info-@var{options}=@var{filename} +@opindex fopt-info +Controls optimization dumps from various optimization passes. If the +@samp{-@var{options}} form is used, @var{options} is a list of +@samp{-} separated option keywords to select the dump details and +optimizations. -@item -fdump-rtl-seqabstr -@opindex fdump-rtl-seqabstr -Dump after common sequence discovery. +The @var{options} can be divided into two groups: options describing the +verbosity of the dump, and options describing which optimizations +should be included. The options from both the groups can be freely +mixed as they are non-overlapping. However, in case of any conflicts, +the later options override the earlier options on the command +line. -@item -fdump-rtl-shorten -@opindex fdump-rtl-shorten -Dump after shortening branches. +The following options control the dump verbosity: -@item -fdump-rtl-sibling -@opindex fdump-rtl-sibling -Dump after sibling call optimizations. +@table @samp +@item optimized +Print information when an optimization is successfully applied. It is +up to a pass to decide which information is relevant. For example, the +vectorizer passes print the source location of loops which are +successfully vectorized. +@item missed +Print information about missed optimizations. Individual passes +control which information to include in the output. +@item note +Print verbose information about optimizations, such as certain +transformations, more detailed messages about decisions etc. +@item all +Print detailed optimization information. This includes +@samp{optimized}, @samp{missed}, and @samp{note}. +@end table -@item -fdump-rtl-split1 -@itemx -fdump-rtl-split2 -@itemx -fdump-rtl-split3 -@itemx -fdump-rtl-split4 -@itemx -fdump-rtl-split5 -@opindex fdump-rtl-split1 -@opindex fdump-rtl-split2 -@opindex fdump-rtl-split3 -@opindex fdump-rtl-split4 -@opindex fdump-rtl-split5 -These options enable dumping after five rounds of -instruction splitting. +One or more of the following option keywords can be used to describe a +group of optimizations: -@item -fdump-rtl-sms -@opindex fdump-rtl-sms -Dump after modulo scheduling. This pass is only run on some -architectures. +@table @samp +@item ipa +Enable dumps from all interprocedural optimizations. +@item loop +Enable dumps from all loop optimizations. +@item inline +Enable dumps from all inlining optimizations. +@item vec +Enable dumps from all vectorization optimizations. +@item optall +Enable dumps from all optimizations. This is a superset of +the optimization groups listed above. +@end table -@item -fdump-rtl-stack -@opindex fdump-rtl-stack -Dump after conversion from GCC's ``flat register file'' registers to the -x87's stack-like registers. This pass is only run on x86 variants. +If @var{options} is +omitted, it defaults to @samp{optimized-optall}, which means to dump all +info about successful optimizations from all the passes. -@item -fdump-rtl-subreg1 -@itemx -fdump-rtl-subreg2 -@opindex fdump-rtl-subreg1 -@opindex fdump-rtl-subreg2 -@option{-fdump-rtl-subreg1} and @option{-fdump-rtl-subreg2} enable dumping after -the two subreg expansion passes. +If the @var{filename} is provided, then the dumps from all the +applicable optimizations are concatenated into the @var{filename}. +Otherwise the dump is output onto @file{stderr}. Though multiple +@option{-fopt-info} options are accepted, only one of them can include +a @var{filename}. If other filenames are provided then all but the +first such option are ignored. -@item -fdump-rtl-unshare -@opindex fdump-rtl-unshare -Dump after all rtl has been unshared. - -@item -fdump-rtl-vartrack -@opindex fdump-rtl-vartrack -Dump after variable tracking. +Note that the output @var{filename} is overwritten +in case of multiple translation units. If a combined output from +multiple translation units is desired, @file{stderr} should be used +instead. -@item -fdump-rtl-vregs -@opindex fdump-rtl-vregs -Dump after converting virtual registers to hard registers. +In the following example, the optimization info is output to +@file{stderr}: -@item -fdump-rtl-web -@opindex fdump-rtl-web -Dump after live range splitting. +@smallexample +gcc -O3 -fopt-info +@end smallexample -@item -fdump-rtl-regclass -@itemx -fdump-rtl-subregs_of_mode_init -@itemx -fdump-rtl-subregs_of_mode_finish -@itemx -fdump-rtl-dfinit -@itemx -fdump-rtl-dfinish -@opindex fdump-rtl-regclass -@opindex fdump-rtl-subregs_of_mode_init -@opindex fdump-rtl-subregs_of_mode_finish -@opindex fdump-rtl-dfinit -@opindex fdump-rtl-dfinish -These dumps are defined but always produce empty files. +This example: +@smallexample +gcc -O3 -fopt-info-missed=missed.all +@end smallexample -@item -da -@itemx -fdump-rtl-all -@opindex da -@opindex fdump-rtl-all -Produce all the dumps listed above. +@noindent +outputs missed optimization report from all the passes into +@file{missed.all}, and this one: -@item -dA -@opindex dA -Annotate the assembler output with miscellaneous debugging information. +@smallexample +gcc -O2 -ftree-vectorize -fopt-info-vec-missed +@end smallexample -@item -dD -@opindex dD -Dump all macro definitions, at the end of preprocessing, in addition to -normal output. +@noindent +prints information about missed optimization opportunities from +vectorization passes on @file{stderr}. +Note that @option{-fopt-info-vec-missed} is equivalent to +@option{-fopt-info-missed-vec}. -@item -dH -@opindex dH -Produce a core dump whenever an error occurs. +As another example, +@smallexample +gcc -O3 -fopt-info-inline-optimized-missed=inline.txt +@end smallexample -@item -dp -@opindex dp -Annotate the assembler output with a comment indicating which -pattern and alternative is used. The length of each instruction is -also printed. +@noindent +outputs information about missed optimizations as well as +optimized locations from all the inlining passes into +@file{inline.txt}. -@item -dP -@opindex dP -Dump the RTL in the assembler output as a comment before each instruction. -Also turns on @option{-dp} annotation. +Finally, consider: -@item -dx -@opindex dx -Just generate RTL for a function instead of compiling it. Usually used -with @option{-fdump-rtl-expand}. -@end table +@smallexample +gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt +@end smallexample -@item -fdump-noaddr -@opindex fdump-noaddr -When doing debugging dumps, suppress address output. This makes it more -feasible to use diff on debugging dumps for compiler invocations with -different compiler binaries and/or different -text / bss / data / heap / stack / dso start locations. +@noindent +Here the two output filenames @file{vec.miss} and @file{loop.opt} are +in conflict since only one output file is allowed. In this case, only +the first option takes effect and the subsequent options are +ignored. Thus only @file{vec.miss} is produced which contains +dumps from the vectorizer about missed opportunities. -@item -freport-bug -@opindex freport-bug -Collect and dump debug information into temporary file if ICE in C/C++ -compiler occured. +@item -frandom-seed=@var{string} +@opindex frandom-seed +This option provides a seed that GCC uses in place of +random numbers in generating certain symbol names +that have to be different in every compiled file. It is also used to +place unique stamps in coverage data files and the object files that +produce them. You can use the @option{-frandom-seed} option to produce +reproducibly identical object files. -@item -fdump-unnumbered -@opindex fdump-unnumbered -When doing debugging dumps, suppress instruction numbers and address output. -This makes it more feasible to use diff on debugging dumps for compiler -invocations with different options, in particular with and without -@option{-g}. +The @var{string} can either be a number (decimal, octal or hex) or an +arbitrary string (in which case it's converted to a number by +computing CRC32). -@item -fdump-unnumbered-links -@opindex fdump-unnumbered-links -When doing debugging dumps (see @option{-d} option above), suppress -instruction numbers for the links to the previous and next instructions -in a sequence. +The @var{string} should be different for every file you compile. -@item -fdump-translation-unit @r{(C++ only)} -@itemx -fdump-translation-unit-@var{options} @r{(C++ only)} -@opindex fdump-translation-unit -Dump a representation of the tree structure for the entire translation -unit to a file. The file name is made by appending @file{.tu} to the -source file name, and the file is created in the same directory as the -output file. If the @samp{-@var{options}} form is used, @var{options} -controls the details of the dump as described for the -@option{-fdump-tree} options. +@item -fsched-verbose=@var{n} +@opindex fsched-verbose +On targets that use instruction scheduling, this option controls the +amount of debugging output the scheduler prints to the dump files. -@item -fdump-class-hierarchy @r{(C++ only)} -@itemx -fdump-class-hierarchy-@var{options} @r{(C++ only)} -@opindex fdump-class-hierarchy -Dump a representation of each class's hierarchy and virtual function -table layout to a file. The file name is made by appending -@file{.class} to the source file name, and the file is created in the -same directory as the output file. If the @samp{-@var{options}} form -is used, @var{options} controls the details of the dump as described -for the @option{-fdump-tree} options. +For @var{n} greater than zero, @option{-fsched-verbose} outputs the +same information as @option{-fdump-rtl-sched1} and @option{-fdump-rtl-sched2}. +For @var{n} greater than one, it also output basic block probabilities, +detailed ready list information and unit/insn info. For @var{n} greater +than two, it includes RTL at abort point, control-flow and regions info. +And for @var{n} over four, @option{-fsched-verbose} also includes +dependence info. -@item -fdump-ipa-@var{switch} -@opindex fdump-ipa -Control the dumping at various stages of inter-procedural analysis -language tree to a file. The file name is generated by appending a -switch specific suffix to the source file name, and the file is created -in the same directory as the output file. The following dumps are -possible: +@item -save-temps +@itemx -save-temps=cwd +@opindex save-temps +Store the usual ``temporary'' intermediate files permanently; place them +in the current directory and name them based on the source file. Thus, +compiling @file{foo.c} with @option{-c -save-temps} produces files +@file{foo.i} and @file{foo.s}, as well as @file{foo.o}. This creates a +preprocessed @file{foo.i} output file even though the compiler now +normally uses an integrated preprocessor. -@table @samp -@item all -Enables all inter-procedural analysis dumps. +When used in combination with the @option{-x} command-line option, +@option{-save-temps} is sensible enough to avoid over writing an +input source file with the same extension as an intermediate file. +The corresponding intermediate file may be obtained by renaming the +source file before using @option{-save-temps}. -@item cgraph -Dumps information about call-graph optimization, unused function removal, -and inlining decisions. +If you invoke GCC in parallel, compiling several different source +files that share a common base name in different subdirectories or the +same source file compiled for multiple output destinations, it is +likely that the different parallel compilers will interfere with each +other, and overwrite the temporary files. For instance: -@item inline -Dump after function inlining. +@smallexample +gcc -save-temps -o outdir1/foo.o indir1/foo.c& +gcc -save-temps -o outdir2/foo.o indir2/foo.c& +@end smallexample -@end table +may result in @file{foo.i} and @file{foo.o} being written to +simultaneously by both compilers. -@item -fdump-passes -@opindex fdump-passes -Dump the list of optimization passes that are turned on and off by -the current command-line options. +@item -save-temps=obj +@opindex save-temps=obj +Store the usual ``temporary'' intermediate files permanently. If the +@option{-o} option is used, the temporary files are based on the +object file. If the @option{-o} option is not used, the +@option{-save-temps=obj} switch behaves like @option{-save-temps}. -@item -fdump-statistics-@var{option} -@opindex fdump-statistics -Enable and control dumping of pass statistics in a separate file. The -file name is generated by appending a suffix ending in -@samp{.statistics} to the source file name, and the file is created in -the same directory as the output file. If the @samp{-@var{option}} -form is used, @samp{-stats} causes counters to be summed over the -whole compilation unit while @samp{-details} dumps every event as -the passes generate them. The default with no option is to sum -counters for each function compiled. +For example: -@item -fdump-tree-@var{switch} -@itemx -fdump-tree-@var{switch}-@var{options} -@itemx -fdump-tree-@var{switch}-@var{options}=@var{filename} -@opindex fdump-tree -Control the dumping at various stages of processing the intermediate -language tree to a file. The file name is generated by appending a -switch-specific suffix to the source file name, and the file is -created in the same directory as the output file. In case of -@option{=@var{filename}} option, the dump is output on the given file -instead of the auto named dump files. If the @samp{-@var{options}} -form is used, @var{options} is a list of @samp{-} separated options -which control the details of the dump. Not all options are applicable -to all dumps; those that are not meaningful are ignored. The -following options are available +@smallexample +gcc -save-temps=obj -c foo.c +gcc -save-temps=obj -c bar.c -o dir/xbar.o +gcc -save-temps=obj foobar.c -o dir2/yfoobar +@end smallexample -@table @samp -@item address -Print the address of each node. Usually this is not meaningful as it -changes according to the environment and source file. Its primary use -is for tying up a dump file with a debug environment. -@item asmname -If @code{DECL_ASSEMBLER_NAME} has been set for a given decl, use that -in the dump instead of @code{DECL_NAME}. Its primary use is ease of -use working backward from mangled names in the assembly file. -@item slim -When dumping front-end intermediate representations, inhibit dumping -of members of a scope or body of a function merely because that scope -has been reached. Only dump such items when they are directly reachable -by some other path. +@noindent +creates @file{foo.i}, @file{foo.s}, @file{dir/xbar.i}, +@file{dir/xbar.s}, @file{dir2/yfoobar.i}, @file{dir2/yfoobar.s}, and +@file{dir2/yfoobar.o}. -When dumping pretty-printed trees, this option inhibits dumping the -bodies of control structures. - -When dumping RTL, print the RTL in slim (condensed) form instead of -the default LISP-like representation. -@item raw -Print a raw representation of the tree. By default, trees are -pretty-printed into a C-like representation. -@item details -Enable more detailed dumps (not honored by every dump option). Also -include information from the optimization passes. -@item stats -Enable dumping various statistics about the pass (not honored by every dump -option). -@item blocks -Enable showing basic block boundaries (disabled in raw dumps). -@item graph -For each of the other indicated dump files (@option{-fdump-rtl-@var{pass}}), -dump a representation of the control flow graph suitable for viewing with -GraphViz to @file{@var{file}.@var{passid}.@var{pass}.dot}. Each function in -the file is pretty-printed as a subgraph, so that GraphViz can render them -all in a single plot. +@item -time@r{[}=@var{file}@r{]} +@opindex time +Report the CPU time taken by each subprocess in the compilation +sequence. For C source files, this is the compiler proper and assembler +(plus the linker if linking is done). -This option currently only works for RTL dumps, and the RTL is always -dumped in slim form. -@item vops -Enable showing virtual operands for every statement. -@item lineno -Enable showing line numbers for statements. -@item uid -Enable showing the unique ID (@code{DECL_UID}) for each variable. -@item verbose -Enable showing the tree dump for each statement. -@item eh -Enable showing the EH region number holding each statement. -@item scev -Enable showing scalar evolution analysis details. -@item optimized -Enable showing optimization information (only available in certain -passes). -@item missed -Enable showing missed optimization information (only available in certain -passes). -@item note -Enable other detailed optimization information (only available in -certain passes). -@item =@var{filename} -Instead of an auto named dump file, output into the given file -name. The file names @file{stdout} and @file{stderr} are treated -specially and are considered already open standard streams. For -example, +Without the specification of an output file, the output looks like this: @smallexample -gcc -O2 -ftree-vectorize -fdump-tree-vect-blocks=foo.dump - -fdump-tree-pre=stderr file.c +# cc1 0.12 0.01 +# as 0.00 0.01 @end smallexample -outputs vectorizer dump into @file{foo.dump}, while the PRE dump is -output on to @file{stderr}. If two conflicting dump filenames are -given for the same pass, then the latter option overrides the earlier -one. - -@item split-paths -@opindex fdump-tree-split-paths -Dump each function after splitting paths to loop backedges. The file -name is made by appending @file{.split-paths} to the source file name. +The first number on each line is the ``user time'', that is time spent +executing the program itself. The second number is ``system time'', +time spent executing operating system routines on behalf of the program. +Both numbers are in seconds. -@item all -Turn on all options, except @option{raw}, @option{slim}, @option{verbose} -and @option{lineno}. +With the specification of an output file, the output is appended to the +named file, and it looks like this: -@item optall -Turn on all optimization options, i.e., @option{optimized}, -@option{missed}, and @option{note}. -@end table +@smallexample +0.12 0.01 cc1 @var{options} +0.00 0.01 as @var{options} +@end smallexample -The following tree dumps are possible: -@table @samp +The ``user time'' and the ``system time'' are moved before the program +name, and the options passed to the program are displayed, so that one +can later tell what file was being compiled, and with which options. -@item original -@opindex fdump-tree-original -Dump before any tree based optimization, to @file{@var{file}.original}. +@item -fvar-tracking +@opindex fvar-tracking +Run variable tracking pass. It computes where variables are stored at each +position in code. Better debugging information is then generated +(if the debugging information format supports this information). -@item optimized -@opindex fdump-tree-optimized -Dump after all tree based optimization, to @file{@var{file}.optimized}. +It is enabled by default when compiling with optimization (@option{-Os}, +@option{-O}, @option{-O2}, @dots{}), debugging information (@option{-g}) and +the debug info format supports it. -@item gimple -@opindex fdump-tree-gimple -Dump each function before and after the gimplification pass to a file. The -file name is made by appending @file{.gimple} to the source file name. +@item -fvar-tracking-assignments +@opindex fvar-tracking-assignments +@opindex fno-var-tracking-assignments +Annotate assignments to user variables early in the compilation and +attempt to carry the annotations over throughout the compilation all the +way to the end, in an attempt to improve debug information while +optimizing. Use of @option{-gdwarf-4} is recommended along with it. -@item cfg -@opindex fdump-tree-cfg -Dump the control flow graph of each function to a file. The file name is -made by appending @file{.cfg} to the source file name. +It can be enabled even if var-tracking is disabled, in which case +annotations are created and maintained, but discarded at the end. +By default, this flag is enabled together with @option{-fvar-tracking}, +except when selective scheduling is enabled. -@item ch -@opindex fdump-tree-ch -Dump each function after copying loop headers. The file name is made by -appending @file{.ch} to the source file name. +@item -fvar-tracking-assignments-toggle +@opindex fvar-tracking-assignments-toggle +@opindex fno-var-tracking-assignments-toggle +Toggle @option{-fvar-tracking-assignments}, in the same way that +@option{-gtoggle} toggles @option{-g}. -@item ssa -@opindex fdump-tree-ssa -Dump SSA related information to a file. The file name is made by appending -@file{.ssa} to the source file name. +@item -print-file-name=@var{library} +@opindex print-file-name +Print the full absolute name of the library file @var{library} that +would be used when linking---and don't do anything else. With this +option, GCC does not compile or link anything; it just prints the +file name. -@item alias -@opindex fdump-tree-alias -Dump aliasing information for each function. The file name is made by -appending @file{.alias} to the source file name. +@item -print-multi-directory +@opindex print-multi-directory +Print the directory name corresponding to the multilib selected by any +other switches present in the command line. This directory is supposed +to exist in @env{GCC_EXEC_PREFIX}. -@item ccp -@opindex fdump-tree-ccp -Dump each function after CCP@. The file name is made by appending -@file{.ccp} to the source file name. +@item -print-multi-lib +@opindex print-multi-lib +Print the mapping from multilib directory names to compiler switches +that enable them. The directory name is separated from the switches by +@samp{;}, and each switch starts with an @samp{@@} instead of the +@samp{-}, without spaces between multiple switches. This is supposed to +ease shell processing. -@item storeccp -@opindex fdump-tree-storeccp -Dump each function after STORE-CCP@. The file name is made by appending -@file{.storeccp} to the source file name. +@item -print-multi-os-directory +@opindex print-multi-os-directory +Print the path to OS libraries for the selected +multilib, relative to some @file{lib} subdirectory. If OS libraries are +present in the @file{lib} subdirectory and no multilibs are used, this is +usually just @file{.}, if OS libraries are present in @file{lib@var{suffix}} +sibling directories this prints e.g.@: @file{../lib64}, @file{../lib} or +@file{../lib32}, or if OS libraries are present in @file{lib/@var{subdir}} +subdirectories it prints e.g.@: @file{amd64}, @file{sparcv9} or @file{ev6}. -@item pre -@opindex fdump-tree-pre -Dump trees after partial redundancy elimination. The file name is made -by appending @file{.pre} to the source file name. +@item -print-multiarch +@opindex print-multiarch +Print the path to OS libraries for the selected multiarch, +relative to some @file{lib} subdirectory. -@item fre -@opindex fdump-tree-fre -Dump trees after full redundancy elimination. The file name is made -by appending @file{.fre} to the source file name. +@item -print-prog-name=@var{program} +@opindex print-prog-name +Like @option{-print-file-name}, but searches for a program such as @command{cpp}. -@item copyprop -@opindex fdump-tree-copyprop -Dump trees after copy propagation. The file name is made -by appending @file{.copyprop} to the source file name. +@item -print-libgcc-file-name +@opindex print-libgcc-file-name +Same as @option{-print-file-name=libgcc.a}. -@item store_copyprop -@opindex fdump-tree-store_copyprop -Dump trees after store copy-propagation. The file name is made -by appending @file{.store_copyprop} to the source file name. +This is useful when you use @option{-nostdlib} or @option{-nodefaultlibs} +but you do want to link with @file{libgcc.a}. You can do: -@item dce -@opindex fdump-tree-dce -Dump each function after dead code elimination. The file name is made by -appending @file{.dce} to the source file name. +@smallexample +gcc -nostdlib @var{files}@dots{} `gcc -print-libgcc-file-name` +@end smallexample -@item sra -@opindex fdump-tree-sra -Dump each function after performing scalar replacement of aggregates. The -file name is made by appending @file{.sra} to the source file name. +@item -print-search-dirs +@opindex print-search-dirs +Print the name of the configured installation directory and a list of +program and library directories @command{gcc} searches---and don't do anything else. -@item sink -@opindex fdump-tree-sink -Dump each function after performing code sinking. The file name is made -by appending @file{.sink} to the source file name. +This is useful when @command{gcc} prints the error message +@samp{installation problem, cannot exec cpp0: No such file or directory}. +To resolve this you either need to put @file{cpp0} and the other compiler +components where @command{gcc} expects to find them, or you can set the environment +variable @env{GCC_EXEC_PREFIX} to the directory where you installed them. +Don't forget the trailing @samp{/}. +@xref{Environment Variables}. -@item dom -@opindex fdump-tree-dom -Dump each function after applying dominator tree optimizations. The file -name is made by appending @file{.dom} to the source file name. +@item -print-sysroot +@opindex print-sysroot +Print the target sysroot directory that is used during +compilation. This is the target sysroot specified either at configure +time or using the @option{--sysroot} option, possibly with an extra +suffix that depends on compilation options. If no target sysroot is +specified, the option prints nothing. -@item dse -@opindex fdump-tree-dse -Dump each function after applying dead store elimination. The file -name is made by appending @file{.dse} to the source file name. +@item -print-sysroot-headers-suffix +@opindex print-sysroot-headers-suffix +Print the suffix added to the target sysroot when searching for +headers, or give an error if the compiler is not configured with such +a suffix---and don't do anything else. -@item phiopt -@opindex fdump-tree-phiopt -Dump each function after optimizing PHI nodes into straightline code. The file -name is made by appending @file{.phiopt} to the source file name. +@item -dumpmachine +@opindex dumpmachine +Print the compiler's target machine (for example, +@samp{i686-pc-linux-gnu})---and don't do anything else. -@item backprop -@opindex fdump-tree-backprop -Dump each function after back-propagating use information up the definition -chain. The file name is made by appending @file{.backprop} to the -source file name. +@item -dumpversion +@opindex dumpversion +Print the compiler version (for example, @code{3.0})---and don't do +anything else. -@item forwprop -@opindex fdump-tree-forwprop -Dump each function after forward propagating single use variables. The file -name is made by appending @file{.forwprop} to the source file name. +@item -dumpspecs +@opindex dumpspecs +Print the compiler's built-in specs---and don't do anything else. (This +is used when GCC itself is being built.) @xref{Spec Files}. -@item nrv -@opindex fdump-tree-nrv -Dump each function after applying the named return value optimization on -generic trees. The file name is made by appending @file{.nrv} to the source -file name. +@item -fno-eliminate-unused-debug-types +@opindex feliminate-unused-debug-types +@opindex fno-eliminate-unused-debug-types +Normally, when producing DWARF 2 output, GCC avoids producing debug symbol +output for types that are nowhere used in the source file being compiled. +Sometimes it is useful to have GCC emit debugging +information for all types declared in a compilation +unit, regardless of whether or not they are actually used +in that compilation unit, for example +if, in the debugger, you want to cast a value to a type that is +not actually used in your program (but is declared). More often, +however, this results in a significant amount of wasted space. +@end table -@item vect -@opindex fdump-tree-vect -Dump each function after applying vectorization of loops. The file name is -made by appending @file{.vect} to the source file name. +@node Optimize Options +@section Options That Control Optimization +@cindex optimize options +@cindex options, optimization -@item slp -@opindex fdump-tree-slp -Dump each function after applying vectorization of basic blocks. The file name -is made by appending @file{.slp} to the source file name. +These options control various sorts of optimizations. -@item vrp -@opindex fdump-tree-vrp -Dump each function after Value Range Propagation (VRP). The file name -is made by appending @file{.vrp} to the source file name. +Without any optimization option, the compiler's goal is to reduce the +cost of compilation and to make debugging produce the expected +results. Statements are independent: if you stop the program with a +breakpoint between statements, you can then assign a new value to any +variable or change the program counter to any other statement in the +function and get exactly the results you expect from the source +code. -@item oaccdevlow -@opindex fdump-tree-oaccdevlow -Dump each function after applying device-specific OpenACC transformations. -The file name is made by appending @file{.oaccdevlow} to the source file name. +Turning on optimization flags makes the compiler attempt to improve +the performance and/or code size at the expense of compilation time +and possibly the ability to debug the program. -@item all -@opindex fdump-tree-all -Enable all the available tree dumps with the flags provided in this option. +The compiler performs optimization based on the knowledge it has of the +program. Compiling multiple files at once to a single output file mode allows +the compiler to use information gained from all of the files when compiling +each of them. + +Not all optimizations are controlled directly by a flag. Only +optimizations that have a flag are listed in this section. + +Most optimizations are only enabled if an @option{-O} level is set on +the command line. Otherwise they are disabled, even if individual +optimization flags are specified. + +Depending on the target and how GCC was configured, a slightly different +set of optimizations may be enabled at each @option{-O} level than +those listed here. You can invoke GCC with @option{-Q --help=optimizers} +to find out the exact set of optimizations that are enabled at each level. +@xref{Overall Options}, for examples. + +@table @gcctabopt +@item -O +@itemx -O1 +@opindex O +@opindex O1 +Optimize. Optimizing compilation takes somewhat more time, and a lot +more memory for a large function. + +With @option{-O}, the compiler tries to reduce code size and execution +time, without performing any optimizations that take a great deal of +compilation time. + +@option{-O} turns on the following optimization flags: +@gccoptlist{ +-fauto-inc-dec @gol +-fbranch-count-reg @gol +-fcombine-stack-adjustments @gol +-fcompare-elim @gol +-fcprop-registers @gol +-fdce @gol +-fdefer-pop @gol +-fdelayed-branch @gol +-fdse @gol +-fforward-propagate @gol +-fguess-branch-probability @gol +-fif-conversion2 @gol +-fif-conversion @gol +-finline-functions-called-once @gol +-fipa-pure-const @gol +-fipa-profile @gol +-fipa-reference @gol +-fmerge-constants @gol +-fmove-loop-invariants @gol +-freorder-blocks @gol +-fshrink-wrap @gol +-fsplit-wide-types @gol +-fssa-backprop @gol +-fssa-phiopt @gol +-ftree-bit-ccp @gol +-ftree-ccp @gol +-ftree-ch @gol +-ftree-coalesce-vars @gol +-ftree-copy-prop @gol +-ftree-dce @gol +-ftree-dominator-opts @gol +-ftree-dse @gol +-ftree-forwprop @gol +-ftree-fre @gol +-ftree-phiprop @gol +-ftree-sink @gol +-ftree-slsr @gol +-ftree-sra @gol +-ftree-pta @gol +-ftree-ter @gol +-funit-at-a-time} + +@option{-O} also turns on @option{-fomit-frame-pointer} on machines +where doing so does not interfere with debugging. + +@item -O2 +@opindex O2 +Optimize even more. GCC performs nearly all supported optimizations +that do not involve a space-speed tradeoff. +As compared to @option{-O}, this option increases both compilation time +and the performance of the generated code. + +@option{-O2} turns on all optimization flags specified by @option{-O}. It +also turns on the following optimization flags: +@gccoptlist{-fthread-jumps @gol +-falign-functions -falign-jumps @gol +-falign-loops -falign-labels @gol +-fcaller-saves @gol +-fcrossjumping @gol +-fcse-follow-jumps -fcse-skip-blocks @gol +-fdelete-null-pointer-checks @gol +-fdevirtualize -fdevirtualize-speculatively @gol +-fexpensive-optimizations @gol +-fgcse -fgcse-lm @gol +-fhoist-adjacent-loads @gol +-finline-small-functions @gol +-findirect-inlining @gol +-fipa-cp @gol +-fipa-cp-alignment @gol +-fipa-sra @gol +-fipa-icf @gol +-fisolate-erroneous-paths-dereference @gol +-flra-remat @gol +-foptimize-sibling-calls @gol +-foptimize-strlen @gol +-fpartial-inlining @gol +-fpeephole2 @gol +-freorder-blocks-algorithm=stc @gol +-freorder-blocks-and-partition -freorder-functions @gol +-frerun-cse-after-loop @gol +-fsched-interblock -fsched-spec @gol +-fschedule-insns -fschedule-insns2 @gol +-fstrict-aliasing -fstrict-overflow @gol +-ftree-builtin-call-dce @gol +-ftree-switch-conversion -ftree-tail-merge @gol +-ftree-pre @gol +-ftree-vrp @gol +-fipa-ra} + +Please note the warning under @option{-fgcse} about +invoking @option{-O2} on programs that use computed gotos. + +@item -O3 +@opindex O3 +Optimize yet more. @option{-O3} turns on all optimizations specified +by @option{-O2} and also turns on the @option{-finline-functions}, +@option{-funswitch-loops}, @option{-fpredictive-commoning}, +@option{-fgcse-after-reload}, @option{-ftree-loop-vectorize}, +@option{-ftree-loop-distribute-patterns}, @option{-fsplit-paths} +@option{-ftree-slp-vectorize}, @option{-fvect-cost-model}, +@option{-ftree-partial-pre} and @option{-fipa-cp-clone} options. + +@item -O0 +@opindex O0 +Reduce compilation time and make debugging produce the expected +results. This is the default. + +@item -Os +@opindex Os +Optimize for size. @option{-Os} enables all @option{-O2} optimizations that +do not typically increase code size. It also performs further +optimizations designed to reduce code size. + +@option{-Os} disables the following optimization flags: +@gccoptlist{-falign-functions -falign-jumps -falign-loops @gol +-falign-labels -freorder-blocks -freorder-blocks-algorithm=stc @gol +-freorder-blocks-and-partition -fprefetch-loop-arrays} + +@item -Ofast +@opindex Ofast +Disregard strict standards compliance. @option{-Ofast} enables all +@option{-O3} optimizations. It also enables optimizations that are not +valid for all standard-compliant programs. +It turns on @option{-ffast-math} and the Fortran-specific +@option{-fno-protect-parens} and @option{-fstack-arrays}. + +@item -Og +@opindex Og +Optimize debugging experience. @option{-Og} enables optimizations +that do not interfere with debugging. It should be the optimization +level of choice for the standard edit-compile-debug cycle, offering +a reasonable level of optimization while maintaining fast compilation +and a good debugging experience. @end table -@item -fopt-info -@itemx -fopt-info-@var{options} -@itemx -fopt-info-@var{options}=@var{filename} -@opindex fopt-info -Controls optimization dumps from various optimization passes. If the -@samp{-@var{options}} form is used, @var{options} is a list of -@samp{-} separated option keywords to select the dump details and -optimizations. +If you use multiple @option{-O} options, with or without level numbers, +the last such option is the one that is effective. + +Options of the form @option{-f@var{flag}} specify machine-independent +flags. Most flags have both positive and negative forms; the negative +form of @option{-ffoo} is @option{-fno-foo}. In the table +below, only one of the forms is listed---the one you typically +use. You can figure out the other form by either removing @samp{no-} +or adding it. + +The following options control specific optimizations. They are either +activated by @option{-O} options or are related to ones that are. You +can use the following flags in the rare cases when ``fine-tuning'' of +optimizations to be performed is desired. + +@table @gcctabopt +@item -fno-defer-pop +@opindex fno-defer-pop +Always pop the arguments to each function call as soon as that function +returns. For machines that must pop arguments after a function call, +the compiler normally lets arguments accumulate on the stack for several +function calls and pops them all at once. + +Disabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. + +@item -fforward-propagate +@opindex fforward-propagate +Perform a forward propagation pass on RTL@. The pass tries to combine two +instructions and checks if the result can be simplified. If loop unrolling +is active, two passes are performed and the second is scheduled after +loop unrolling. + +This option is enabled by default at optimization levels @option{-O}, +@option{-O2}, @option{-O3}, @option{-Os}. + +@item -ffp-contract=@var{style} +@opindex ffp-contract +@option{-ffp-contract=off} disables floating-point expression contraction. +@option{-ffp-contract=fast} enables floating-point expression contraction +such as forming of fused multiply-add operations if the target has +native support for them. +@option{-ffp-contract=on} enables floating-point expression contraction +if allowed by the language standard. This is currently not implemented +and treated equal to @option{-ffp-contract=off}. + +The default is @option{-ffp-contract=fast}. + +@item -fomit-frame-pointer +@opindex fomit-frame-pointer +Don't keep the frame pointer in a register for functions that +don't need one. This avoids the instructions to save, set up and +restore frame pointers; it also makes an extra register available +in many functions. @strong{It also makes debugging impossible on +some machines.} + +On some machines, such as the VAX, this flag has no effect, because +the standard calling sequence automatically handles the frame pointer +and nothing is saved by pretending it doesn't exist. The +machine-description macro @code{FRAME_POINTER_REQUIRED} controls +whether a target machine supports this flag. @xref{Registers,,Register +Usage, gccint, GNU Compiler Collection (GCC) Internals}. + +The default setting (when not optimizing for +size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86 targets is +@option{-fomit-frame-pointer}. You can configure GCC with the +@option{--enable-frame-pointer} configure option to change the default. + +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. + +@item -foptimize-sibling-calls +@opindex foptimize-sibling-calls +Optimize sibling and tail recursive calls. + +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. + +@item -foptimize-strlen +@opindex foptimize-strlen +Optimize various standard C string functions (e.g. @code{strlen}, +@code{strchr} or @code{strcpy}) and +their @code{_FORTIFY_SOURCE} counterparts into faster alternatives. + +Enabled at levels @option{-O2}, @option{-O3}. + +@item -fno-inline +@opindex fno-inline +Do not expand any functions inline apart from those marked with +the @code{always_inline} attribute. This is the default when not +optimizing. -The @var{options} can be divided into two groups: options describing the -verbosity of the dump, and options describing which optimizations -should be included. The options from both the groups can be freely -mixed as they are non-overlapping. However, in case of any conflicts, -the later options override the earlier options on the command -line. +Single functions can be exempted from inlining by marking them +with the @code{noinline} attribute. -The following options control the dump verbosity: +@item -finline-small-functions +@opindex finline-small-functions +Integrate functions into their callers when their body is smaller than expected +function call code (so overall size of program gets smaller). The compiler +heuristically decides which functions are simple enough to be worth integrating +in this way. This inlining applies to all functions, even those not declared +inline. -@table @samp -@item optimized -Print information when an optimization is successfully applied. It is -up to a pass to decide which information is relevant. For example, the -vectorizer passes print the source location of loops which are -successfully vectorized. -@item missed -Print information about missed optimizations. Individual passes -control which information to include in the output. -@item note -Print verbose information about optimizations, such as certain -transformations, more detailed messages about decisions etc. -@item all -Print detailed optimization information. This includes -@samp{optimized}, @samp{missed}, and @samp{note}. -@end table +Enabled at level @option{-O2}. -One or more of the following option keywords can be used to describe a -group of optimizations: +@item -findirect-inlining +@opindex findirect-inlining +Inline also indirect calls that are discovered to be known at compile +time thanks to previous inlining. This option has any effect only +when inlining itself is turned on by the @option{-finline-functions} +or @option{-finline-small-functions} options. -@table @samp -@item ipa -Enable dumps from all interprocedural optimizations. -@item loop -Enable dumps from all loop optimizations. -@item inline -Enable dumps from all inlining optimizations. -@item vec -Enable dumps from all vectorization optimizations. -@item optall -Enable dumps from all optimizations. This is a superset of -the optimization groups listed above. -@end table +Enabled at level @option{-O2}. -If @var{options} is -omitted, it defaults to @samp{optimized-optall}, which means to dump all -info about successful optimizations from all the passes. +@item -finline-functions +@opindex finline-functions +Consider all functions for inlining, even if they are not declared inline. +The compiler heuristically decides which functions are worth integrating +in this way. -If the @var{filename} is provided, then the dumps from all the -applicable optimizations are concatenated into the @var{filename}. -Otherwise the dump is output onto @file{stderr}. Though multiple -@option{-fopt-info} options are accepted, only one of them can include -a @var{filename}. If other filenames are provided then all but the -first such option are ignored. +If all calls to a given function are integrated, and the function is +declared @code{static}, then the function is normally not output as +assembler code in its own right. -Note that the output @var{filename} is overwritten -in case of multiple translation units. If a combined output from -multiple translation units is desired, @file{stderr} should be used -instead. +Enabled at level @option{-O3}. -In the following example, the optimization info is output to -@file{stderr}: +@item -finline-functions-called-once +@opindex finline-functions-called-once +Consider all @code{static} functions called once for inlining into their +caller even if they are not marked @code{inline}. If a call to a given +function is integrated, then the function is not output as assembler code +in its own right. -@smallexample -gcc -O3 -fopt-info -@end smallexample +Enabled at levels @option{-O1}, @option{-O2}, @option{-O3} and @option{-Os}. -This example: -@smallexample -gcc -O3 -fopt-info-missed=missed.all -@end smallexample +@item -fearly-inlining +@opindex fearly-inlining +Inline functions marked by @code{always_inline} and functions whose body seems +smaller than the function call overhead early before doing +@option{-fprofile-generate} instrumentation and real inlining pass. Doing so +makes profiling significantly cheaper and usually inlining faster on programs +having large chains of nested wrapper functions. -@noindent -outputs missed optimization report from all the passes into -@file{missed.all}, and this one: +Enabled by default. -@smallexample -gcc -O2 -ftree-vectorize -fopt-info-vec-missed -@end smallexample +@item -fipa-sra +@opindex fipa-sra +Perform interprocedural scalar replacement of aggregates, removal of +unused parameters and replacement of parameters passed by reference +by parameters passed by value. -@noindent -prints information about missed optimization opportunities from -vectorization passes on @file{stderr}. -Note that @option{-fopt-info-vec-missed} is equivalent to -@option{-fopt-info-missed-vec}. +Enabled at levels @option{-O2}, @option{-O3} and @option{-Os}. -As another example, -@smallexample -gcc -O3 -fopt-info-inline-optimized-missed=inline.txt -@end smallexample +@item -finline-limit=@var{n} +@opindex finline-limit +By default, GCC limits the size of functions that can be inlined. This flag +allows coarse control of this limit. @var{n} is the size of functions that +can be inlined in number of pseudo instructions. -@noindent -outputs information about missed optimizations as well as -optimized locations from all the inlining passes into -@file{inline.txt}. +Inlining is actually controlled by a number of parameters, which may be +specified individually by using @option{--param @var{name}=@var{value}}. +The @option{-finline-limit=@var{n}} option sets some of these parameters +as follows: -Finally, consider: +@table @gcctabopt +@item max-inline-insns-single +is set to @var{n}/2. +@item max-inline-insns-auto +is set to @var{n}/2. +@end table -@smallexample -gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt -@end smallexample +See below for a documentation of the individual +parameters controlling inlining and for the defaults of these parameters. -@noindent -Here the two output filenames @file{vec.miss} and @file{loop.opt} are -in conflict since only one output file is allowed. In this case, only -the first option takes effect and the subsequent options are -ignored. Thus only @file{vec.miss} is produced which contains -dumps from the vectorizer about missed opportunities. +@emph{Note:} there may be no value to @option{-finline-limit} that results +in default behavior. -@item -frandom-seed=@var{string} -@opindex frandom-seed -This option provides a seed that GCC uses in place of -random numbers in generating certain symbol names -that have to be different in every compiled file. It is also used to -place unique stamps in coverage data files and the object files that -produce them. You can use the @option{-frandom-seed} option to produce -reproducibly identical object files. +@emph{Note:} pseudo instruction represents, in this particular context, an +abstract measurement of function's size. In no way does it represent a count +of assembly instructions and as such its exact meaning might change from one +release to an another. -The @var{string} can either be a number (decimal, octal or hex) or an -arbitrary string (in which case it's converted to a number by -computing CRC32). +@item -fno-keep-inline-dllexport +@opindex fno-keep-inline-dllexport +This is a more fine-grained version of @option{-fkeep-inline-functions}, +which applies only to functions that are declared using the @code{dllexport} +attribute or declspec (@xref{Function Attributes,,Declaring Attributes of +Functions}.) -The @var{string} should be different for every file you compile. +@item -fkeep-inline-functions +@opindex fkeep-inline-functions +In C, emit @code{static} functions that are declared @code{inline} +into the object file, even if the function has been inlined into all +of its callers. This switch does not affect functions using the +@code{extern inline} extension in GNU C90@. In C++, emit any and all +inline functions into the object file. -@item -fsched-verbose=@var{n} -@opindex fsched-verbose -On targets that use instruction scheduling, this option controls the -amount of debugging output the scheduler prints to the dump files. +@item -fkeep-static-functions +@opindex fkeep-static-functions +Emit @code{static} functions into the object file, even if the function +is never used. -For @var{n} greater than zero, @option{-fsched-verbose} outputs the -same information as @option{-fdump-rtl-sched1} and @option{-fdump-rtl-sched2}. -For @var{n} greater than one, it also output basic block probabilities, -detailed ready list information and unit/insn info. For @var{n} greater -than two, it includes RTL at abort point, control-flow and regions info. -And for @var{n} over four, @option{-fsched-verbose} also includes -dependence info. +@item -fkeep-static-consts +@opindex fkeep-static-consts +Emit variables declared @code{static const} when optimization isn't turned +on, even if the variables aren't referenced. -@item -save-temps -@itemx -save-temps=cwd -@opindex save-temps -Store the usual ``temporary'' intermediate files permanently; place them -in the current directory and name them based on the source file. Thus, -compiling @file{foo.c} with @option{-c -save-temps} produces files -@file{foo.i} and @file{foo.s}, as well as @file{foo.o}. This creates a -preprocessed @file{foo.i} output file even though the compiler now -normally uses an integrated preprocessor. +GCC enables this option by default. If you want to force the compiler to +check if a variable is referenced, regardless of whether or not +optimization is turned on, use the @option{-fno-keep-static-consts} option. -When used in combination with the @option{-x} command-line option, -@option{-save-temps} is sensible enough to avoid over writing an -input source file with the same extension as an intermediate file. -The corresponding intermediate file may be obtained by renaming the -source file before using @option{-save-temps}. +@item -fmerge-constants +@opindex fmerge-constants +Attempt to merge identical constants (string constants and floating-point +constants) across compilation units. -If you invoke GCC in parallel, compiling several different source -files that share a common base name in different subdirectories or the -same source file compiled for multiple output destinations, it is -likely that the different parallel compilers will interfere with each -other, and overwrite the temporary files. For instance: +This option is the default for optimized compilation if the assembler and +linker support it. Use @option{-fno-merge-constants} to inhibit this +behavior. -@smallexample -gcc -save-temps -o outdir1/foo.o indir1/foo.c& -gcc -save-temps -o outdir2/foo.o indir2/foo.c& -@end smallexample +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. -may result in @file{foo.i} and @file{foo.o} being written to -simultaneously by both compilers. +@item -fmerge-all-constants +@opindex fmerge-all-constants +Attempt to merge identical constants and identical variables. -@item -save-temps=obj -@opindex save-temps=obj -Store the usual ``temporary'' intermediate files permanently. If the -@option{-o} option is used, the temporary files are based on the -object file. If the @option{-o} option is not used, the -@option{-save-temps=obj} switch behaves like @option{-save-temps}. +This option implies @option{-fmerge-constants}. In addition to +@option{-fmerge-constants} this considers e.g.@: even constant initialized +arrays or initialized constant variables with integral or floating-point +types. Languages like C or C++ require each variable, including multiple +instances of the same variable in recursive calls, to have distinct locations, +so using this option results in non-conforming +behavior. -For example: +@item -fmodulo-sched +@opindex fmodulo-sched +Perform swing modulo scheduling immediately before the first scheduling +pass. This pass looks at innermost loops and reorders their +instructions by overlapping different iterations. -@smallexample -gcc -save-temps=obj -c foo.c -gcc -save-temps=obj -c bar.c -o dir/xbar.o -gcc -save-temps=obj foobar.c -o dir2/yfoobar -@end smallexample +@item -fmodulo-sched-allow-regmoves +@opindex fmodulo-sched-allow-regmoves +Perform more aggressive SMS-based modulo scheduling with register moves +allowed. By setting this flag certain anti-dependences edges are +deleted, which triggers the generation of reg-moves based on the +life-range analysis. This option is effective only with +@option{-fmodulo-sched} enabled. -@noindent -creates @file{foo.i}, @file{foo.s}, @file{dir/xbar.i}, -@file{dir/xbar.s}, @file{dir2/yfoobar.i}, @file{dir2/yfoobar.s}, and -@file{dir2/yfoobar.o}. +@item -fno-branch-count-reg +@opindex fno-branch-count-reg +Do not use ``decrement and branch'' instructions on a count register, +but instead generate a sequence of instructions that decrement a +register, compare it against zero, then branch based upon the result. +This option is only meaningful on architectures that support such +instructions, which include x86, PowerPC, IA-64 and S/390. -@item -time@r{[}=@var{file}@r{]} -@opindex time -Report the CPU time taken by each subprocess in the compilation -sequence. For C source files, this is the compiler proper and assembler -(plus the linker if linking is done). +Enabled by default at @option{-O1} and higher. -Without the specification of an output file, the output looks like this: +The default is @option{-fbranch-count-reg}. -@smallexample -# cc1 0.12 0.01 -# as 0.00 0.01 -@end smallexample +@item -fno-function-cse +@opindex fno-function-cse +Do not put function addresses in registers; make each instruction that +calls a constant function contain the function's address explicitly. -The first number on each line is the ``user time'', that is time spent -executing the program itself. The second number is ``system time'', -time spent executing operating system routines on behalf of the program. -Both numbers are in seconds. +This option results in less efficient code, but some strange hacks +that alter the assembler output may be confused by the optimizations +performed when this option is not used. -With the specification of an output file, the output is appended to the -named file, and it looks like this: +The default is @option{-ffunction-cse} -@smallexample -0.12 0.01 cc1 @var{options} -0.00 0.01 as @var{options} -@end smallexample +@item -fno-zero-initialized-in-bss +@opindex fno-zero-initialized-in-bss +If the target supports a BSS section, GCC by default puts variables that +are initialized to zero into BSS@. This can save space in the resulting +code. -The ``user time'' and the ``system time'' are moved before the program -name, and the options passed to the program are displayed, so that one -can later tell what file was being compiled, and with which options. +This option turns off this behavior because some programs explicitly +rely on variables going to the data section---e.g., so that the +resulting executable can find the beginning of that section and/or make +assumptions based on that. -@item -fvar-tracking -@opindex fvar-tracking -Run variable tracking pass. It computes where variables are stored at each -position in code. Better debugging information is then generated -(if the debugging information format supports this information). +The default is @option{-fzero-initialized-in-bss}. -It is enabled by default when compiling with optimization (@option{-Os}, -@option{-O}, @option{-O2}, @dots{}), debugging information (@option{-g}) and -the debug info format supports it. +@item -fthread-jumps +@opindex fthread-jumps +Perform optimizations that check to see if a jump branches to a +location where another comparison subsumed by the first is found. If +so, the first branch is redirected to either the destination of the +second branch or a point immediately following it, depending on whether +the condition is known to be true or false. -@item -fvar-tracking-assignments -@opindex fvar-tracking-assignments -@opindex fno-var-tracking-assignments -Annotate assignments to user variables early in the compilation and -attempt to carry the annotations over throughout the compilation all the -way to the end, in an attempt to improve debug information while -optimizing. Use of @option{-gdwarf-4} is recommended along with it. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -It can be enabled even if var-tracking is disabled, in which case -annotations are created and maintained, but discarded at the end. -By default, this flag is enabled together with @option{-fvar-tracking}, -except when selective scheduling is enabled. +@item -fsplit-wide-types +@opindex fsplit-wide-types +When using a type that occupies multiple registers, such as @code{long +long} on a 32-bit system, split the registers apart and allocate them +independently. This normally generates better code for those types, +but may make debugging more difficult. -@item -fvar-tracking-assignments-toggle -@opindex fvar-tracking-assignments-toggle -@opindex fno-var-tracking-assignments-toggle -Toggle @option{-fvar-tracking-assignments}, in the same way that -@option{-gtoggle} toggles @option{-g}. +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, +@option{-Os}. -@item -print-file-name=@var{library} -@opindex print-file-name -Print the full absolute name of the library file @var{library} that -would be used when linking---and don't do anything else. With this -option, GCC does not compile or link anything; it just prints the -file name. +@item -fcse-follow-jumps +@opindex fcse-follow-jumps +In common subexpression elimination (CSE), scan through jump instructions +when the target of the jump is not reached by any other path. For +example, when CSE encounters an @code{if} statement with an +@code{else} clause, CSE follows the jump when the condition +tested is false. -@item -print-multi-directory -@opindex print-multi-directory -Print the directory name corresponding to the multilib selected by any -other switches present in the command line. This directory is supposed -to exist in @env{GCC_EXEC_PREFIX}. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -print-multi-lib -@opindex print-multi-lib -Print the mapping from multilib directory names to compiler switches -that enable them. The directory name is separated from the switches by -@samp{;}, and each switch starts with an @samp{@@} instead of the -@samp{-}, without spaces between multiple switches. This is supposed to -ease shell processing. +@item -fcse-skip-blocks +@opindex fcse-skip-blocks +This is similar to @option{-fcse-follow-jumps}, but causes CSE to +follow jumps that conditionally skip over blocks. When CSE +encounters a simple @code{if} statement with no else clause, +@option{-fcse-skip-blocks} causes CSE to follow the jump around the +body of the @code{if}. -@item -print-multi-os-directory -@opindex print-multi-os-directory -Print the path to OS libraries for the selected -multilib, relative to some @file{lib} subdirectory. If OS libraries are -present in the @file{lib} subdirectory and no multilibs are used, this is -usually just @file{.}, if OS libraries are present in @file{lib@var{suffix}} -sibling directories this prints e.g.@: @file{../lib64}, @file{../lib} or -@file{../lib32}, or if OS libraries are present in @file{lib/@var{subdir}} -subdirectories it prints e.g.@: @file{amd64}, @file{sparcv9} or @file{ev6}. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -print-multiarch -@opindex print-multiarch -Print the path to OS libraries for the selected multiarch, -relative to some @file{lib} subdirectory. +@item -frerun-cse-after-loop +@opindex frerun-cse-after-loop +Re-run common subexpression elimination after loop optimizations are +performed. -@item -print-prog-name=@var{program} -@opindex print-prog-name -Like @option{-print-file-name}, but searches for a program such as @command{cpp}. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -print-libgcc-file-name -@opindex print-libgcc-file-name -Same as @option{-print-file-name=libgcc.a}. +@item -fgcse +@opindex fgcse +Perform a global common subexpression elimination pass. +This pass also performs global constant and copy propagation. -This is useful when you use @option{-nostdlib} or @option{-nodefaultlibs} -but you do want to link with @file{libgcc.a}. You can do: +@emph{Note:} When compiling a program using computed gotos, a GCC +extension, you may get better run-time performance if you disable +the global common subexpression elimination pass by adding +@option{-fno-gcse} to the command line. -@smallexample -gcc -nostdlib @var{files}@dots{} `gcc -print-libgcc-file-name` -@end smallexample +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -print-search-dirs -@opindex print-search-dirs -Print the name of the configured installation directory and a list of -program and library directories @command{gcc} searches---and don't do anything else. +@item -fgcse-lm +@opindex fgcse-lm +When @option{-fgcse-lm} is enabled, global common subexpression elimination +attempts to move loads that are only killed by stores into themselves. This +allows a loop containing a load/store sequence to be changed to a load outside +the loop, and a copy/store within the loop. -This is useful when @command{gcc} prints the error message -@samp{installation problem, cannot exec cpp0: No such file or directory}. -To resolve this you either need to put @file{cpp0} and the other compiler -components where @command{gcc} expects to find them, or you can set the environment -variable @env{GCC_EXEC_PREFIX} to the directory where you installed them. -Don't forget the trailing @samp{/}. -@xref{Environment Variables}. +Enabled by default when @option{-fgcse} is enabled. -@item -print-sysroot -@opindex print-sysroot -Print the target sysroot directory that is used during -compilation. This is the target sysroot specified either at configure -time or using the @option{--sysroot} option, possibly with an extra -suffix that depends on compilation options. If no target sysroot is -specified, the option prints nothing. +@item -fgcse-sm +@opindex fgcse-sm +When @option{-fgcse-sm} is enabled, a store motion pass is run after +global common subexpression elimination. This pass attempts to move +stores out of loops. When used in conjunction with @option{-fgcse-lm}, +loops containing a load/store sequence can be changed to a load before +the loop and a store after the loop. -@item -print-sysroot-headers-suffix -@opindex print-sysroot-headers-suffix -Print the suffix added to the target sysroot when searching for -headers, or give an error if the compiler is not configured with such -a suffix---and don't do anything else. +Not enabled at any optimization level. -@item -dumpmachine -@opindex dumpmachine -Print the compiler's target machine (for example, -@samp{i686-pc-linux-gnu})---and don't do anything else. +@item -fgcse-las +@opindex fgcse-las +When @option{-fgcse-las} is enabled, the global common subexpression +elimination pass eliminates redundant loads that come after stores to the +same memory location (both partial and full redundancies). -@item -dumpversion -@opindex dumpversion -Print the compiler version (for example, @code{3.0})---and don't do -anything else. +Not enabled at any optimization level. -@item -dumpspecs -@opindex dumpspecs -Print the compiler's built-in specs---and don't do anything else. (This -is used when GCC itself is being built.) @xref{Spec Files}. +@item -fgcse-after-reload +@opindex fgcse-after-reload +When @option{-fgcse-after-reload} is enabled, a redundant load elimination +pass is performed after reload. The purpose of this pass is to clean up +redundant spilling. + +@item -faggressive-loop-optimizations +@opindex faggressive-loop-optimizations +This option tells the loop optimizer to use language constraints to +derive bounds for the number of iterations of a loop. This assumes that +loop code does not invoke undefined behavior by for example causing signed +integer overflows or out-of-bound array accesses. The bounds for the +number of iterations of a loop are used to guide loop unrolling and peeling +and loop exit test optimizations. +This option is enabled by default. -@item -fno-eliminate-unused-debug-types -@opindex feliminate-unused-debug-types -@opindex fno-eliminate-unused-debug-types -Normally, when producing DWARF 2 output, GCC avoids producing debug symbol -output for types that are nowhere used in the source file being compiled. -Sometimes it is useful to have GCC emit debugging -information for all types declared in a compilation -unit, regardless of whether or not they are actually used -in that compilation unit, for example -if, in the debugger, you want to cast a value to a type that is -not actually used in your program (but is declared). More often, -however, this results in a significant amount of wasted space. -@end table +@item -funsafe-loop-optimizations +@opindex funsafe-loop-optimizations +This option tells the loop optimizer to assume that loop indices do not +overflow, and that loops with nontrivial exit condition are not +infinite. This enables a wider range of loop optimizations even if +the loop optimizer itself cannot prove that these assumptions are valid. +If you use @option{-Wunsafe-loop-optimizations}, the compiler warns you +if it finds this kind of loop. -@node Optimize Options -@section Options That Control Optimization -@cindex optimize options -@cindex options, optimization +@item -fcrossjumping +@opindex fcrossjumping +Perform cross-jumping transformation. +This transformation unifies equivalent code and saves code size. The +resulting code may or may not perform better than without cross-jumping. -These options control various sorts of optimizations. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -Without any optimization option, the compiler's goal is to reduce the -cost of compilation and to make debugging produce the expected -results. Statements are independent: if you stop the program with a -breakpoint between statements, you can then assign a new value to any -variable or change the program counter to any other statement in the -function and get exactly the results you expect from the source -code. +@item -fauto-inc-dec +@opindex fauto-inc-dec +Combine increments or decrements of addresses with memory accesses. +This pass is always skipped on architectures that do not have +instructions to support this. Enabled by default at @option{-O} and +higher on architectures that support this. -Turning on optimization flags makes the compiler attempt to improve -the performance and/or code size at the expense of compilation time -and possibly the ability to debug the program. +@item -fdce +@opindex fdce +Perform dead code elimination (DCE) on RTL@. +Enabled by default at @option{-O} and higher. -The compiler performs optimization based on the knowledge it has of the -program. Compiling multiple files at once to a single output file mode allows -the compiler to use information gained from all of the files when compiling -each of them. +@item -fdse +@opindex fdse +Perform dead store elimination (DSE) on RTL@. +Enabled by default at @option{-O} and higher. -Not all optimizations are controlled directly by a flag. Only -optimizations that have a flag are listed in this section. +@item -fif-conversion +@opindex fif-conversion +Attempt to transform conditional jumps into branch-less equivalents. This +includes use of conditional moves, min, max, set flags and abs instructions, and +some tricks doable by standard arithmetics. The use of conditional execution +on chips where it is available is controlled by @option{-fif-conversion2}. -Most optimizations are only enabled if an @option{-O} level is set on -the command line. Otherwise they are disabled, even if individual -optimization flags are specified. +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. -Depending on the target and how GCC was configured, a slightly different -set of optimizations may be enabled at each @option{-O} level than -those listed here. You can invoke GCC with @option{-Q --help=optimizers} -to find out the exact set of optimizations that are enabled at each level. -@xref{Overall Options}, for examples. +@item -fif-conversion2 +@opindex fif-conversion2 +Use conditional execution (where available) to transform conditional jumps into +branch-less equivalents. -@table @gcctabopt -@item -O -@itemx -O1 -@opindex O -@opindex O1 -Optimize. Optimizing compilation takes somewhat more time, and a lot -more memory for a large function. +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. -With @option{-O}, the compiler tries to reduce code size and execution -time, without performing any optimizations that take a great deal of -compilation time. +@item -fdeclone-ctor-dtor +@opindex fdeclone-ctor-dtor +The C++ ABI requires multiple entry points for constructors and +destructors: one for a base subobject, one for a complete object, and +one for a virtual destructor that calls operator delete afterwards. +For a hierarchy with virtual bases, the base and complete variants are +clones, which means two copies of the function. With this option, the +base and complete variants are changed to be thunks that call a common +implementation. -@option{-O} turns on the following optimization flags: -@gccoptlist{ --fauto-inc-dec @gol --fbranch-count-reg @gol --fcombine-stack-adjustments @gol --fcompare-elim @gol --fcprop-registers @gol --fdce @gol --fdefer-pop @gol --fdelayed-branch @gol --fdse @gol --fforward-propagate @gol --fguess-branch-probability @gol --fif-conversion2 @gol --fif-conversion @gol --finline-functions-called-once @gol --fipa-pure-const @gol --fipa-profile @gol --fipa-reference @gol --fmerge-constants @gol --fmove-loop-invariants @gol --freorder-blocks @gol --fshrink-wrap @gol --fsplit-wide-types @gol --fssa-backprop @gol --fssa-phiopt @gol --ftree-bit-ccp @gol --ftree-ccp @gol --ftree-ch @gol --ftree-coalesce-vars @gol --ftree-copy-prop @gol --ftree-dce @gol --ftree-dominator-opts @gol --ftree-dse @gol --ftree-forwprop @gol --ftree-fre @gol --ftree-phiprop @gol --ftree-sink @gol --ftree-slsr @gol --ftree-sra @gol --ftree-pta @gol --ftree-ter @gol --funit-at-a-time} +Enabled by @option{-Os}. -@option{-O} also turns on @option{-fomit-frame-pointer} on machines -where doing so does not interfere with debugging. +@item -fdelete-null-pointer-checks +@opindex fdelete-null-pointer-checks +Assume that programs cannot safely dereference null pointers, and that +no code or data element resides at address zero. +This option enables simple constant +folding optimizations at all optimization levels. In addition, other +optimization passes in GCC use this flag to control global dataflow +analyses that eliminate useless checks for null pointers; these assume +that a memory access to address zero always results in a trap, so +that if a pointer is checked after it has already been dereferenced, +it cannot be null. -@item -O2 -@opindex O2 -Optimize even more. GCC performs nearly all supported optimizations -that do not involve a space-speed tradeoff. -As compared to @option{-O}, this option increases both compilation time -and the performance of the generated code. +Note however that in some environments this assumption is not true. +Use @option{-fno-delete-null-pointer-checks} to disable this optimization +for programs that depend on that behavior. -@option{-O2} turns on all optimization flags specified by @option{-O}. It -also turns on the following optimization flags: -@gccoptlist{-fthread-jumps @gol --falign-functions -falign-jumps @gol --falign-loops -falign-labels @gol --fcaller-saves @gol --fcrossjumping @gol --fcse-follow-jumps -fcse-skip-blocks @gol --fdelete-null-pointer-checks @gol --fdevirtualize -fdevirtualize-speculatively @gol --fexpensive-optimizations @gol --fgcse -fgcse-lm @gol --fhoist-adjacent-loads @gol --finline-small-functions @gol --findirect-inlining @gol --fipa-cp @gol --fipa-cp-alignment @gol --fipa-sra @gol --fipa-icf @gol --fisolate-erroneous-paths-dereference @gol --flra-remat @gol --foptimize-sibling-calls @gol --foptimize-strlen @gol --fpartial-inlining @gol --fpeephole2 @gol --freorder-blocks-algorithm=stc @gol --freorder-blocks-and-partition -freorder-functions @gol --frerun-cse-after-loop @gol --fsched-interblock -fsched-spec @gol --fschedule-insns -fschedule-insns2 @gol --fstrict-aliasing -fstrict-overflow @gol --ftree-builtin-call-dce @gol --ftree-switch-conversion -ftree-tail-merge @gol --ftree-pre @gol --ftree-vrp @gol --fipa-ra} +This option is enabled by default on most targets. On Nios II ELF, it +defaults to off. On AVR and CR16, this option is completely disabled. -Please note the warning under @option{-fgcse} about -invoking @option{-O2} on programs that use computed gotos. +Passes that use the dataflow information +are enabled independently at different optimization levels. -@item -O3 -@opindex O3 -Optimize yet more. @option{-O3} turns on all optimizations specified -by @option{-O2} and also turns on the @option{-finline-functions}, -@option{-funswitch-loops}, @option{-fpredictive-commoning}, -@option{-fgcse-after-reload}, @option{-ftree-loop-vectorize}, -@option{-ftree-loop-distribute-patterns}, @option{-fsplit-paths} -@option{-ftree-slp-vectorize}, @option{-fvect-cost-model}, -@option{-ftree-partial-pre} and @option{-fipa-cp-clone} options. +@item -fdevirtualize +@opindex fdevirtualize +Attempt to convert calls to virtual functions to direct calls. This +is done both within a procedure and interprocedurally as part of +indirect inlining (@option{-findirect-inlining}) and interprocedural constant +propagation (@option{-fipa-cp}). +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -O0 -@opindex O0 -Reduce compilation time and make debugging produce the expected -results. This is the default. +@item -fdevirtualize-speculatively +@opindex fdevirtualize-speculatively +Attempt to convert calls to virtual functions to speculative direct calls. +Based on the analysis of the type inheritance graph, determine for a given call +the set of likely targets. If the set is small, preferably of size 1, change +the call into a conditional deciding between direct and indirect calls. The +speculative calls enable more optimizations, such as inlining. When they seem +useless after further optimization, they are converted back into original form. -@item -Os -@opindex Os -Optimize for size. @option{-Os} enables all @option{-O2} optimizations that -do not typically increase code size. It also performs further -optimizations designed to reduce code size. +@item -fdevirtualize-at-ltrans +@opindex fdevirtualize-at-ltrans +Stream extra information needed for aggressive devirtualization when running +the link-time optimizer in local transformation mode. +This option enables more devirtualization but +significantly increases the size of streamed data. For this reason it is +disabled by default. -@option{-Os} disables the following optimization flags: -@gccoptlist{-falign-functions -falign-jumps -falign-loops @gol --falign-labels -freorder-blocks -freorder-blocks-algorithm=stc @gol --freorder-blocks-and-partition -fprefetch-loop-arrays} +@item -fexpensive-optimizations +@opindex fexpensive-optimizations +Perform a number of minor optimizations that are relatively expensive. -@item -Ofast -@opindex Ofast -Disregard strict standards compliance. @option{-Ofast} enables all -@option{-O3} optimizations. It also enables optimizations that are not -valid for all standard-compliant programs. -It turns on @option{-ffast-math} and the Fortran-specific -@option{-fno-protect-parens} and @option{-fstack-arrays}. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -Og -@opindex Og -Optimize debugging experience. @option{-Og} enables optimizations -that do not interfere with debugging. It should be the optimization -level of choice for the standard edit-compile-debug cycle, offering -a reasonable level of optimization while maintaining fast compilation -and a good debugging experience. -@end table +@item -free +@opindex free +Attempt to remove redundant extension instructions. This is especially +helpful for the x86-64 architecture, which implicitly zero-extends in 64-bit +registers after writing to their lower 32-bit half. -If you use multiple @option{-O} options, with or without level numbers, -the last such option is the one that is effective. +Enabled for Alpha, AArch64 and x86 at levels @option{-O2}, +@option{-O3}, @option{-Os}. -Options of the form @option{-f@var{flag}} specify machine-independent -flags. Most flags have both positive and negative forms; the negative -form of @option{-ffoo} is @option{-fno-foo}. In the table -below, only one of the forms is listed---the one you typically -use. You can figure out the other form by either removing @samp{no-} -or adding it. +@item -fno-lifetime-dse +@opindex fno-lifetime-dse +In C++ the value of an object is only affected by changes within its +lifetime: when the constructor begins, the object has an indeterminate +value, and any changes during the lifetime of the object are dead when +the object is destroyed. Normally dead store elimination will take +advantage of this; if your code relies on the value of the object +storage persisting beyond the lifetime of the object, you can use this +flag to disable this optimization. -The following options control specific optimizations. They are either -activated by @option{-O} options or are related to ones that are. You -can use the following flags in the rare cases when ``fine-tuning'' of -optimizations to be performed is desired. +@item -flive-range-shrinkage +@opindex flive-range-shrinkage +Attempt to decrease register pressure through register live range +shrinkage. This is helpful for fast processors with small or moderate +size register sets. -@table @gcctabopt -@item -fno-defer-pop -@opindex fno-defer-pop -Always pop the arguments to each function call as soon as that function -returns. For machines that must pop arguments after a function call, -the compiler normally lets arguments accumulate on the stack for several -function calls and pops them all at once. +@item -fira-algorithm=@var{algorithm} +@opindex fira-algorithm +Use the specified coloring algorithm for the integrated register +allocator. The @var{algorithm} argument can be @samp{priority}, which +specifies Chow's priority coloring, or @samp{CB}, which specifies +Chaitin-Briggs coloring. Chaitin-Briggs coloring is not implemented +for all architectures, but for those targets that do support it, it is +the default because it generates better code. -Disabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item -fira-region=@var{region} +@opindex fira-region +Use specified regions for the integrated register allocator. The +@var{region} argument should be one of the following: -@item -fforward-propagate -@opindex fforward-propagate -Perform a forward propagation pass on RTL@. The pass tries to combine two -instructions and checks if the result can be simplified. If loop unrolling -is active, two passes are performed and the second is scheduled after -loop unrolling. +@table @samp -This option is enabled by default at optimization levels @option{-O}, -@option{-O2}, @option{-O3}, @option{-Os}. +@item all +Use all loops as register allocation regions. +This can give the best results for machines with a small and/or +irregular register set. -@item -ffp-contract=@var{style} -@opindex ffp-contract -@option{-ffp-contract=off} disables floating-point expression contraction. -@option{-ffp-contract=fast} enables floating-point expression contraction -such as forming of fused multiply-add operations if the target has -native support for them. -@option{-ffp-contract=on} enables floating-point expression contraction -if allowed by the language standard. This is currently not implemented -and treated equal to @option{-ffp-contract=off}. +@item mixed +Use all loops except for loops with small register pressure +as the regions. This value usually gives +the best results in most cases and for most architectures, +and is enabled by default when compiling with optimization for speed +(@option{-O}, @option{-O2}, @dots{}). -The default is @option{-ffp-contract=fast}. +@item one +Use all functions as a single region. +This typically results in the smallest code size, and is enabled by default for +@option{-Os} or @option{-O0}. -@item -fomit-frame-pointer -@opindex fomit-frame-pointer -Don't keep the frame pointer in a register for functions that -don't need one. This avoids the instructions to save, set up and -restore frame pointers; it also makes an extra register available -in many functions. @strong{It also makes debugging impossible on -some machines.} +@end table -On some machines, such as the VAX, this flag has no effect, because -the standard calling sequence automatically handles the frame pointer -and nothing is saved by pretending it doesn't exist. The -machine-description macro @code{FRAME_POINTER_REQUIRED} controls -whether a target machine supports this flag. @xref{Registers,,Register -Usage, gccint, GNU Compiler Collection (GCC) Internals}. +@item -fira-hoist-pressure +@opindex fira-hoist-pressure +Use IRA to evaluate register pressure in the code hoisting pass for +decisions to hoist expressions. This option usually results in smaller +code, but it can slow the compiler down. -The default setting (when not optimizing for -size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86 targets is -@option{-fomit-frame-pointer}. You can configure GCC with the -@option{--enable-frame-pointer} configure option to change the default. +This option is enabled at level @option{-Os} for all targets. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item -fira-loop-pressure +@opindex fira-loop-pressure +Use IRA to evaluate register pressure in loops for decisions to move +loop invariants. This option usually results in generation +of faster and smaller code on machines with large register files (>= 32 +registers), but it can slow the compiler down. -@item -foptimize-sibling-calls -@opindex foptimize-sibling-calls -Optimize sibling and tail recursive calls. +This option is enabled at level @option{-O3} for some targets. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -fno-ira-share-save-slots +@opindex fno-ira-share-save-slots +Disable sharing of stack slots used for saving call-used hard +registers living through a call. Each hard register gets a +separate stack slot, and as a result function stack frames are +larger. -@item -foptimize-strlen -@opindex foptimize-strlen -Optimize various standard C string functions (e.g. @code{strlen}, -@code{strchr} or @code{strcpy}) and -their @code{_FORTIFY_SOURCE} counterparts into faster alternatives. +@item -fno-ira-share-spill-slots +@opindex fno-ira-share-spill-slots +Disable sharing of stack slots allocated for pseudo-registers. Each +pseudo-register that does not get a hard register gets a separate +stack slot, and as a result function stack frames are larger. -Enabled at levels @option{-O2}, @option{-O3}. +@item -fira-verbose=@var{n} +@opindex fira-verbose +Control the verbosity of the dump file for the integrated register allocator. +The default value is 5. If the value @var{n} is greater or equal to 10, +the dump output is sent to stderr using the same format as @var{n} minus 10. -@item -fno-inline -@opindex fno-inline -Do not expand any functions inline apart from those marked with -the @code{always_inline} attribute. This is the default when not -optimizing. +@item -flra-remat +@opindex flra-remat +Enable CFG-sensitive rematerialization in LRA. Instead of loading +values of spilled pseudos, LRA tries to rematerialize (recalculate) +values if it is profitable. -Single functions can be exempted from inlining by marking them -with the @code{noinline} attribute. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -finline-small-functions -@opindex finline-small-functions -Integrate functions into their callers when their body is smaller than expected -function call code (so overall size of program gets smaller). The compiler -heuristically decides which functions are simple enough to be worth integrating -in this way. This inlining applies to all functions, even those not declared -inline. +@item -fdelayed-branch +@opindex fdelayed-branch +If supported for the target machine, attempt to reorder instructions +to exploit instruction slots available after delayed branch +instructions. -Enabled at level @option{-O2}. +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. -@item -findirect-inlining -@opindex findirect-inlining -Inline also indirect calls that are discovered to be known at compile -time thanks to previous inlining. This option has any effect only -when inlining itself is turned on by the @option{-finline-functions} -or @option{-finline-small-functions} options. +@item -fschedule-insns +@opindex fschedule-insns +If supported for the target machine, attempt to reorder instructions to +eliminate execution stalls due to required data being unavailable. This +helps machines that have slow floating point or memory load instructions +by allowing other instructions to be issued until the result of the load +or floating-point instruction is required. -Enabled at level @option{-O2}. +Enabled at levels @option{-O2}, @option{-O3}. -@item -finline-functions -@opindex finline-functions -Consider all functions for inlining, even if they are not declared inline. -The compiler heuristically decides which functions are worth integrating -in this way. +@item -fschedule-insns2 +@opindex fschedule-insns2 +Similar to @option{-fschedule-insns}, but requests an additional pass of +instruction scheduling after register allocation has been done. This is +especially useful on machines with a relatively small number of +registers and where memory load instructions take more than one cycle. -If all calls to a given function are integrated, and the function is -declared @code{static}, then the function is normally not output as -assembler code in its own right. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -Enabled at level @option{-O3}. +@item -fno-sched-interblock +@opindex fno-sched-interblock +Don't schedule instructions across basic blocks. This is normally +enabled by default when scheduling before register allocation, i.e.@: +with @option{-fschedule-insns} or at @option{-O2} or higher. -@item -finline-functions-called-once -@opindex finline-functions-called-once -Consider all @code{static} functions called once for inlining into their -caller even if they are not marked @code{inline}. If a call to a given -function is integrated, then the function is not output as assembler code -in its own right. +@item -fno-sched-spec +@opindex fno-sched-spec +Don't allow speculative motion of non-load instructions. This is normally +enabled by default when scheduling before register allocation, i.e.@: +with @option{-fschedule-insns} or at @option{-O2} or higher. -Enabled at levels @option{-O1}, @option{-O2}, @option{-O3} and @option{-Os}. +@item -fsched-pressure +@opindex fsched-pressure +Enable register pressure sensitive insn scheduling before register +allocation. This only makes sense when scheduling before register +allocation is enabled, i.e.@: with @option{-fschedule-insns} or at +@option{-O2} or higher. Usage of this option can improve the +generated code and decrease its size by preventing register pressure +increase above the number of available hard registers and subsequent +spills in register allocation. -@item -fearly-inlining -@opindex fearly-inlining -Inline functions marked by @code{always_inline} and functions whose body seems -smaller than the function call overhead early before doing -@option{-fprofile-generate} instrumentation and real inlining pass. Doing so -makes profiling significantly cheaper and usually inlining faster on programs -having large chains of nested wrapper functions. +@item -fsched-spec-load +@opindex fsched-spec-load +Allow speculative motion of some load instructions. This only makes +sense when scheduling before register allocation, i.e.@: with +@option{-fschedule-insns} or at @option{-O2} or higher. -Enabled by default. +@item -fsched-spec-load-dangerous +@opindex fsched-spec-load-dangerous +Allow speculative motion of more load instructions. This only makes +sense when scheduling before register allocation, i.e.@: with +@option{-fschedule-insns} or at @option{-O2} or higher. -@item -fipa-sra -@opindex fipa-sra -Perform interprocedural scalar replacement of aggregates, removal of -unused parameters and replacement of parameters passed by reference -by parameters passed by value. +@item -fsched-stalled-insns +@itemx -fsched-stalled-insns=@var{n} +@opindex fsched-stalled-insns +Define how many insns (if any) can be moved prematurely from the queue +of stalled insns into the ready list during the second scheduling pass. +@option{-fno-sched-stalled-insns} means that no insns are moved +prematurely, @option{-fsched-stalled-insns=0} means there is no limit +on how many queued insns can be moved prematurely. +@option{-fsched-stalled-insns} without a value is equivalent to +@option{-fsched-stalled-insns=1}. -Enabled at levels @option{-O2}, @option{-O3} and @option{-Os}. +@item -fsched-stalled-insns-dep +@itemx -fsched-stalled-insns-dep=@var{n} +@opindex fsched-stalled-insns-dep +Define how many insn groups (cycles) are examined for a dependency +on a stalled insn that is a candidate for premature removal from the queue +of stalled insns. This has an effect only during the second scheduling pass, +and only if @option{-fsched-stalled-insns} is used. +@option{-fno-sched-stalled-insns-dep} is equivalent to +@option{-fsched-stalled-insns-dep=0}. +@option{-fsched-stalled-insns-dep} without a value is equivalent to +@option{-fsched-stalled-insns-dep=1}. -@item -finline-limit=@var{n} -@opindex finline-limit -By default, GCC limits the size of functions that can be inlined. This flag -allows coarse control of this limit. @var{n} is the size of functions that -can be inlined in number of pseudo instructions. +@item -fsched2-use-superblocks +@opindex fsched2-use-superblocks +When scheduling after register allocation, use superblock scheduling. +This allows motion across basic block boundaries, +resulting in faster schedules. This option is experimental, as not all machine +descriptions used by GCC model the CPU closely enough to avoid unreliable +results from the algorithm. -Inlining is actually controlled by a number of parameters, which may be -specified individually by using @option{--param @var{name}=@var{value}}. -The @option{-finline-limit=@var{n}} option sets some of these parameters -as follows: +This only makes sense when scheduling after register allocation, i.e.@: with +@option{-fschedule-insns2} or at @option{-O2} or higher. -@table @gcctabopt -@item max-inline-insns-single -is set to @var{n}/2. -@item max-inline-insns-auto -is set to @var{n}/2. -@end table +@item -fsched-group-heuristic +@opindex fsched-group-heuristic +Enable the group heuristic in the scheduler. This heuristic favors +the instruction that belongs to a schedule group. This is enabled +by default when scheduling is enabled, i.e.@: with @option{-fschedule-insns} +or @option{-fschedule-insns2} or at @option{-O2} or higher. -See below for a documentation of the individual -parameters controlling inlining and for the defaults of these parameters. +@item -fsched-critical-path-heuristic +@opindex fsched-critical-path-heuristic +Enable the critical-path heuristic in the scheduler. This heuristic favors +instructions on the critical path. This is enabled by default when +scheduling is enabled, i.e.@: with @option{-fschedule-insns} +or @option{-fschedule-insns2} or at @option{-O2} or higher. -@emph{Note:} there may be no value to @option{-finline-limit} that results -in default behavior. +@item -fsched-spec-insn-heuristic +@opindex fsched-spec-insn-heuristic +Enable the speculative instruction heuristic in the scheduler. This +heuristic favors speculative instructions with greater dependency weakness. +This is enabled by default when scheduling is enabled, i.e.@: +with @option{-fschedule-insns} or @option{-fschedule-insns2} +or at @option{-O2} or higher. -@emph{Note:} pseudo instruction represents, in this particular context, an -abstract measurement of function's size. In no way does it represent a count -of assembly instructions and as such its exact meaning might change from one -release to an another. +@item -fsched-rank-heuristic +@opindex fsched-rank-heuristic +Enable the rank heuristic in the scheduler. This heuristic favors +the instruction belonging to a basic block with greater size or frequency. +This is enabled by default when scheduling is enabled, i.e.@: +with @option{-fschedule-insns} or @option{-fschedule-insns2} or +at @option{-O2} or higher. -@item -fno-keep-inline-dllexport -@opindex fno-keep-inline-dllexport -This is a more fine-grained version of @option{-fkeep-inline-functions}, -which applies only to functions that are declared using the @code{dllexport} -attribute or declspec (@xref{Function Attributes,,Declaring Attributes of -Functions}.) +@item -fsched-last-insn-heuristic +@opindex fsched-last-insn-heuristic +Enable the last-instruction heuristic in the scheduler. This heuristic +favors the instruction that is less dependent on the last instruction +scheduled. This is enabled by default when scheduling is enabled, +i.e.@: with @option{-fschedule-insns} or @option{-fschedule-insns2} or +at @option{-O2} or higher. -@item -fkeep-inline-functions -@opindex fkeep-inline-functions -In C, emit @code{static} functions that are declared @code{inline} -into the object file, even if the function has been inlined into all -of its callers. This switch does not affect functions using the -@code{extern inline} extension in GNU C90@. In C++, emit any and all -inline functions into the object file. +@item -fsched-dep-count-heuristic +@opindex fsched-dep-count-heuristic +Enable the dependent-count heuristic in the scheduler. This heuristic +favors the instruction that has more instructions depending on it. +This is enabled by default when scheduling is enabled, i.e.@: +with @option{-fschedule-insns} or @option{-fschedule-insns2} or +at @option{-O2} or higher. -@item -fkeep-static-functions -@opindex fkeep-static-functions -Emit @code{static} functions into the object file, even if the function -is never used. +@item -freschedule-modulo-scheduled-loops +@opindex freschedule-modulo-scheduled-loops +Modulo scheduling is performed before traditional scheduling. If a loop +is modulo scheduled, later scheduling passes may change its schedule. +Use this option to control that behavior. -@item -fkeep-static-consts -@opindex fkeep-static-consts -Emit variables declared @code{static const} when optimization isn't turned -on, even if the variables aren't referenced. +@item -fselective-scheduling +@opindex fselective-scheduling +Schedule instructions using selective scheduling algorithm. Selective +scheduling runs instead of the first scheduler pass. -GCC enables this option by default. If you want to force the compiler to -check if a variable is referenced, regardless of whether or not -optimization is turned on, use the @option{-fno-keep-static-consts} option. +@item -fselective-scheduling2 +@opindex fselective-scheduling2 +Schedule instructions using selective scheduling algorithm. Selective +scheduling runs instead of the second scheduler pass. -@item -fmerge-constants -@opindex fmerge-constants -Attempt to merge identical constants (string constants and floating-point -constants) across compilation units. +@item -fsel-sched-pipelining +@opindex fsel-sched-pipelining +Enable software pipelining of innermost loops during selective scheduling. +This option has no effect unless one of @option{-fselective-scheduling} or +@option{-fselective-scheduling2} is turned on. -This option is the default for optimized compilation if the assembler and -linker support it. Use @option{-fno-merge-constants} to inhibit this -behavior. +@item -fsel-sched-pipelining-outer-loops +@opindex fsel-sched-pipelining-outer-loops +When pipelining loops during selective scheduling, also pipeline outer loops. +This option has no effect unless @option{-fsel-sched-pipelining} is turned on. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item -fsemantic-interposition +@opindex fsemantic-interposition +Some object formats, like ELF, allow interposing of symbols by the +dynamic linker. +This means that for symbols exported from the DSO, the compiler cannot perform +interprocedural propagation, inlining and other optimizations in anticipation +that the function or variable in question may change. While this feature is +useful, for example, to rewrite memory allocation functions by a debugging +implementation, it is expensive in the terms of code quality. +With @option{-fno-semantic-interposition} the compiler assumes that +if interposition happens for functions the overwriting function will have +precisely the same semantics (and side effects). +Similarly if interposition happens +for variables, the constructor of the variable will be the same. The flag +has no effect for functions explicitly declared inline +(where it is never allowed for interposition to change semantics) +and for symbols explicitly declared weak. -@item -fmerge-all-constants -@opindex fmerge-all-constants -Attempt to merge identical constants and identical variables. +@item -fshrink-wrap +@opindex fshrink-wrap +Emit function prologues only before parts of the function that need it, +rather than at the top of the function. This flag is enabled by default at +@option{-O} and higher. -This option implies @option{-fmerge-constants}. In addition to -@option{-fmerge-constants} this considers e.g.@: even constant initialized -arrays or initialized constant variables with integral or floating-point -types. Languages like C or C++ require each variable, including multiple -instances of the same variable in recursive calls, to have distinct locations, -so using this option results in non-conforming -behavior. +@item -fcaller-saves +@opindex fcaller-saves +Enable allocation of values to registers that are clobbered by +function calls, by emitting extra instructions to save and restore the +registers around such calls. Such allocation is done only when it +seems to result in better code. -@item -fmodulo-sched -@opindex fmodulo-sched -Perform swing modulo scheduling immediately before the first scheduling -pass. This pass looks at innermost loops and reorders their -instructions by overlapping different iterations. +This option is always enabled by default on certain machines, usually +those which have no call-preserved registers to use instead. -@item -fmodulo-sched-allow-regmoves -@opindex fmodulo-sched-allow-regmoves -Perform more aggressive SMS-based modulo scheduling with register moves -allowed. By setting this flag certain anti-dependences edges are -deleted, which triggers the generation of reg-moves based on the -life-range analysis. This option is effective only with -@option{-fmodulo-sched} enabled. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -fno-branch-count-reg -@opindex fno-branch-count-reg -Do not use ``decrement and branch'' instructions on a count register, -but instead generate a sequence of instructions that decrement a -register, compare it against zero, then branch based upon the result. -This option is only meaningful on architectures that support such -instructions, which include x86, PowerPC, IA-64 and S/390. +@item -fcombine-stack-adjustments +@opindex fcombine-stack-adjustments +Tracks stack adjustments (pushes and pops) and stack memory references +and then tries to find ways to combine them. Enabled by default at @option{-O1} and higher. -The default is @option{-fbranch-count-reg}. - -@item -fno-function-cse -@opindex fno-function-cse -Do not put function addresses in registers; make each instruction that -calls a constant function contain the function's address explicitly. +@item -fipa-ra +@opindex fipa-ra +Use caller save registers for allocation if those registers are not used by +any called function. In that case it is not necessary to save and restore +them around calls. This is only possible if called functions are part of +same compilation unit as current function and they are compiled before it. -This option results in less efficient code, but some strange hacks -that alter the assembler output may be confused by the optimizations -performed when this option is not used. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -The default is @option{-ffunction-cse} +@item -fconserve-stack +@opindex fconserve-stack +Attempt to minimize stack usage. The compiler attempts to use less +stack space, even if that makes the program slower. This option +implies setting the @option{large-stack-frame} parameter to 100 +and the @option{large-stack-frame-growth} parameter to 400. -@item -fno-zero-initialized-in-bss -@opindex fno-zero-initialized-in-bss -If the target supports a BSS section, GCC by default puts variables that -are initialized to zero into BSS@. This can save space in the resulting -code. +@item -ftree-reassoc +@opindex ftree-reassoc +Perform reassociation on trees. This flag is enabled by default +at @option{-O} and higher. -This option turns off this behavior because some programs explicitly -rely on variables going to the data section---e.g., so that the -resulting executable can find the beginning of that section and/or make -assumptions based on that. +@item -ftree-pre +@opindex ftree-pre +Perform partial redundancy elimination (PRE) on trees. This flag is +enabled by default at @option{-O2} and @option{-O3}. -The default is @option{-fzero-initialized-in-bss}. +@item -ftree-partial-pre +@opindex ftree-partial-pre +Make partial redundancy elimination (PRE) more aggressive. This flag is +enabled by default at @option{-O3}. -@item -fthread-jumps -@opindex fthread-jumps -Perform optimizations that check to see if a jump branches to a -location where another comparison subsumed by the first is found. If -so, the first branch is redirected to either the destination of the -second branch or a point immediately following it, depending on whether -the condition is known to be true or false. +@item -ftree-forwprop +@opindex ftree-forwprop +Perform forward propagation on trees. This flag is enabled by default +at @option{-O} and higher. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -ftree-fre +@opindex ftree-fre +Perform full redundancy elimination (FRE) on trees. The difference +between FRE and PRE is that FRE only considers expressions +that are computed on all paths leading to the redundant computation. +This analysis is faster than PRE, though it exposes fewer redundancies. +This flag is enabled by default at @option{-O} and higher. -@item -fsplit-wide-types -@opindex fsplit-wide-types -When using a type that occupies multiple registers, such as @code{long -long} on a 32-bit system, split the registers apart and allocate them -independently. This normally generates better code for those types, -but may make debugging more difficult. +@item -ftree-phiprop +@opindex ftree-phiprop +Perform hoisting of loads from conditional pointers on trees. This +pass is enabled by default at @option{-O} and higher. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, -@option{-Os}. +@item -fhoist-adjacent-loads +@opindex fhoist-adjacent-loads +Speculatively hoist loads from both branches of an if-then-else if the +loads are from adjacent locations in the same structure and the target +architecture has a conditional move instruction. This flag is enabled +by default at @option{-O2} and higher. -@item -fcse-follow-jumps -@opindex fcse-follow-jumps -In common subexpression elimination (CSE), scan through jump instructions -when the target of the jump is not reached by any other path. For -example, when CSE encounters an @code{if} statement with an -@code{else} clause, CSE follows the jump when the condition -tested is false. +@item -ftree-copy-prop +@opindex ftree-copy-prop +Perform copy propagation on trees. This pass eliminates unnecessary +copy operations. This flag is enabled by default at @option{-O} and +higher. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -fipa-pure-const +@opindex fipa-pure-const +Discover which functions are pure or constant. +Enabled by default at @option{-O} and higher. -@item -fcse-skip-blocks -@opindex fcse-skip-blocks -This is similar to @option{-fcse-follow-jumps}, but causes CSE to -follow jumps that conditionally skip over blocks. When CSE -encounters a simple @code{if} statement with no else clause, -@option{-fcse-skip-blocks} causes CSE to follow the jump around the -body of the @code{if}. +@item -fipa-reference +@opindex fipa-reference +Discover which static variables do not escape the +compilation unit. +Enabled by default at @option{-O} and higher. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -fipa-pta +@opindex fipa-pta +Perform interprocedural pointer analysis and interprocedural modification +and reference analysis. This option can cause excessive memory and +compile-time usage on large compilation units. It is not enabled by +default at any optimization level. -@item -frerun-cse-after-loop -@opindex frerun-cse-after-loop -Re-run common subexpression elimination after loop optimizations are -performed. +@item -fipa-profile +@opindex fipa-profile +Perform interprocedural profile propagation. The functions called only from +cold functions are marked as cold. Also functions executed once (such as +@code{cold}, @code{noreturn}, static constructors or destructors) are identified. Cold +functions and loop less parts of functions executed once are then optimized for +size. +Enabled by default at @option{-O} and higher. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -fipa-cp +@opindex fipa-cp +Perform interprocedural constant propagation. +This optimization analyzes the program to determine when values passed +to functions are constants and then optimizes accordingly. +This optimization can substantially increase performance +if the application has constants passed to functions. +This flag is enabled by default at @option{-O2}, @option{-Os} and @option{-O3}. -@item -fgcse -@opindex fgcse -Perform a global common subexpression elimination pass. -This pass also performs global constant and copy propagation. +@item -fipa-cp-clone +@opindex fipa-cp-clone +Perform function cloning to make interprocedural constant propagation stronger. +When enabled, interprocedural constant propagation performs function cloning +when externally visible function can be called with constant arguments. +Because this optimization can create multiple copies of functions, +it may significantly increase code size +(see @option{--param ipcp-unit-growth=@var{value}}). +This flag is enabled by default at @option{-O3}. -@emph{Note:} When compiling a program using computed gotos, a GCC -extension, you may get better run-time performance if you disable -the global common subexpression elimination pass by adding -@option{-fno-gcse} to the command line. +@item -fipa-cp-alignment +@opindex -fipa-cp-alignment +When enabled, this optimization propagates alignment of function +parameters to support better vectorization and string operations. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +This flag is enabled by default at @option{-O2} and @option{-Os}. It +requires that @option{-fipa-cp} is enabled. -@item -fgcse-lm -@opindex fgcse-lm -When @option{-fgcse-lm} is enabled, global common subexpression elimination -attempts to move loads that are only killed by stores into themselves. This -allows a loop containing a load/store sequence to be changed to a load outside -the loop, and a copy/store within the loop. +@item -fipa-icf +@opindex fipa-icf +Perform Identical Code Folding for functions and read-only variables. +The optimization reduces code size and may disturb unwind stacks by replacing +a function by equivalent one with a different name. The optimization works +more effectively with link time optimization enabled. -Enabled by default when @option{-fgcse} is enabled. +Nevertheless the behavior is similar to Gold Linker ICF optimization, GCC ICF +works on different levels and thus the optimizations are not same - there are +equivalences that are found only by GCC and equivalences found only by Gold. -@item -fgcse-sm -@opindex fgcse-sm -When @option{-fgcse-sm} is enabled, a store motion pass is run after -global common subexpression elimination. This pass attempts to move -stores out of loops. When used in conjunction with @option{-fgcse-lm}, -loops containing a load/store sequence can be changed to a load before -the loop and a store after the loop. +This flag is enabled by default at @option{-O2} and @option{-Os}. -Not enabled at any optimization level. +@item -fisolate-erroneous-paths-dereference +@opindex fisolate-erroneous-paths-dereference +Detect paths that trigger erroneous or undefined behavior due to +dereferencing a null pointer. Isolate those paths from the main control +flow and turn the statement with erroneous or undefined behavior into a trap. +This flag is enabled by default at @option{-O2} and higher and depends on +@option{-fdelete-null-pointer-checks} also being enabled. -@item -fgcse-las -@opindex fgcse-las -When @option{-fgcse-las} is enabled, the global common subexpression -elimination pass eliminates redundant loads that come after stores to the -same memory location (both partial and full redundancies). +@item -fisolate-erroneous-paths-attribute +@opindex fisolate-erroneous-paths-attribute +Detect paths that trigger erroneous or undefined behavior due a null value +being used in a way forbidden by a @code{returns_nonnull} or @code{nonnull} +attribute. Isolate those paths from the main control flow and turn the +statement with erroneous or undefined behavior into a trap. This is not +currently enabled, but may be enabled by @option{-O2} in the future. -Not enabled at any optimization level. +@item -ftree-sink +@opindex ftree-sink +Perform forward store motion on trees. This flag is +enabled by default at @option{-O} and higher. -@item -fgcse-after-reload -@opindex fgcse-after-reload -When @option{-fgcse-after-reload} is enabled, a redundant load elimination -pass is performed after reload. The purpose of this pass is to clean up -redundant spilling. +@item -ftree-bit-ccp +@opindex ftree-bit-ccp +Perform sparse conditional bit constant propagation on trees and propagate +pointer alignment information. +This pass only operates on local scalar variables and is enabled by default +at @option{-O} and higher. It requires that @option{-ftree-ccp} is enabled. -@item -faggressive-loop-optimizations -@opindex faggressive-loop-optimizations -This option tells the loop optimizer to use language constraints to -derive bounds for the number of iterations of a loop. This assumes that -loop code does not invoke undefined behavior by for example causing signed -integer overflows or out-of-bound array accesses. The bounds for the -number of iterations of a loop are used to guide loop unrolling and peeling -and loop exit test optimizations. -This option is enabled by default. +@item -ftree-ccp +@opindex ftree-ccp +Perform sparse conditional constant propagation (CCP) on trees. This +pass only operates on local scalar variables and is enabled by default +at @option{-O} and higher. -@item -funsafe-loop-optimizations -@opindex funsafe-loop-optimizations -This option tells the loop optimizer to assume that loop indices do not -overflow, and that loops with nontrivial exit condition are not -infinite. This enables a wider range of loop optimizations even if -the loop optimizer itself cannot prove that these assumptions are valid. -If you use @option{-Wunsafe-loop-optimizations}, the compiler warns you -if it finds this kind of loop. +@item -fssa-backprop +@opindex fssa-backprop +Propagate information about uses of a value up the definition chain +in order to simplify the definitions. For example, this pass strips +sign operations if the sign of a value never matters. The flag is +enabled by default at @option{-O} and higher. -@item -fcrossjumping -@opindex fcrossjumping -Perform cross-jumping transformation. -This transformation unifies equivalent code and saves code size. The -resulting code may or may not perform better than without cross-jumping. +@item -fssa-phiopt +@opindex fssa-phiopt +Perform pattern matching on SSA PHI nodes to optimize conditional +code. This pass is enabled by default at @option{-O} and higher. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -ftree-switch-conversion +@opindex ftree-switch-conversion +Perform conversion of simple initializations in a switch to +initializations from a scalar array. This flag is enabled by default +at @option{-O2} and higher. -@item -fauto-inc-dec -@opindex fauto-inc-dec -Combine increments or decrements of addresses with memory accesses. -This pass is always skipped on architectures that do not have -instructions to support this. Enabled by default at @option{-O} and -higher on architectures that support this. +@item -ftree-tail-merge +@opindex ftree-tail-merge +Look for identical code sequences. When found, replace one with a jump to the +other. This optimization is known as tail merging or cross jumping. This flag +is enabled by default at @option{-O2} and higher. The compilation time +in this pass can +be limited using @option{max-tail-merge-comparisons} parameter and +@option{max-tail-merge-iterations} parameter. -@item -fdce -@opindex fdce -Perform dead code elimination (DCE) on RTL@. -Enabled by default at @option{-O} and higher. +@item -ftree-dce +@opindex ftree-dce +Perform dead code elimination (DCE) on trees. This flag is enabled by +default at @option{-O} and higher. -@item -fdse -@opindex fdse -Perform dead store elimination (DSE) on RTL@. -Enabled by default at @option{-O} and higher. +@item -ftree-builtin-call-dce +@opindex ftree-builtin-call-dce +Perform conditional dead code elimination (DCE) for calls to built-in functions +that may set @code{errno} but are otherwise side-effect free. This flag is +enabled by default at @option{-O2} and higher if @option{-Os} is not also +specified. -@item -fif-conversion -@opindex fif-conversion -Attempt to transform conditional jumps into branch-less equivalents. This -includes use of conditional moves, min, max, set flags and abs instructions, and -some tricks doable by standard arithmetics. The use of conditional execution -on chips where it is available is controlled by @option{-fif-conversion2}. +@item -ftree-dominator-opts +@opindex ftree-dominator-opts +Perform a variety of simple scalar cleanups (constant/copy +propagation, redundancy elimination, range propagation and expression +simplification) based on a dominator tree traversal. This also +performs jump threading (to reduce jumps to jumps). This flag is +enabled by default at @option{-O} and higher. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item -ftree-dse +@opindex ftree-dse +Perform dead store elimination (DSE) on trees. A dead store is a store into +a memory location that is later overwritten by another store without +any intervening loads. In this case the earlier store can be deleted. This +flag is enabled by default at @option{-O} and higher. -@item -fif-conversion2 -@opindex fif-conversion2 -Use conditional execution (where available) to transform conditional jumps into -branch-less equivalents. +@item -ftree-ch +@opindex ftree-ch +Perform loop header copying on trees. This is beneficial since it increases +effectiveness of code motion optimizations. It also saves one jump. This flag +is enabled by default at @option{-O} and higher. It is not enabled +for @option{-Os}, since it usually increases code size. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item -ftree-loop-optimize +@opindex ftree-loop-optimize +Perform loop optimizations on trees. This flag is enabled by default +at @option{-O} and higher. -@item -fdeclone-ctor-dtor -@opindex fdeclone-ctor-dtor -The C++ ABI requires multiple entry points for constructors and -destructors: one for a base subobject, one for a complete object, and -one for a virtual destructor that calls operator delete afterwards. -For a hierarchy with virtual bases, the base and complete variants are -clones, which means two copies of the function. With this option, the -base and complete variants are changed to be thunks that call a common -implementation. +@item -ftree-loop-linear +@itemx -floop-interchange +@itemx -floop-strip-mine +@itemx -floop-block +@itemx -floop-unroll-and-jam +@opindex ftree-loop-linear +@opindex floop-interchange +@opindex floop-strip-mine +@opindex floop-block +@opindex floop-unroll-and-jam +Perform loop nest optimizations. Same as +@option{-floop-nest-optimize}. To use this code transformation, GCC has +to be configured with @option{--with-isl} to enable the Graphite loop +transformation infrastructure. -Enabled by @option{-Os}. +@item -fgraphite-identity +@opindex fgraphite-identity +Enable the identity transformation for graphite. For every SCoP we generate +the polyhedral representation and transform it back to gimple. Using +@option{-fgraphite-identity} we can check the costs or benefits of the +GIMPLE -> GRAPHITE -> GIMPLE transformation. Some minimal optimizations +are also performed by the code generator isl, like index splitting and +dead code elimination in loops. -@item -fdelete-null-pointer-checks -@opindex fdelete-null-pointer-checks -Assume that programs cannot safely dereference null pointers, and that -no code or data element resides at address zero. -This option enables simple constant -folding optimizations at all optimization levels. In addition, other -optimization passes in GCC use this flag to control global dataflow -analyses that eliminate useless checks for null pointers; these assume -that a memory access to address zero always results in a trap, so -that if a pointer is checked after it has already been dereferenced, -it cannot be null. +@item -floop-nest-optimize +@opindex floop-nest-optimize +Enable the isl based loop nest optimizer. This is a generic loop nest +optimizer based on the Pluto optimization algorithms. It calculates a loop +structure optimized for data-locality and parallelism. This option +is experimental. -Note however that in some environments this assumption is not true. -Use @option{-fno-delete-null-pointer-checks} to disable this optimization -for programs that depend on that behavior. +@item -floop-parallelize-all +@opindex floop-parallelize-all +Use the Graphite data dependence analysis to identify loops that can +be parallelized. Parallelize all the loops that can be analyzed to +not contain loop carried dependences without checking that it is +profitable to parallelize the loops. -This option is enabled by default on most targets. On Nios II ELF, it -defaults to off. On AVR and CR16, this option is completely disabled. +@item -ftree-coalesce-vars +@opindex ftree-coalesce-vars +While transforming the program out of the SSA representation, attempt to +reduce copying by coalescing versions of different user-defined +variables, instead of just compiler temporaries. This may severely +limit the ability to debug an optimized program compiled with +@option{-fno-var-tracking-assignments}. In the negated form, this flag +prevents SSA coalescing of user variables. This option is enabled by +default if optimization is enabled, and it does very little otherwise. -Passes that use the dataflow information -are enabled independently at different optimization levels. +@item -ftree-loop-if-convert +@opindex ftree-loop-if-convert +Attempt to transform conditional jumps in the innermost loops to +branch-less equivalents. The intent is to remove control-flow from +the innermost loops in order to improve the ability of the +vectorization pass to handle these loops. This is enabled by default +if vectorization is enabled. -@item -fdevirtualize -@opindex fdevirtualize -Attempt to convert calls to virtual functions to direct calls. This -is done both within a procedure and interprocedurally as part of -indirect inlining (@option{-findirect-inlining}) and interprocedural constant -propagation (@option{-fipa-cp}). -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -ftree-loop-if-convert-stores +@opindex ftree-loop-if-convert-stores +Attempt to also if-convert conditional jumps containing memory writes. +This transformation can be unsafe for multi-threaded programs as it +transforms conditional memory writes into unconditional memory writes. +For example, +@smallexample +for (i = 0; i < N; i++) + if (cond) + A[i] = expr; +@end smallexample +is transformed to +@smallexample +for (i = 0; i < N; i++) + A[i] = cond ? expr : A[i]; +@end smallexample +potentially producing data races. -@item -fdevirtualize-speculatively -@opindex fdevirtualize-speculatively -Attempt to convert calls to virtual functions to speculative direct calls. -Based on the analysis of the type inheritance graph, determine for a given call -the set of likely targets. If the set is small, preferably of size 1, change -the call into a conditional deciding between direct and indirect calls. The -speculative calls enable more optimizations, such as inlining. When they seem -useless after further optimization, they are converted back into original form. +@item -ftree-loop-distribution +@opindex ftree-loop-distribution +Perform loop distribution. This flag can improve cache performance on +big loop bodies and allow further loop optimizations, like +parallelization or vectorization, to take place. For example, the loop +@smallexample +DO I = 1, N + A(I) = B(I) + C + D(I) = E(I) * F +ENDDO +@end smallexample +is transformed to +@smallexample +DO I = 1, N + A(I) = B(I) + C +ENDDO +DO I = 1, N + D(I) = E(I) * F +ENDDO +@end smallexample -@item -fdevirtualize-at-ltrans -@opindex fdevirtualize-at-ltrans -Stream extra information needed for aggressive devirtualization when running -the link-time optimizer in local transformation mode. -This option enables more devirtualization but -significantly increases the size of streamed data. For this reason it is -disabled by default. +@item -ftree-loop-distribute-patterns +@opindex ftree-loop-distribute-patterns +Perform loop distribution of patterns that can be code generated with +calls to a library. This flag is enabled by default at @option{-O3}. -@item -fexpensive-optimizations -@opindex fexpensive-optimizations -Perform a number of minor optimizations that are relatively expensive. +This pass distributes the initialization loops and generates a call to +memset zero. For example, the loop +@smallexample +DO I = 1, N + A(I) = 0 + B(I) = A(I) + I +ENDDO +@end smallexample +is transformed to +@smallexample +DO I = 1, N + A(I) = 0 +ENDDO +DO I = 1, N + B(I) = A(I) + I +ENDDO +@end smallexample +and the initialization loop is transformed into a call to memset zero. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -ftree-loop-im +@opindex ftree-loop-im +Perform loop invariant motion on trees. This pass moves only invariants that +are hard to handle at RTL level (function calls, operations that expand to +nontrivial sequences of insns). With @option{-funswitch-loops} it also moves +operands of conditions that are invariant out of the loop, so that we can use +just trivial invariantness analysis in loop unswitching. The pass also includes +store motion. -@item -free -@opindex free -Attempt to remove redundant extension instructions. This is especially -helpful for the x86-64 architecture, which implicitly zero-extends in 64-bit -registers after writing to their lower 32-bit half. +@item -ftree-loop-ivcanon +@opindex ftree-loop-ivcanon +Create a canonical counter for number of iterations in loops for which +determining number of iterations requires complicated analysis. Later +optimizations then may determine the number easily. Useful especially +in connection with unrolling. -Enabled for Alpha, AArch64 and x86 at levels @option{-O2}, -@option{-O3}, @option{-Os}. +@item -fivopts +@opindex fivopts +Perform induction variable optimizations (strength reduction, induction +variable merging and induction variable elimination) on trees. -@item -fno-lifetime-dse -@opindex fno-lifetime-dse -In C++ the value of an object is only affected by changes within its -lifetime: when the constructor begins, the object has an indeterminate -value, and any changes during the lifetime of the object are dead when -the object is destroyed. Normally dead store elimination will take -advantage of this; if your code relies on the value of the object -storage persisting beyond the lifetime of the object, you can use this -flag to disable this optimization. +@item -ftree-parallelize-loops=n +@opindex ftree-parallelize-loops +Parallelize loops, i.e., split their iteration space to run in n threads. +This is only possible for loops whose iterations are independent +and can be arbitrarily reordered. The optimization is only +profitable on multiprocessor machines, for loops that are CPU-intensive, +rather than constrained e.g.@: by memory bandwidth. This option +implies @option{-pthread}, and thus is only supported on targets +that have support for @option{-pthread}. + +@item -ftree-pta +@opindex ftree-pta +Perform function-local points-to analysis on trees. This flag is +enabled by default at @option{-O} and higher. -@item -flive-range-shrinkage -@opindex flive-range-shrinkage -Attempt to decrease register pressure through register live range -shrinkage. This is helpful for fast processors with small or moderate -size register sets. +@item -ftree-sra +@opindex ftree-sra +Perform scalar replacement of aggregates. This pass replaces structure +references with scalars to prevent committing structures to memory too +early. This flag is enabled by default at @option{-O} and higher. -@item -fira-algorithm=@var{algorithm} -@opindex fira-algorithm -Use the specified coloring algorithm for the integrated register -allocator. The @var{algorithm} argument can be @samp{priority}, which -specifies Chow's priority coloring, or @samp{CB}, which specifies -Chaitin-Briggs coloring. Chaitin-Briggs coloring is not implemented -for all architectures, but for those targets that do support it, it is -the default because it generates better code. +@item -ftree-ter +@opindex ftree-ter +Perform temporary expression replacement during the SSA->normal phase. Single +use/single def temporaries are replaced at their use location with their +defining expression. This results in non-GIMPLE code, but gives the expanders +much more complex trees to work on resulting in better RTL generation. This is +enabled by default at @option{-O} and higher. -@item -fira-region=@var{region} -@opindex fira-region -Use specified regions for the integrated register allocator. The -@var{region} argument should be one of the following: +@item -ftree-slsr +@opindex ftree-slsr +Perform straight-line strength reduction on trees. This recognizes related +expressions involving multiplications and replaces them by less expensive +calculations when possible. This is enabled by default at @option{-O} and +higher. -@table @samp +@item -ftree-vectorize +@opindex ftree-vectorize +Perform vectorization on trees. This flag enables @option{-ftree-loop-vectorize} +and @option{-ftree-slp-vectorize} if not explicitly specified. -@item all -Use all loops as register allocation regions. -This can give the best results for machines with a small and/or -irregular register set. +@item -ftree-loop-vectorize +@opindex ftree-loop-vectorize +Perform loop vectorization on trees. This flag is enabled by default at +@option{-O3} and when @option{-ftree-vectorize} is enabled. -@item mixed -Use all loops except for loops with small register pressure -as the regions. This value usually gives -the best results in most cases and for most architectures, -and is enabled by default when compiling with optimization for speed -(@option{-O}, @option{-O2}, @dots{}). +@item -ftree-slp-vectorize +@opindex ftree-slp-vectorize +Perform basic block vectorization on trees. This flag is enabled by default at +@option{-O3} and when @option{-ftree-vectorize} is enabled. -@item one -Use all functions as a single region. -This typically results in the smallest code size, and is enabled by default for -@option{-Os} or @option{-O0}. +@item -fvect-cost-model=@var{model} +@opindex fvect-cost-model +Alter the cost model used for vectorization. The @var{model} argument +should be one of @samp{unlimited}, @samp{dynamic} or @samp{cheap}. +With the @samp{unlimited} model the vectorized code-path is assumed +to be profitable while with the @samp{dynamic} model a runtime check +guards the vectorized code-path to enable it only for iteration +counts that will likely execute faster than when executing the original +scalar loop. The @samp{cheap} model disables vectorization of +loops where doing so would be cost prohibitive for example due to +required runtime checks for data dependence or alignment but otherwise +is equal to the @samp{dynamic} model. +The default cost model depends on other optimization flags and is +either @samp{dynamic} or @samp{cheap}. -@end table +@item -fsimd-cost-model=@var{model} +@opindex fsimd-cost-model +Alter the cost model used for vectorization of loops marked with the OpenMP +or Cilk Plus simd directive. The @var{model} argument should be one of +@samp{unlimited}, @samp{dynamic}, @samp{cheap}. All values of @var{model} +have the same meaning as described in @option{-fvect-cost-model} and by +default a cost model defined with @option{-fvect-cost-model} is used. -@item -fira-hoist-pressure -@opindex fira-hoist-pressure -Use IRA to evaluate register pressure in the code hoisting pass for -decisions to hoist expressions. This option usually results in smaller -code, but it can slow the compiler down. +@item -ftree-vrp +@opindex ftree-vrp +Perform Value Range Propagation on trees. This is similar to the +constant propagation pass, but instead of values, ranges of values are +propagated. This allows the optimizers to remove unnecessary range +checks like array bound checks and null pointer checks. This is +enabled by default at @option{-O2} and higher. Null pointer check +elimination is only done if @option{-fdelete-null-pointer-checks} is +enabled. -This option is enabled at level @option{-Os} for all targets. +@item -fsplit-paths +@opindex fsplit-paths +Split paths leading to loop backedges. This can improve dead code +elimination and common subexpression elimination. This is enabled by +default at @option{-O2} and above. -@item -fira-loop-pressure -@opindex fira-loop-pressure -Use IRA to evaluate register pressure in loops for decisions to move -loop invariants. This option usually results in generation -of faster and smaller code on machines with large register files (>= 32 -registers), but it can slow the compiler down. +@item -fsplit-ivs-in-unroller +@opindex fsplit-ivs-in-unroller +Enables expression of values of induction variables in later iterations +of the unrolled loop using the value in the first iteration. This breaks +long dependency chains, thus improving efficiency of the scheduling passes. -This option is enabled at level @option{-O3} for some targets. +A combination of @option{-fweb} and CSE is often sufficient to obtain the +same effect. However, that is not reliable in cases where the loop body +is more complicated than a single basic block. It also does not work at all +on some architectures due to restrictions in the CSE pass. -@item -fno-ira-share-save-slots -@opindex fno-ira-share-save-slots -Disable sharing of stack slots used for saving call-used hard -registers living through a call. Each hard register gets a -separate stack slot, and as a result function stack frames are -larger. +This optimization is enabled by default. -@item -fno-ira-share-spill-slots -@opindex fno-ira-share-spill-slots -Disable sharing of stack slots allocated for pseudo-registers. Each -pseudo-register that does not get a hard register gets a separate -stack slot, and as a result function stack frames are larger. +@item -fvariable-expansion-in-unroller +@opindex fvariable-expansion-in-unroller +With this option, the compiler creates multiple copies of some +local variables when unrolling a loop, which can result in superior code. -@item -fira-verbose=@var{n} -@opindex fira-verbose -Control the verbosity of the dump file for the integrated register allocator. -The default value is 5. If the value @var{n} is greater or equal to 10, -the dump output is sent to stderr using the same format as @var{n} minus 10. +@item -fpartial-inlining +@opindex fpartial-inlining +Inline parts of functions. This option has any effect only +when inlining itself is turned on by the @option{-finline-functions} +or @option{-finline-small-functions} options. -@item -flra-remat -@opindex flra-remat -Enable CFG-sensitive rematerialization in LRA. Instead of loading -values of spilled pseudos, LRA tries to rematerialize (recalculate) -values if it is profitable. +Enabled at level @option{-O2}. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item -fpredictive-commoning +@opindex fpredictive-commoning +Perform predictive commoning optimization, i.e., reusing computations +(especially memory loads and stores) performed in previous +iterations of loops. -@item -fdelayed-branch -@opindex fdelayed-branch -If supported for the target machine, attempt to reorder instructions -to exploit instruction slots available after delayed branch -instructions. +This option is enabled at level @option{-O3}. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item -fprefetch-loop-arrays +@opindex fprefetch-loop-arrays +If supported by the target machine, generate instructions to prefetch +memory to improve the performance of loops that access large arrays. -@item -fschedule-insns -@opindex fschedule-insns -If supported for the target machine, attempt to reorder instructions to -eliminate execution stalls due to required data being unavailable. This -helps machines that have slow floating point or memory load instructions -by allowing other instructions to be issued until the result of the load -or floating-point instruction is required. +This option may generate better or worse code; results are highly +dependent on the structure of loops within the source code. -Enabled at levels @option{-O2}, @option{-O3}. +Disabled at level @option{-Os}. -@item -fschedule-insns2 -@opindex fschedule-insns2 -Similar to @option{-fschedule-insns}, but requests an additional pass of -instruction scheduling after register allocation has been done. This is -especially useful on machines with a relatively small number of -registers and where memory load instructions take more than one cycle. +@item -fno-peephole +@itemx -fno-peephole2 +@opindex fno-peephole +@opindex fno-peephole2 +Disable any machine-specific peephole optimizations. The difference +between @option{-fno-peephole} and @option{-fno-peephole2} is in how they +are implemented in the compiler; some targets use one, some use the +other, a few use both. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@option{-fpeephole} is enabled by default. +@option{-fpeephole2} enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -fno-sched-interblock -@opindex fno-sched-interblock -Don't schedule instructions across basic blocks. This is normally -enabled by default when scheduling before register allocation, i.e.@: -with @option{-fschedule-insns} or at @option{-O2} or higher. +@item -fno-guess-branch-probability +@opindex fno-guess-branch-probability +Do not guess branch probabilities using heuristics. -@item -fno-sched-spec -@opindex fno-sched-spec -Don't allow speculative motion of non-load instructions. This is normally -enabled by default when scheduling before register allocation, i.e.@: -with @option{-fschedule-insns} or at @option{-O2} or higher. +GCC uses heuristics to guess branch probabilities if they are +not provided by profiling feedback (@option{-fprofile-arcs}). These +heuristics are based on the control flow graph. If some branch probabilities +are specified by @code{__builtin_expect}, then the heuristics are +used to guess branch probabilities for the rest of the control flow graph, +taking the @code{__builtin_expect} info into account. The interactions +between the heuristics and @code{__builtin_expect} can be complex, and in +some cases, it may be useful to disable the heuristics so that the effects +of @code{__builtin_expect} are easier to understand. -@item -fsched-pressure -@opindex fsched-pressure -Enable register pressure sensitive insn scheduling before register -allocation. This only makes sense when scheduling before register -allocation is enabled, i.e.@: with @option{-fschedule-insns} or at -@option{-O2} or higher. Usage of this option can improve the -generated code and decrease its size by preventing register pressure -increase above the number of available hard registers and subsequent -spills in register allocation. +The default is @option{-fguess-branch-probability} at levels +@option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. -@item -fsched-spec-load -@opindex fsched-spec-load -Allow speculative motion of some load instructions. This only makes -sense when scheduling before register allocation, i.e.@: with -@option{-fschedule-insns} or at @option{-O2} or higher. +@item -freorder-blocks +@opindex freorder-blocks +Reorder basic blocks in the compiled function in order to reduce number of +taken branches and improve code locality. -@item -fsched-spec-load-dangerous -@opindex fsched-spec-load-dangerous -Allow speculative motion of more load instructions. This only makes -sense when scheduling before register allocation, i.e.@: with -@option{-fschedule-insns} or at @option{-O2} or higher. +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. -@item -fsched-stalled-insns -@itemx -fsched-stalled-insns=@var{n} -@opindex fsched-stalled-insns -Define how many insns (if any) can be moved prematurely from the queue -of stalled insns into the ready list during the second scheduling pass. -@option{-fno-sched-stalled-insns} means that no insns are moved -prematurely, @option{-fsched-stalled-insns=0} means there is no limit -on how many queued insns can be moved prematurely. -@option{-fsched-stalled-insns} without a value is equivalent to -@option{-fsched-stalled-insns=1}. +@item -freorder-blocks-algorithm=@var{algorithm} +@opindex freorder-blocks-algorithm +Use the specified algorithm for basic block reordering. The +@var{algorithm} argument can be @samp{simple}, which does not increase +code size (except sometimes due to secondary effects like alignment), +or @samp{stc}, the ``software trace cache'' algorithm, which tries to +put all often executed code together, minimizing the number of branches +executed by making extra copies of code. -@item -fsched-stalled-insns-dep -@itemx -fsched-stalled-insns-dep=@var{n} -@opindex fsched-stalled-insns-dep -Define how many insn groups (cycles) are examined for a dependency -on a stalled insn that is a candidate for premature removal from the queue -of stalled insns. This has an effect only during the second scheduling pass, -and only if @option{-fsched-stalled-insns} is used. -@option{-fno-sched-stalled-insns-dep} is equivalent to -@option{-fsched-stalled-insns-dep=0}. -@option{-fsched-stalled-insns-dep} without a value is equivalent to -@option{-fsched-stalled-insns-dep=1}. +The default is @samp{simple} at levels @option{-O}, @option{-Os}, and +@samp{stc} at levels @option{-O2}, @option{-O3}. -@item -fsched2-use-superblocks -@opindex fsched2-use-superblocks -When scheduling after register allocation, use superblock scheduling. -This allows motion across basic block boundaries, -resulting in faster schedules. This option is experimental, as not all machine -descriptions used by GCC model the CPU closely enough to avoid unreliable -results from the algorithm. +@item -freorder-blocks-and-partition +@opindex freorder-blocks-and-partition +In addition to reordering basic blocks in the compiled function, in order +to reduce number of taken branches, partitions hot and cold basic blocks +into separate sections of the assembly and .o files, to improve +paging and cache locality performance. -This only makes sense when scheduling after register allocation, i.e.@: with -@option{-fschedule-insns2} or at @option{-O2} or higher. +This optimization is automatically turned off in the presence of +exception handling, for linkonce sections, for functions with a user-defined +section attribute and on any architecture that does not support named +sections. -@item -fsched-group-heuristic -@opindex fsched-group-heuristic -Enable the group heuristic in the scheduler. This heuristic favors -the instruction that belongs to a schedule group. This is enabled -by default when scheduling is enabled, i.e.@: with @option{-fschedule-insns} -or @option{-fschedule-insns2} or at @option{-O2} or higher. +Enabled for x86 at levels @option{-O2}, @option{-O3}. -@item -fsched-critical-path-heuristic -@opindex fsched-critical-path-heuristic -Enable the critical-path heuristic in the scheduler. This heuristic favors -instructions on the critical path. This is enabled by default when -scheduling is enabled, i.e.@: with @option{-fschedule-insns} -or @option{-fschedule-insns2} or at @option{-O2} or higher. +@item -freorder-functions +@opindex freorder-functions +Reorder functions in the object file in order to +improve code locality. This is implemented by using special +subsections @code{.text.hot} for most frequently executed functions and +@code{.text.unlikely} for unlikely executed functions. Reordering is done by +the linker so object file format must support named sections and linker must +place them in a reasonable way. -@item -fsched-spec-insn-heuristic -@opindex fsched-spec-insn-heuristic -Enable the speculative instruction heuristic in the scheduler. This -heuristic favors speculative instructions with greater dependency weakness. -This is enabled by default when scheduling is enabled, i.e.@: -with @option{-fschedule-insns} or @option{-fschedule-insns2} -or at @option{-O2} or higher. +Also profile feedback must be available to make this option effective. See +@option{-fprofile-arcs} for details. -@item -fsched-rank-heuristic -@opindex fsched-rank-heuristic -Enable the rank heuristic in the scheduler. This heuristic favors -the instruction belonging to a basic block with greater size or frequency. -This is enabled by default when scheduling is enabled, i.e.@: -with @option{-fschedule-insns} or @option{-fschedule-insns2} or -at @option{-O2} or higher. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -@item -fsched-last-insn-heuristic -@opindex fsched-last-insn-heuristic -Enable the last-instruction heuristic in the scheduler. This heuristic -favors the instruction that is less dependent on the last instruction -scheduled. This is enabled by default when scheduling is enabled, -i.e.@: with @option{-fschedule-insns} or @option{-fschedule-insns2} or -at @option{-O2} or higher. +@item -fstrict-aliasing +@opindex fstrict-aliasing +Allow the compiler to assume the strictest aliasing rules applicable to +the language being compiled. For C (and C++), this activates +optimizations based on the type of expressions. In particular, an +object of one type is assumed never to reside at the same address as an +object of a different type, unless the types are almost the same. For +example, an @code{unsigned int} can alias an @code{int}, but not a +@code{void*} or a @code{double}. A character type may alias any other +type. -@item -fsched-dep-count-heuristic -@opindex fsched-dep-count-heuristic -Enable the dependent-count heuristic in the scheduler. This heuristic -favors the instruction that has more instructions depending on it. -This is enabled by default when scheduling is enabled, i.e.@: -with @option{-fschedule-insns} or @option{-fschedule-insns2} or -at @option{-O2} or higher. +@anchor{Type-punning}Pay special attention to code like this: +@smallexample +union a_union @{ + int i; + double d; +@}; -@item -freschedule-modulo-scheduled-loops -@opindex freschedule-modulo-scheduled-loops -Modulo scheduling is performed before traditional scheduling. If a loop -is modulo scheduled, later scheduling passes may change its schedule. -Use this option to control that behavior. +int f() @{ + union a_union t; + t.d = 3.0; + return t.i; +@} +@end smallexample +The practice of reading from a different union member than the one most +recently written to (called ``type-punning'') is common. Even with +@option{-fstrict-aliasing}, type-punning is allowed, provided the memory +is accessed through the union type. So, the code above works as +expected. @xref{Structures unions enumerations and bit-fields +implementation}. However, this code might not: +@smallexample +int f() @{ + union a_union t; + int* ip; + t.d = 3.0; + ip = &t.i; + return *ip; +@} +@end smallexample -@item -fselective-scheduling -@opindex fselective-scheduling -Schedule instructions using selective scheduling algorithm. Selective -scheduling runs instead of the first scheduler pass. +Similarly, access by taking the address, casting the resulting pointer +and dereferencing the result has undefined behavior, even if the cast +uses a union type, e.g.: +@smallexample +int f() @{ + double d = 3.0; + return ((union a_union *) &d)->i; +@} +@end smallexample -@item -fselective-scheduling2 -@opindex fselective-scheduling2 -Schedule instructions using selective scheduling algorithm. Selective -scheduling runs instead of the second scheduler pass. +The @option{-fstrict-aliasing} option is enabled at levels +@option{-O2}, @option{-O3}, @option{-Os}. -@item -fsel-sched-pipelining -@opindex fsel-sched-pipelining -Enable software pipelining of innermost loops during selective scheduling. -This option has no effect unless one of @option{-fselective-scheduling} or -@option{-fselective-scheduling2} is turned on. +@item -fstrict-overflow +@opindex fstrict-overflow +Allow the compiler to assume strict signed overflow rules, depending +on the language being compiled. For C (and C++) this means that +overflow when doing arithmetic with signed numbers is undefined, which +means that the compiler may assume that it does not happen. This +permits various optimizations. For example, the compiler assumes +that an expression like @code{i + 10 > i} is always true for +signed @code{i}. This assumption is only valid if signed overflow is +undefined, as the expression is false if @code{i + 10} overflows when +using twos complement arithmetic. When this option is in effect any +attempt to determine whether an operation on signed numbers +overflows must be written carefully to not actually involve overflow. -@item -fsel-sched-pipelining-outer-loops -@opindex fsel-sched-pipelining-outer-loops -When pipelining loops during selective scheduling, also pipeline outer loops. -This option has no effect unless @option{-fsel-sched-pipelining} is turned on. +This option also allows the compiler to assume strict pointer +semantics: given a pointer to an object, if adding an offset to that +pointer does not produce a pointer to the same object, the addition is +undefined. This permits the compiler to conclude that @code{p + u > +p} is always true for a pointer @code{p} and unsigned integer +@code{u}. This assumption is only valid because pointer wraparound is +undefined, as the expression is false if @code{p + u} overflows using +twos complement arithmetic. -@item -fsemantic-interposition -@opindex fsemantic-interposition -Some object formats, like ELF, allow interposing of symbols by the -dynamic linker. -This means that for symbols exported from the DSO, the compiler cannot perform -interprocedural propagation, inlining and other optimizations in anticipation -that the function or variable in question may change. While this feature is -useful, for example, to rewrite memory allocation functions by a debugging -implementation, it is expensive in the terms of code quality. -With @option{-fno-semantic-interposition} the compiler assumes that -if interposition happens for functions the overwriting function will have -precisely the same semantics (and side effects). -Similarly if interposition happens -for variables, the constructor of the variable will be the same. The flag -has no effect for functions explicitly declared inline -(where it is never allowed for interposition to change semantics) -and for symbols explicitly declared weak. +See also the @option{-fwrapv} option. Using @option{-fwrapv} means +that integer signed overflow is fully defined: it wraps. When +@option{-fwrapv} is used, there is no difference between +@option{-fstrict-overflow} and @option{-fno-strict-overflow} for +integers. With @option{-fwrapv} certain types of overflow are +permitted. For example, if the compiler gets an overflow when doing +arithmetic on constants, the overflowed value can still be used with +@option{-fwrapv}, but not otherwise. -@item -fshrink-wrap -@opindex fshrink-wrap -Emit function prologues only before parts of the function that need it, -rather than at the top of the function. This flag is enabled by default at -@option{-O} and higher. +The @option{-fstrict-overflow} option is enabled at levels +@option{-O2}, @option{-O3}, @option{-Os}. -@item -fcaller-saves -@opindex fcaller-saves -Enable allocation of values to registers that are clobbered by -function calls, by emitting extra instructions to save and restore the -registers around such calls. Such allocation is done only when it -seems to result in better code. +@item -falign-functions +@itemx -falign-functions=@var{n} +@opindex falign-functions +Align the start of functions to the next power-of-two greater than +@var{n}, skipping up to @var{n} bytes. For instance, +@option{-falign-functions=32} aligns functions to the next 32-byte +boundary, but @option{-falign-functions=24} aligns to the next +32-byte boundary only if this can be done by skipping 23 bytes or less. -This option is always enabled by default on certain machines, usually -those which have no call-preserved registers to use instead. +@option{-fno-align-functions} and @option{-falign-functions=1} are +equivalent and mean that functions are not aligned. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +Some assemblers only support this flag when @var{n} is a power of two; +in that case, it is rounded up. -@item -fcombine-stack-adjustments -@opindex fcombine-stack-adjustments -Tracks stack adjustments (pushes and pops) and stack memory references -and then tries to find ways to combine them. +If @var{n} is not specified or is zero, use a machine-dependent default. -Enabled by default at @option{-O1} and higher. +Enabled at levels @option{-O2}, @option{-O3}. -@item -fipa-ra -@opindex fipa-ra -Use caller save registers for allocation if those registers are not used by -any called function. In that case it is not necessary to save and restore -them around calls. This is only possible if called functions are part of -same compilation unit as current function and they are compiled before it. +@item -falign-labels +@itemx -falign-labels=@var{n} +@opindex falign-labels +Align all branch targets to a power-of-two boundary, skipping up to +@var{n} bytes like @option{-falign-functions}. This option can easily +make code slower, because it must insert dummy operations for when the +branch target is reached in the usual flow of the code. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@option{-fno-align-labels} and @option{-falign-labels=1} are +equivalent and mean that labels are not aligned. -@item -fconserve-stack -@opindex fconserve-stack -Attempt to minimize stack usage. The compiler attempts to use less -stack space, even if that makes the program slower. This option -implies setting the @option{large-stack-frame} parameter to 100 -and the @option{large-stack-frame-growth} parameter to 400. +If @option{-falign-loops} or @option{-falign-jumps} are applicable and +are greater than this value, then their values are used instead. -@item -ftree-reassoc -@opindex ftree-reassoc -Perform reassociation on trees. This flag is enabled by default -at @option{-O} and higher. +If @var{n} is not specified or is zero, use a machine-dependent default +which is very likely to be @samp{1}, meaning no alignment. -@item -ftree-pre -@opindex ftree-pre -Perform partial redundancy elimination (PRE) on trees. This flag is -enabled by default at @option{-O2} and @option{-O3}. +Enabled at levels @option{-O2}, @option{-O3}. -@item -ftree-partial-pre -@opindex ftree-partial-pre -Make partial redundancy elimination (PRE) more aggressive. This flag is -enabled by default at @option{-O3}. +@item -falign-loops +@itemx -falign-loops=@var{n} +@opindex falign-loops +Align loops to a power-of-two boundary, skipping up to @var{n} bytes +like @option{-falign-functions}. If the loops are +executed many times, this makes up for any execution of the dummy +operations. -@item -ftree-forwprop -@opindex ftree-forwprop -Perform forward propagation on trees. This flag is enabled by default -at @option{-O} and higher. +@option{-fno-align-loops} and @option{-falign-loops=1} are +equivalent and mean that loops are not aligned. -@item -ftree-fre -@opindex ftree-fre -Perform full redundancy elimination (FRE) on trees. The difference -between FRE and PRE is that FRE only considers expressions -that are computed on all paths leading to the redundant computation. -This analysis is faster than PRE, though it exposes fewer redundancies. -This flag is enabled by default at @option{-O} and higher. +If @var{n} is not specified or is zero, use a machine-dependent default. -@item -ftree-phiprop -@opindex ftree-phiprop -Perform hoisting of loads from conditional pointers on trees. This -pass is enabled by default at @option{-O} and higher. +Enabled at levels @option{-O2}, @option{-O3}. -@item -fhoist-adjacent-loads -@opindex fhoist-adjacent-loads -Speculatively hoist loads from both branches of an if-then-else if the -loads are from adjacent locations in the same structure and the target -architecture has a conditional move instruction. This flag is enabled -by default at @option{-O2} and higher. +@item -falign-jumps +@itemx -falign-jumps=@var{n} +@opindex falign-jumps +Align branch targets to a power-of-two boundary, for branch targets +where the targets can only be reached by jumping, skipping up to @var{n} +bytes like @option{-falign-functions}. In this case, no dummy operations +need be executed. -@item -ftree-copy-prop -@opindex ftree-copy-prop -Perform copy propagation on trees. This pass eliminates unnecessary -copy operations. This flag is enabled by default at @option{-O} and -higher. +@option{-fno-align-jumps} and @option{-falign-jumps=1} are +equivalent and mean that loops are not aligned. -@item -fipa-pure-const -@opindex fipa-pure-const -Discover which functions are pure or constant. -Enabled by default at @option{-O} and higher. +If @var{n} is not specified or is zero, use a machine-dependent default. -@item -fipa-reference -@opindex fipa-reference -Discover which static variables do not escape the -compilation unit. -Enabled by default at @option{-O} and higher. +Enabled at levels @option{-O2}, @option{-O3}. -@item -fipa-pta -@opindex fipa-pta -Perform interprocedural pointer analysis and interprocedural modification -and reference analysis. This option can cause excessive memory and -compile-time usage on large compilation units. It is not enabled by -default at any optimization level. +@item -funit-at-a-time +@opindex funit-at-a-time +This option is left for compatibility reasons. @option{-funit-at-a-time} +has no effect, while @option{-fno-unit-at-a-time} implies +@option{-fno-toplevel-reorder} and @option{-fno-section-anchors}. -@item -fipa-profile -@opindex fipa-profile -Perform interprocedural profile propagation. The functions called only from -cold functions are marked as cold. Also functions executed once (such as -@code{cold}, @code{noreturn}, static constructors or destructors) are identified. Cold -functions and loop less parts of functions executed once are then optimized for -size. -Enabled by default at @option{-O} and higher. +Enabled by default. -@item -fipa-cp -@opindex fipa-cp -Perform interprocedural constant propagation. -This optimization analyzes the program to determine when values passed -to functions are constants and then optimizes accordingly. -This optimization can substantially increase performance -if the application has constants passed to functions. -This flag is enabled by default at @option{-O2}, @option{-Os} and @option{-O3}. +@item -fno-toplevel-reorder +@opindex fno-toplevel-reorder +Do not reorder top-level functions, variables, and @code{asm} +statements. Output them in the same order that they appear in the +input file. When this option is used, unreferenced static variables +are not removed. This option is intended to support existing code +that relies on a particular ordering. For new code, it is better to +use attributes when possible. -@item -fipa-cp-clone -@opindex fipa-cp-clone -Perform function cloning to make interprocedural constant propagation stronger. -When enabled, interprocedural constant propagation performs function cloning -when externally visible function can be called with constant arguments. -Because this optimization can create multiple copies of functions, -it may significantly increase code size -(see @option{--param ipcp-unit-growth=@var{value}}). -This flag is enabled by default at @option{-O3}. +Enabled at level @option{-O0}. When disabled explicitly, it also implies +@option{-fno-section-anchors}, which is otherwise enabled at @option{-O0} on some +targets. -@item -fipa-cp-alignment -@opindex -fipa-cp-alignment -When enabled, this optimization propagates alignment of function -parameters to support better vectorization and string operations. +@item -fweb +@opindex fweb +Constructs webs as commonly used for register allocation purposes and assign +each web individual pseudo register. This allows the register allocation pass +to operate on pseudos directly, but also strengthens several other optimization +passes, such as CSE, loop optimizer and trivial dead code remover. It can, +however, make debugging impossible, since variables no longer stay in a +``home register''. -This flag is enabled by default at @option{-O2} and @option{-Os}. It -requires that @option{-fipa-cp} is enabled. +Enabled by default with @option{-funroll-loops}. -@item -fipa-icf -@opindex fipa-icf -Perform Identical Code Folding for functions and read-only variables. -The optimization reduces code size and may disturb unwind stacks by replacing -a function by equivalent one with a different name. The optimization works -more effectively with link time optimization enabled. +@item -fwhole-program +@opindex fwhole-program +Assume that the current compilation unit represents the whole program being +compiled. All public functions and variables with the exception of @code{main} +and those merged by attribute @code{externally_visible} become static functions +and in effect are optimized more aggressively by interprocedural optimizers. -Nevertheless the behavior is similar to Gold Linker ICF optimization, GCC ICF -works on different levels and thus the optimizations are not same - there are -equivalences that are found only by GCC and equivalences found only by Gold. +This option should not be used in combination with @option{-flto}. +Instead relying on a linker plugin should provide safer and more precise +information. -This flag is enabled by default at @option{-O2} and @option{-Os}. +@item -flto[=@var{n}] +@opindex flto +This option runs the standard link-time optimizer. When invoked +with source code, it generates GIMPLE (one of GCC's internal +representations) and writes it to special ELF sections in the object +file. When the object files are linked together, all the function +bodies are read from these ELF sections and instantiated as if they +had been part of the same translation unit. -@item -fisolate-erroneous-paths-dereference -@opindex fisolate-erroneous-paths-dereference -Detect paths that trigger erroneous or undefined behavior due to -dereferencing a null pointer. Isolate those paths from the main control -flow and turn the statement with erroneous or undefined behavior into a trap. -This flag is enabled by default at @option{-O2} and higher and depends on -@option{-fdelete-null-pointer-checks} also being enabled. +To use the link-time optimizer, @option{-flto} and optimization +options should be specified at compile time and during the final link. +For example: -@item -fisolate-erroneous-paths-attribute -@opindex fisolate-erroneous-paths-attribute -Detect paths that trigger erroneous or undefined behavior due a null value -being used in a way forbidden by a @code{returns_nonnull} or @code{nonnull} -attribute. Isolate those paths from the main control flow and turn the -statement with erroneous or undefined behavior into a trap. This is not -currently enabled, but may be enabled by @option{-O2} in the future. +@smallexample +gcc -c -O2 -flto foo.c +gcc -c -O2 -flto bar.c +gcc -o myprog -flto -O2 foo.o bar.o +@end smallexample -@item -ftree-sink -@opindex ftree-sink -Perform forward store motion on trees. This flag is -enabled by default at @option{-O} and higher. +The first two invocations to GCC save a bytecode representation +of GIMPLE into special ELF sections inside @file{foo.o} and +@file{bar.o}. The final invocation reads the GIMPLE bytecode from +@file{foo.o} and @file{bar.o}, merges the two files into a single +internal image, and compiles the result as usual. Since both +@file{foo.o} and @file{bar.o} are merged into a single image, this +causes all the interprocedural analyses and optimizations in GCC to +work across the two files as if they were a single one. This means, +for example, that the inliner is able to inline functions in +@file{bar.o} into functions in @file{foo.o} and vice-versa. -@item -ftree-bit-ccp -@opindex ftree-bit-ccp -Perform sparse conditional bit constant propagation on trees and propagate -pointer alignment information. -This pass only operates on local scalar variables and is enabled by default -at @option{-O} and higher. It requires that @option{-ftree-ccp} is enabled. +Another (simpler) way to enable link-time optimization is: -@item -ftree-ccp -@opindex ftree-ccp -Perform sparse conditional constant propagation (CCP) on trees. This -pass only operates on local scalar variables and is enabled by default -at @option{-O} and higher. +@smallexample +gcc -o myprog -flto -O2 foo.c bar.c +@end smallexample -@item -fssa-backprop -@opindex fssa-backprop -Propagate information about uses of a value up the definition chain -in order to simplify the definitions. For example, this pass strips -sign operations if the sign of a value never matters. The flag is -enabled by default at @option{-O} and higher. +The above generates bytecode for @file{foo.c} and @file{bar.c}, +merges them together into a single GIMPLE representation and optimizes +them as usual to produce @file{myprog}. -@item -fssa-phiopt -@opindex fssa-phiopt -Perform pattern matching on SSA PHI nodes to optimize conditional -code. This pass is enabled by default at @option{-O} and higher. +The only important thing to keep in mind is that to enable link-time +optimizations you need to use the GCC driver to perform the link-step. +GCC then automatically performs link-time optimization if any of the +objects involved were compiled with the @option{-flto} command-line option. +You generally +should specify the optimization options to be used for link-time +optimization though GCC tries to be clever at guessing an +optimization level to use from the options used at compile-time +if you fail to specify one at link-time. You can always override +the automatic decision to do link-time optimization at link-time +by passing @option{-fno-lto} to the link command. -@item -ftree-switch-conversion -@opindex ftree-switch-conversion -Perform conversion of simple initializations in a switch to -initializations from a scalar array. This flag is enabled by default -at @option{-O2} and higher. +To make whole program optimization effective, it is necessary to make +certain whole program assumptions. The compiler needs to know +what functions and variables can be accessed by libraries and runtime +outside of the link-time optimized unit. When supported by the linker, +the linker plugin (see @option{-fuse-linker-plugin}) passes information +to the compiler about used and externally visible symbols. When +the linker plugin is not available, @option{-fwhole-program} should be +used to allow the compiler to make these assumptions, which leads +to more aggressive optimization decisions. -@item -ftree-tail-merge -@opindex ftree-tail-merge -Look for identical code sequences. When found, replace one with a jump to the -other. This optimization is known as tail merging or cross jumping. This flag -is enabled by default at @option{-O2} and higher. The compilation time -in this pass can -be limited using @option{max-tail-merge-comparisons} parameter and -@option{max-tail-merge-iterations} parameter. +When @option{-fuse-linker-plugin} is not enabled then, when a file is +compiled with @option{-flto}, the generated object file is larger than +a regular object file because it contains GIMPLE bytecodes and the usual +final code (see @option{-ffat-lto-objects}. This means that +object files with LTO information can be linked as normal object +files; if @option{-fno-lto} is passed to the linker, no +interprocedural optimizations are applied. Note that when +@option{-fno-fat-lto-objects} is enabled the compile-stage is faster +but you cannot perform a regular, non-LTO link on them. -@item -ftree-dce -@opindex ftree-dce -Perform dead code elimination (DCE) on trees. This flag is enabled by -default at @option{-O} and higher. +Additionally, the optimization flags used to compile individual files +are not necessarily related to those used at link time. For instance, -@item -ftree-builtin-call-dce -@opindex ftree-builtin-call-dce -Perform conditional dead code elimination (DCE) for calls to built-in functions -that may set @code{errno} but are otherwise side-effect free. This flag is -enabled by default at @option{-O2} and higher if @option{-Os} is not also -specified. +@smallexample +gcc -c -O0 -ffat-lto-objects -flto foo.c +gcc -c -O0 -ffat-lto-objects -flto bar.c +gcc -o myprog -O3 foo.o bar.o +@end smallexample -@item -ftree-dominator-opts -@opindex ftree-dominator-opts -Perform a variety of simple scalar cleanups (constant/copy -propagation, redundancy elimination, range propagation and expression -simplification) based on a dominator tree traversal. This also -performs jump threading (to reduce jumps to jumps). This flag is -enabled by default at @option{-O} and higher. +This produces individual object files with unoptimized assembler +code, but the resulting binary @file{myprog} is optimized at +@option{-O3}. If, instead, the final binary is generated with +@option{-fno-lto}, then @file{myprog} is not optimized. -@item -ftree-dse -@opindex ftree-dse -Perform dead store elimination (DSE) on trees. A dead store is a store into -a memory location that is later overwritten by another store without -any intervening loads. In this case the earlier store can be deleted. This -flag is enabled by default at @option{-O} and higher. +When producing the final binary, GCC only +applies link-time optimizations to those files that contain bytecode. +Therefore, you can mix and match object files and libraries with +GIMPLE bytecodes and final object code. GCC automatically selects +which files to optimize in LTO mode and which files to link without +further processing. -@item -ftree-ch -@opindex ftree-ch -Perform loop header copying on trees. This is beneficial since it increases -effectiveness of code motion optimizations. It also saves one jump. This flag -is enabled by default at @option{-O} and higher. It is not enabled -for @option{-Os}, since it usually increases code size. +There are some code generation flags preserved by GCC when +generating bytecodes, as they need to be used during the final link +stage. Generally options specified at link-time override those +specified at compile-time. -@item -ftree-loop-optimize -@opindex ftree-loop-optimize -Perform loop optimizations on trees. This flag is enabled by default -at @option{-O} and higher. +If you do not specify an optimization level option @option{-O} at +link-time then GCC computes one based on the optimization levels +used when compiling the object files. The highest optimization +level wins here. -@item -ftree-loop-linear -@itemx -floop-interchange -@itemx -floop-strip-mine -@itemx -floop-block -@itemx -floop-unroll-and-jam -@opindex ftree-loop-linear -@opindex floop-interchange -@opindex floop-strip-mine -@opindex floop-block -@opindex floop-unroll-and-jam -Perform loop nest optimizations. Same as -@option{-floop-nest-optimize}. To use this code transformation, GCC has -to be configured with @option{--with-isl} to enable the Graphite loop -transformation infrastructure. +Currently, the following options and their setting are take from +the first object file that explicitely specified it: +@option{-fPIC}, @option{-fpic}, @option{-fpie}, @option{-fcommon}, +@option{-fexceptions}, @option{-fnon-call-exceptions}, @option{-fgnu-tm} +and all the @option{-m} target flags. -@item -fgraphite-identity -@opindex fgraphite-identity -Enable the identity transformation for graphite. For every SCoP we generate -the polyhedral representation and transform it back to gimple. Using -@option{-fgraphite-identity} we can check the costs or benefits of the -GIMPLE -> GRAPHITE -> GIMPLE transformation. Some minimal optimizations -are also performed by the code generator isl, like index splitting and -dead code elimination in loops. +Certain ABI changing flags are required to match in all compilation-units +and trying to override this at link-time with a conflicting value +is ignored. This includes options such as @option{-freg-struct-return} +and @option{-fpcc-struct-return}. -@item -floop-nest-optimize -@opindex floop-nest-optimize -Enable the isl based loop nest optimizer. This is a generic loop nest -optimizer based on the Pluto optimization algorithms. It calculates a loop -structure optimized for data-locality and parallelism. This option -is experimental. +Other options such as @option{-ffp-contract}, @option{-fno-strict-overflow}, +@option{-fwrapv}, @option{-fno-trapv} or @option{-fno-strict-aliasing} +are passed through to the link stage and merged conservatively for +conflicting translation units. Specifically +@option{-fno-strict-overflow}, @option{-fwrapv} and @option{-fno-trapv} take +precedence and for example @option{-ffp-contract=off} takes precedence +over @option{-ffp-contract=fast}. You can override them at linke-time. -@item -floop-parallelize-all -@opindex floop-parallelize-all -Use the Graphite data dependence analysis to identify loops that can -be parallelized. Parallelize all the loops that can be analyzed to -not contain loop carried dependences without checking that it is -profitable to parallelize the loops. +It is recommended that you compile all the files participating in the +same link with the same options and also specify those options at +link time. -@item -ftree-coalesce-vars -@opindex ftree-coalesce-vars -While transforming the program out of the SSA representation, attempt to -reduce copying by coalescing versions of different user-defined -variables, instead of just compiler temporaries. This may severely -limit the ability to debug an optimized program compiled with -@option{-fno-var-tracking-assignments}. In the negated form, this flag -prevents SSA coalescing of user variables. This option is enabled by -default if optimization is enabled, and it does very little otherwise. +If LTO encounters objects with C linkage declared with incompatible +types in separate translation units to be linked together (undefined +behavior according to ISO C99 6.2.7), a non-fatal diagnostic may be +issued. The behavior is still undefined at run time. Similar +diagnostics may be raised for other languages. -@item -ftree-loop-if-convert -@opindex ftree-loop-if-convert -Attempt to transform conditional jumps in the innermost loops to -branch-less equivalents. The intent is to remove control-flow from -the innermost loops in order to improve the ability of the -vectorization pass to handle these loops. This is enabled by default -if vectorization is enabled. +Another feature of LTO is that it is possible to apply interprocedural +optimizations on files written in different languages: -@item -ftree-loop-if-convert-stores -@opindex ftree-loop-if-convert-stores -Attempt to also if-convert conditional jumps containing memory writes. -This transformation can be unsafe for multi-threaded programs as it -transforms conditional memory writes into unconditional memory writes. -For example, -@smallexample -for (i = 0; i < N; i++) - if (cond) - A[i] = expr; -@end smallexample -is transformed to @smallexample -for (i = 0; i < N; i++) - A[i] = cond ? expr : A[i]; +gcc -c -flto foo.c +g++ -c -flto bar.cc +gfortran -c -flto baz.f90 +g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran @end smallexample -potentially producing data races. -@item -ftree-loop-distribution -@opindex ftree-loop-distribution -Perform loop distribution. This flag can improve cache performance on -big loop bodies and allow further loop optimizations, like -parallelization or vectorization, to take place. For example, the loop -@smallexample -DO I = 1, N - A(I) = B(I) + C - D(I) = E(I) * F -ENDDO -@end smallexample -is transformed to +Notice that the final link is done with @command{g++} to get the C++ +runtime libraries and @option{-lgfortran} is added to get the Fortran +runtime libraries. In general, when mixing languages in LTO mode, you +should use the same link command options as when mixing languages in a +regular (non-LTO) compilation. + +If object files containing GIMPLE bytecode are stored in a library archive, say +@file{libfoo.a}, it is possible to extract and use them in an LTO link if you +are using a linker with plugin support. To create static libraries suitable +for LTO, use @command{gcc-ar} and @command{gcc-ranlib} instead of @command{ar} +and @command{ranlib}; +to show the symbols of object files with GIMPLE bytecode, use +@command{gcc-nm}. Those commands require that @command{ar}, @command{ranlib} +and @command{nm} have been compiled with plugin support. At link time, use the the +flag @option{-fuse-linker-plugin} to ensure that the library participates in +the LTO optimization process: + @smallexample -DO I = 1, N - A(I) = B(I) + C -ENDDO -DO I = 1, N - D(I) = E(I) * F -ENDDO +gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo @end smallexample -@item -ftree-loop-distribute-patterns -@opindex ftree-loop-distribute-patterns -Perform loop distribution of patterns that can be code generated with -calls to a library. This flag is enabled by default at @option{-O3}. +With the linker plugin enabled, the linker extracts the needed +GIMPLE files from @file{libfoo.a} and passes them on to the running GCC +to make them part of the aggregated GIMPLE image to be optimized. + +If you are not using a linker with plugin support and/or do not +enable the linker plugin, then the objects inside @file{libfoo.a} +are extracted and linked as usual, but they do not participate +in the LTO optimization process. In order to make a static library suitable +for both LTO optimization and usual linkage, compile its object files with +@option{-flto} @option{-ffat-lto-objects}. + +Link-time optimizations do not require the presence of the whole program to +operate. If the program does not require any symbols to be exported, it is +possible to combine @option{-flto} and @option{-fwhole-program} to allow +the interprocedural optimizers to use more aggressive assumptions which may +lead to improved optimization opportunities. +Use of @option{-fwhole-program} is not needed when linker plugin is +active (see @option{-fuse-linker-plugin}). + +The current implementation of LTO makes no +attempt to generate bytecode that is portable between different +types of hosts. The bytecode files are versioned and there is a +strict version check, so bytecode files generated in one version of +GCC do not work with an older or newer version of GCC. + +Link-time optimization does not work well with generation of debugging +information. Combining @option{-flto} with +@option{-g} is currently experimental and expected to produce unexpected +results. + +If you specify the optional @var{n}, the optimization and code +generation done at link time is executed in parallel using @var{n} +parallel jobs by utilizing an installed @command{make} program. The +environment variable @env{MAKE} may be used to override the program +used. The default value for @var{n} is 1. + +You can also specify @option{-flto=jobserver} to use GNU make's +job server mode to determine the number of parallel jobs. This +is useful when the Makefile calling GCC is already executing in parallel. +You must prepend a @samp{+} to the command recipe in the parent Makefile +for this to work. This option likely only works if @env{MAKE} is +GNU make. -This pass distributes the initialization loops and generates a call to -memset zero. For example, the loop -@smallexample -DO I = 1, N - A(I) = 0 - B(I) = A(I) + I -ENDDO -@end smallexample -is transformed to -@smallexample -DO I = 1, N - A(I) = 0 -ENDDO -DO I = 1, N - B(I) = A(I) + I -ENDDO -@end smallexample -and the initialization loop is transformed into a call to memset zero. +@item -flto-partition=@var{alg} +@opindex flto-partition +Specify the partitioning algorithm used by the link-time optimizer. +The value is either @samp{1to1} to specify a partitioning mirroring +the original source files or @samp{balanced} to specify partitioning +into equally sized chunks (whenever possible) or @samp{max} to create +new partition for every symbol where possible. Specifying @samp{none} +as an algorithm disables partitioning and streaming completely. +The default value is @samp{balanced}. While @samp{1to1} can be used +as an workaround for various code ordering issues, the @samp{max} +partitioning is intended for internal testing only. +The value @samp{one} specifies that exactly one partition should be +used while the value @samp{none} bypasses partitioning and executes +the link-time optimization step directly from the WPA phase. -@item -ftree-loop-im -@opindex ftree-loop-im -Perform loop invariant motion on trees. This pass moves only invariants that -are hard to handle at RTL level (function calls, operations that expand to -nontrivial sequences of insns). With @option{-funswitch-loops} it also moves -operands of conditions that are invariant out of the loop, so that we can use -just trivial invariantness analysis in loop unswitching. The pass also includes -store motion. +@item -flto-odr-type-merging +@opindex flto-odr-type-merging +Enable streaming of mangled types names of C++ types and their unification +at linktime. This increases size of LTO object files, but enable +diagnostics about One Definition Rule violations. -@item -ftree-loop-ivcanon -@opindex ftree-loop-ivcanon -Create a canonical counter for number of iterations in loops for which -determining number of iterations requires complicated analysis. Later -optimizations then may determine the number easily. Useful especially -in connection with unrolling. +@item -flto-compression-level=@var{n} +@opindex flto-compression-level +This option specifies the level of compression used for intermediate +language written to LTO object files, and is only meaningful in +conjunction with LTO mode (@option{-flto}). Valid +values are 0 (no compression) to 9 (maximum compression). Values +outside this range are clamped to either 0 or 9. If the option is not +given, a default balanced compression setting is used. -@item -fivopts -@opindex fivopts -Perform induction variable optimizations (strength reduction, induction -variable merging and induction variable elimination) on trees. +@item -flto-report +@opindex flto-report +Prints a report with internal details on the workings of the link-time +optimizer. The contents of this report vary from version to version. +It is meant to be useful to GCC developers when processing object +files in LTO mode (via @option{-flto}). -@item -ftree-parallelize-loops=n -@opindex ftree-parallelize-loops -Parallelize loops, i.e., split their iteration space to run in n threads. -This is only possible for loops whose iterations are independent -and can be arbitrarily reordered. The optimization is only -profitable on multiprocessor machines, for loops that are CPU-intensive, -rather than constrained e.g.@: by memory bandwidth. This option -implies @option{-pthread}, and thus is only supported on targets -that have support for @option{-pthread}. +Disabled by default. -@item -ftree-pta -@opindex ftree-pta -Perform function-local points-to analysis on trees. This flag is -enabled by default at @option{-O} and higher. +@item -flto-report-wpa +@opindex flto-report-wpa +Like @option{-flto-report}, but only print for the WPA phase of Link +Time Optimization. -@item -ftree-sra -@opindex ftree-sra -Perform scalar replacement of aggregates. This pass replaces structure -references with scalars to prevent committing structures to memory too -early. This flag is enabled by default at @option{-O} and higher. +@item -fuse-linker-plugin +@opindex fuse-linker-plugin +Enables the use of a linker plugin during link-time optimization. This +option relies on plugin support in the linker, which is available in gold +or in GNU ld 2.21 or newer. -@item -ftree-ter -@opindex ftree-ter -Perform temporary expression replacement during the SSA->normal phase. Single -use/single def temporaries are replaced at their use location with their -defining expression. This results in non-GIMPLE code, but gives the expanders -much more complex trees to work on resulting in better RTL generation. This is -enabled by default at @option{-O} and higher. +This option enables the extraction of object files with GIMPLE bytecode out +of library archives. This improves the quality of optimization by exposing +more code to the link-time optimizer. This information specifies what +symbols can be accessed externally (by non-LTO object or during dynamic +linking). Resulting code quality improvements on binaries (and shared +libraries that use hidden visibility) are similar to @option{-fwhole-program}. +See @option{-flto} for a description of the effect of this flag and how to +use it. -@item -ftree-slsr -@opindex ftree-slsr -Perform straight-line strength reduction on trees. This recognizes related -expressions involving multiplications and replaces them by less expensive -calculations when possible. This is enabled by default at @option{-O} and -higher. +This option is enabled by default when LTO support in GCC is enabled +and GCC was configured for use with +a linker supporting plugins (GNU ld 2.21 or newer or gold). -@item -ftree-vectorize -@opindex ftree-vectorize -Perform vectorization on trees. This flag enables @option{-ftree-loop-vectorize} -and @option{-ftree-slp-vectorize} if not explicitly specified. +@item -ffat-lto-objects +@opindex ffat-lto-objects +Fat LTO objects are object files that contain both the intermediate language +and the object code. This makes them usable for both LTO linking and normal +linking. This option is effective only when compiling with @option{-flto} +and is ignored at link time. -@item -ftree-loop-vectorize -@opindex ftree-loop-vectorize -Perform loop vectorization on trees. This flag is enabled by default at -@option{-O3} and when @option{-ftree-vectorize} is enabled. +@option{-fno-fat-lto-objects} improves compilation time over plain LTO, but +requires the complete toolchain to be aware of LTO. It requires a linker with +linker plugin support for basic functionality. Additionally, +@command{nm}, @command{ar} and @command{ranlib} +need to support linker plugins to allow a full-featured build environment +(capable of building static libraries etc). GCC provides the @command{gcc-ar}, +@command{gcc-nm}, @command{gcc-ranlib} wrappers to pass the right options +to these tools. With non fat LTO makefiles need to be modified to use them. -@item -ftree-slp-vectorize -@opindex ftree-slp-vectorize -Perform basic block vectorization on trees. This flag is enabled by default at -@option{-O3} and when @option{-ftree-vectorize} is enabled. +The default is @option{-fno-fat-lto-objects} on targets with linker plugin +support. -@item -fvect-cost-model=@var{model} -@opindex fvect-cost-model -Alter the cost model used for vectorization. The @var{model} argument -should be one of @samp{unlimited}, @samp{dynamic} or @samp{cheap}. -With the @samp{unlimited} model the vectorized code-path is assumed -to be profitable while with the @samp{dynamic} model a runtime check -guards the vectorized code-path to enable it only for iteration -counts that will likely execute faster than when executing the original -scalar loop. The @samp{cheap} model disables vectorization of -loops where doing so would be cost prohibitive for example due to -required runtime checks for data dependence or alignment but otherwise -is equal to the @samp{dynamic} model. -The default cost model depends on other optimization flags and is -either @samp{dynamic} or @samp{cheap}. +@item -fcompare-elim +@opindex fcompare-elim +After register allocation and post-register allocation instruction splitting, +identify arithmetic instructions that compute processor flags similar to a +comparison operation based on that arithmetic. If possible, eliminate the +explicit comparison operation. -@item -fsimd-cost-model=@var{model} -@opindex fsimd-cost-model -Alter the cost model used for vectorization of loops marked with the OpenMP -or Cilk Plus simd directive. The @var{model} argument should be one of -@samp{unlimited}, @samp{dynamic}, @samp{cheap}. All values of @var{model} -have the same meaning as described in @option{-fvect-cost-model} and by -default a cost model defined with @option{-fvect-cost-model} is used. +This pass only applies to certain targets that cannot explicitly represent +the comparison operation before register allocation is complete. -@item -ftree-vrp -@opindex ftree-vrp -Perform Value Range Propagation on trees. This is similar to the -constant propagation pass, but instead of values, ranges of values are -propagated. This allows the optimizers to remove unnecessary range -checks like array bound checks and null pointer checks. This is -enabled by default at @option{-O2} and higher. Null pointer check -elimination is only done if @option{-fdelete-null-pointer-checks} is -enabled. +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. -@item -fsplit-paths -@opindex fsplit-paths -Split paths leading to loop backedges. This can improve dead code -elimination and common subexpression elimination. This is enabled by -default at @option{-O2} and above. +@item -fcprop-registers +@opindex fcprop-registers +After register allocation and post-register allocation instruction splitting, +perform a copy-propagation pass to try to reduce scheduling dependencies +and occasionally eliminate the copy. -@item -fsplit-ivs-in-unroller -@opindex fsplit-ivs-in-unroller -Enables expression of values of induction variables in later iterations -of the unrolled loop using the value in the first iteration. This breaks -long dependency chains, thus improving efficiency of the scheduling passes. +Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. -A combination of @option{-fweb} and CSE is often sufficient to obtain the -same effect. However, that is not reliable in cases where the loop body -is more complicated than a single basic block. It also does not work at all -on some architectures due to restrictions in the CSE pass. +@item -fprofile-correction +@opindex fprofile-correction +Profiles collected using an instrumented binary for multi-threaded programs may +be inconsistent due to missed counter updates. When this option is specified, +GCC uses heuristics to correct or smooth out such inconsistencies. By +default, GCC emits an error message when an inconsistent profile is detected. -This optimization is enabled by default. +@item -fprofile-use +@itemx -fprofile-use=@var{path} +@opindex fprofile-use +Enable profile feedback-directed optimizations, +and the following optimizations +which are generally profitable only with profile feedback available: +@option{-fbranch-probabilities}, @option{-fvpt}, +@option{-funroll-loops}, @option{-fpeel-loops}, @option{-ftracer}, +@option{-ftree-vectorize}, and @option{ftree-loop-distribute-patterns}. -@item -fvariable-expansion-in-unroller -@opindex fvariable-expansion-in-unroller -With this option, the compiler creates multiple copies of some -local variables when unrolling a loop, which can result in superior code. +Before you can use this option, you must first generate profiling information. +@xref{Optimize Options}, for information about the @option{-fprofile-generate} +option. -@item -fpartial-inlining -@opindex fpartial-inlining -Inline parts of functions. This option has any effect only -when inlining itself is turned on by the @option{-finline-functions} -or @option{-finline-small-functions} options. +By default, GCC emits an error message if the feedback profiles do not +match the source code. This error can be turned into a warning by using +@option{-Wcoverage-mismatch}. Note this may result in poorly optimized +code. -Enabled at level @option{-O2}. +If @var{path} is specified, GCC looks at the @var{path} to find +the profile feedback data files. See @option{-fprofile-dir}. -@item -fpredictive-commoning -@opindex fpredictive-commoning -Perform predictive commoning optimization, i.e., reusing computations -(especially memory loads and stores) performed in previous -iterations of loops. +@item -fauto-profile +@itemx -fauto-profile=@var{path} +@opindex fauto-profile +Enable sampling-based feedback-directed optimizations, +and the following optimizations +which are generally profitable only with profile feedback available: +@option{-fbranch-probabilities}, @option{-fvpt}, +@option{-funroll-loops}, @option{-fpeel-loops}, @option{-ftracer}, +@option{-ftree-vectorize}, +@option{-finline-functions}, @option{-fipa-cp}, @option{-fipa-cp-clone}, +@option{-fpredictive-commoning}, @option{-funswitch-loops}, +@option{-fgcse-after-reload}, and @option{-ftree-loop-distribute-patterns}. -This option is enabled at level @option{-O3}. +@var{path} is the name of a file containing AutoFDO profile information. +If omitted, it defaults to @file{fbdata.afdo} in the current directory. -@item -fprefetch-loop-arrays -@opindex fprefetch-loop-arrays -If supported by the target machine, generate instructions to prefetch -memory to improve the performance of loops that access large arrays. +Producing an AutoFDO profile data file requires running your program +with the @command{perf} utility on a supported GNU/Linux target system. +For more information, see @uref{https://perf.wiki.kernel.org/}. -This option may generate better or worse code; results are highly -dependent on the structure of loops within the source code. +E.g. +@smallexample +perf record -e br_inst_retired:near_taken -b -o perf.data \ + -- your_program +@end smallexample -Disabled at level @option{-Os}. +Then use the @command{create_gcov} tool to convert the raw profile data +to a format that can be used by GCC.@ You must also supply the +unstripped binary for your program to this tool. +See @uref{https://github.com/google/autofdo}. -@item -fno-peephole -@itemx -fno-peephole2 -@opindex fno-peephole -@opindex fno-peephole2 -Disable any machine-specific peephole optimizations. The difference -between @option{-fno-peephole} and @option{-fno-peephole2} is in how they -are implemented in the compiler; some targets use one, some use the -other, a few use both. +E.g. +@smallexample +create_gcov --binary=your_program.unstripped --profile=perf.data \ + --gcov=profile.afdo +@end smallexample +@end table -@option{-fpeephole} is enabled by default. -@option{-fpeephole2} enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +The following options control compiler behavior regarding floating-point +arithmetic. These options trade off between speed and +correctness. All must be specifically enabled. -@item -fno-guess-branch-probability -@opindex fno-guess-branch-probability -Do not guess branch probabilities using heuristics. +@table @gcctabopt +@item -ffloat-store +@opindex ffloat-store +Do not store floating-point variables in registers, and inhibit other +options that might change whether a floating-point value is taken from a +register or memory. -GCC uses heuristics to guess branch probabilities if they are -not provided by profiling feedback (@option{-fprofile-arcs}). These -heuristics are based on the control flow graph. If some branch probabilities -are specified by @code{__builtin_expect}, then the heuristics are -used to guess branch probabilities for the rest of the control flow graph, -taking the @code{__builtin_expect} info into account. The interactions -between the heuristics and @code{__builtin_expect} can be complex, and in -some cases, it may be useful to disable the heuristics so that the effects -of @code{__builtin_expect} are easier to understand. +@cindex floating-point precision +This option prevents undesirable excess precision on machines such as +the 68000 where the floating registers (of the 68881) keep more +precision than a @code{double} is supposed to have. Similarly for the +x86 architecture. For most programs, the excess precision does only +good, but a few programs rely on the precise definition of IEEE floating +point. Use @option{-ffloat-store} for such programs, after modifying +them to store all pertinent intermediate computations into variables. -The default is @option{-fguess-branch-probability} at levels -@option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item -fexcess-precision=@var{style} +@opindex fexcess-precision +This option allows further control over excess precision on machines +where floating-point registers have more precision than the IEEE +@code{float} and @code{double} types and the processor does not +support operations rounding to those types. By default, +@option{-fexcess-precision=fast} is in effect; this means that +operations are carried out in the precision of the registers and that +it is unpredictable when rounding to the types specified in the source +code takes place. When compiling C, if +@option{-fexcess-precision=standard} is specified then excess +precision follows the rules specified in ISO C99; in particular, +both casts and assignments cause values to be rounded to their +semantic types (whereas @option{-ffloat-store} only affects +assignments). This option is enabled by default for C if a strict +conformance option such as @option{-std=c99} is used. -@item -freorder-blocks -@opindex freorder-blocks -Reorder basic blocks in the compiled function in order to reduce number of -taken branches and improve code locality. +@opindex mfpmath +@option{-fexcess-precision=standard} is not implemented for languages +other than C, and has no effect if +@option{-funsafe-math-optimizations} or @option{-ffast-math} is +specified. On the x86, it also has no effect if @option{-mfpmath=sse} +or @option{-mfpmath=sse+387} is specified; in the former case, IEEE +semantics apply without excess precision, and in the latter, rounding +is unpredictable. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item -ffast-math +@opindex ffast-math +Sets the options @option{-fno-math-errno}, @option{-funsafe-math-optimizations}, +@option{-ffinite-math-only}, @option{-fno-rounding-math}, +@option{-fno-signaling-nans} and @option{-fcx-limited-range}. -@item -freorder-blocks-algorithm=@var{algorithm} -@opindex freorder-blocks-algorithm -Use the specified algorithm for basic block reordering. The -@var{algorithm} argument can be @samp{simple}, which does not increase -code size (except sometimes due to secondary effects like alignment), -or @samp{stc}, the ``software trace cache'' algorithm, which tries to -put all often executed code together, minimizing the number of branches -executed by making extra copies of code. +This option causes the preprocessor macro @code{__FAST_MATH__} to be defined. -The default is @samp{simple} at levels @option{-O}, @option{-Os}, and -@samp{stc} at levels @option{-O2}, @option{-O3}. +This option is not turned on by any @option{-O} option besides +@option{-Ofast} since it can result in incorrect output for programs +that depend on an exact implementation of IEEE or ISO rules/specifications +for math functions. It may, however, yield faster code for programs +that do not require the guarantees of these specifications. -@item -freorder-blocks-and-partition -@opindex freorder-blocks-and-partition -In addition to reordering basic blocks in the compiled function, in order -to reduce number of taken branches, partitions hot and cold basic blocks -into separate sections of the assembly and .o files, to improve -paging and cache locality performance. +@item -fno-math-errno +@opindex fno-math-errno +Do not set @code{errno} after calling math functions that are executed +with a single instruction, e.g., @code{sqrt}. A program that relies on +IEEE exceptions for math error handling may want to use this flag +for speed while maintaining IEEE arithmetic compatibility. -This optimization is automatically turned off in the presence of -exception handling, for linkonce sections, for functions with a user-defined -section attribute and on any architecture that does not support named -sections. +This option is not turned on by any @option{-O} option since +it can result in incorrect output for programs that depend on +an exact implementation of IEEE or ISO rules/specifications for +math functions. It may, however, yield faster code for programs +that do not require the guarantees of these specifications. -Enabled for x86 at levels @option{-O2}, @option{-O3}. +The default is @option{-fmath-errno}. -@item -freorder-functions -@opindex freorder-functions -Reorder functions in the object file in order to -improve code locality. This is implemented by using special -subsections @code{.text.hot} for most frequently executed functions and -@code{.text.unlikely} for unlikely executed functions. Reordering is done by -the linker so object file format must support named sections and linker must -place them in a reasonable way. +On Darwin systems, the math library never sets @code{errno}. There is +therefore no reason for the compiler to consider the possibility that +it might, and @option{-fno-math-errno} is the default. -Also profile feedback must be available to make this option effective. See -@option{-fprofile-arcs} for details. +@item -funsafe-math-optimizations +@opindex funsafe-math-optimizations -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +Allow optimizations for floating-point arithmetic that (a) assume +that arguments and results are valid and (b) may violate IEEE or +ANSI standards. When used at link-time, it may include libraries +or startup files that change the default FPU control word or other +similar optimizations. -@item -fstrict-aliasing -@opindex fstrict-aliasing -Allow the compiler to assume the strictest aliasing rules applicable to -the language being compiled. For C (and C++), this activates -optimizations based on the type of expressions. In particular, an -object of one type is assumed never to reside at the same address as an -object of a different type, unless the types are almost the same. For -example, an @code{unsigned int} can alias an @code{int}, but not a -@code{void*} or a @code{double}. A character type may alias any other -type. +This option is not turned on by any @option{-O} option since +it can result in incorrect output for programs that depend on +an exact implementation of IEEE or ISO rules/specifications for +math functions. It may, however, yield faster code for programs +that do not require the guarantees of these specifications. +Enables @option{-fno-signed-zeros}, @option{-fno-trapping-math}, +@option{-fassociative-math} and @option{-freciprocal-math}. -@anchor{Type-punning}Pay special attention to code like this: -@smallexample -union a_union @{ - int i; - double d; -@}; +The default is @option{-fno-unsafe-math-optimizations}. -int f() @{ - union a_union t; - t.d = 3.0; - return t.i; -@} -@end smallexample -The practice of reading from a different union member than the one most -recently written to (called ``type-punning'') is common. Even with -@option{-fstrict-aliasing}, type-punning is allowed, provided the memory -is accessed through the union type. So, the code above works as -expected. @xref{Structures unions enumerations and bit-fields -implementation}. However, this code might not: -@smallexample -int f() @{ - union a_union t; - int* ip; - t.d = 3.0; - ip = &t.i; - return *ip; -@} -@end smallexample +@item -fassociative-math +@opindex fassociative-math -Similarly, access by taking the address, casting the resulting pointer -and dereferencing the result has undefined behavior, even if the cast -uses a union type, e.g.: -@smallexample -int f() @{ - double d = 3.0; - return ((union a_union *) &d)->i; -@} -@end smallexample +Allow re-association of operands in series of floating-point operations. +This violates the ISO C and C++ language standard by possibly changing +computation result. NOTE: re-ordering may change the sign of zero as +well as ignore NaNs and inhibit or create underflow or overflow (and +thus cannot be used on code that relies on rounding behavior like +@code{(x + 2**52) - 2**52}. May also reorder floating-point comparisons +and thus may not be used when ordered comparisons are required. +This option requires that both @option{-fno-signed-zeros} and +@option{-fno-trapping-math} be in effect. Moreover, it doesn't make +much sense with @option{-frounding-math}. For Fortran the option +is automatically enabled when both @option{-fno-signed-zeros} and +@option{-fno-trapping-math} are in effect. -The @option{-fstrict-aliasing} option is enabled at levels -@option{-O2}, @option{-O3}, @option{-Os}. +The default is @option{-fno-associative-math}. -@item -fstrict-overflow -@opindex fstrict-overflow -Allow the compiler to assume strict signed overflow rules, depending -on the language being compiled. For C (and C++) this means that -overflow when doing arithmetic with signed numbers is undefined, which -means that the compiler may assume that it does not happen. This -permits various optimizations. For example, the compiler assumes -that an expression like @code{i + 10 > i} is always true for -signed @code{i}. This assumption is only valid if signed overflow is -undefined, as the expression is false if @code{i + 10} overflows when -using twos complement arithmetic. When this option is in effect any -attempt to determine whether an operation on signed numbers -overflows must be written carefully to not actually involve overflow. +@item -freciprocal-math +@opindex freciprocal-math + +Allow the reciprocal of a value to be used instead of dividing by +the value if this enables optimizations. For example @code{x / y} +can be replaced with @code{x * (1/y)}, which is useful if @code{(1/y)} +is subject to common subexpression elimination. Note that this loses +precision and increases the number of flops operating on the value. -This option also allows the compiler to assume strict pointer -semantics: given a pointer to an object, if adding an offset to that -pointer does not produce a pointer to the same object, the addition is -undefined. This permits the compiler to conclude that @code{p + u > -p} is always true for a pointer @code{p} and unsigned integer -@code{u}. This assumption is only valid because pointer wraparound is -undefined, as the expression is false if @code{p + u} overflows using -twos complement arithmetic. +The default is @option{-fno-reciprocal-math}. -See also the @option{-fwrapv} option. Using @option{-fwrapv} means -that integer signed overflow is fully defined: it wraps. When -@option{-fwrapv} is used, there is no difference between -@option{-fstrict-overflow} and @option{-fno-strict-overflow} for -integers. With @option{-fwrapv} certain types of overflow are -permitted. For example, if the compiler gets an overflow when doing -arithmetic on constants, the overflowed value can still be used with -@option{-fwrapv}, but not otherwise. +@item -ffinite-math-only +@opindex ffinite-math-only +Allow optimizations for floating-point arithmetic that assume +that arguments and results are not NaNs or +-Infs. -The @option{-fstrict-overflow} option is enabled at levels -@option{-O2}, @option{-O3}, @option{-Os}. +This option is not turned on by any @option{-O} option since +it can result in incorrect output for programs that depend on +an exact implementation of IEEE or ISO rules/specifications for +math functions. It may, however, yield faster code for programs +that do not require the guarantees of these specifications. -@item -falign-functions -@itemx -falign-functions=@var{n} -@opindex falign-functions -Align the start of functions to the next power-of-two greater than -@var{n}, skipping up to @var{n} bytes. For instance, -@option{-falign-functions=32} aligns functions to the next 32-byte -boundary, but @option{-falign-functions=24} aligns to the next -32-byte boundary only if this can be done by skipping 23 bytes or less. +The default is @option{-fno-finite-math-only}. -@option{-fno-align-functions} and @option{-falign-functions=1} are -equivalent and mean that functions are not aligned. +@item -fno-signed-zeros +@opindex fno-signed-zeros +Allow optimizations for floating-point arithmetic that ignore the +signedness of zero. IEEE arithmetic specifies the behavior of +distinct +0.0 and @minus{}0.0 values, which then prohibits simplification +of expressions such as x+0.0 or 0.0*x (even with @option{-ffinite-math-only}). +This option implies that the sign of a zero result isn't significant. -Some assemblers only support this flag when @var{n} is a power of two; -in that case, it is rounded up. +The default is @option{-fsigned-zeros}. -If @var{n} is not specified or is zero, use a machine-dependent default. +@item -fno-trapping-math +@opindex fno-trapping-math +Compile code assuming that floating-point operations cannot generate +user-visible traps. These traps include division by zero, overflow, +underflow, inexact result and invalid operation. This option requires +that @option{-fno-signaling-nans} be in effect. Setting this option may +allow faster code if one relies on ``non-stop'' IEEE arithmetic, for example. -Enabled at levels @option{-O2}, @option{-O3}. +This option should never be turned on by any @option{-O} option since +it can result in incorrect output for programs that depend on +an exact implementation of IEEE or ISO rules/specifications for +math functions. -@item -falign-labels -@itemx -falign-labels=@var{n} -@opindex falign-labels -Align all branch targets to a power-of-two boundary, skipping up to -@var{n} bytes like @option{-falign-functions}. This option can easily -make code slower, because it must insert dummy operations for when the -branch target is reached in the usual flow of the code. +The default is @option{-ftrapping-math}. -@option{-fno-align-labels} and @option{-falign-labels=1} are -equivalent and mean that labels are not aligned. +@item -frounding-math +@opindex frounding-math +Disable transformations and optimizations that assume default floating-point +rounding behavior. This is round-to-zero for all floating point +to integer conversions, and round-to-nearest for all other arithmetic +truncations. This option should be specified for programs that change +the FP rounding mode dynamically, or that may be executed with a +non-default rounding mode. This option disables constant folding of +floating-point expressions at compile time (which may be affected by +rounding mode) and arithmetic transformations that are unsafe in the +presence of sign-dependent rounding modes. -If @option{-falign-loops} or @option{-falign-jumps} are applicable and -are greater than this value, then their values are used instead. +The default is @option{-fno-rounding-math}. -If @var{n} is not specified or is zero, use a machine-dependent default -which is very likely to be @samp{1}, meaning no alignment. +This option is experimental and does not currently guarantee to +disable all GCC optimizations that are affected by rounding mode. +Future versions of GCC may provide finer control of this setting +using C99's @code{FENV_ACCESS} pragma. This command-line option +will be used to specify the default state for @code{FENV_ACCESS}. -Enabled at levels @option{-O2}, @option{-O3}. +@item -fsignaling-nans +@opindex fsignaling-nans +Compile code assuming that IEEE signaling NaNs may generate user-visible +traps during floating-point operations. Setting this option disables +optimizations that may change the number of exceptions visible with +signaling NaNs. This option implies @option{-ftrapping-math}. -@item -falign-loops -@itemx -falign-loops=@var{n} -@opindex falign-loops -Align loops to a power-of-two boundary, skipping up to @var{n} bytes -like @option{-falign-functions}. If the loops are -executed many times, this makes up for any execution of the dummy -operations. +This option causes the preprocessor macro @code{__SUPPORT_SNAN__} to +be defined. -@option{-fno-align-loops} and @option{-falign-loops=1} are -equivalent and mean that loops are not aligned. +The default is @option{-fno-signaling-nans}. -If @var{n} is not specified or is zero, use a machine-dependent default. +This option is experimental and does not currently guarantee to +disable all GCC optimizations that affect signaling NaN behavior. -Enabled at levels @option{-O2}, @option{-O3}. +@item -fsingle-precision-constant +@opindex fsingle-precision-constant +Treat floating-point constants as single precision instead of +implicitly converting them to double-precision constants. -@item -falign-jumps -@itemx -falign-jumps=@var{n} -@opindex falign-jumps -Align branch targets to a power-of-two boundary, for branch targets -where the targets can only be reached by jumping, skipping up to @var{n} -bytes like @option{-falign-functions}. In this case, no dummy operations -need be executed. +@item -fcx-limited-range +@opindex fcx-limited-range +When enabled, this option states that a range reduction step is not +needed when performing complex division. Also, there is no checking +whether the result of a complex multiplication or division is @code{NaN ++ I*NaN}, with an attempt to rescue the situation in that case. The +default is @option{-fno-cx-limited-range}, but is enabled by +@option{-ffast-math}. -@option{-fno-align-jumps} and @option{-falign-jumps=1} are -equivalent and mean that loops are not aligned. +This option controls the default setting of the ISO C99 +@code{CX_LIMITED_RANGE} pragma. Nevertheless, the option applies to +all languages. -If @var{n} is not specified or is zero, use a machine-dependent default. +@item -fcx-fortran-rules +@opindex fcx-fortran-rules +Complex multiplication and division follow Fortran rules. Range +reduction is done as part of complex division, but there is no checking +whether the result of a complex multiplication or division is @code{NaN ++ I*NaN}, with an attempt to rescue the situation in that case. -Enabled at levels @option{-O2}, @option{-O3}. +The default is @option{-fno-cx-fortran-rules}. -@item -funit-at-a-time -@opindex funit-at-a-time -This option is left for compatibility reasons. @option{-funit-at-a-time} -has no effect, while @option{-fno-unit-at-a-time} implies -@option{-fno-toplevel-reorder} and @option{-fno-section-anchors}. +@end table -Enabled by default. +The following options control optimizations that may improve +performance, but are not enabled by any @option{-O} options. This +section includes experimental options that may produce broken code. -@item -fno-toplevel-reorder -@opindex fno-toplevel-reorder -Do not reorder top-level functions, variables, and @code{asm} -statements. Output them in the same order that they appear in the -input file. When this option is used, unreferenced static variables -are not removed. This option is intended to support existing code -that relies on a particular ordering. For new code, it is better to -use attributes when possible. +@table @gcctabopt +@item -fbranch-probabilities +@opindex fbranch-probabilities +After running a program compiled with @option{-fprofile-arcs} +(@pxref{Instrumentation Options}), +you can compile it a second time using +@option{-fbranch-probabilities}, to improve optimizations based on +the number of times each branch was taken. When a program +compiled with @option{-fprofile-arcs} exits, it saves arc execution +counts to a file called @file{@var{sourcename}.gcda} for each source +file. The information in this data file is very dependent on the +structure of the generated code, so you must use the same source code +and the same optimization options for both compilations. -Enabled at level @option{-O0}. When disabled explicitly, it also implies -@option{-fno-section-anchors}, which is otherwise enabled at @option{-O0} on some -targets. +With @option{-fbranch-probabilities}, GCC puts a +@samp{REG_BR_PROB} note on each @samp{JUMP_INSN} and @samp{CALL_INSN}. +These can be used to improve optimization. Currently, they are only +used in one place: in @file{reorg.c}, instead of guessing which path a +branch is most likely to take, the @samp{REG_BR_PROB} values are used to +exactly determine which path is taken more often. -@item -fweb -@opindex fweb -Constructs webs as commonly used for register allocation purposes and assign -each web individual pseudo register. This allows the register allocation pass -to operate on pseudos directly, but also strengthens several other optimization -passes, such as CSE, loop optimizer and trivial dead code remover. It can, -however, make debugging impossible, since variables no longer stay in a -``home register''. +@item -fprofile-values +@opindex fprofile-values +If combined with @option{-fprofile-arcs}, it adds code so that some +data about values of expressions in the program is gathered. -Enabled by default with @option{-funroll-loops}. +With @option{-fbranch-probabilities}, it reads back the data gathered +from profiling values of expressions for usage in optimizations. -@item -fwhole-program -@opindex fwhole-program -Assume that the current compilation unit represents the whole program being -compiled. All public functions and variables with the exception of @code{main} -and those merged by attribute @code{externally_visible} become static functions -and in effect are optimized more aggressively by interprocedural optimizers. +Enabled with @option{-fprofile-generate} and @option{-fprofile-use}. -This option should not be used in combination with @option{-flto}. -Instead relying on a linker plugin should provide safer and more precise -information. +@item -fprofile-reorder-functions +@opindex fprofile-reorder-functions +Function reordering based on profile instrumentation collects +first time of execution of a function and orders these functions +in ascending order. -@item -flto[=@var{n}] -@opindex flto -This option runs the standard link-time optimizer. When invoked -with source code, it generates GIMPLE (one of GCC's internal -representations) and writes it to special ELF sections in the object -file. When the object files are linked together, all the function -bodies are read from these ELF sections and instantiated as if they -had been part of the same translation unit. +Enabled with @option{-fprofile-use}. -To use the link-time optimizer, @option{-flto} and optimization -options should be specified at compile time and during the final link. -For example: +@item -fvpt +@opindex fvpt +If combined with @option{-fprofile-arcs}, this option instructs the compiler +to add code to gather information about values of expressions. -@smallexample -gcc -c -O2 -flto foo.c -gcc -c -O2 -flto bar.c -gcc -o myprog -flto -O2 foo.o bar.o -@end smallexample +With @option{-fbranch-probabilities}, it reads back the data gathered +and actually performs the optimizations based on them. +Currently the optimizations include specialization of division operations +using the knowledge about the value of the denominator. -The first two invocations to GCC save a bytecode representation -of GIMPLE into special ELF sections inside @file{foo.o} and -@file{bar.o}. The final invocation reads the GIMPLE bytecode from -@file{foo.o} and @file{bar.o}, merges the two files into a single -internal image, and compiles the result as usual. Since both -@file{foo.o} and @file{bar.o} are merged into a single image, this -causes all the interprocedural analyses and optimizations in GCC to -work across the two files as if they were a single one. This means, -for example, that the inliner is able to inline functions in -@file{bar.o} into functions in @file{foo.o} and vice-versa. +@item -frename-registers +@opindex frename-registers +Attempt to avoid false dependencies in scheduled code by making use +of registers left over after register allocation. This optimization +most benefits processors with lots of registers. Depending on the +debug information format adopted by the target, however, it can +make debugging impossible, since variables no longer stay in +a ``home register''. -Another (simpler) way to enable link-time optimization is: +Enabled by default with @option{-funroll-loops} and @option{-fpeel-loops}. -@smallexample -gcc -o myprog -flto -O2 foo.c bar.c -@end smallexample +@item -fschedule-fusion +@opindex fschedule-fusion +Performs a target dependent pass over the instruction stream to schedule +instructions of same type together because target machine can execute them +more efficiently if they are adjacent to each other in the instruction flow. -The above generates bytecode for @file{foo.c} and @file{bar.c}, -merges them together into a single GIMPLE representation and optimizes -them as usual to produce @file{myprog}. +Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. -The only important thing to keep in mind is that to enable link-time -optimizations you need to use the GCC driver to perform the link-step. -GCC then automatically performs link-time optimization if any of the -objects involved were compiled with the @option{-flto} command-line option. -You generally -should specify the optimization options to be used for link-time -optimization though GCC tries to be clever at guessing an -optimization level to use from the options used at compile-time -if you fail to specify one at link-time. You can always override -the automatic decision to do link-time optimization at link-time -by passing @option{-fno-lto} to the link command. +@item -ftracer +@opindex ftracer +Perform tail duplication to enlarge superblock size. This transformation +simplifies the control flow of the function allowing other optimizations to do +a better job. -To make whole program optimization effective, it is necessary to make -certain whole program assumptions. The compiler needs to know -what functions and variables can be accessed by libraries and runtime -outside of the link-time optimized unit. When supported by the linker, -the linker plugin (see @option{-fuse-linker-plugin}) passes information -to the compiler about used and externally visible symbols. When -the linker plugin is not available, @option{-fwhole-program} should be -used to allow the compiler to make these assumptions, which leads -to more aggressive optimization decisions. +Enabled with @option{-fprofile-use}. -When @option{-fuse-linker-plugin} is not enabled then, when a file is -compiled with @option{-flto}, the generated object file is larger than -a regular object file because it contains GIMPLE bytecodes and the usual -final code (see @option{-ffat-lto-objects}. This means that -object files with LTO information can be linked as normal object -files; if @option{-fno-lto} is passed to the linker, no -interprocedural optimizations are applied. Note that when -@option{-fno-fat-lto-objects} is enabled the compile-stage is faster -but you cannot perform a regular, non-LTO link on them. +@item -funroll-loops +@opindex funroll-loops +Unroll loops whose number of iterations can be determined at compile time or +upon entry to the loop. @option{-funroll-loops} implies +@option{-frerun-cse-after-loop}, @option{-fweb} and @option{-frename-registers}. +It also turns on complete loop peeling (i.e.@: complete removal of loops with +a small constant number of iterations). This option makes code larger, and may +or may not make it run faster. -Additionally, the optimization flags used to compile individual files -are not necessarily related to those used at link time. For instance, +Enabled with @option{-fprofile-use}. -@smallexample -gcc -c -O0 -ffat-lto-objects -flto foo.c -gcc -c -O0 -ffat-lto-objects -flto bar.c -gcc -o myprog -O3 foo.o bar.o -@end smallexample +@item -funroll-all-loops +@opindex funroll-all-loops +Unroll all loops, even if their number of iterations is uncertain when +the loop is entered. This usually makes programs run more slowly. +@option{-funroll-all-loops} implies the same options as +@option{-funroll-loops}. -This produces individual object files with unoptimized assembler -code, but the resulting binary @file{myprog} is optimized at -@option{-O3}. If, instead, the final binary is generated with -@option{-fno-lto}, then @file{myprog} is not optimized. +@item -fpeel-loops +@opindex fpeel-loops +Peels loops for which there is enough information that they do not +roll much (from profile feedback). It also turns on complete loop peeling +(i.e.@: complete removal of loops with small constant number of iterations). -When producing the final binary, GCC only -applies link-time optimizations to those files that contain bytecode. -Therefore, you can mix and match object files and libraries with -GIMPLE bytecodes and final object code. GCC automatically selects -which files to optimize in LTO mode and which files to link without -further processing. +Enabled with @option{-fprofile-use}. -There are some code generation flags preserved by GCC when -generating bytecodes, as they need to be used during the final link -stage. Generally options specified at link-time override those -specified at compile-time. +@item -fmove-loop-invariants +@opindex fmove-loop-invariants +Enables the loop invariant motion pass in the RTL loop optimizer. Enabled +at level @option{-O1} -If you do not specify an optimization level option @option{-O} at -link-time then GCC computes one based on the optimization levels -used when compiling the object files. The highest optimization -level wins here. +@item -funswitch-loops +@opindex funswitch-loops +Move branches with loop invariant conditions out of the loop, with duplicates +of the loop on both branches (modified according to result of the condition). -Currently, the following options and their setting are take from -the first object file that explicitely specified it: -@option{-fPIC}, @option{-fpic}, @option{-fpie}, @option{-fcommon}, -@option{-fexceptions}, @option{-fnon-call-exceptions}, @option{-fgnu-tm} -and all the @option{-m} target flags. +@item -ffunction-sections +@itemx -fdata-sections +@opindex ffunction-sections +@opindex fdata-sections +Place each function or data item into its own section in the output +file if the target supports arbitrary sections. The name of the +function or the name of the data item determines the section's name +in the output file. -Certain ABI changing flags are required to match in all compilation-units -and trying to override this at link-time with a conflicting value -is ignored. This includes options such as @option{-freg-struct-return} -and @option{-fpcc-struct-return}. +Use these options on systems where the linker can perform optimizations +to improve locality of reference in the instruction space. Most systems +using the ELF object format and SPARC processors running Solaris 2 have +linkers with such optimizations. AIX may have these optimizations in +the future. -Other options such as @option{-ffp-contract}, @option{-fno-strict-overflow}, -@option{-fwrapv}, @option{-fno-trapv} or @option{-fno-strict-aliasing} -are passed through to the link stage and merged conservatively for -conflicting translation units. Specifically -@option{-fno-strict-overflow}, @option{-fwrapv} and @option{-fno-trapv} take -precedence and for example @option{-ffp-contract=off} takes precedence -over @option{-ffp-contract=fast}. You can override them at linke-time. +Only use these options when there are significant benefits from doing +so. When you specify these options, the assembler and linker +create larger object and executable files and are also slower. +You cannot use @command{gprof} on all systems if you +specify this option, and you may have problems with debugging if +you specify both this option and @option{-g}. -It is recommended that you compile all the files participating in the -same link with the same options and also specify those options at -link time. +@item -fbranch-target-load-optimize +@opindex fbranch-target-load-optimize +Perform branch target register load optimization before prologue / epilogue +threading. +The use of target registers can typically be exposed only during reload, +thus hoisting loads out of loops and doing inter-block scheduling needs +a separate optimization pass. -If LTO encounters objects with C linkage declared with incompatible -types in separate translation units to be linked together (undefined -behavior according to ISO C99 6.2.7), a non-fatal diagnostic may be -issued. The behavior is still undefined at run time. Similar -diagnostics may be raised for other languages. +@item -fbranch-target-load-optimize2 +@opindex fbranch-target-load-optimize2 +Perform branch target register load optimization after prologue / epilogue +threading. -Another feature of LTO is that it is possible to apply interprocedural -optimizations on files written in different languages: +@item -fbtr-bb-exclusive +@opindex fbtr-bb-exclusive +When performing branch target register load optimization, don't reuse +branch target registers within any basic block. -@smallexample -gcc -c -flto foo.c -g++ -c -flto bar.cc -gfortran -c -flto baz.f90 -g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran -@end smallexample +@item -fstdarg-opt +@opindex fstdarg-opt +Optimize the prologue of variadic argument functions with respect to usage of +those arguments. -Notice that the final link is done with @command{g++} to get the C++ -runtime libraries and @option{-lgfortran} is added to get the Fortran -runtime libraries. In general, when mixing languages in LTO mode, you -should use the same link command options as when mixing languages in a -regular (non-LTO) compilation. +@item -fsection-anchors +@opindex fsection-anchors +Try to reduce the number of symbolic address calculations by using +shared ``anchor'' symbols to address nearby objects. This transformation +can help to reduce the number of GOT entries and GOT accesses on some +targets. -If object files containing GIMPLE bytecode are stored in a library archive, say -@file{libfoo.a}, it is possible to extract and use them in an LTO link if you -are using a linker with plugin support. To create static libraries suitable -for LTO, use @command{gcc-ar} and @command{gcc-ranlib} instead of @command{ar} -and @command{ranlib}; -to show the symbols of object files with GIMPLE bytecode, use -@command{gcc-nm}. Those commands require that @command{ar}, @command{ranlib} -and @command{nm} have been compiled with plugin support. At link time, use the the -flag @option{-fuse-linker-plugin} to ensure that the library participates in -the LTO optimization process: +For example, the implementation of the following function @code{foo}: @smallexample -gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo +static int a, b, c; +int foo (void) @{ return a + b + c; @} @end smallexample -With the linker plugin enabled, the linker extracts the needed -GIMPLE files from @file{libfoo.a} and passes them on to the running GCC -to make them part of the aggregated GIMPLE image to be optimized. - -If you are not using a linker with plugin support and/or do not -enable the linker plugin, then the objects inside @file{libfoo.a} -are extracted and linked as usual, but they do not participate -in the LTO optimization process. In order to make a static library suitable -for both LTO optimization and usual linkage, compile its object files with -@option{-flto} @option{-ffat-lto-objects}. - -Link-time optimizations do not require the presence of the whole program to -operate. If the program does not require any symbols to be exported, it is -possible to combine @option{-flto} and @option{-fwhole-program} to allow -the interprocedural optimizers to use more aggressive assumptions which may -lead to improved optimization opportunities. -Use of @option{-fwhole-program} is not needed when linker plugin is -active (see @option{-fuse-linker-plugin}). - -The current implementation of LTO makes no -attempt to generate bytecode that is portable between different -types of hosts. The bytecode files are versioned and there is a -strict version check, so bytecode files generated in one version of -GCC do not work with an older or newer version of GCC. - -Link-time optimization does not work well with generation of debugging -information. Combining @option{-flto} with -@option{-g} is currently experimental and expected to produce unexpected -results. +@noindent +usually calculates the addresses of all three variables, but if you +compile it with @option{-fsection-anchors}, it accesses the variables +from a common anchor point instead. The effect is similar to the +following pseudocode (which isn't valid C): -If you specify the optional @var{n}, the optimization and code -generation done at link time is executed in parallel using @var{n} -parallel jobs by utilizing an installed @command{make} program. The -environment variable @env{MAKE} may be used to override the program -used. The default value for @var{n} is 1. +@smallexample +int foo (void) +@{ + register int *xr = &x; + return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; +@} +@end smallexample -You can also specify @option{-flto=jobserver} to use GNU make's -job server mode to determine the number of parallel jobs. This -is useful when the Makefile calling GCC is already executing in parallel. -You must prepend a @samp{+} to the command recipe in the parent Makefile -for this to work. This option likely only works if @env{MAKE} is -GNU make. +Not all targets support this option. -@item -flto-partition=@var{alg} -@opindex flto-partition -Specify the partitioning algorithm used by the link-time optimizer. -The value is either @samp{1to1} to specify a partitioning mirroring -the original source files or @samp{balanced} to specify partitioning -into equally sized chunks (whenever possible) or @samp{max} to create -new partition for every symbol where possible. Specifying @samp{none} -as an algorithm disables partitioning and streaming completely. -The default value is @samp{balanced}. While @samp{1to1} can be used -as an workaround for various code ordering issues, the @samp{max} -partitioning is intended for internal testing only. -The value @samp{one} specifies that exactly one partition should be -used while the value @samp{none} bypasses partitioning and executes -the link-time optimization step directly from the WPA phase. +@item --param @var{name}=@var{value} +@opindex param +In some places, GCC uses various constants to control the amount of +optimization that is done. For example, GCC does not inline functions +that contain more than a certain number of instructions. You can +control some of these constants on the command line using the +@option{--param} option. -@item -flto-odr-type-merging -@opindex flto-odr-type-merging -Enable streaming of mangled types names of C++ types and their unification -at linktime. This increases size of LTO object files, but enable -diagnostics about One Definition Rule violations. +The names of specific parameters, and the meaning of the values, are +tied to the internals of the compiler, and are subject to change +without notice in future releases. -@item -flto-compression-level=@var{n} -@opindex flto-compression-level -This option specifies the level of compression used for intermediate -language written to LTO object files, and is only meaningful in -conjunction with LTO mode (@option{-flto}). Valid -values are 0 (no compression) to 9 (maximum compression). Values -outside this range are clamped to either 0 or 9. If the option is not -given, a default balanced compression setting is used. +In each case, the @var{value} is an integer. The allowable choices for +@var{name} are: -@item -flto-report -@opindex flto-report -Prints a report with internal details on the workings of the link-time -optimizer. The contents of this report vary from version to version. -It is meant to be useful to GCC developers when processing object -files in LTO mode (via @option{-flto}). +@table @gcctabopt +@item predictable-branch-outcome +When branch is predicted to be taken with probability lower than this threshold +(in percent), then it is considered well predictable. The default is 10. -Disabled by default. +@item max-rtl-if-conversion-insns +RTL if-conversion tries to remove conditional branches around a block and +replace them with conditionally executed instructions. This parameter +gives the maximum number of instructions in a block which should be +considered for if-conversion. The default is 10, though the compiler will +also use other heuristics to decide whether if-conversion is likely to be +profitable. -@item -flto-report-wpa -@opindex flto-report-wpa -Like @option{-flto-report}, but only print for the WPA phase of Link -Time Optimization. +@item max-crossjump-edges +The maximum number of incoming edges to consider for cross-jumping. +The algorithm used by @option{-fcrossjumping} is @math{O(N^2)} in +the number of edges incoming to each block. Increasing values mean +more aggressive optimization, making the compilation time increase with +probably small improvement in executable size. -@item -fuse-linker-plugin -@opindex fuse-linker-plugin -Enables the use of a linker plugin during link-time optimization. This -option relies on plugin support in the linker, which is available in gold -or in GNU ld 2.21 or newer. +@item min-crossjump-insns +The minimum number of instructions that must be matched at the end +of two blocks before cross-jumping is performed on them. This +value is ignored in the case where all instructions in the block being +cross-jumped from are matched. The default value is 5. -This option enables the extraction of object files with GIMPLE bytecode out -of library archives. This improves the quality of optimization by exposing -more code to the link-time optimizer. This information specifies what -symbols can be accessed externally (by non-LTO object or during dynamic -linking). Resulting code quality improvements on binaries (and shared -libraries that use hidden visibility) are similar to @option{-fwhole-program}. -See @option{-flto} for a description of the effect of this flag and how to -use it. +@item max-grow-copy-bb-insns +The maximum code size expansion factor when copying basic blocks +instead of jumping. The expansion is relative to a jump instruction. +The default value is 8. -This option is enabled by default when LTO support in GCC is enabled -and GCC was configured for use with -a linker supporting plugins (GNU ld 2.21 or newer or gold). +@item max-goto-duplication-insns +The maximum number of instructions to duplicate to a block that jumps +to a computed goto. To avoid @math{O(N^2)} behavior in a number of +passes, GCC factors computed gotos early in the compilation process, +and unfactors them as late as possible. Only computed jumps at the +end of a basic blocks with no more than max-goto-duplication-insns are +unfactored. The default value is 8. -@item -ffat-lto-objects -@opindex ffat-lto-objects -Fat LTO objects are object files that contain both the intermediate language -and the object code. This makes them usable for both LTO linking and normal -linking. This option is effective only when compiling with @option{-flto} -and is ignored at link time. +@item max-delay-slot-insn-search +The maximum number of instructions to consider when looking for an +instruction to fill a delay slot. If more than this arbitrary number of +instructions are searched, the time savings from filling the delay slot +are minimal, so stop searching. Increasing values mean more +aggressive optimization, making the compilation time increase with probably +small improvement in execution time. -@option{-fno-fat-lto-objects} improves compilation time over plain LTO, but -requires the complete toolchain to be aware of LTO. It requires a linker with -linker plugin support for basic functionality. Additionally, -@command{nm}, @command{ar} and @command{ranlib} -need to support linker plugins to allow a full-featured build environment -(capable of building static libraries etc). GCC provides the @command{gcc-ar}, -@command{gcc-nm}, @command{gcc-ranlib} wrappers to pass the right options -to these tools. With non fat LTO makefiles need to be modified to use them. +@item max-delay-slot-live-search +When trying to fill delay slots, the maximum number of instructions to +consider when searching for a block with valid live register +information. Increasing this arbitrarily chosen value means more +aggressive optimization, increasing the compilation time. This parameter +should be removed when the delay slot code is rewritten to maintain the +control-flow graph. -The default is @option{-fno-fat-lto-objects} on targets with linker plugin -support. +@item max-gcse-memory +The approximate maximum amount of memory that can be allocated in +order to perform the global common subexpression elimination +optimization. If more memory than specified is required, the +optimization is not done. -@item -fcompare-elim -@opindex fcompare-elim -After register allocation and post-register allocation instruction splitting, -identify arithmetic instructions that compute processor flags similar to a -comparison operation based on that arithmetic. If possible, eliminate the -explicit comparison operation. +@item max-gcse-insertion-ratio +If the ratio of expression insertions to deletions is larger than this value +for any expression, then RTL PRE inserts or removes the expression and thus +leaves partially redundant computations in the instruction stream. The default value is 20. -This pass only applies to certain targets that cannot explicitly represent -the comparison operation before register allocation is complete. +@item max-pending-list-length +The maximum number of pending dependencies scheduling allows +before flushing the current state and starting over. Large functions +with few branches or calls can create excessively large lists which +needlessly consume memory and resources. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item max-modulo-backtrack-attempts +The maximum number of backtrack attempts the scheduler should make +when modulo scheduling a loop. Larger values can exponentially increase +compilation time. -@item -fcprop-registers -@opindex fcprop-registers -After register allocation and post-register allocation instruction splitting, -perform a copy-propagation pass to try to reduce scheduling dependencies -and occasionally eliminate the copy. +@item max-inline-insns-single +Several parameters control the tree inliner used in GCC@. +This number sets the maximum number of instructions (counted in GCC's +internal representation) in a single function that the tree inliner +considers for inlining. This only affects functions declared +inline and methods implemented in a class declaration (C++). +The default value is 400. -Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}. +@item max-inline-insns-auto +When you use @option{-finline-functions} (included in @option{-O3}), +a lot of functions that would otherwise not be considered for inlining +by the compiler are investigated. To those functions, a different +(more restrictive) limit compared to functions declared inline can +be applied. +The default value is 40. -@item -fprofile-correction -@opindex fprofile-correction -Profiles collected using an instrumented binary for multi-threaded programs may -be inconsistent due to missed counter updates. When this option is specified, -GCC uses heuristics to correct or smooth out such inconsistencies. By -default, GCC emits an error message when an inconsistent profile is detected. +@item inline-min-speedup +When estimated performance improvement of caller + callee runtime exceeds this +threshold (in precent), the function can be inlined regardless the limit on +@option{--param max-inline-insns-single} and @option{--param +max-inline-insns-auto}. -@item -fprofile-dir=@var{path} -@opindex fprofile-dir +@item large-function-insns +The limit specifying really large functions. For functions larger than this +limit after inlining, inlining is constrained by +@option{--param large-function-growth}. This parameter is useful primarily +to avoid extreme compilation time caused by non-linear algorithms used by the +back end. +The default value is 2700. -Set the directory to search for the profile data files in to @var{path}. -This option affects only the profile data generated by -@option{-fprofile-generate}, @option{-ftest-coverage}, @option{-fprofile-arcs} -and used by @option{-fprofile-use} and @option{-fbranch-probabilities} -and its related options. Both absolute and relative paths can be used. -By default, GCC uses the current directory as @var{path}, thus the -profile data file appears in the same directory as the object file. +@item large-function-growth +Specifies maximal growth of large function caused by inlining in percents. +The default value is 100 which limits large function growth to 2.0 times +the original size. -@item -fprofile-generate -@itemx -fprofile-generate=@var{path} -@opindex fprofile-generate +@item large-unit-insns +The limit specifying large translation unit. Growth caused by inlining of +units larger than this limit is limited by @option{--param inline-unit-growth}. +For small units this might be too tight. +For example, consider a unit consisting of function A +that is inline and B that just calls A three times. If B is small relative to +A, the growth of unit is 300\% and yet such inlining is very sane. For very +large units consisting of small inlineable functions, however, the overall unit +growth limit is needed to avoid exponential explosion of code size. Thus for +smaller units, the size is increased to @option{--param large-unit-insns} +before applying @option{--param inline-unit-growth}. The default is 10000. -Enable options usually used for instrumenting application to produce -profile useful for later recompilation with profile feedback based -optimization. You must use @option{-fprofile-generate} both when -compiling and when linking your program. +@item inline-unit-growth +Specifies maximal overall growth of the compilation unit caused by inlining. +The default value is 20 which limits unit growth to 1.2 times the original +size. Cold functions (either marked cold via an attribute or by profile +feedback) are not accounted into the unit size. -The following options are enabled: @option{-fprofile-arcs}, @option{-fprofile-values}, @option{-fvpt}. +@item ipcp-unit-growth +Specifies maximal overall growth of the compilation unit caused by +interprocedural constant propagation. The default value is 10 which limits +unit growth to 1.1 times the original size. -If @var{path} is specified, GCC looks at the @var{path} to find -the profile feedback data files. See @option{-fprofile-dir}. +@item large-stack-frame +The limit specifying large stack frames. While inlining the algorithm is trying +to not grow past this limit too much. The default value is 256 bytes. -@item -fprofile-use -@itemx -fprofile-use=@var{path} -@opindex fprofile-use -Enable profile feedback-directed optimizations, -and the following optimizations -which are generally profitable only with profile feedback available: -@option{-fbranch-probabilities}, @option{-fvpt}, -@option{-funroll-loops}, @option{-fpeel-loops}, @option{-ftracer}, -@option{-ftree-vectorize}, and @option{ftree-loop-distribute-patterns}. +@item large-stack-frame-growth +Specifies maximal growth of large stack frames caused by inlining in percents. +The default value is 1000 which limits large stack frame growth to 11 times +the original size. + +@item max-inline-insns-recursive +@itemx max-inline-insns-recursive-auto +Specifies the maximum number of instructions an out-of-line copy of a +self-recursive inline +function can grow into by performing recursive inlining. -By default, GCC emits an error message if the feedback profiles do not -match the source code. This error can be turned into a warning by using -@option{-Wcoverage-mismatch}. Note this may result in poorly optimized -code. +@option{--param max-inline-insns-recursive} applies to functions +declared inline. +For functions not declared inline, recursive inlining +happens only when @option{-finline-functions} (included in @option{-O3}) is +enabled; @option{--param max-inline-insns-recursive-auto} applies instead. The +default value is 450. -If @var{path} is specified, GCC looks at the @var{path} to find -the profile feedback data files. See @option{-fprofile-dir}. +@item max-inline-recursive-depth +@itemx max-inline-recursive-depth-auto +Specifies the maximum recursion depth used for recursive inlining. -@item -fauto-profile -@itemx -fauto-profile=@var{path} -@opindex fauto-profile -Enable sampling-based feedback-directed optimizations, -and the following optimizations -which are generally profitable only with profile feedback available: -@option{-fbranch-probabilities}, @option{-fvpt}, -@option{-funroll-loops}, @option{-fpeel-loops}, @option{-ftracer}, -@option{-ftree-vectorize}, -@option{-finline-functions}, @option{-fipa-cp}, @option{-fipa-cp-clone}, -@option{-fpredictive-commoning}, @option{-funswitch-loops}, -@option{-fgcse-after-reload}, and @option{-ftree-loop-distribute-patterns}. +@option{--param max-inline-recursive-depth} applies to functions +declared inline. For functions not declared inline, recursive inlining +happens only when @option{-finline-functions} (included in @option{-O3}) is +enabled; @option{--param max-inline-recursive-depth-auto} applies instead. The +default value is 8. -@var{path} is the name of a file containing AutoFDO profile information. -If omitted, it defaults to @file{fbdata.afdo} in the current directory. +@item min-inline-recursive-probability +Recursive inlining is profitable only for function having deep recursion +in average and can hurt for function having little recursion depth by +increasing the prologue size or complexity of function body to other +optimizers. -Producing an AutoFDO profile data file requires running your program -with the @command{perf} utility on a supported GNU/Linux target system. -For more information, see @uref{https://perf.wiki.kernel.org/}. +When profile feedback is available (see @option{-fprofile-generate}) the actual +recursion depth can be guessed from probability that function recurses via a +given call expression. This parameter limits inlining only to call expressions +whose probability exceeds the given threshold (in percents). +The default value is 10. -E.g. -@smallexample -perf record -e br_inst_retired:near_taken -b -o perf.data \ - -- your_program -@end smallexample +@item early-inlining-insns +Specify growth that the early inliner can make. In effect it increases +the amount of inlining for code having a large abstraction penalty. +The default value is 14. -Then use the @command{create_gcov} tool to convert the raw profile data -to a format that can be used by GCC.@ You must also supply the -unstripped binary for your program to this tool. -See @uref{https://github.com/google/autofdo}. +@item max-early-inliner-iterations +Limit of iterations of the early inliner. This basically bounds +the number of nested indirect calls the early inliner can resolve. +Deeper chains are still handled by late inlining. -E.g. -@smallexample -create_gcov --binary=your_program.unstripped --profile=perf.data \ - --gcov=profile.afdo -@end smallexample -@end table +@item comdat-sharing-probability +Probability (in percent) that C++ inline function with comdat visibility +are shared across multiple compilation units. The default value is 20. -The following options control compiler behavior regarding floating-point -arithmetic. These options trade off between speed and -correctness. All must be specifically enabled. +@item profile-func-internal-id +A parameter to control whether to use function internal id in profile +database lookup. If the value is 0, the compiler uses an id that +is based on function assembler name and filename, which makes old profile +data more tolerant to source changes such as function reordering etc. +The default value is 0. -@table @gcctabopt -@item -ffloat-store -@opindex ffloat-store -Do not store floating-point variables in registers, and inhibit other -options that might change whether a floating-point value is taken from a -register or memory. +@item min-vect-loop-bound +The minimum number of iterations under which loops are not vectorized +when @option{-ftree-vectorize} is used. The number of iterations after +vectorization needs to be greater than the value specified by this option +to allow vectorization. The default value is 0. -@cindex floating-point precision -This option prevents undesirable excess precision on machines such as -the 68000 where the floating registers (of the 68881) keep more -precision than a @code{double} is supposed to have. Similarly for the -x86 architecture. For most programs, the excess precision does only -good, but a few programs rely on the precise definition of IEEE floating -point. Use @option{-ffloat-store} for such programs, after modifying -them to store all pertinent intermediate computations into variables. +@item gcse-cost-distance-ratio +Scaling factor in calculation of maximum distance an expression +can be moved by GCSE optimizations. This is currently supported only in the +code hoisting pass. The bigger the ratio, the more aggressive code hoisting +is with simple expressions, i.e., the expressions that have cost +less than @option{gcse-unrestricted-cost}. Specifying 0 disables +hoisting of simple expressions. The default value is 10. -@item -fexcess-precision=@var{style} -@opindex fexcess-precision -This option allows further control over excess precision on machines -where floating-point registers have more precision than the IEEE -@code{float} and @code{double} types and the processor does not -support operations rounding to those types. By default, -@option{-fexcess-precision=fast} is in effect; this means that -operations are carried out in the precision of the registers and that -it is unpredictable when rounding to the types specified in the source -code takes place. When compiling C, if -@option{-fexcess-precision=standard} is specified then excess -precision follows the rules specified in ISO C99; in particular, -both casts and assignments cause values to be rounded to their -semantic types (whereas @option{-ffloat-store} only affects -assignments). This option is enabled by default for C if a strict -conformance option such as @option{-std=c99} is used. +@item gcse-unrestricted-cost +Cost, roughly measured as the cost of a single typical machine +instruction, at which GCSE optimizations do not constrain +the distance an expression can travel. This is currently +supported only in the code hoisting pass. The lesser the cost, +the more aggressive code hoisting is. Specifying 0 +allows all expressions to travel unrestricted distances. +The default value is 3. -@opindex mfpmath -@option{-fexcess-precision=standard} is not implemented for languages -other than C, and has no effect if -@option{-funsafe-math-optimizations} or @option{-ffast-math} is -specified. On the x86, it also has no effect if @option{-mfpmath=sse} -or @option{-mfpmath=sse+387} is specified; in the former case, IEEE -semantics apply without excess precision, and in the latter, rounding -is unpredictable. +@item max-hoist-depth +The depth of search in the dominator tree for expressions to hoist. +This is used to avoid quadratic behavior in hoisting algorithm. +The value of 0 does not limit on the search, but may slow down compilation +of huge functions. The default value is 30. -@item -ffast-math -@opindex ffast-math -Sets the options @option{-fno-math-errno}, @option{-funsafe-math-optimizations}, -@option{-ffinite-math-only}, @option{-fno-rounding-math}, -@option{-fno-signaling-nans} and @option{-fcx-limited-range}. +@item max-tail-merge-comparisons +The maximum amount of similar bbs to compare a bb with. This is used to +avoid quadratic behavior in tree tail merging. The default value is 10. -This option causes the preprocessor macro @code{__FAST_MATH__} to be defined. +@item max-tail-merge-iterations +The maximum amount of iterations of the pass over the function. This is used to +limit compilation time in tree tail merging. The default value is 2. -This option is not turned on by any @option{-O} option besides -@option{-Ofast} since it can result in incorrect output for programs -that depend on an exact implementation of IEEE or ISO rules/specifications -for math functions. It may, however, yield faster code for programs -that do not require the guarantees of these specifications. +@item max-unrolled-insns +The maximum number of instructions that a loop may have to be unrolled. +If a loop is unrolled, this parameter also determines how many times +the loop code is unrolled. -@item -fno-math-errno -@opindex fno-math-errno -Do not set @code{errno} after calling math functions that are executed -with a single instruction, e.g., @code{sqrt}. A program that relies on -IEEE exceptions for math error handling may want to use this flag -for speed while maintaining IEEE arithmetic compatibility. +@item max-average-unrolled-insns +The maximum number of instructions biased by probabilities of their execution +that a loop may have to be unrolled. If a loop is unrolled, +this parameter also determines how many times the loop code is unrolled. -This option is not turned on by any @option{-O} option since -it can result in incorrect output for programs that depend on -an exact implementation of IEEE or ISO rules/specifications for -math functions. It may, however, yield faster code for programs -that do not require the guarantees of these specifications. +@item max-unroll-times +The maximum number of unrollings of a single loop. -The default is @option{-fmath-errno}. +@item max-peeled-insns +The maximum number of instructions that a loop may have to be peeled. +If a loop is peeled, this parameter also determines how many times +the loop code is peeled. -On Darwin systems, the math library never sets @code{errno}. There is -therefore no reason for the compiler to consider the possibility that -it might, and @option{-fno-math-errno} is the default. +@item max-peel-times +The maximum number of peelings of a single loop. -@item -funsafe-math-optimizations -@opindex funsafe-math-optimizations +@item max-peel-branches +The maximum number of branches on the hot path through the peeled sequence. -Allow optimizations for floating-point arithmetic that (a) assume -that arguments and results are valid and (b) may violate IEEE or -ANSI standards. When used at link-time, it may include libraries -or startup files that change the default FPU control word or other -similar optimizations. +@item max-completely-peeled-insns +The maximum number of insns of a completely peeled loop. -This option is not turned on by any @option{-O} option since -it can result in incorrect output for programs that depend on -an exact implementation of IEEE or ISO rules/specifications for -math functions. It may, however, yield faster code for programs -that do not require the guarantees of these specifications. -Enables @option{-fno-signed-zeros}, @option{-fno-trapping-math}, -@option{-fassociative-math} and @option{-freciprocal-math}. +@item max-completely-peel-times +The maximum number of iterations of a loop to be suitable for complete peeling. -The default is @option{-fno-unsafe-math-optimizations}. +@item max-completely-peel-loop-nest-depth +The maximum depth of a loop nest suitable for complete peeling. -@item -fassociative-math -@opindex fassociative-math +@item max-unswitch-insns +The maximum number of insns of an unswitched loop. -Allow re-association of operands in series of floating-point operations. -This violates the ISO C and C++ language standard by possibly changing -computation result. NOTE: re-ordering may change the sign of zero as -well as ignore NaNs and inhibit or create underflow or overflow (and -thus cannot be used on code that relies on rounding behavior like -@code{(x + 2**52) - 2**52}. May also reorder floating-point comparisons -and thus may not be used when ordered comparisons are required. -This option requires that both @option{-fno-signed-zeros} and -@option{-fno-trapping-math} be in effect. Moreover, it doesn't make -much sense with @option{-frounding-math}. For Fortran the option -is automatically enabled when both @option{-fno-signed-zeros} and -@option{-fno-trapping-math} are in effect. +@item max-unswitch-level +The maximum number of branches unswitched in a single loop. -The default is @option{-fno-associative-math}. +@item lim-expensive +The minimum cost of an expensive expression in the loop invariant motion. -@item -freciprocal-math -@opindex freciprocal-math +@item iv-consider-all-candidates-bound +Bound on number of candidates for induction variables, below which +all candidates are considered for each use in induction variable +optimizations. If there are more candidates than this, +only the most relevant ones are considered to avoid quadratic time complexity. -Allow the reciprocal of a value to be used instead of dividing by -the value if this enables optimizations. For example @code{x / y} -can be replaced with @code{x * (1/y)}, which is useful if @code{(1/y)} -is subject to common subexpression elimination. Note that this loses -precision and increases the number of flops operating on the value. +@item iv-max-considered-uses +The induction variable optimizations give up on loops that contain more +induction variable uses. -The default is @option{-fno-reciprocal-math}. +@item iv-always-prune-cand-set-bound +If the number of candidates in the set is smaller than this value, +always try to remove unnecessary ivs from the set +when adding a new one. -@item -ffinite-math-only -@opindex ffinite-math-only -Allow optimizations for floating-point arithmetic that assume -that arguments and results are not NaNs or +-Infs. +@item scev-max-expr-size +Bound on size of expressions used in the scalar evolutions analyzer. +Large expressions slow the analyzer. -This option is not turned on by any @option{-O} option since -it can result in incorrect output for programs that depend on -an exact implementation of IEEE or ISO rules/specifications for -math functions. It may, however, yield faster code for programs -that do not require the guarantees of these specifications. +@item scev-max-expr-complexity +Bound on the complexity of the expressions in the scalar evolutions analyzer. +Complex expressions slow the analyzer. -The default is @option{-fno-finite-math-only}. +@item vect-max-version-for-alignment-checks +The maximum number of run-time checks that can be performed when +doing loop versioning for alignment in the vectorizer. -@item -fno-signed-zeros -@opindex fno-signed-zeros -Allow optimizations for floating-point arithmetic that ignore the -signedness of zero. IEEE arithmetic specifies the behavior of -distinct +0.0 and @minus{}0.0 values, which then prohibits simplification -of expressions such as x+0.0 or 0.0*x (even with @option{-ffinite-math-only}). -This option implies that the sign of a zero result isn't significant. +@item vect-max-version-for-alias-checks +The maximum number of run-time checks that can be performed when +doing loop versioning for alias in the vectorizer. -The default is @option{-fsigned-zeros}. +@item vect-max-peeling-for-alignment +The maximum number of loop peels to enhance access alignment +for vectorizer. Value -1 means 'no limit'. -@item -fno-trapping-math -@opindex fno-trapping-math -Compile code assuming that floating-point operations cannot generate -user-visible traps. These traps include division by zero, overflow, -underflow, inexact result and invalid operation. This option requires -that @option{-fno-signaling-nans} be in effect. Setting this option may -allow faster code if one relies on ``non-stop'' IEEE arithmetic, for example. +@item max-iterations-to-track +The maximum number of iterations of a loop the brute-force algorithm +for analysis of the number of iterations of the loop tries to evaluate. -This option should never be turned on by any @option{-O} option since -it can result in incorrect output for programs that depend on -an exact implementation of IEEE or ISO rules/specifications for -math functions. +@item hot-bb-count-ws-permille +A basic block profile count is considered hot if it contributes to +the given permillage (i.e. 0...1000) of the entire profiled execution. -The default is @option{-ftrapping-math}. +@item hot-bb-frequency-fraction +Select fraction of the entry block frequency of executions of basic block in +function given basic block needs to have to be considered hot. -@item -frounding-math -@opindex frounding-math -Disable transformations and optimizations that assume default floating-point -rounding behavior. This is round-to-zero for all floating point -to integer conversions, and round-to-nearest for all other arithmetic -truncations. This option should be specified for programs that change -the FP rounding mode dynamically, or that may be executed with a -non-default rounding mode. This option disables constant folding of -floating-point expressions at compile time (which may be affected by -rounding mode) and arithmetic transformations that are unsafe in the -presence of sign-dependent rounding modes. +@item max-predicted-iterations +The maximum number of loop iterations we predict statically. This is useful +in cases where a function contains a single loop with known bound and +another loop with unknown bound. +The known number of iterations is predicted correctly, while +the unknown number of iterations average to roughly 10. This means that the +loop without bounds appears artificially cold relative to the other one. -The default is @option{-fno-rounding-math}. +@item builtin-expect-probability +Control the probability of the expression having the specified value. This +parameter takes a percentage (i.e. 0 ... 100) as input. +The default probability of 90 is obtained empirically. -This option is experimental and does not currently guarantee to -disable all GCC optimizations that are affected by rounding mode. -Future versions of GCC may provide finer control of this setting -using C99's @code{FENV_ACCESS} pragma. This command-line option -will be used to specify the default state for @code{FENV_ACCESS}. +@item align-threshold -@item -fsignaling-nans -@opindex fsignaling-nans -Compile code assuming that IEEE signaling NaNs may generate user-visible -traps during floating-point operations. Setting this option disables -optimizations that may change the number of exceptions visible with -signaling NaNs. This option implies @option{-ftrapping-math}. +Select fraction of the maximal frequency of executions of a basic block in +a function to align the basic block. -This option causes the preprocessor macro @code{__SUPPORT_SNAN__} to -be defined. +@item align-loop-iterations -The default is @option{-fno-signaling-nans}. +A loop expected to iterate at least the selected number of iterations is +aligned. -This option is experimental and does not currently guarantee to -disable all GCC optimizations that affect signaling NaN behavior. +@item tracer-dynamic-coverage +@itemx tracer-dynamic-coverage-feedback -@item -fsingle-precision-constant -@opindex fsingle-precision-constant -Treat floating-point constants as single precision instead of -implicitly converting them to double-precision constants. +This value is used to limit superblock formation once the given percentage of +executed instructions is covered. This limits unnecessary code size +expansion. -@item -fcx-limited-range -@opindex fcx-limited-range -When enabled, this option states that a range reduction step is not -needed when performing complex division. Also, there is no checking -whether the result of a complex multiplication or division is @code{NaN -+ I*NaN}, with an attempt to rescue the situation in that case. The -default is @option{-fno-cx-limited-range}, but is enabled by -@option{-ffast-math}. +The @option{tracer-dynamic-coverage-feedback} parameter +is used only when profile +feedback is available. The real profiles (as opposed to statically estimated +ones) are much less balanced allowing the threshold to be larger value. -This option controls the default setting of the ISO C99 -@code{CX_LIMITED_RANGE} pragma. Nevertheless, the option applies to -all languages. +@item tracer-max-code-growth +Stop tail duplication once code growth has reached given percentage. This is +a rather artificial limit, as most of the duplicates are eliminated later in +cross jumping, so it may be set to much higher values than is the desired code +growth. -@item -fcx-fortran-rules -@opindex fcx-fortran-rules -Complex multiplication and division follow Fortran rules. Range -reduction is done as part of complex division, but there is no checking -whether the result of a complex multiplication or division is @code{NaN -+ I*NaN}, with an attempt to rescue the situation in that case. +@item tracer-min-branch-ratio -The default is @option{-fno-cx-fortran-rules}. +Stop reverse growth when the reverse probability of best edge is less than this +threshold (in percent). -@end table +@item tracer-min-branch-ratio +@itemx tracer-min-branch-ratio-feedback -The following options control optimizations that may improve -performance, but are not enabled by any @option{-O} options. This -section includes experimental options that may produce broken code. +Stop forward growth if the best edge has probability lower than this +threshold. -@table @gcctabopt -@item -fbranch-probabilities -@opindex fbranch-probabilities -After running a program compiled with @option{-fprofile-arcs} -(@pxref{Debugging Options,, Options for Debugging Your Program or -@command{gcc}}), you can compile it a second time using -@option{-fbranch-probabilities}, to improve optimizations based on -the number of times each branch was taken. When a program -compiled with @option{-fprofile-arcs} exits, it saves arc execution -counts to a file called @file{@var{sourcename}.gcda} for each source -file. The information in this data file is very dependent on the -structure of the generated code, so you must use the same source code -and the same optimization options for both compilations. +Similarly to @option{tracer-dynamic-coverage} two values are present, one for +compilation for profile feedback and one for compilation without. The value +for compilation with profile feedback needs to be more conservative (higher) in +order to make tracer effective. -With @option{-fbranch-probabilities}, GCC puts a -@samp{REG_BR_PROB} note on each @samp{JUMP_INSN} and @samp{CALL_INSN}. -These can be used to improve optimization. Currently, they are only -used in one place: in @file{reorg.c}, instead of guessing which path a -branch is most likely to take, the @samp{REG_BR_PROB} values are used to -exactly determine which path is taken more often. +@item max-cse-path-length -@item -fprofile-values -@opindex fprofile-values -If combined with @option{-fprofile-arcs}, it adds code so that some -data about values of expressions in the program is gathered. +The maximum number of basic blocks on path that CSE considers. +The default is 10. -With @option{-fbranch-probabilities}, it reads back the data gathered -from profiling values of expressions for usage in optimizations. +@item max-cse-insns +The maximum number of instructions CSE processes before flushing. +The default is 1000. -Enabled with @option{-fprofile-generate} and @option{-fprofile-use}. +@item ggc-min-expand -@item -fprofile-reorder-functions -@opindex fprofile-reorder-functions -Function reordering based on profile instrumentation collects -first time of execution of a function and orders these functions -in ascending order. +GCC uses a garbage collector to manage its own memory allocation. This +parameter specifies the minimum percentage by which the garbage +collector's heap should be allowed to expand between collections. +Tuning this may improve compilation speed; it has no effect on code +generation. -Enabled with @option{-fprofile-use}. +The default is 30% + 70% * (RAM/1GB) with an upper bound of 100% when +RAM >= 1GB@. If @code{getrlimit} is available, the notion of ``RAM'' is +the smallest of actual RAM and @code{RLIMIT_DATA} or @code{RLIMIT_AS}. If +GCC is not able to calculate RAM on a particular platform, the lower +bound of 30% is used. Setting this parameter and +@option{ggc-min-heapsize} to zero causes a full collection to occur at +every opportunity. This is extremely slow, but can be useful for +debugging. -@item -fvpt -@opindex fvpt -If combined with @option{-fprofile-arcs}, this option instructs the compiler -to add code to gather information about values of expressions. +@item ggc-min-heapsize -With @option{-fbranch-probabilities}, it reads back the data gathered -and actually performs the optimizations based on them. -Currently the optimizations include specialization of division operations -using the knowledge about the value of the denominator. +Minimum size of the garbage collector's heap before it begins bothering +to collect garbage. The first collection occurs after the heap expands +by @option{ggc-min-expand}% beyond @option{ggc-min-heapsize}. Again, +tuning this may improve compilation speed, and has no effect on code +generation. -@item -frename-registers -@opindex frename-registers -Attempt to avoid false dependencies in scheduled code by making use -of registers left over after register allocation. This optimization -most benefits processors with lots of registers. Depending on the -debug information format adopted by the target, however, it can -make debugging impossible, since variables no longer stay in -a ``home register''. +The default is the smaller of RAM/8, RLIMIT_RSS, or a limit that +tries to ensure that RLIMIT_DATA or RLIMIT_AS are not exceeded, but +with a lower bound of 4096 (four megabytes) and an upper bound of +131072 (128 megabytes). If GCC is not able to calculate RAM on a +particular platform, the lower bound is used. Setting this parameter +very large effectively disables garbage collection. Setting this +parameter and @option{ggc-min-expand} to zero causes a full collection +to occur at every opportunity. -Enabled by default with @option{-funroll-loops} and @option{-fpeel-loops}. +@item max-reload-search-insns +The maximum number of instruction reload should look backward for equivalent +register. Increasing values mean more aggressive optimization, making the +compilation time increase with probably slightly better performance. +The default value is 100. -@item -fschedule-fusion -@opindex fschedule-fusion -Performs a target dependent pass over the instruction stream to schedule -instructions of same type together because target machine can execute them -more efficiently if they are adjacent to each other in the instruction flow. +@item max-cselib-memory-locations +The maximum number of memory locations cselib should take into account. +Increasing values mean more aggressive optimization, making the compilation time +increase with probably slightly better performance. The default value is 500. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +@item reorder-blocks-duplicate +@itemx reorder-blocks-duplicate-feedback + +Used by the basic block reordering pass to decide whether to use unconditional +branch or duplicate the code on its destination. Code is duplicated when its +estimated size is smaller than this value multiplied by the estimated size of +unconditional jump in the hot spots of the program. -@item -ftracer -@opindex ftracer -Perform tail duplication to enlarge superblock size. This transformation -simplifies the control flow of the function allowing other optimizations to do -a better job. +The @option{reorder-block-duplicate-feedback} parameter +is used only when profile +feedback is available. It may be set to higher values than +@option{reorder-block-duplicate} since information about the hot spots is more +accurate. -Enabled with @option{-fprofile-use}. +@item max-sched-ready-insns +The maximum number of instructions ready to be issued the scheduler should +consider at any given time during the first scheduling pass. Increasing +values mean more thorough searches, making the compilation time increase +with probably little benefit. The default value is 100. -@item -funroll-loops -@opindex funroll-loops -Unroll loops whose number of iterations can be determined at compile time or -upon entry to the loop. @option{-funroll-loops} implies -@option{-frerun-cse-after-loop}, @option{-fweb} and @option{-frename-registers}. -It also turns on complete loop peeling (i.e.@: complete removal of loops with -a small constant number of iterations). This option makes code larger, and may -or may not make it run faster. +@item max-sched-region-blocks +The maximum number of blocks in a region to be considered for +interblock scheduling. The default value is 10. -Enabled with @option{-fprofile-use}. +@item max-pipeline-region-blocks +The maximum number of blocks in a region to be considered for +pipelining in the selective scheduler. The default value is 15. -@item -funroll-all-loops -@opindex funroll-all-loops -Unroll all loops, even if their number of iterations is uncertain when -the loop is entered. This usually makes programs run more slowly. -@option{-funroll-all-loops} implies the same options as -@option{-funroll-loops}. +@item max-sched-region-insns +The maximum number of insns in a region to be considered for +interblock scheduling. The default value is 100. -@item -fpeel-loops -@opindex fpeel-loops -Peels loops for which there is enough information that they do not -roll much (from profile feedback). It also turns on complete loop peeling -(i.e.@: complete removal of loops with small constant number of iterations). +@item max-pipeline-region-insns +The maximum number of insns in a region to be considered for +pipelining in the selective scheduler. The default value is 200. -Enabled with @option{-fprofile-use}. +@item min-spec-prob +The minimum probability (in percents) of reaching a source block +for interblock speculative scheduling. The default value is 40. -@item -fmove-loop-invariants -@opindex fmove-loop-invariants -Enables the loop invariant motion pass in the RTL loop optimizer. Enabled -at level @option{-O1} +@item max-sched-extend-regions-iters +The maximum number of iterations through CFG to extend regions. +A value of 0 (the default) disables region extensions. -@item -funswitch-loops -@opindex funswitch-loops -Move branches with loop invariant conditions out of the loop, with duplicates -of the loop on both branches (modified according to result of the condition). +@item max-sched-insn-conflict-delay +The maximum conflict delay for an insn to be considered for speculative motion. +The default value is 3. -@item -ffunction-sections -@itemx -fdata-sections -@opindex ffunction-sections -@opindex fdata-sections -Place each function or data item into its own section in the output -file if the target supports arbitrary sections. The name of the -function or the name of the data item determines the section's name -in the output file. +@item sched-spec-prob-cutoff +The minimal probability of speculation success (in percents), so that +speculative insns are scheduled. +The default value is 40. -Use these options on systems where the linker can perform optimizations -to improve locality of reference in the instruction space. Most systems -using the ELF object format and SPARC processors running Solaris 2 have -linkers with such optimizations. AIX may have these optimizations in -the future. +@item sched-spec-state-edge-prob-cutoff +The minimum probability an edge must have for the scheduler to save its +state across it. +The default value is 10. -Only use these options when there are significant benefits from doing -so. When you specify these options, the assembler and linker -create larger object and executable files and are also slower. -You cannot use @command{gprof} on all systems if you -specify this option, and you may have problems with debugging if -you specify both this option and @option{-g}. +@item sched-mem-true-dep-cost +Minimal distance (in CPU cycles) between store and load targeting same +memory locations. The default value is 1. -@item -fbranch-target-load-optimize -@opindex fbranch-target-load-optimize -Perform branch target register load optimization before prologue / epilogue -threading. -The use of target registers can typically be exposed only during reload, -thus hoisting loads out of loops and doing inter-block scheduling needs -a separate optimization pass. +@item selsched-max-lookahead +The maximum size of the lookahead window of selective scheduling. It is a +depth of search for available instructions. +The default value is 50. -@item -fbranch-target-load-optimize2 -@opindex fbranch-target-load-optimize2 -Perform branch target register load optimization after prologue / epilogue -threading. +@item selsched-max-sched-times +The maximum number of times that an instruction is scheduled during +selective scheduling. This is the limit on the number of iterations +through which the instruction may be pipelined. The default value is 2. -@item -fbtr-bb-exclusive -@opindex fbtr-bb-exclusive -When performing branch target register load optimization, don't reuse -branch target registers within any basic block. +@item selsched-max-insns-to-rename +The maximum number of best instructions in the ready list that are considered +for renaming in the selective scheduler. The default value is 2. -@item -fstack-protector -@opindex fstack-protector -Emit extra code to check for buffer overflows, such as stack smashing -attacks. This is done by adding a guard variable to functions with -vulnerable objects. This includes functions that call @code{alloca}, and -functions with buffers larger than 8 bytes. The guards are initialized -when a function is entered and then checked when the function exits. -If a guard check fails, an error message is printed and the program exits. +@item sms-min-sc +The minimum value of stage count that swing modulo scheduler +generates. The default value is 2. -@item -fstack-protector-all -@opindex fstack-protector-all -Like @option{-fstack-protector} except that all functions are protected. +@item max-last-value-rtl +The maximum size measured as number of RTLs that can be recorded in an expression +in combiner for a pseudo register as last known value of that register. The default +is 10000. -@item -fstack-protector-strong -@opindex fstack-protector-strong -Like @option{-fstack-protector} but includes additional functions to -be protected --- those that have local array definitions, or have -references to local frame addresses. +@item max-combine-insns +The maximum number of instructions the RTL combiner tries to combine. +The default value is 2 at @option{-Og} and 4 otherwise. -@item -fstack-protector-explicit -@opindex fstack-protector-explicit -Like @option{-fstack-protector} but only protects those functions which -have the @code{stack_protect} attribute. +@item integer-share-limit +Small integer constants can use a shared data structure, reducing the +compiler's memory usage and increasing its speed. This sets the maximum +value of a shared integer constant. The default value is 256. -@item -fstdarg-opt -@opindex fstdarg-opt -Optimize the prologue of variadic argument functions with respect to usage of -those arguments. +@item ssp-buffer-size +The minimum size of buffers (i.e.@: arrays) that receive stack smashing +protection when @option{-fstack-protection} is used. -@item -fsection-anchors -@opindex fsection-anchors -Try to reduce the number of symbolic address calculations by using -shared ``anchor'' symbols to address nearby objects. This transformation -can help to reduce the number of GOT entries and GOT accesses on some -targets. +@item min-size-for-stack-sharing +The minimum size of variables taking part in stack slot sharing when not +optimizing. The default value is 32. -For example, the implementation of the following function @code{foo}: +@item max-jump-thread-duplication-stmts +Maximum number of statements allowed in a block that needs to be +duplicated when threading jumps. -@smallexample -static int a, b, c; -int foo (void) @{ return a + b + c; @} -@end smallexample +@item max-fields-for-field-sensitive +Maximum number of fields in a structure treated in +a field sensitive manner during pointer analysis. The default is zero +for @option{-O0} and @option{-O1}, +and 100 for @option{-Os}, @option{-O2}, and @option{-O3}. -@noindent -usually calculates the addresses of all three variables, but if you -compile it with @option{-fsection-anchors}, it accesses the variables -from a common anchor point instead. The effect is similar to the -following pseudocode (which isn't valid C): +@item prefetch-latency +Estimate on average number of instructions that are executed before +prefetch finishes. The distance prefetched ahead is proportional +to this constant. Increasing this number may also lead to less +streams being prefetched (see @option{simultaneous-prefetches}). -@smallexample -int foo (void) -@{ - register int *xr = &x; - return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; -@} -@end smallexample +@item simultaneous-prefetches +Maximum number of prefetches that can run at the same time. -Not all targets support this option. +@item l1-cache-line-size +The size of cache line in L1 cache, in bytes. -@item --param @var{name}=@var{value} -@opindex param -In some places, GCC uses various constants to control the amount of -optimization that is done. For example, GCC does not inline functions -that contain more than a certain number of instructions. You can -control some of these constants on the command line using the -@option{--param} option. +@item l1-cache-size +The size of L1 cache, in kilobytes. -The names of specific parameters, and the meaning of the values, are -tied to the internals of the compiler, and are subject to change -without notice in future releases. +@item l2-cache-size +The size of L2 cache, in kilobytes. -In each case, the @var{value} is an integer. The allowable choices for -@var{name} are: +@item min-insn-to-prefetch-ratio +The minimum ratio between the number of instructions and the +number of prefetches to enable prefetching in a loop. -@table @gcctabopt -@item predictable-branch-outcome -When branch is predicted to be taken with probability lower than this threshold -(in percent), then it is considered well predictable. The default is 10. +@item prefetch-min-insn-to-mem-ratio +The minimum ratio between the number of instructions and the +number of memory references to enable prefetching in a loop. -@item max-rtl-if-conversion-insns -RTL if-conversion tries to remove conditional branches around a block and -replace them with conditionally executed instructions. This parameter -gives the maximum number of instructions in a block which should be -considered for if-conversion. The default is 10, though the compiler will -also use other heuristics to decide whether if-conversion is likely to be -profitable. +@item use-canonical-types +Whether the compiler should use the ``canonical'' type system. By +default, this should always be 1, which uses a more efficient internal +mechanism for comparing types in C++ and Objective-C++. However, if +bugs in the canonical type system are causing compilation failures, +set this value to 0 to disable canonical types. -@item max-crossjump-edges -The maximum number of incoming edges to consider for cross-jumping. -The algorithm used by @option{-fcrossjumping} is @math{O(N^2)} in -the number of edges incoming to each block. Increasing values mean -more aggressive optimization, making the compilation time increase with -probably small improvement in executable size. +@item switch-conversion-max-branch-ratio +Switch initialization conversion refuses to create arrays that are +bigger than @option{switch-conversion-max-branch-ratio} times the number of +branches in the switch. -@item min-crossjump-insns -The minimum number of instructions that must be matched at the end -of two blocks before cross-jumping is performed on them. This -value is ignored in the case where all instructions in the block being -cross-jumped from are matched. The default value is 5. +@item max-partial-antic-length +Maximum length of the partial antic set computed during the tree +partial redundancy elimination optimization (@option{-ftree-pre}) when +optimizing at @option{-O3} and above. For some sorts of source code +the enhanced partial redundancy elimination optimization can run away, +consuming all of the memory available on the host machine. This +parameter sets a limit on the length of the sets that are computed, +which prevents the runaway behavior. Setting a value of 0 for +this parameter allows an unlimited set length. -@item max-grow-copy-bb-insns -The maximum code size expansion factor when copying basic blocks -instead of jumping. The expansion is relative to a jump instruction. -The default value is 8. +@item sccvn-max-scc-size +Maximum size of a strongly connected component (SCC) during SCCVN +processing. If this limit is hit, SCCVN processing for the whole +function is not done and optimizations depending on it are +disabled. The default maximum SCC size is 10000. -@item max-goto-duplication-insns -The maximum number of instructions to duplicate to a block that jumps -to a computed goto. To avoid @math{O(N^2)} behavior in a number of -passes, GCC factors computed gotos early in the compilation process, -and unfactors them as late as possible. Only computed jumps at the -end of a basic blocks with no more than max-goto-duplication-insns are -unfactored. The default value is 8. +@item sccvn-max-alias-queries-per-access +Maximum number of alias-oracle queries we perform when looking for +redundancies for loads and stores. If this limit is hit the search +is aborted and the load or store is not considered redundant. The +number of queries is algorithmically limited to the number of +stores on all paths from the load to the function entry. +The default maxmimum number of queries is 1000. -@item max-delay-slot-insn-search -The maximum number of instructions to consider when looking for an -instruction to fill a delay slot. If more than this arbitrary number of -instructions are searched, the time savings from filling the delay slot -are minimal, so stop searching. Increasing values mean more -aggressive optimization, making the compilation time increase with probably -small improvement in execution time. +@item ira-max-loops-num +IRA uses regional register allocation by default. If a function +contains more loops than the number given by this parameter, only at most +the given number of the most frequently-executed loops form regions +for regional register allocation. The default value of the +parameter is 100. -@item max-delay-slot-live-search -When trying to fill delay slots, the maximum number of instructions to -consider when searching for a block with valid live register -information. Increasing this arbitrarily chosen value means more -aggressive optimization, increasing the compilation time. This parameter -should be removed when the delay slot code is rewritten to maintain the -control-flow graph. +@item ira-max-conflict-table-size +Although IRA uses a sophisticated algorithm to compress the conflict +table, the table can still require excessive amounts of memory for +huge functions. If the conflict table for a function could be more +than the size in MB given by this parameter, the register allocator +instead uses a faster, simpler, and lower-quality +algorithm that does not require building a pseudo-register conflict table. +The default value of the parameter is 2000. -@item max-gcse-memory -The approximate maximum amount of memory that can be allocated in -order to perform the global common subexpression elimination -optimization. If more memory than specified is required, the -optimization is not done. +@item ira-loop-reserved-regs +IRA can be used to evaluate more accurate register pressure in loops +for decisions to move loop invariants (see @option{-O3}). The number +of available registers reserved for some other purposes is given +by this parameter. The default value of the parameter is 2, which is +the minimal number of registers needed by typical instructions. +This value is the best found from numerous experiments. -@item max-gcse-insertion-ratio -If the ratio of expression insertions to deletions is larger than this value -for any expression, then RTL PRE inserts or removes the expression and thus -leaves partially redundant computations in the instruction stream. The default value is 20. +@item lra-inheritance-ebb-probability-cutoff +LRA tries to reuse values reloaded in registers in subsequent insns. +This optimization is called inheritance. EBB is used as a region to +do this optimization. The parameter defines a minimal fall-through +edge probability in percentage used to add BB to inheritance EBB in +LRA. The default value of the parameter is 40. The value was chosen +from numerous runs of SPEC2000 on x86-64. -@item max-pending-list-length -The maximum number of pending dependencies scheduling allows -before flushing the current state and starting over. Large functions -with few branches or calls can create excessively large lists which -needlessly consume memory and resources. +@item loop-invariant-max-bbs-in-loop +Loop invariant motion can be very expensive, both in compilation time and +in amount of needed compile-time memory, with very large loops. Loops +with more basic blocks than this parameter won't have loop invariant +motion optimization performed on them. The default value of the +parameter is 1000 for @option{-O1} and 10000 for @option{-O2} and above. -@item max-modulo-backtrack-attempts -The maximum number of backtrack attempts the scheduler should make -when modulo scheduling a loop. Larger values can exponentially increase -compilation time. +@item loop-max-datarefs-for-datadeps +Building data dapendencies is expensive for very large loops. This +parameter limits the number of data references in loops that are +considered for data dependence analysis. These large loops are no +handled by the optimizations using loop data dependencies. +The default value is 1000. -@item max-inline-insns-single -Several parameters control the tree inliner used in GCC@. -This number sets the maximum number of instructions (counted in GCC's -internal representation) in a single function that the tree inliner -considers for inlining. This only affects functions declared -inline and methods implemented in a class declaration (C++). -The default value is 400. +@item max-vartrack-size +Sets a maximum number of hash table slots to use during variable +tracking dataflow analysis of any function. If this limit is exceeded +with variable tracking at assignments enabled, analysis for that +function is retried without it, after removing all debug insns from +the function. If the limit is exceeded even without debug insns, var +tracking analysis is completely disabled for the function. Setting +the parameter to zero makes it unlimited. -@item max-inline-insns-auto -When you use @option{-finline-functions} (included in @option{-O3}), -a lot of functions that would otherwise not be considered for inlining -by the compiler are investigated. To those functions, a different -(more restrictive) limit compared to functions declared inline can -be applied. -The default value is 40. +@item max-vartrack-expr-depth +Sets a maximum number of recursion levels when attempting to map +variable names or debug temporaries to value expressions. This trades +compilation time for more complete debug information. If this is set too +low, value expressions that are available and could be represented in +debug information may end up not being used; setting this higher may +enable the compiler to find more complex debug expressions, but compile +time and memory use may grow. The default is 12. -@item inline-min-speedup -When estimated performance improvement of caller + callee runtime exceeds this -threshold (in precent), the function can be inlined regardless the limit on -@option{--param max-inline-insns-single} and @option{--param -max-inline-insns-auto}. +@item min-nondebug-insn-uid +Use uids starting at this parameter for nondebug insns. The range below +the parameter is reserved exclusively for debug insns created by +@option{-fvar-tracking-assignments}, but debug insns may get +(non-overlapping) uids above it if the reserved range is exhausted. -@item large-function-insns -The limit specifying really large functions. For functions larger than this -limit after inlining, inlining is constrained by -@option{--param large-function-growth}. This parameter is useful primarily -to avoid extreme compilation time caused by non-linear algorithms used by the -back end. -The default value is 2700. +@item ipa-sra-ptr-growth-factor +IPA-SRA replaces a pointer to an aggregate with one or more new +parameters only when their cumulative size is less or equal to +@option{ipa-sra-ptr-growth-factor} times the size of the original +pointer parameter. -@item large-function-growth -Specifies maximal growth of large function caused by inlining in percents. -The default value is 100 which limits large function growth to 2.0 times -the original size. +@item sra-max-scalarization-size-Ospeed +@item sra-max-scalarization-size-Osize +The two Scalar Reduction of Aggregates passes (SRA and IPA-SRA) aim to +replace scalar parts of aggregates with uses of independent scalar +variables. These parameters control the maximum size, in storage units, +of aggregate which is considered for replacement when compiling for +speed +(@option{sra-max-scalarization-size-Ospeed}) or size +(@option{sra-max-scalarization-size-Osize}) respectively. -@item large-unit-insns -The limit specifying large translation unit. Growth caused by inlining of -units larger than this limit is limited by @option{--param inline-unit-growth}. -For small units this might be too tight. -For example, consider a unit consisting of function A -that is inline and B that just calls A three times. If B is small relative to -A, the growth of unit is 300\% and yet such inlining is very sane. For very -large units consisting of small inlineable functions, however, the overall unit -growth limit is needed to avoid exponential explosion of code size. Thus for -smaller units, the size is increased to @option{--param large-unit-insns} -before applying @option{--param inline-unit-growth}. The default is 10000. +@item tm-max-aggregate-size +When making copies of thread-local variables in a transaction, this +parameter specifies the size in bytes after which variables are +saved with the logging functions as opposed to save/restore code +sequence pairs. This option only applies when using +@option{-fgnu-tm}. -@item inline-unit-growth -Specifies maximal overall growth of the compilation unit caused by inlining. -The default value is 20 which limits unit growth to 1.2 times the original -size. Cold functions (either marked cold via an attribute or by profile -feedback) are not accounted into the unit size. +@item graphite-max-nb-scop-params +To avoid exponential effects in the Graphite loop transforms, the +number of parameters in a Static Control Part (SCoP) is bounded. The +default value is 10 parameters. A variable whose value is unknown at +compilation time and defined outside a SCoP is a parameter of the SCoP. -@item ipcp-unit-growth -Specifies maximal overall growth of the compilation unit caused by -interprocedural constant propagation. The default value is 10 which limits -unit growth to 1.1 times the original size. +@item graphite-max-bbs-per-function +To avoid exponential effects in the detection of SCoPs, the size of +the functions analyzed by Graphite is bounded. The default value is +100 basic blocks. -@item large-stack-frame -The limit specifying large stack frames. While inlining the algorithm is trying -to not grow past this limit too much. The default value is 256 bytes. +@item loop-block-tile-size +Loop blocking or strip mining transforms, enabled with +@option{-floop-block} or @option{-floop-strip-mine}, strip mine each +loop in the loop nest by a given number of iterations. The strip +length can be changed using the @option{loop-block-tile-size} +parameter. The default value is 51 iterations. -@item large-stack-frame-growth -Specifies maximal growth of large stack frames caused by inlining in percents. -The default value is 1000 which limits large stack frame growth to 11 times -the original size. +@item loop-unroll-jam-size +Specify the unroll factor for the @option{-floop-unroll-and-jam} option. The +default value is 4. -@item max-inline-insns-recursive -@itemx max-inline-insns-recursive-auto -Specifies the maximum number of instructions an out-of-line copy of a -self-recursive inline -function can grow into by performing recursive inlining. +@item loop-unroll-jam-depth +Specify the dimension to be unrolled (counting from the most inner loop) +for the @option{-floop-unroll-and-jam}. The default value is 2. -@option{--param max-inline-insns-recursive} applies to functions -declared inline. -For functions not declared inline, recursive inlining -happens only when @option{-finline-functions} (included in @option{-O3}) is -enabled; @option{--param max-inline-insns-recursive-auto} applies instead. The -default value is 450. +@item ipa-cp-value-list-size +IPA-CP attempts to track all possible values and types passed to a function's +parameter in order to propagate them and perform devirtualization. +@option{ipa-cp-value-list-size} is the maximum number of values and types it +stores per one formal parameter of a function. -@item max-inline-recursive-depth -@itemx max-inline-recursive-depth-auto -Specifies the maximum recursion depth used for recursive inlining. +@item ipa-cp-eval-threshold +IPA-CP calculates its own score of cloning profitability heuristics +and performs those cloning opportunities with scores that exceed +@option{ipa-cp-eval-threshold}. + +@item ipa-cp-recursion-penalty +Percentage penalty the recursive functions will receive when they +are evaluated for cloning. -@option{--param max-inline-recursive-depth} applies to functions -declared inline. For functions not declared inline, recursive inlining -happens only when @option{-finline-functions} (included in @option{-O3}) is -enabled; @option{--param max-inline-recursive-depth-auto} applies instead. The -default value is 8. +@item ipa-cp-single-call-penalty +Percentage penalty functions containg a single call to another +function will receive when they are evaluated for cloning. -@item min-inline-recursive-probability -Recursive inlining is profitable only for function having deep recursion -in average and can hurt for function having little recursion depth by -increasing the prologue size or complexity of function body to other -optimizers. -When profile feedback is available (see @option{-fprofile-generate}) the actual -recursion depth can be guessed from probability that function recurses via a -given call expression. This parameter limits inlining only to call expressions -whose probability exceeds the given threshold (in percents). -The default value is 10. +@item ipa-max-agg-items +IPA-CP is also capable to propagate a number of scalar values passed +in an aggregate. @option{ipa-max-agg-items} controls the maximum +number of such values per one parameter. -@item early-inlining-insns -Specify growth that the early inliner can make. In effect it increases -the amount of inlining for code having a large abstraction penalty. -The default value is 14. +@item ipa-cp-loop-hint-bonus +When IPA-CP determines that a cloning candidate would make the number +of iterations of a loop known, it adds a bonus of +@option{ipa-cp-loop-hint-bonus} to the profitability score of +the candidate. -@item max-early-inliner-iterations -Limit of iterations of the early inliner. This basically bounds -the number of nested indirect calls the early inliner can resolve. -Deeper chains are still handled by late inlining. +@item ipa-cp-array-index-hint-bonus +When IPA-CP determines that a cloning candidate would make the index of +an array access known, it adds a bonus of +@option{ipa-cp-array-index-hint-bonus} to the profitability +score of the candidate. -@item comdat-sharing-probability -Probability (in percent) that C++ inline function with comdat visibility -are shared across multiple compilation units. The default value is 20. +@item ipa-max-aa-steps +During its analysis of function bodies, IPA-CP employs alias analysis +in order to track values pointed to by function parameters. In order +not spend too much time analyzing huge functions, it gives up and +consider all memory clobbered after examining +@option{ipa-max-aa-steps} statements modifying memory. -@item profile-func-internal-id -A parameter to control whether to use function internal id in profile -database lookup. If the value is 0, the compiler uses an id that -is based on function assembler name and filename, which makes old profile -data more tolerant to source changes such as function reordering etc. -The default value is 0. +@item lto-partitions +Specify desired number of partitions produced during WHOPR compilation. +The number of partitions should exceed the number of CPUs used for compilation. +The default value is 32. -@item min-vect-loop-bound -The minimum number of iterations under which loops are not vectorized -when @option{-ftree-vectorize} is used. The number of iterations after -vectorization needs to be greater than the value specified by this option -to allow vectorization. The default value is 0. +@item lto-minpartition +Size of minimal partition for WHOPR (in estimated instructions). +This prevents expenses of splitting very small programs into too many +partitions. -@item gcse-cost-distance-ratio -Scaling factor in calculation of maximum distance an expression -can be moved by GCSE optimizations. This is currently supported only in the -code hoisting pass. The bigger the ratio, the more aggressive code hoisting -is with simple expressions, i.e., the expressions that have cost -less than @option{gcse-unrestricted-cost}. Specifying 0 disables -hoisting of simple expressions. The default value is 10. +@item cxx-max-namespaces-for-diagnostic-help +The maximum number of namespaces to consult for suggestions when C++ +name lookup fails for an identifier. The default is 1000. -@item gcse-unrestricted-cost -Cost, roughly measured as the cost of a single typical machine -instruction, at which GCSE optimizations do not constrain -the distance an expression can travel. This is currently -supported only in the code hoisting pass. The lesser the cost, -the more aggressive code hoisting is. Specifying 0 -allows all expressions to travel unrestricted distances. -The default value is 3. +@item sink-frequency-threshold +The maximum relative execution frequency (in percents) of the target block +relative to a statement's original block to allow statement sinking of a +statement. Larger numbers result in more aggressive statement sinking. +The default value is 75. A small positive adjustment is applied for +statements with memory operands as those are even more profitable so sink. -@item max-hoist-depth -The depth of search in the dominator tree for expressions to hoist. -This is used to avoid quadratic behavior in hoisting algorithm. -The value of 0 does not limit on the search, but may slow down compilation -of huge functions. The default value is 30. +@item max-stores-to-sink +The maximum number of conditional stores paires that can be sunk. Set to 0 +if either vectorization (@option{-ftree-vectorize}) or if-conversion +(@option{-ftree-loop-if-convert}) is disabled. The default is 2. -@item max-tail-merge-comparisons -The maximum amount of similar bbs to compare a bb with. This is used to -avoid quadratic behavior in tree tail merging. The default value is 10. +@item allow-store-data-races +Allow optimizers to introduce new data races on stores. +Set to 1 to allow, otherwise to 0. This option is enabled by default +at optimization level @option{-Ofast}. -@item max-tail-merge-iterations -The maximum amount of iterations of the pass over the function. This is used to -limit compilation time in tree tail merging. The default value is 2. +@item case-values-threshold +The smallest number of different values for which it is best to use a +jump-table instead of a tree of conditional branches. If the value is +0, use the default for the machine. The default is 0. -@item max-unrolled-insns -The maximum number of instructions that a loop may have to be unrolled. -If a loop is unrolled, this parameter also determines how many times -the loop code is unrolled. +@item tree-reassoc-width +Set the maximum number of instructions executed in parallel in +reassociated tree. This parameter overrides target dependent +heuristics used by default if has non zero value. -@item max-average-unrolled-insns -The maximum number of instructions biased by probabilities of their execution -that a loop may have to be unrolled. If a loop is unrolled, -this parameter also determines how many times the loop code is unrolled. +@item sched-pressure-algorithm +Choose between the two available implementations of +@option{-fsched-pressure}. Algorithm 1 is the original implementation +and is the more likely to prevent instructions from being reordered. +Algorithm 2 was designed to be a compromise between the relatively +conservative approach taken by algorithm 1 and the rather aggressive +approach taken by the default scheduler. It relies more heavily on +having a regular register file and accurate register pressure classes. +See @file{haifa-sched.c} in the GCC sources for more details. -@item max-unroll-times -The maximum number of unrollings of a single loop. +The default choice depends on the target. -@item max-peeled-insns -The maximum number of instructions that a loop may have to be peeled. -If a loop is peeled, this parameter also determines how many times -the loop code is peeled. +@item max-slsr-cand-scan +Set the maximum number of existing candidates that are considered when +seeking a basis for a new straight-line strength reduction candidate. -@item max-peel-times -The maximum number of peelings of a single loop. +@item asan-globals +Enable buffer overflow detection for global objects. This kind +of protection is enabled by default if you are using +@option{-fsanitize=address} option. +To disable global objects protection use @option{--param asan-globals=0}. -@item max-peel-branches -The maximum number of branches on the hot path through the peeled sequence. +@item asan-stack +Enable buffer overflow detection for stack objects. This kind of +protection is enabled by default when using @option{-fsanitize=address}. +To disable stack protection use @option{--param asan-stack=0} option. -@item max-completely-peeled-insns -The maximum number of insns of a completely peeled loop. +@item asan-instrument-reads +Enable buffer overflow detection for memory reads. This kind of +protection is enabled by default when using @option{-fsanitize=address}. +To disable memory reads protection use +@option{--param asan-instrument-reads=0}. -@item max-completely-peel-times -The maximum number of iterations of a loop to be suitable for complete peeling. +@item asan-instrument-writes +Enable buffer overflow detection for memory writes. This kind of +protection is enabled by default when using @option{-fsanitize=address}. +To disable memory writes protection use +@option{--param asan-instrument-writes=0} option. -@item max-completely-peel-loop-nest-depth -The maximum depth of a loop nest suitable for complete peeling. +@item asan-memintrin +Enable detection for built-in functions. This kind of protection +is enabled by default when using @option{-fsanitize=address}. +To disable built-in functions protection use +@option{--param asan-memintrin=0}. -@item max-unswitch-insns -The maximum number of insns of an unswitched loop. +@item asan-use-after-return +Enable detection of use-after-return. This kind of protection +is enabled by default when using @option{-fsanitize=address} option. +To disable use-after-return detection use +@option{--param asan-use-after-return=0}. -@item max-unswitch-level -The maximum number of branches unswitched in a single loop. +@item asan-instrumentation-with-call-threshold +If number of memory accesses in function being instrumented +is greater or equal to this number, use callbacks instead of inline checks. +E.g. to disable inline code use +@option{--param asan-instrumentation-with-call-threshold=0}. -@item lim-expensive -The minimum cost of an expensive expression in the loop invariant motion. +@item chkp-max-ctor-size +Static constructors generated by Pointer Bounds Checker may become very +large and significantly increase compile time at optimization level +@option{-O1} and higher. This parameter is a maximum nubmer of statements +in a single generated constructor. Default value is 5000. -@item iv-consider-all-candidates-bound -Bound on number of candidates for induction variables, below which -all candidates are considered for each use in induction variable -optimizations. If there are more candidates than this, -only the most relevant ones are considered to avoid quadratic time complexity. +@item max-fsm-thread-path-insns +Maximum number of instructions to copy when duplicating blocks on a +finite state automaton jump thread path. The default is 100. -@item iv-max-considered-uses -The induction variable optimizations give up on loops that contain more -induction variable uses. +@item max-fsm-thread-length +Maximum number of basic blocks on a finite state automaton jump thread +path. The default is 10. -@item iv-always-prune-cand-set-bound -If the number of candidates in the set is smaller than this value, -always try to remove unnecessary ivs from the set -when adding a new one. +@item max-fsm-thread-paths +Maximum number of new jump thread paths to create for a finite state +automaton. The default is 50. -@item scev-max-expr-size -Bound on size of expressions used in the scalar evolutions analyzer. -Large expressions slow the analyzer. +@item parloops-chunk-size +Chunk size of omp schedule for loops parallelized by parloops. The default +is 0. -@item scev-max-expr-complexity -Bound on the complexity of the expressions in the scalar evolutions analyzer. -Complex expressions slow the analyzer. +@item parloops-schedule +Schedule type of omp schedule for loops parallelized by parloops (static, +dynamic, guided, auto, runtime). The default is static. -@item vect-max-version-for-alignment-checks -The maximum number of run-time checks that can be performed when -doing loop versioning for alignment in the vectorizer. +@item max-ssa-name-query-depth +Maximum depth of recursion when querying properties of SSA names in things +like fold routines. One level of recursion corresponds to following a +use-def chain. -@item vect-max-version-for-alias-checks -The maximum number of run-time checks that can be performed when -doing loop versioning for alias in the vectorizer. +@item omp-gpu-gridify +Enable creation of gridified GPU kernels out of loops within target +OpenMP constructs. This conversion is enabled by default when +offloading to HSA, to disable it, use @option{--param omp-gpu-gridify=0} + +@item hsa-gen-debug-stores +Enable emission of special debug stores within HSA kernels which are +then read and reported by libgomp plugin. Generation of these stores +is disabled by default, use @option{--param hsa-gen-debug-stores=1} to +enable it. +@end table +@end table -@item vect-max-peeling-for-alignment -The maximum number of loop peels to enhance access alignment -for vectorizer. Value -1 means 'no limit'. +@node Instrumentation Options +@section Program Instrumentation Options +@cindex instrumentation options +@cindex program instrumentation options +@cindex run-time error checking options +@cindex profiling options +@cindex options, program instrumentation +@cindex options, run-time error checking +@cindex options, profiling + +GCC supports a number of command-line options that control adding +run-time instrumentation to the code it normally generates. +For example, one purpose of instrumentation is collect profiling +statistics for use in finding program hot spots, code coverage +analysis, or profile-guided optimizations. +Another class of program instrumentation is adding run-time checking +to detect programming errors like invalid pointer +dereferences or out-of-bounds array accesses, as well as deliberately +hostile attacks such as stack smashing or C++ vtable hijacking. +There is also a general hook which can be used to implement other +forms of tracing or function-level instrumentation for debug or +program analysis purposes. -@item max-iterations-to-track -The maximum number of iterations of a loop the brute-force algorithm -for analysis of the number of iterations of the loop tries to evaluate. +@table @gcctabopt +@cindex @command{prof} +@item -p +@opindex p +Generate extra code to write profile information suitable for the +analysis program @command{prof}. You must use this option when compiling +the source files you want data about, and you must also use it when +linking. -@item hot-bb-count-ws-permille -A basic block profile count is considered hot if it contributes to -the given permillage (i.e. 0...1000) of the entire profiled execution. +@cindex @command{gprof} +@item -pg +@opindex pg +Generate extra code to write profile information suitable for the +analysis program @command{gprof}. You must use this option when compiling +the source files you want data about, and you must also use it when +linking. -@item hot-bb-frequency-fraction -Select fraction of the entry block frequency of executions of basic block in -function given basic block needs to have to be considered hot. +@item -fprofile-arcs +@opindex fprofile-arcs +Add code so that program flow @dfn{arcs} are instrumented. During +execution the program records how many times each branch and call is +executed and how many times it is taken or returns. When the compiled +program exits it saves this data to a file called +@file{@var{auxname}.gcda} for each source file. The data may be used for +profile-directed optimizations (@option{-fbranch-probabilities}), or for +test coverage analysis (@option{-ftest-coverage}). Each object file's +@var{auxname} is generated from the name of the output file, if +explicitly specified and it is not the final executable, otherwise it is +the basename of the source file. In both cases any suffix is removed +(e.g.@: @file{foo.gcda} for input file @file{dir/foo.c}, or +@file{dir/foo.gcda} for output file specified as @option{-o dir/foo.o}). +@xref{Cross-profiling}. -@item max-predicted-iterations -The maximum number of loop iterations we predict statically. This is useful -in cases where a function contains a single loop with known bound and -another loop with unknown bound. -The known number of iterations is predicted correctly, while -the unknown number of iterations average to roughly 10. This means that the -loop without bounds appears artificially cold relative to the other one. +@cindex @command{gcov} +@item --coverage +@opindex coverage -@item builtin-expect-probability -Control the probability of the expression having the specified value. This -parameter takes a percentage (i.e. 0 ... 100) as input. -The default probability of 90 is obtained empirically. +This option is used to compile and link code instrumented for coverage +analysis. The option is a synonym for @option{-fprofile-arcs} +@option{-ftest-coverage} (when compiling) and @option{-lgcov} (when +linking). See the documentation for those options for more details. -@item align-threshold +@itemize -Select fraction of the maximal frequency of executions of a basic block in -a function to align the basic block. +@item +Compile the source files with @option{-fprofile-arcs} plus optimization +and code generation options. For test coverage analysis, use the +additional @option{-ftest-coverage} option. You do not need to profile +every source file in a program. -@item align-loop-iterations +@item +Link your object files with @option{-lgcov} or @option{-fprofile-arcs} +(the latter implies the former). -A loop expected to iterate at least the selected number of iterations is -aligned. +@item +Run the program on a representative workload to generate the arc profile +information. This may be repeated any number of times. You can run +concurrent instances of your program, and provided that the file system +supports locking, the data files will be correctly updated. Also +@code{fork} calls are detected and correctly handled (double counting +will not happen). -@item tracer-dynamic-coverage -@itemx tracer-dynamic-coverage-feedback +@item +For profile-directed optimizations, compile the source files again with +the same optimization and code generation options plus +@option{-fbranch-probabilities} (@pxref{Optimize Options,,Options that +Control Optimization}). -This value is used to limit superblock formation once the given percentage of -executed instructions is covered. This limits unnecessary code size -expansion. +@item +For test coverage analysis, use @command{gcov} to produce human readable +information from the @file{.gcno} and @file{.gcda} files. Refer to the +@command{gcov} documentation for further information. -The @option{tracer-dynamic-coverage-feedback} parameter -is used only when profile -feedback is available. The real profiles (as opposed to statically estimated -ones) are much less balanced allowing the threshold to be larger value. +@end itemize -@item tracer-max-code-growth -Stop tail duplication once code growth has reached given percentage. This is -a rather artificial limit, as most of the duplicates are eliminated later in -cross jumping, so it may be set to much higher values than is the desired code -growth. +With @option{-fprofile-arcs}, for each function of your program GCC +creates a program flow graph, then finds a spanning tree for the graph. +Only arcs that are not on the spanning tree have to be instrumented: the +compiler adds code to count the number of times that these arcs are +executed. When an arc is the only exit or only entrance to a block, the +instrumentation code can be added to the block; otherwise, a new basic +block must be created to hold the instrumentation code. -@item tracer-min-branch-ratio +@need 2000 +@item -ftest-coverage +@opindex ftest-coverage +Produce a notes file that the @command{gcov} code-coverage utility +(@pxref{Gcov,, @command{gcov}---a Test Coverage Program}) can use to +show program coverage. Each source file's note file is called +@file{@var{auxname}.gcno}. Refer to the @option{-fprofile-arcs} option +above for a description of @var{auxname} and instructions on how to +generate test coverage data. Coverage data matches the source files +more closely if you do not optimize. -Stop reverse growth when the reverse probability of best edge is less than this -threshold (in percent). +@item -fprofile-dir=@var{path} +@opindex fprofile-dir -@item tracer-min-branch-ratio -@itemx tracer-min-branch-ratio-feedback +Set the directory to search for the profile data files in to @var{path}. +This option affects only the profile data generated by +@option{-fprofile-generate}, @option{-ftest-coverage}, @option{-fprofile-arcs} +and used by @option{-fprofile-use} and @option{-fbranch-probabilities} +and its related options. Both absolute and relative paths can be used. +By default, GCC uses the current directory as @var{path}, thus the +profile data file appears in the same directory as the object file. -Stop forward growth if the best edge has probability lower than this -threshold. +@item -fprofile-generate +@itemx -fprofile-generate=@var{path} +@opindex fprofile-generate -Similarly to @option{tracer-dynamic-coverage} two values are present, one for -compilation for profile feedback and one for compilation without. The value -for compilation with profile feedback needs to be more conservative (higher) in -order to make tracer effective. +Enable options usually used for instrumenting application to produce +profile useful for later recompilation with profile feedback based +optimization. You must use @option{-fprofile-generate} both when +compiling and when linking your program. -@item max-cse-path-length +The following options are enabled: @option{-fprofile-arcs}, @option{-fprofile-values}, @option{-fvpt}. -The maximum number of basic blocks on path that CSE considers. -The default is 10. +If @var{path} is specified, GCC looks at the @var{path} to find +the profile feedback data files. See @option{-fprofile-dir}. -@item max-cse-insns -The maximum number of instructions CSE processes before flushing. -The default is 1000. +To optimize the program based on the collected profile information, use +@option{-fprofile-use}. @xref{Optimize Options}, for more information. -@item ggc-min-expand +@item -fsanitize=address +@opindex fsanitize=address +Enable AddressSanitizer, a fast memory error detector. +Memory access instructions are instrumented to detect +out-of-bounds and use-after-free bugs. +See @uref{https://github.com/google/sanitizers/wiki/AddressSanitizer} for +more details. The run-time behavior can be influenced using the +@env{ASAN_OPTIONS} environment variable. When set to @code{help=1}, +the available options are shown at startup of the instrumended program. See +@url{https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags} +for a list of supported options. -GCC uses a garbage collector to manage its own memory allocation. This -parameter specifies the minimum percentage by which the garbage -collector's heap should be allowed to expand between collections. -Tuning this may improve compilation speed; it has no effect on code -generation. +@item -fsanitize=kernel-address +@opindex fsanitize=kernel-address +Enable AddressSanitizer for Linux kernel. +See @uref{https://github.com/google/kasan/wiki} for more details. -The default is 30% + 70% * (RAM/1GB) with an upper bound of 100% when -RAM >= 1GB@. If @code{getrlimit} is available, the notion of ``RAM'' is -the smallest of actual RAM and @code{RLIMIT_DATA} or @code{RLIMIT_AS}. If -GCC is not able to calculate RAM on a particular platform, the lower -bound of 30% is used. Setting this parameter and -@option{ggc-min-heapsize} to zero causes a full collection to occur at -every opportunity. This is extremely slow, but can be useful for -debugging. +@item -fsanitize=thread +@opindex fsanitize=thread +Enable ThreadSanitizer, a fast data race detector. +Memory access instructions are instrumented to detect +data race bugs. See @uref{https://github.com/google/sanitizers/wiki#threadsanitizer} for more +details. The run-time behavior can be influenced using the @env{TSAN_OPTIONS} +environment variable; see +@url{https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags} for a list of +supported options. -@item ggc-min-heapsize +@item -fsanitize=leak +@opindex fsanitize=leak +Enable LeakSanitizer, a memory leak detector. +This option only matters for linking of executables and if neither +@option{-fsanitize=address} nor @option{-fsanitize=thread} is used. In that +case the executable is linked against a library that overrides @code{malloc} +and other allocator functions. See +@uref{https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer} for more +details. The run-time behavior can be influenced using the +@env{LSAN_OPTIONS} environment variable. -Minimum size of the garbage collector's heap before it begins bothering -to collect garbage. The first collection occurs after the heap expands -by @option{ggc-min-expand}% beyond @option{ggc-min-heapsize}. Again, -tuning this may improve compilation speed, and has no effect on code -generation. +@item -fsanitize=undefined +@opindex fsanitize=undefined +Enable UndefinedBehaviorSanitizer, a fast undefined behavior detector. +Various computations are instrumented to detect undefined behavior +at runtime. Current suboptions are: -The default is the smaller of RAM/8, RLIMIT_RSS, or a limit that -tries to ensure that RLIMIT_DATA or RLIMIT_AS are not exceeded, but -with a lower bound of 4096 (four megabytes) and an upper bound of -131072 (128 megabytes). If GCC is not able to calculate RAM on a -particular platform, the lower bound is used. Setting this parameter -very large effectively disables garbage collection. Setting this -parameter and @option{ggc-min-expand} to zero causes a full collection -to occur at every opportunity. +@table @gcctabopt -@item max-reload-search-insns -The maximum number of instruction reload should look backward for equivalent -register. Increasing values mean more aggressive optimization, making the -compilation time increase with probably slightly better performance. -The default value is 100. +@item -fsanitize=shift +@opindex fsanitize=shift +This option enables checking that the result of a shift operation is +not undefined. Note that what exactly is considered undefined differs +slightly between C and C++, as well as between ISO C90 and C99, etc. -@item max-cselib-memory-locations -The maximum number of memory locations cselib should take into account. -Increasing values mean more aggressive optimization, making the compilation time -increase with probably slightly better performance. The default value is 500. +@item -fsanitize=integer-divide-by-zero +@opindex fsanitize=integer-divide-by-zero +Detect integer division by zero as well as @code{INT_MIN / -1} division. -@item reorder-blocks-duplicate -@itemx reorder-blocks-duplicate-feedback +@item -fsanitize=unreachable +@opindex fsanitize=unreachable +With this option, the compiler turns the @code{__builtin_unreachable} +call into a diagnostics message call instead. When reaching the +@code{__builtin_unreachable} call, the behavior is undefined. -Used by the basic block reordering pass to decide whether to use unconditional -branch or duplicate the code on its destination. Code is duplicated when its -estimated size is smaller than this value multiplied by the estimated size of -unconditional jump in the hot spots of the program. +@item -fsanitize=vla-bound +@opindex fsanitize=vla-bound +This option instructs the compiler to check that the size of a variable +length array is positive. -The @option{reorder-block-duplicate-feedback} parameter -is used only when profile -feedback is available. It may be set to higher values than -@option{reorder-block-duplicate} since information about the hot spots is more -accurate. +@item -fsanitize=null +@opindex fsanitize=null +This option enables pointer checking. Particularly, the application +built with this option turned on will issue an error message when it +tries to dereference a NULL pointer, or if a reference (possibly an +rvalue reference) is bound to a NULL pointer, or if a method is invoked +on an object pointed by a NULL pointer. -@item max-sched-ready-insns -The maximum number of instructions ready to be issued the scheduler should -consider at any given time during the first scheduling pass. Increasing -values mean more thorough searches, making the compilation time increase -with probably little benefit. The default value is 100. +@item -fsanitize=return +@opindex fsanitize=return +This option enables return statement checking. Programs +built with this option turned on will issue an error message +when the end of a non-void function is reached without actually +returning a value. This option works in C++ only. -@item max-sched-region-blocks -The maximum number of blocks in a region to be considered for -interblock scheduling. The default value is 10. +@item -fsanitize=signed-integer-overflow +@opindex fsanitize=signed-integer-overflow +This option enables signed integer overflow checking. We check that +the result of @code{+}, @code{*}, and both unary and binary @code{-} +does not overflow in the signed arithmetics. Note, integer promotion +rules must be taken into account. That is, the following is not an +overflow: +@smallexample +signed char a = SCHAR_MAX; +a++; +@end smallexample -@item max-pipeline-region-blocks -The maximum number of blocks in a region to be considered for -pipelining in the selective scheduler. The default value is 15. +@item -fsanitize=bounds +@opindex fsanitize=bounds +This option enables instrumentation of array bounds. Various out of bounds +accesses are detected. Flexible array members, flexible array member-like +arrays, and initializers of variables with static storage are not instrumented. -@item max-sched-region-insns -The maximum number of insns in a region to be considered for -interblock scheduling. The default value is 100. +@item -fsanitize=bounds-strict +@opindex fsanitize=bounds-strict +This option enables strict instrumentation of array bounds. Most out of bounds +accesses are detected, including flexible array members and flexible array +member-like arrays. Initializers of variables with static storage are not +instrumented. -@item max-pipeline-region-insns -The maximum number of insns in a region to be considered for -pipelining in the selective scheduler. The default value is 200. +@item -fsanitize=alignment +@opindex fsanitize=alignment -@item min-spec-prob -The minimum probability (in percents) of reaching a source block -for interblock speculative scheduling. The default value is 40. +This option enables checking of alignment of pointers when they are +dereferenced, or when a reference is bound to insufficiently aligned target, +or when a method or constructor is invoked on insufficiently aligned object. -@item max-sched-extend-regions-iters -The maximum number of iterations through CFG to extend regions. -A value of 0 (the default) disables region extensions. +@item -fsanitize=object-size +@opindex fsanitize=object-size +This option enables instrumentation of memory references using the +@code{__builtin_object_size} function. Various out of bounds pointer +accesses are detected. -@item max-sched-insn-conflict-delay -The maximum conflict delay for an insn to be considered for speculative motion. -The default value is 3. +@item -fsanitize=float-divide-by-zero +@opindex fsanitize=float-divide-by-zero +Detect floating-point division by zero. Unlike other similar options, +@option{-fsanitize=float-divide-by-zero} is not enabled by +@option{-fsanitize=undefined}, since floating-point division by zero can +be a legitimate way of obtaining infinities and NaNs. -@item sched-spec-prob-cutoff -The minimal probability of speculation success (in percents), so that -speculative insns are scheduled. -The default value is 40. +@item -fsanitize=float-cast-overflow +@opindex fsanitize=float-cast-overflow +This option enables floating-point type to integer conversion checking. +We check that the result of the conversion does not overflow. +Unlike other similar options, @option{-fsanitize=float-cast-overflow} is +not enabled by @option{-fsanitize=undefined}. +This option does not work well with @code{FE_INVALID} exceptions enabled. -@item sched-spec-state-edge-prob-cutoff -The minimum probability an edge must have for the scheduler to save its -state across it. -The default value is 10. +@item -fsanitize=nonnull-attribute +@opindex fsanitize=nonnull-attribute -@item sched-mem-true-dep-cost -Minimal distance (in CPU cycles) between store and load targeting same -memory locations. The default value is 1. +This option enables instrumentation of calls, checking whether null values +are not passed to arguments marked as requiring a non-null value by the +@code{nonnull} function attribute. -@item selsched-max-lookahead -The maximum size of the lookahead window of selective scheduling. It is a -depth of search for available instructions. -The default value is 50. +@item -fsanitize=returns-nonnull-attribute +@opindex fsanitize=returns-nonnull-attribute -@item selsched-max-sched-times -The maximum number of times that an instruction is scheduled during -selective scheduling. This is the limit on the number of iterations -through which the instruction may be pipelined. The default value is 2. +This option enables instrumentation of return statements in functions +marked with @code{returns_nonnull} function attribute, to detect returning +of null values from such functions. -@item selsched-max-insns-to-rename -The maximum number of best instructions in the ready list that are considered -for renaming in the selective scheduler. The default value is 2. +@item -fsanitize=bool +@opindex fsanitize=bool -@item sms-min-sc -The minimum value of stage count that swing modulo scheduler -generates. The default value is 2. +This option enables instrumentation of loads from bool. If a value other +than 0/1 is loaded, a run-time error is issued. -@item max-last-value-rtl -The maximum size measured as number of RTLs that can be recorded in an expression -in combiner for a pseudo register as last known value of that register. The default -is 10000. +@item -fsanitize=enum +@opindex fsanitize=enum -@item max-combine-insns -The maximum number of instructions the RTL combiner tries to combine. -The default value is 2 at @option{-Og} and 4 otherwise. +This option enables instrumentation of loads from an enum type. If +a value outside the range of values for the enum type is loaded, +a run-time error is issued. -@item integer-share-limit -Small integer constants can use a shared data structure, reducing the -compiler's memory usage and increasing its speed. This sets the maximum -value of a shared integer constant. The default value is 256. +@item -fsanitize=vptr +@opindex fsanitize=vptr -@item ssp-buffer-size -The minimum size of buffers (i.e.@: arrays) that receive stack smashing -protection when @option{-fstack-protection} is used. +This option enables instrumentation of C++ member function calls, member +accesses and some conversions between pointers to base and derived classes, +to verify the referenced object has the correct dynamic type. -@item min-size-for-stack-sharing -The minimum size of variables taking part in stack slot sharing when not -optimizing. The default value is 32. +@end table -@item max-jump-thread-duplication-stmts -Maximum number of statements allowed in a block that needs to be -duplicated when threading jumps. +While @option{-ftrapv} causes traps for signed overflows to be emitted, +@option{-fsanitize=undefined} gives a diagnostic message. +This currently works only for the C family of languages. -@item max-fields-for-field-sensitive -Maximum number of fields in a structure treated in -a field sensitive manner during pointer analysis. The default is zero -for @option{-O0} and @option{-O1}, -and 100 for @option{-Os}, @option{-O2}, and @option{-O3}. +@item -fno-sanitize=all +@opindex fno-sanitize=all -@item prefetch-latency -Estimate on average number of instructions that are executed before -prefetch finishes. The distance prefetched ahead is proportional -to this constant. Increasing this number may also lead to less -streams being prefetched (see @option{simultaneous-prefetches}). +This option disables all previously enabled sanitizers. +@option{-fsanitize=all} is not allowed, as some sanitizers cannot be used +together. -@item simultaneous-prefetches -Maximum number of prefetches that can run at the same time. +@item -fasan-shadow-offset=@var{number} +@opindex fasan-shadow-offset +This option forces GCC to use custom shadow offset in AddressSanitizer checks. +It is useful for experimenting with different shadow memory layouts in +Kernel AddressSanitizer. -@item l1-cache-line-size -The size of cache line in L1 cache, in bytes. +@item -fsanitize-sections=@var{s1},@var{s2},... +@opindex fsanitize-sections +Sanitize global variables in selected user-defined sections. @var{si} may +contain wildcards. -@item l1-cache-size -The size of L1 cache, in kilobytes. +@item -fsanitize-recover@r{[}=@var{opts}@r{]} +@opindex fsanitize-recover +@opindex fno-sanitize-recover +@option{-fsanitize-recover=} controls error recovery mode for sanitizers +mentioned in comma-separated list of @var{opts}. Enabling this option +for a sanitizer component causes it to attempt to continue +running the program as if no error happened. This means multiple +runtime errors can be reported in a single program run, and the exit +code of the program may indicate success even when errors +have been reported. The @option{-fno-sanitize-recover=} option +can be used to alter +this behavior: only the first detected error is reported +and program then exits with a non-zero exit code. -@item l2-cache-size -The size of L2 cache, in kilobytes. +Currently this feature only works for @option{-fsanitize=undefined} (and its suboptions +except for @option{-fsanitize=unreachable} and @option{-fsanitize=return}), +@option{-fsanitize=float-cast-overflow}, @option{-fsanitize=float-divide-by-zero}, +@option{-fsanitize=kernel-address} and @option{-fsanitize=address}. +For these sanitizers error recovery is turned on by default, except @option{-fsanitize=address}, +for which this feature is experimental. +@option{-fsanitize-recover=all} and @option{-fno-sanitize-recover=all} is also +accepted, the former enables recovery for all sanitizers that support it, +the latter disables recovery for all sanitizers that support it. -@item min-insn-to-prefetch-ratio -The minimum ratio between the number of instructions and the -number of prefetches to enable prefetching in a loop. +Syntax without explicit @var{opts} parameter is deprecated. It is equivalent to +@smallexample +-fsanitize-recover=undefined,float-cast-overflow,float-divide-by-zero +@end smallexample +@noindent +Similarly @option{-fno-sanitize-recover} is equivalent to +@smallexample +-fno-sanitize-recover=undefined,float-cast-overflow,float-divide-by-zero +@end smallexample -@item prefetch-min-insn-to-mem-ratio -The minimum ratio between the number of instructions and the -number of memory references to enable prefetching in a loop. +@item -fsanitize-undefined-trap-on-error +@opindex fsanitize-undefined-trap-on-error +The @option{-fsanitize-undefined-trap-on-error} option instructs the compiler to +report undefined behavior using @code{__builtin_trap} rather than +a @code{libubsan} library routine. The advantage of this is that the +@code{libubsan} library is not needed and is not linked in, so this +is usable even in freestanding environments. -@item use-canonical-types -Whether the compiler should use the ``canonical'' type system. By -default, this should always be 1, which uses a more efficient internal -mechanism for comparing types in C++ and Objective-C++. However, if -bugs in the canonical type system are causing compilation failures, -set this value to 0 to disable canonical types. +@item -fsanitize-coverage=trace-pc +@opindex fsanitize-coverage=trace-pc +Enable coverage-guided fuzzing code instrumentation. +Inserts call to __sanitizer_cov_trace_pc into every basic block. -@item switch-conversion-max-branch-ratio -Switch initialization conversion refuses to create arrays that are -bigger than @option{switch-conversion-max-branch-ratio} times the number of -branches in the switch. +@item -fbounds-check +@opindex fbounds-check +For front ends that support it, generate additional code to check that +indices used to access arrays are within the declared range. This is +currently only supported by the Java and Fortran front ends, where +this option defaults to true and false respectively. -@item max-partial-antic-length -Maximum length of the partial antic set computed during the tree -partial redundancy elimination optimization (@option{-ftree-pre}) when -optimizing at @option{-O3} and above. For some sorts of source code -the enhanced partial redundancy elimination optimization can run away, -consuming all of the memory available on the host machine. This -parameter sets a limit on the length of the sets that are computed, -which prevents the runaway behavior. Setting a value of 0 for -this parameter allows an unlimited set length. +@item -fcheck-pointer-bounds +@opindex fcheck-pointer-bounds +@opindex fno-check-pointer-bounds +@cindex Pointer Bounds Checker options +Enable Pointer Bounds Checker instrumentation. Each memory reference +is instrumented with checks of the pointer used for memory access against +bounds associated with that pointer. -@item sccvn-max-scc-size -Maximum size of a strongly connected component (SCC) during SCCVN -processing. If this limit is hit, SCCVN processing for the whole -function is not done and optimizations depending on it are -disabled. The default maximum SCC size is 10000. +Currently there +is only an implementation for Intel MPX available, thus x86 target +and @option{-mmpx} are required to enable this feature. +MPX-based instrumentation requires +a runtime library to enable MPX in hardware and handle bounds +violation signals. By default when @option{-fcheck-pointer-bounds} +and @option{-mmpx} options are used to link a program, the GCC driver +links against the @file{libmpx} runtime library and @file{libmpxwrappers} +library. It also passes '-z bndplt' to a linker in case it supports this +option (which is checked on libmpx configuration). Note that old versions +of linker may ignore option. Gold linker doesn't support '-z bndplt' +option. With no '-z bndplt' support in linker all calls to dynamic libraries +lose passed bounds reducing overall protection level. It's highly +recommended to use linker with '-z bndplt' support. In case such linker +is not available it is adviced to always use @option{-static-libmpxwrappers} +for better protection level or use @option{-static} to completely avoid +external calls to dynamic libraries. MPX-based instrumentation +may be used for debugging and also may be included in production code +to increase program security. Depending on usage, you may +have different requirements for the runtime library. The current version +of the MPX runtime library is more oriented for use as a debugging +tool. MPX runtime library usage implies @option{-lpthread}. See +also @option{-static-libmpx}. The runtime library behavior can be +influenced using various @env{CHKP_RT_*} environment variables. See +@uref{https://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler} +for more details. -@item sccvn-max-alias-queries-per-access -Maximum number of alias-oracle queries we perform when looking for -redundancies for loads and stores. If this limit is hit the search -is aborted and the load or store is not considered redundant. The -number of queries is algorithmically limited to the number of -stores on all paths from the load to the function entry. -The default maxmimum number of queries is 1000. +Generated instrumentation may be controlled by various +@option{-fchkp-*} options and by the @code{bnd_variable_size} +structure field attribute (@pxref{Type Attributes}) and +@code{bnd_legacy}, and @code{bnd_instrument} function attributes +(@pxref{Function Attributes}). GCC also provides a number of built-in +functions for controlling the Pointer Bounds Checker. @xref{Pointer +Bounds Checker builtins}, for more information. -@item ira-max-loops-num -IRA uses regional register allocation by default. If a function -contains more loops than the number given by this parameter, only at most -the given number of the most frequently-executed loops form regions -for regional register allocation. The default value of the -parameter is 100. +@item -fchkp-check-incomplete-type +@opindex fchkp-check-incomplete-type +@opindex fno-chkp-check-incomplete-type +Generate pointer bounds checks for variables with incomplete type. +Enabled by default. -@item ira-max-conflict-table-size -Although IRA uses a sophisticated algorithm to compress the conflict -table, the table can still require excessive amounts of memory for -huge functions. If the conflict table for a function could be more -than the size in MB given by this parameter, the register allocator -instead uses a faster, simpler, and lower-quality -algorithm that does not require building a pseudo-register conflict table. -The default value of the parameter is 2000. +@item -fchkp-narrow-bounds +@opindex fchkp-narrow-bounds +@opindex fno-chkp-narrow-bounds +Controls bounds used by Pointer Bounds Checker for pointers to object +fields. If narrowing is enabled then field bounds are used. Otherwise +object bounds are used. See also @option{-fchkp-narrow-to-innermost-array} +and @option{-fchkp-first-field-has-own-bounds}. Enabled by default. -@item ira-loop-reserved-regs -IRA can be used to evaluate more accurate register pressure in loops -for decisions to move loop invariants (see @option{-O3}). The number -of available registers reserved for some other purposes is given -by this parameter. The default value of the parameter is 2, which is -the minimal number of registers needed by typical instructions. -This value is the best found from numerous experiments. +@item -fchkp-first-field-has-own-bounds +@opindex fchkp-first-field-has-own-bounds +@opindex fno-chkp-first-field-has-own-bounds +Forces Pointer Bounds Checker to use narrowed bounds for the address of the +first field in the structure. By default a pointer to the first field has +the same bounds as a pointer to the whole structure. -@item lra-inheritance-ebb-probability-cutoff -LRA tries to reuse values reloaded in registers in subsequent insns. -This optimization is called inheritance. EBB is used as a region to -do this optimization. The parameter defines a minimal fall-through -edge probability in percentage used to add BB to inheritance EBB in -LRA. The default value of the parameter is 40. The value was chosen -from numerous runs of SPEC2000 on x86-64. +@item -fchkp-narrow-to-innermost-array +@opindex fchkp-narrow-to-innermost-array +@opindex fno-chkp-narrow-to-innermost-array +Forces Pointer Bounds Checker to use bounds of the innermost arrays in +case of nested static array access. By default this option is disabled and +bounds of the outermost array are used. -@item loop-invariant-max-bbs-in-loop -Loop invariant motion can be very expensive, both in compilation time and -in amount of needed compile-time memory, with very large loops. Loops -with more basic blocks than this parameter won't have loop invariant -motion optimization performed on them. The default value of the -parameter is 1000 for @option{-O1} and 10000 for @option{-O2} and above. +@item -fchkp-optimize +@opindex fchkp-optimize +@opindex fno-chkp-optimize +Enables Pointer Bounds Checker optimizations. Enabled by default at +optimization levels @option{-O}, @option{-O2}, @option{-O3}. -@item loop-max-datarefs-for-datadeps -Building data dapendencies is expensive for very large loops. This -parameter limits the number of data references in loops that are -considered for data dependence analysis. These large loops are no -handled by the optimizations using loop data dependencies. -The default value is 1000. +@item -fchkp-use-fast-string-functions +@opindex fchkp-use-fast-string-functions +@opindex fno-chkp-use-fast-string-functions +Enables use of @code{*_nobnd} versions of string functions (not copying bounds) +by Pointer Bounds Checker. Disabled by default. -@item max-vartrack-size -Sets a maximum number of hash table slots to use during variable -tracking dataflow analysis of any function. If this limit is exceeded -with variable tracking at assignments enabled, analysis for that -function is retried without it, after removing all debug insns from -the function. If the limit is exceeded even without debug insns, var -tracking analysis is completely disabled for the function. Setting -the parameter to zero makes it unlimited. +@item -fchkp-use-nochk-string-functions +@opindex fchkp-use-nochk-string-functions +@opindex fno-chkp-use-nochk-string-functions +Enables use of @code{*_nochk} versions of string functions (not checking bounds) +by Pointer Bounds Checker. Disabled by default. -@item max-vartrack-expr-depth -Sets a maximum number of recursion levels when attempting to map -variable names or debug temporaries to value expressions. This trades -compilation time for more complete debug information. If this is set too -low, value expressions that are available and could be represented in -debug information may end up not being used; setting this higher may -enable the compiler to find more complex debug expressions, but compile -time and memory use may grow. The default is 12. +@item -fchkp-use-static-bounds +@opindex fchkp-use-static-bounds +@opindex fno-chkp-use-static-bounds +Allow Pointer Bounds Checker to generate static bounds holding +bounds of static variables. Enabled by default. -@item min-nondebug-insn-uid -Use uids starting at this parameter for nondebug insns. The range below -the parameter is reserved exclusively for debug insns created by -@option{-fvar-tracking-assignments}, but debug insns may get -(non-overlapping) uids above it if the reserved range is exhausted. +@item -fchkp-use-static-const-bounds +@opindex fchkp-use-static-const-bounds +@opindex fno-chkp-use-static-const-bounds +Use statically-initialized bounds for constant bounds instead of +generating them each time they are required. By default enabled when +@option{-fchkp-use-static-bounds} is enabled. -@item ipa-sra-ptr-growth-factor -IPA-SRA replaces a pointer to an aggregate with one or more new -parameters only when their cumulative size is less or equal to -@option{ipa-sra-ptr-growth-factor} times the size of the original -pointer parameter. +@item -fchkp-treat-zero-dynamic-size-as-infinite +@opindex fchkp-treat-zero-dynamic-size-as-infinite +@opindex fno-chkp-treat-zero-dynamic-size-as-infinite +With this option, objects with incomplete type whose +dynamically-obtained size is zero are treated as having infinite size +instead by Pointer Bounds +Checker. This option may be helpful if a program is linked with a library +missing size information for some symbols. Disabled by default. -@item sra-max-scalarization-size-Ospeed -@item sra-max-scalarization-size-Osize -The two Scalar Reduction of Aggregates passes (SRA and IPA-SRA) aim to -replace scalar parts of aggregates with uses of independent scalar -variables. These parameters control the maximum size, in storage units, -of aggregate which is considered for replacement when compiling for -speed -(@option{sra-max-scalarization-size-Ospeed}) or size -(@option{sra-max-scalarization-size-Osize}) respectively. +@item -fchkp-check-read +@opindex fchkp-check-read +@opindex fno-chkp-check-read +Instructs Pointer Bounds Checker to generate checks for all read +accesses to memory. Enabled by default. -@item tm-max-aggregate-size -When making copies of thread-local variables in a transaction, this -parameter specifies the size in bytes after which variables are -saved with the logging functions as opposed to save/restore code -sequence pairs. This option only applies when using -@option{-fgnu-tm}. +@item -fchkp-check-write +@opindex fchkp-check-write +@opindex fno-chkp-check-write +Instructs Pointer Bounds Checker to generate checks for all write +accesses to memory. Enabled by default. -@item graphite-max-nb-scop-params -To avoid exponential effects in the Graphite loop transforms, the -number of parameters in a Static Control Part (SCoP) is bounded. The -default value is 10 parameters. A variable whose value is unknown at -compilation time and defined outside a SCoP is a parameter of the SCoP. +@item -fchkp-store-bounds +@opindex fchkp-store-bounds +@opindex fno-chkp-store-bounds +Instructs Pointer Bounds Checker to generate bounds stores for +pointer writes. Enabled by default. -@item graphite-max-bbs-per-function -To avoid exponential effects in the detection of SCoPs, the size of -the functions analyzed by Graphite is bounded. The default value is -100 basic blocks. +@item -fchkp-instrument-calls +@opindex fchkp-instrument-calls +@opindex fno-chkp-instrument-calls +Instructs Pointer Bounds Checker to pass pointer bounds to calls. +Enabled by default. -@item loop-block-tile-size -Loop blocking or strip mining transforms, enabled with -@option{-floop-block} or @option{-floop-strip-mine}, strip mine each -loop in the loop nest by a given number of iterations. The strip -length can be changed using the @option{loop-block-tile-size} -parameter. The default value is 51 iterations. +@item -fchkp-instrument-marked-only +@opindex fchkp-instrument-marked-only +@opindex fno-chkp-instrument-marked-only +Instructs Pointer Bounds Checker to instrument only functions +marked with the @code{bnd_instrument} attribute +(@pxref{Function Attributes}). Disabled by default. -@item loop-unroll-jam-size -Specify the unroll factor for the @option{-floop-unroll-and-jam} option. The -default value is 4. +@item -fchkp-use-wrappers +@opindex fchkp-use-wrappers +@opindex fno-chkp-use-wrappers +Allows Pointer Bounds Checker to replace calls to built-in functions +with calls to wrapper functions. When @option{-fchkp-use-wrappers} +is used to link a program, the GCC driver automatically links +against @file{libmpxwrappers}. See also @option{-static-libmpxwrappers}. +Enabled by default. -@item loop-unroll-jam-depth -Specify the dimension to be unrolled (counting from the most inner loop) -for the @option{-floop-unroll-and-jam}. The default value is 2. +@item -fstack-protector +@opindex fstack-protector +Emit extra code to check for buffer overflows, such as stack smashing +attacks. This is done by adding a guard variable to functions with +vulnerable objects. This includes functions that call @code{alloca}, and +functions with buffers larger than 8 bytes. The guards are initialized +when a function is entered and then checked when the function exits. +If a guard check fails, an error message is printed and the program exits. -@item ipa-cp-value-list-size -IPA-CP attempts to track all possible values and types passed to a function's -parameter in order to propagate them and perform devirtualization. -@option{ipa-cp-value-list-size} is the maximum number of values and types it -stores per one formal parameter of a function. +@item -fstack-protector-all +@opindex fstack-protector-all +Like @option{-fstack-protector} except that all functions are protected. -@item ipa-cp-eval-threshold -IPA-CP calculates its own score of cloning profitability heuristics -and performs those cloning opportunities with scores that exceed -@option{ipa-cp-eval-threshold}. +@item -fstack-protector-strong +@opindex fstack-protector-strong +Like @option{-fstack-protector} but includes additional functions to +be protected --- those that have local array definitions, or have +references to local frame addresses. -@item ipa-cp-recursion-penalty -Percentage penalty the recursive functions will receive when they -are evaluated for cloning. +@item -fstack-protector-explicit +@opindex fstack-protector-explicit +Like @option{-fstack-protector} but only protects those functions which +have the @code{stack_protect} attribute. -@item ipa-cp-single-call-penalty -Percentage penalty functions containg a single call to another -function will receive when they are evaluated for cloning. +@item -fstack-check +@opindex fstack-check +Generate code to verify that you do not go beyond the boundary of the +stack. You should specify this flag if you are running in an +environment with multiple threads, but you only rarely need to specify it in +a single-threaded environment since stack overflow is automatically +detected on nearly all systems if there is only one stack. +Note that this switch does not actually cause checking to be done; the +operating system or the language runtime must do that. The switch causes +generation of code to ensure that they see the stack being extended. -@item ipa-max-agg-items -IPA-CP is also capable to propagate a number of scalar values passed -in an aggregate. @option{ipa-max-agg-items} controls the maximum -number of such values per one parameter. +You can additionally specify a string parameter: @samp{no} means no +checking, @samp{generic} means force the use of old-style checking, +@samp{specific} means use the best checking method and is equivalent +to bare @option{-fstack-check}. -@item ipa-cp-loop-hint-bonus -When IPA-CP determines that a cloning candidate would make the number -of iterations of a loop known, it adds a bonus of -@option{ipa-cp-loop-hint-bonus} to the profitability score of -the candidate. +Old-style checking is a generic mechanism that requires no specific +target support in the compiler but comes with the following drawbacks: -@item ipa-cp-array-index-hint-bonus -When IPA-CP determines that a cloning candidate would make the index of -an array access known, it adds a bonus of -@option{ipa-cp-array-index-hint-bonus} to the profitability -score of the candidate. +@enumerate +@item +Modified allocation strategy for large objects: they are always +allocated dynamically if their size exceeds a fixed threshold. -@item ipa-max-aa-steps -During its analysis of function bodies, IPA-CP employs alias analysis -in order to track values pointed to by function parameters. In order -not spend too much time analyzing huge functions, it gives up and -consider all memory clobbered after examining -@option{ipa-max-aa-steps} statements modifying memory. +@item +Fixed limit on the size of the static frame of functions: when it is +topped by a particular function, stack checking is not reliable and +a warning is issued by the compiler. -@item lto-partitions -Specify desired number of partitions produced during WHOPR compilation. -The number of partitions should exceed the number of CPUs used for compilation. -The default value is 32. +@item +Inefficiency: because of both the modified allocation strategy and the +generic implementation, code performance is hampered. +@end enumerate -@item lto-minpartition -Size of minimal partition for WHOPR (in estimated instructions). -This prevents expenses of splitting very small programs into too many -partitions. +Note that old-style stack checking is also the fallback method for +@samp{specific} if no target support has been added in the compiler. -@item cxx-max-namespaces-for-diagnostic-help -The maximum number of namespaces to consult for suggestions when C++ -name lookup fails for an identifier. The default is 1000. +@item -fstack-limit-register=@var{reg} +@itemx -fstack-limit-symbol=@var{sym} +@itemx -fno-stack-limit +@opindex fstack-limit-register +@opindex fstack-limit-symbol +@opindex fno-stack-limit +Generate code to ensure that the stack does not grow beyond a certain value, +either the value of a register or the address of a symbol. If a larger +stack is required, a signal is raised at run time. For most targets, +the signal is raised before the stack overruns the boundary, so +it is possible to catch the signal without taking special precautions. -@item sink-frequency-threshold -The maximum relative execution frequency (in percents) of the target block -relative to a statement's original block to allow statement sinking of a -statement. Larger numbers result in more aggressive statement sinking. -The default value is 75. A small positive adjustment is applied for -statements with memory operands as those are even more profitable so sink. +For instance, if the stack starts at absolute address @samp{0x80000000} +and grows downwards, you can use the flags +@option{-fstack-limit-symbol=__stack_limit} and +@option{-Wl,--defsym,__stack_limit=0x7ffe0000} to enforce a stack limit +of 128KB@. Note that this may only work with the GNU linker. -@item max-stores-to-sink -The maximum number of conditional stores paires that can be sunk. Set to 0 -if either vectorization (@option{-ftree-vectorize}) or if-conversion -(@option{-ftree-loop-if-convert}) is disabled. The default is 2. +You can locally override stack limit checking by using the +@code{no_stack_limit} function attribute (@pxref{Function Attributes}). -@item allow-store-data-races -Allow optimizers to introduce new data races on stores. -Set to 1 to allow, otherwise to 0. This option is enabled by default -at optimization level @option{-Ofast}. +@item -fsplit-stack +@opindex fsplit-stack +Generate code to automatically split the stack before it overflows. +The resulting program has a discontiguous stack which can only +overflow if the program is unable to allocate any more memory. This +is most useful when running threaded programs, as it is no longer +necessary to calculate a good stack size to use for each thread. This +is currently only implemented for the x86 targets running +GNU/Linux. -@item case-values-threshold -The smallest number of different values for which it is best to use a -jump-table instead of a tree of conditional branches. If the value is -0, use the default for the machine. The default is 0. +When code compiled with @option{-fsplit-stack} calls code compiled +without @option{-fsplit-stack}, there may not be much stack space +available for the latter code to run. If compiling all code, +including library code, with @option{-fsplit-stack} is not an option, +then the linker can fix up these calls so that the code compiled +without @option{-fsplit-stack} always has a large stack. Support for +this is implemented in the gold linker in GNU binutils release 2.21 +and later. -@item tree-reassoc-width -Set the maximum number of instructions executed in parallel in -reassociated tree. This parameter overrides target dependent -heuristics used by default if has non zero value. +@item -fvtable-verify=@r{[}std@r{|}preinit@r{|}none@r{]} +@opindex fvtable-verify +This option is only available when compiling C++ code. +It turns on (or off, if using @option{-fvtable-verify=none}) the security +feature that verifies at run time, for every virtual call, that +the vtable pointer through which the call is made is valid for the type of +the object, and has not been corrupted or overwritten. If an invalid vtable +pointer is detected at run time, an error is reported and execution of the +program is immediately halted. -@item sched-pressure-algorithm -Choose between the two available implementations of -@option{-fsched-pressure}. Algorithm 1 is the original implementation -and is the more likely to prevent instructions from being reordered. -Algorithm 2 was designed to be a compromise between the relatively -conservative approach taken by algorithm 1 and the rather aggressive -approach taken by the default scheduler. It relies more heavily on -having a regular register file and accurate register pressure classes. -See @file{haifa-sched.c} in the GCC sources for more details. +This option causes run-time data structures to be built at program startup, +which are used for verifying the vtable pointers. +The options @samp{std} and @samp{preinit} +control the timing of when these data structures are built. In both cases the +data structures are built before execution reaches @code{main}. Using +@option{-fvtable-verify=std} causes the data structures to be built after +shared libraries have been loaded and initialized. +@option{-fvtable-verify=preinit} causes them to be built before shared +libraries have been loaded and initialized. -The default choice depends on the target. +If this option appears multiple times in the command line with different +values specified, @samp{none} takes highest priority over both @samp{std} and +@samp{preinit}; @samp{preinit} takes priority over @samp{std}. -@item max-slsr-cand-scan -Set the maximum number of existing candidates that are considered when -seeking a basis for a new straight-line strength reduction candidate. +@item -fvtv-debug +@opindex fvtv-debug +When used in conjunction with @option{-fvtable-verify=std} or +@option{-fvtable-verify=preinit}, causes debug versions of the +runtime functions for the vtable verification feature to be called. +This flag also causes the compiler to log information about which +vtable pointers it finds for each class. +This information is written to a file named @file{vtv_set_ptr_data.log} +in the directory named by the environment variable @env{VTV_LOGS_DIR} +if that is defined or the current working directory otherwise. -@item asan-globals -Enable buffer overflow detection for global objects. This kind -of protection is enabled by default if you are using -@option{-fsanitize=address} option. -To disable global objects protection use @option{--param asan-globals=0}. +Note: This feature @emph{appends} data to the log file. If you want a fresh log +file, be sure to delete any existing one. -@item asan-stack -Enable buffer overflow detection for stack objects. This kind of -protection is enabled by default when using @option{-fsanitize=address}. -To disable stack protection use @option{--param asan-stack=0} option. +@item -fvtv-counts +@opindex fvtv-counts +This is a debugging flag. When used in conjunction with +@option{-fvtable-verify=std} or @option{-fvtable-verify=preinit}, this +causes the compiler to keep track of the total number of virtual calls +it encounters and the number of verifications it inserts. It also +counts the number of calls to certain run-time library functions +that it inserts and logs this information for each compilation unit. +The compiler writes this information to a file named +@file{vtv_count_data.log} in the directory named by the environment +variable @env{VTV_LOGS_DIR} if that is defined or the current working +directory otherwise. It also counts the size of the vtable pointer sets +for each class, and writes this information to @file{vtv_class_set_sizes.log} +in the same directory. -@item asan-instrument-reads -Enable buffer overflow detection for memory reads. This kind of -protection is enabled by default when using @option{-fsanitize=address}. -To disable memory reads protection use -@option{--param asan-instrument-reads=0}. +Note: This feature @emph{appends} data to the log files. To get fresh log +files, be sure to delete any existing ones. -@item asan-instrument-writes -Enable buffer overflow detection for memory writes. This kind of -protection is enabled by default when using @option{-fsanitize=address}. -To disable memory writes protection use -@option{--param asan-instrument-writes=0} option. +@item -finstrument-functions +@opindex finstrument-functions +Generate instrumentation calls for entry and exit to functions. Just +after function entry and just before function exit, the following +profiling functions are called with the address of the current +function and its call site. (On some platforms, +@code{__builtin_return_address} does not work beyond the current +function, so the call site information may not be available to the +profiling functions otherwise.) -@item asan-memintrin -Enable detection for built-in functions. This kind of protection -is enabled by default when using @option{-fsanitize=address}. -To disable built-in functions protection use -@option{--param asan-memintrin=0}. +@smallexample +void __cyg_profile_func_enter (void *this_fn, + void *call_site); +void __cyg_profile_func_exit (void *this_fn, + void *call_site); +@end smallexample -@item asan-use-after-return -Enable detection of use-after-return. This kind of protection -is enabled by default when using @option{-fsanitize=address} option. -To disable use-after-return detection use -@option{--param asan-use-after-return=0}. +The first argument is the address of the start of the current function, +which may be looked up exactly in the symbol table. -@item asan-instrumentation-with-call-threshold -If number of memory accesses in function being instrumented -is greater or equal to this number, use callbacks instead of inline checks. -E.g. to disable inline code use -@option{--param asan-instrumentation-with-call-threshold=0}. +This instrumentation is also done for functions expanded inline in other +functions. The profiling calls indicate where, conceptually, the +inline function is entered and exited. This means that addressable +versions of such functions must be available. If all your uses of a +function are expanded inline, this may mean an additional expansion of +code size. If you use @code{extern inline} in your C code, an +addressable version of such functions must be provided. (This is +normally the case anyway, but if you get lucky and the optimizer always +expands the functions inline, you might have gotten away without +providing static copies.) -@item chkp-max-ctor-size -Static constructors generated by Pointer Bounds Checker may become very -large and significantly increase compile time at optimization level -@option{-O1} and higher. This parameter is a maximum nubmer of statements -in a single generated constructor. Default value is 5000. +A function may be given the attribute @code{no_instrument_function}, in +which case this instrumentation is not done. This can be used, for +example, for the profiling functions listed above, high-priority +interrupt routines, and any functions from which the profiling functions +cannot safely be called (perhaps signal handlers, if the profiling +routines generate output or allocate memory). -@item max-fsm-thread-path-insns -Maximum number of instructions to copy when duplicating blocks on a -finite state automaton jump thread path. The default is 100. +@item -finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{} +@opindex finstrument-functions-exclude-file-list -@item max-fsm-thread-length -Maximum number of basic blocks on a finite state automaton jump thread -path. The default is 10. +Set the list of functions that are excluded from instrumentation (see +the description of @option{-finstrument-functions}). If the file that +contains a function definition matches with one of @var{file}, then +that function is not instrumented. The match is done on substrings: +if the @var{file} parameter is a substring of the file name, it is +considered to be a match. -@item max-fsm-thread-paths -Maximum number of new jump thread paths to create for a finite state -automaton. The default is 50. +For example: -@item parloops-chunk-size -Chunk size of omp schedule for loops parallelized by parloops. The default -is 0. +@smallexample +-finstrument-functions-exclude-file-list=/bits/stl,include/sys +@end smallexample -@item parloops-schedule -Schedule type of omp schedule for loops parallelized by parloops (static, -dynamic, guided, auto, runtime). The default is static. +@noindent +excludes any inline function defined in files whose pathnames +contain @file{/bits/stl} or @file{include/sys}. -@item max-ssa-name-query-depth -Maximum depth of recursion when querying properties of SSA names in things -like fold routines. One level of recursion corresponds to following a -use-def chain. +If, for some reason, you want to include letter @samp{,} in one of +@var{sym}, write @samp{\,}. For example, +@option{-finstrument-functions-exclude-file-list='\,\,tmp'} +(note the single quote surrounding the option). -@item omp-gpu-gridify -Enable creation of gridified GPU kernels out of loops within target -OpenMP constructs. This conversion is enabled by default when -offloading to HSA, to disable it, use @option{--param omp-gpu-gridify=0} +@item -finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} +@opindex finstrument-functions-exclude-function-list + +This is similar to @option{-finstrument-functions-exclude-file-list}, +but this option sets the list of function names to be excluded from +instrumentation. The function name to be matched is its user-visible +name, such as @code{vector blah(const vector &)}, not the +internal mangled name (e.g., @code{_Z4blahRSt6vectorIiSaIiEE}). The +match is done on substrings: if the @var{sym} parameter is a substring +of the function name, it is considered to be a match. For C99 and C++ +extended identifiers, the function name must be given in UTF-8, not +using universal character names. -@item hsa-gen-debug-stores -Enable emission of special debug stores within HSA kernels which are -then read and reported by libgomp plugin. Generation of these stores -is disabled by default, use @option{--param hsa-gen-debug-stores=1} to -enable it. -@end table @end table + @node Preprocessor Options @section Options Controlling the Preprocessor @cindex preprocessor options @@ -11876,13 +12079,6 @@ can figure out the other form by either removing @samp{no-} or adding it. @table @gcctabopt -@item -fbounds-check -@opindex fbounds-check -For front ends that support it, generate additional code to check that -indices used to access arrays are within the declared range. This is -currently only supported by the Java and Fortran front ends, where -this option defaults to true and false respectively. - @item -fstack-reuse=@var{reuse-level} @opindex fstack_reuse This option controls stack space reuse for user declared local/auto variables @@ -12297,160 +12493,6 @@ code that is not binary compatible with code generated without that switch. Additionally, it makes the code suboptimal. Use it to conform to a non-default application binary interface. -@item -finstrument-functions -@opindex finstrument-functions -Generate instrumentation calls for entry and exit to functions. Just -after function entry and just before function exit, the following -profiling functions are called with the address of the current -function and its call site. (On some platforms, -@code{__builtin_return_address} does not work beyond the current -function, so the call site information may not be available to the -profiling functions otherwise.) - -@smallexample -void __cyg_profile_func_enter (void *this_fn, - void *call_site); -void __cyg_profile_func_exit (void *this_fn, - void *call_site); -@end smallexample - -The first argument is the address of the start of the current function, -which may be looked up exactly in the symbol table. - -This instrumentation is also done for functions expanded inline in other -functions. The profiling calls indicate where, conceptually, the -inline function is entered and exited. This means that addressable -versions of such functions must be available. If all your uses of a -function are expanded inline, this may mean an additional expansion of -code size. If you use @code{extern inline} in your C code, an -addressable version of such functions must be provided. (This is -normally the case anyway, but if you get lucky and the optimizer always -expands the functions inline, you might have gotten away without -providing static copies.) - -A function may be given the attribute @code{no_instrument_function}, in -which case this instrumentation is not done. This can be used, for -example, for the profiling functions listed above, high-priority -interrupt routines, and any functions from which the profiling functions -cannot safely be called (perhaps signal handlers, if the profiling -routines generate output or allocate memory). - -@item -finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{} -@opindex finstrument-functions-exclude-file-list - -Set the list of functions that are excluded from instrumentation (see -the description of @option{-finstrument-functions}). If the file that -contains a function definition matches with one of @var{file}, then -that function is not instrumented. The match is done on substrings: -if the @var{file} parameter is a substring of the file name, it is -considered to be a match. - -For example: - -@smallexample --finstrument-functions-exclude-file-list=/bits/stl,include/sys -@end smallexample - -@noindent -excludes any inline function defined in files whose pathnames -contain @file{/bits/stl} or @file{include/sys}. - -If, for some reason, you want to include letter @samp{,} in one of -@var{sym}, write @samp{\,}. For example, -@option{-finstrument-functions-exclude-file-list='\,\,tmp'} -(note the single quote surrounding the option). - -@item -finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} -@opindex finstrument-functions-exclude-function-list - -This is similar to @option{-finstrument-functions-exclude-file-list}, -but this option sets the list of function names to be excluded from -instrumentation. The function name to be matched is its user-visible -name, such as @code{vector blah(const vector &)}, not the -internal mangled name (e.g., @code{_Z4blahRSt6vectorIiSaIiEE}). The -match is done on substrings: if the @var{sym} parameter is a substring -of the function name, it is considered to be a match. For C99 and C++ -extended identifiers, the function name must be given in UTF-8, not -using universal character names. - -@item -fstack-check -@opindex fstack-check -Generate code to verify that you do not go beyond the boundary of the -stack. You should specify this flag if you are running in an -environment with multiple threads, but you only rarely need to specify it in -a single-threaded environment since stack overflow is automatically -detected on nearly all systems if there is only one stack. - -Note that this switch does not actually cause checking to be done; the -operating system or the language runtime must do that. The switch causes -generation of code to ensure that they see the stack being extended. - -You can additionally specify a string parameter: @samp{no} means no -checking, @samp{generic} means force the use of old-style checking, -@samp{specific} means use the best checking method and is equivalent -to bare @option{-fstack-check}. - -Old-style checking is a generic mechanism that requires no specific -target support in the compiler but comes with the following drawbacks: - -@enumerate -@item -Modified allocation strategy for large objects: they are always -allocated dynamically if their size exceeds a fixed threshold. - -@item -Fixed limit on the size of the static frame of functions: when it is -topped by a particular function, stack checking is not reliable and -a warning is issued by the compiler. - -@item -Inefficiency: because of both the modified allocation strategy and the -generic implementation, code performance is hampered. -@end enumerate - -Note that old-style stack checking is also the fallback method for -@samp{specific} if no target support has been added in the compiler. - -@item -fstack-limit-register=@var{reg} -@itemx -fstack-limit-symbol=@var{sym} -@itemx -fno-stack-limit -@opindex fstack-limit-register -@opindex fstack-limit-symbol -@opindex fno-stack-limit -Generate code to ensure that the stack does not grow beyond a certain value, -either the value of a register or the address of a symbol. If a larger -stack is required, a signal is raised at run time. For most targets, -the signal is raised before the stack overruns the boundary, so -it is possible to catch the signal without taking special precautions. - -For instance, if the stack starts at absolute address @samp{0x80000000} -and grows downwards, you can use the flags -@option{-fstack-limit-symbol=__stack_limit} and -@option{-Wl,--defsym,__stack_limit=0x7ffe0000} to enforce a stack limit -of 128KB@. Note that this may only work with the GNU linker. - -You can locally override stack limit checking by using the -@code{no_stack_limit} function attribute (@pxref{Function Attributes}). - -@item -fsplit-stack -@opindex fsplit-stack -Generate code to automatically split the stack before it overflows. -The resulting program has a discontiguous stack which can only -overflow if the program is unable to allocate any more memory. This -is most useful when running threaded programs, as it is no longer -necessary to calculate a good stack size to use for each thread. This -is currently only implemented for the x86 targets running -GNU/Linux. - -When code compiled with @option{-fsplit-stack} calls code compiled -without @option{-fsplit-stack}, there may not be much stack space -available for the latter code to run. If compiling all code, -including library code, with @option{-fsplit-stack} is not an option, -then the linker can fix up these calls so that the code compiled -without @option{-fsplit-stack} always has a large stack. Support for -this is implemented in the gold linker in GNU binutils release 2.21 -and later. - @item -fleading-underscore @opindex fleading-underscore This option and its counterpart, @option{-fno-leading-underscore}, forcibly diff --git a/gcc/fold-const.c b/gcc/fold-const.c index cd8dbdf0f3e..bece8d74b46 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6446,13 +6446,17 @@ fold_binary_op_with_conditional_arg (location_t loc, if (VOID_TYPE_P (TREE_TYPE (false_value))) rhs = false_value; } - else + else if (!(TREE_CODE (type) != VECTOR_TYPE + && TREE_CODE (TREE_TYPE (cond)) == VECTOR_TYPE)) { tree testtype = TREE_TYPE (cond); test = cond; true_value = constant_boolean_node (true, testtype); false_value = constant_boolean_node (false, testtype); } + else + /* Detect the case of mixing vector and scalar types - bail out. */ + return NULL_TREE; if (TREE_CODE (TREE_TYPE (test)) == VECTOR_TYPE) cond_code = VEC_COND_EXPR; @@ -13984,6 +13988,23 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1) if (TREE_CODE (op0) == VECTOR_CST && TREE_CODE (op1) == VECTOR_CST) { + if (!VECTOR_TYPE_P (type)) + { + /* Have vector comparison with scalar boolean result. */ + bool result = true; + gcc_assert ((code == EQ_EXPR || code == NE_EXPR) + && VECTOR_CST_NELTS (op0) == VECTOR_CST_NELTS (op1)); + for (unsigned i = 0; i < VECTOR_CST_NELTS (op0); i++) + { + tree elem0 = VECTOR_CST_ELT (op0, i); + tree elem1 = VECTOR_CST_ELT (op1, i); + tree tmp = fold_relational_const (code, type, elem0, elem1); + result &= integer_onep (tmp); + } + if (code == NE_EXPR) + result = !result; + return constant_boolean_node (result, type); + } unsigned count = VECTOR_CST_NELTS (op0); tree *elts = XALLOCAVEC (tree, count); gcc_assert (VECTOR_CST_NELTS (op1) == count diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 051c6ede82c..5ad05ce6e7f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,45 @@ +2016-01-15 Paul Thomas + + PR fortran/64324 + * resolve.c (check_uop_procedure): Prevent deferred length + characters from being trapped by assumed length error. + + PR fortran/49630 + PR fortran/54070 + PR fortran/60593 + PR fortran/60795 + PR fortran/61147 + PR fortran/64324 + * trans-array.c (gfc_conv_scalarized_array_ref): Pass decl for + function as well as variable expressions. + (gfc_array_init_size): Add 'expr' as an argument. Use this to + correctly set the descriptor dtype for deferred characters. + (gfc_array_allocate): Add 'expr' to the call to + 'gfc_array_init_size'. + * trans.c (gfc_build_array_ref): Expand logic for setting span + to include indirect references to character lengths. + * trans-decl.c (gfc_get_symbol_decl): Ensure that deferred + result char lengths that are PARM_DECLs are indirectly + referenced both for directly passed and by reference. + (create_function_arglist): If the length type is a pointer type + then store the length as the 'passed_length' and make the char + length an indirect reference to it. + (gfc_trans_deferred_vars): If a character length has escaped + being set as an indirect reference, return it via the 'passed + length'. + * trans-expr.c (gfc_conv_procedure_call): The length of + deferred character length results is set TREE_STATIC and set to + zero. + (gfc_trans_assignment_1): Do not fix the rse string_length if + it is a variable, a parameter or an indirect reference. Add the + code to trap assignment of scalars to unallocated arrays. + * trans-stmt.c (gfc_trans_allocate): Remove 'def_str_len' and + all references to it. Instead, replicate the code to obtain a + explicitly defined string length and provide a value before + array allocation so that the dtype is correctly set. + trans-types.c (gfc_get_character_type): If the character length + is a pointer, use the indirect reference. + 2016-01-10 Thomas Koenig PR fortran/69154 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 2c839f94df8..64d59ceef17 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -15320,9 +15320,9 @@ check_uop_procedure (gfc_symbol *sym, locus where) } if (sym->ts.type == BT_CHARACTER - && !(sym->ts.u.cl && sym->ts.u.cl->length) - && !(sym->result && sym->result->ts.u.cl - && sym->result->ts.u.cl->length)) + && !((sym->ts.u.cl && sym->ts.u.cl->length) || sym->ts.deferred) + && !(sym->result && ((sym->result->ts.u.cl + && sym->result->ts.u.cl->length) || sym->result->ts.deferred))) { gfc_error ("User operator procedure %qs at %L cannot be assumed " "character length", sym->name, &where); diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index a46f1034777..eeb688c9b91 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -3165,7 +3165,8 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar) index, info->offset); if (expr && (is_subref_array (expr) - || (expr->ts.deferred && expr->expr_type == EXPR_VARIABLE))) + || (expr->ts.deferred && (expr->expr_type == EXPR_VARIABLE + || expr->expr_type == EXPR_FUNCTION)))) decl = expr->symtree->n.sym->backend_decl; tmp = build_fold_indirect_ref_loc (input_location, info->data); @@ -5038,7 +5039,7 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset, gfc_expr ** lower, gfc_expr ** upper, stmtblock_t * pblock, stmtblock_t * descriptor_block, tree * overflow, tree expr3_elem_size, tree *nelems, gfc_expr *expr3, - tree expr3_desc, bool e3_is_array_constr) + tree expr3_desc, bool e3_is_array_constr, gfc_expr *expr) { tree type; tree tmp; @@ -5063,8 +5064,19 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset, offset = gfc_index_zero_node; /* Set the dtype. */ - tmp = gfc_conv_descriptor_dtype (descriptor); - gfc_add_modify (descriptor_block, tmp, gfc_get_dtype (type)); + if (expr->ts.type == BT_CHARACTER && expr->ts.deferred + && TREE_CODE (expr->ts.u.cl->backend_decl) == VAR_DECL) + { + type = gfc_typenode_for_spec (&expr->ts); + tmp = gfc_conv_descriptor_dtype (descriptor); + gfc_add_modify (descriptor_block, tmp, + gfc_get_dtype_rank_type (rank, type)); + } + else + { + tmp = gfc_conv_descriptor_dtype (descriptor); + gfc_add_modify (descriptor_block, tmp, gfc_get_dtype (type)); + } or_expr = boolean_false_node; @@ -5446,7 +5458,7 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, ref->u.ar.as->corank, &offset, lower, upper, &se->pre, &set_descriptor_block, &overflow, expr3_elem_size, nelems, expr3, e3_arr_desc, - e3_is_array_constr); + e3_is_array_constr, expr); if (dimension) { diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 929cbda14f9..21d0ba866bb 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -1377,8 +1377,8 @@ gfc_get_symbol_decl (gfc_symbol * sym) && TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL) { sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl; - sym->ts.u.cl->backend_decl = NULL_TREE; - length = gfc_create_string_length (sym); + gcc_assert (POINTER_TYPE_P (TREE_TYPE (sym->ts.u.cl->passed_length))); + sym->ts.u.cl->backend_decl = build_fold_indirect_ref (sym->ts.u.cl->backend_decl); } fun_or_res = byref && (sym->attr.result @@ -1420,8 +1420,11 @@ gfc_get_symbol_decl (gfc_symbol * sym) /* We need to insert a indirect ref for param decls. */ if (sym->ts.u.cl->backend_decl && TREE_CODE (sym->ts.u.cl->backend_decl) == PARM_DECL) - sym->ts.u.cl->backend_decl = + { + sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl; + sym->ts.u.cl->backend_decl = build_fold_indirect_ref (sym->ts.u.cl->backend_decl); + } } /* For all other parameters make sure, that they are copied so that the value and any modifications are local to the routine @@ -1431,7 +1434,11 @@ gfc_get_symbol_decl (gfc_symbol * sym) && sym->ts.u.cl->backend_decl) { sym->ts.u.cl->passed_length = sym->ts.u.cl->backend_decl; - sym->ts.u.cl->backend_decl = NULL_TREE; + if (POINTER_TYPE_P (TREE_TYPE (sym->ts.u.cl->passed_length))) + sym->ts.u.cl->backend_decl + = build_fold_indirect_ref (sym->ts.u.cl->backend_decl); + else + sym->ts.u.cl->backend_decl = NULL_TREE; } } @@ -2264,6 +2271,13 @@ create_function_arglist (gfc_symbol * sym) type = gfc_sym_type (arg); arg->backend_decl = backend_decl; type = build_reference_type (type); + + if (POINTER_TYPE_P (len_type)) + { + sym->ts.u.cl->passed_length = length; + sym->ts.u.cl->backend_decl = + build_fold_indirect_ref_loc (input_location, length); + } } } @@ -2347,7 +2361,10 @@ create_function_arglist (gfc_symbol * sym) if (f->sym->ts.u.cl->backend_decl == NULL || f->sym->ts.u.cl->backend_decl == length) { - if (f->sym->ts.u.cl->backend_decl == NULL) + if (POINTER_TYPE_P (len_type)) + f->sym->ts.u.cl->backend_decl = + build_fold_indirect_ref_loc (input_location, length); + else if (f->sym->ts.u.cl->backend_decl == NULL) gfc_create_string_length (f->sym); /* Make sure PARM_DECL type doesn't point to incomplete type. */ @@ -3975,12 +3992,19 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block) gfc_restore_backend_locus (&loc); /* Pass back the string length on exit. */ - tmp = proc_sym->ts.u.cl->passed_length; - tmp = build_fold_indirect_ref_loc (input_location, tmp); - tmp = fold_convert (gfc_charlen_type_node, tmp); - tmp = fold_build2_loc (input_location, MODIFY_EXPR, - gfc_charlen_type_node, tmp, - proc_sym->ts.u.cl->backend_decl); + tmp = proc_sym->ts.u.cl->backend_decl; + if (TREE_CODE (tmp) != INDIRECT_REF) + { + tmp = proc_sym->ts.u.cl->passed_length; + tmp = build_fold_indirect_ref_loc (input_location, tmp); + tmp = fold_convert (gfc_charlen_type_node, tmp); + tmp = fold_build2_loc (input_location, MODIFY_EXPR, + gfc_charlen_type_node, tmp, + proc_sym->ts.u.cl->backend_decl); + } + else + tmp = NULL_TREE; + gfc_add_init_cleanup (block, gfc_finish_block (&init), tmp); } else if (TREE_CODE (proc_sym->ts.u.cl->backend_decl) == VAR_DECL) diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 1a6b7344877..40a971f626d 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -5942,6 +5942,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, tmp = len; if (TREE_CODE (tmp) != VAR_DECL) tmp = gfc_evaluate_now (len, &se->pre); + TREE_STATIC (tmp) = 1; + gfc_add_modify (&se->pre, tmp, + build_int_cst (TREE_TYPE (tmp), 0)); tmp = gfc_build_addr_expr (NULL_TREE, tmp); vec_safe_push (retargs, tmp); } @@ -9263,7 +9266,10 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, } /* Stabilize a string length for temporaries. */ - if (expr2->ts.type == BT_CHARACTER && !expr2->ts.deferred) + if (expr2->ts.type == BT_CHARACTER && !expr1->ts.deferred + && !(TREE_CODE (rse.string_length) == VAR_DECL + || TREE_CODE (rse.string_length) == PARM_DECL + || TREE_CODE (rse.string_length) == INDIRECT_REF)) string_length = gfc_evaluate_now (rse.string_length, &rse.pre); else if (expr2->ts.type == BT_CHARACTER) string_length = rse.string_length; @@ -9277,7 +9283,32 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, lse.string_length = string_length; } else - gfc_conv_expr (&lse, expr1); + { + gfc_conv_expr (&lse, expr1); + if (gfc_option.rtcheck & GFC_RTCHECK_MEM + && gfc_expr_attr (expr1).allocatable + && expr1->rank + && !expr2->rank) + { + tree cond; + const char* msg; + + tmp = expr1->symtree->n.sym->backend_decl; + if (POINTER_TYPE_P (TREE_TYPE (tmp))) + tmp = build_fold_indirect_ref_loc (input_location, tmp); + + if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp))) + tmp = gfc_conv_descriptor_data_get (tmp); + else + tmp = TREE_OPERAND (lse.expr, 0); + + cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, + tmp, build_int_cst (TREE_TYPE (tmp), 0)); + msg = _("Assignment of scalar to unallocated array"); + gfc_trans_runtime_check (true, false, cond, &loop.pre, + &expr1->where, msg); + } + } /* Assignments of scalar derived types with allocatable components to arrays must be done with a deep copy and the rhs temporary diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 70a61cc5c86..310d2cdb917 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -1437,7 +1437,7 @@ gfc_trans_critical (gfc_code *code) tree_cons (NULL_TREE, tmp, NULL_TREE), NULL_TREE); ASM_VOLATILE_P (tmp) = 1; - + gfc_add_expr_to_block (&block, tmp); } @@ -5298,7 +5298,6 @@ gfc_trans_allocate (gfc_code * code) tree label_finish; tree memsz; tree al_vptr, al_len; - tree def_str_len = NULL_TREE; /* If an expr3 is present, then store the tree for accessing its _vptr, and _len components in the variables, respectively. The element size, i.e. _vptr%size, is stored in expr3_esize. Any of @@ -5688,7 +5687,6 @@ gfc_trans_allocate (gfc_code * code) expr3_esize = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (se_sz.expr), tmp, se_sz.expr); - def_str_len = gfc_evaluate_now (se_sz.expr, &block); } } @@ -5741,16 +5739,6 @@ gfc_trans_allocate (gfc_code * code) se.want_pointer = 1; se.descriptor_only = 1; - if (expr->ts.type == BT_CHARACTER - && expr->ts.deferred - && TREE_CODE (expr->ts.u.cl->backend_decl) == VAR_DECL - && def_str_len != NULL_TREE) - { - tmp = expr->ts.u.cl->backend_decl; - gfc_add_modify (&block, tmp, - fold_convert (TREE_TYPE (tmp), def_str_len)); - } - gfc_conv_expr (&se, expr); if (expr->ts.type == BT_CHARACTER && expr->ts.deferred) /* se.string_length now stores the .string_length variable of expr @@ -5888,6 +5876,20 @@ gfc_trans_allocate (gfc_code * code) /* Prevent setting the length twice. */ al_len_needs_set = false; } + else if (expr->ts.type == BT_CHARACTER && al_len != NULL_TREE + && code->ext.alloc.ts.u.cl->length) + { + /* Cover the cases where a string length is explicitly + specified by a type spec for deferred length character + arrays or unlimited polymorphic objects without a + source= or mold= expression. */ + gfc_init_se (&se_sz, NULL); + gfc_conv_expr (&se_sz, code->ext.alloc.ts.u.cl->length); + gfc_add_modify (&block, al_len, + fold_convert (TREE_TYPE (al_len), + se_sz.expr)); + al_len_needs_set = false; + } } gfc_add_block_to_block (&block, &se.pre); diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 12cce4d5955..f3d084194de 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -1045,6 +1045,8 @@ gfc_get_character_type (int kind, gfc_charlen * cl) tree len; len = (cl == NULL) ? NULL_TREE : cl->backend_decl; + if (len && POINTER_TYPE_P (TREE_TYPE (len))) + len = build_fold_indirect_ref (len); return gfc_get_character_type_len (kind, len); } diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index 44b85e855fe..e71430baeb8 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -335,10 +335,13 @@ gfc_build_array_ref (tree base, tree offset, tree decl, tree vptr) references. */ if (type && TREE_CODE (type) == ARRAY_TYPE && TYPE_MAXVAL (TYPE_DOMAIN (type)) != NULL_TREE - && TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == VAR_DECL + && (TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == VAR_DECL + || TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == INDIRECT_REF) && decl - && DECL_CONTEXT (TYPE_MAXVAL (TYPE_DOMAIN (type))) - == DECL_CONTEXT (decl)) + && (TREE_CODE (TYPE_MAXVAL (TYPE_DOMAIN (type))) == INDIRECT_REF + || TREE_CODE (decl) == FUNCTION_DECL + || DECL_CONTEXT (TYPE_MAXVAL (TYPE_DOMAIN (type))) + == DECL_CONTEXT (decl))) span = TYPE_MAXVAL (TYPE_DOMAIN (type)); else span = NULL_TREE; @@ -354,7 +357,8 @@ gfc_build_array_ref (tree base, tree offset, tree decl, tree vptr) and reference the element with pointer arithmetic. */ if ((decl && (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL - || TREE_CODE (decl) == PARM_DECL) + || TREE_CODE (decl) == PARM_DECL + || TREE_CODE (decl) == FUNCTION_DECL) && ((GFC_DECL_SUBREF_ARRAY_P (decl) && !integer_zerop (GFC_DECL_SPAN (decl))) || GFC_DECL_CLASS (decl) diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c index 24f9b278e4c..46ee7a75b76 100644 --- a/gcc/gimple-ssa-strength-reduction.c +++ b/gcc/gimple-ssa-strength-reduction.c @@ -2230,7 +2230,7 @@ create_phi_basis (slsr_cand_t c, gimple *from_phi, tree basis_name, slsr_cand_t basis = lookup_cand (c->basis); int nargs = gimple_phi_num_args (from_phi); basic_block phi_bb = gimple_bb (from_phi); - slsr_cand_t phi_cand = base_cand_from_table (gimple_phi_result (from_phi)); + slsr_cand_t phi_cand = *stmt_cand_map->get (from_phi); auto_vec phi_args (nargs); /* Process each argument of the existing phi that represents @@ -2339,7 +2339,7 @@ phi_add_costs (gimple *phi, slsr_cand_t c, int one_add_cost) { unsigned i; int cost = 0; - slsr_cand_t phi_cand = base_cand_from_table (gimple_phi_result (phi)); + slsr_cand_t phi_cand = *stmt_cand_map->get (phi); /* If we work our way back to a phi that isn't dominated by the hidden basis, this isn't a candidate for replacement. Indicate this by @@ -2550,7 +2550,7 @@ static void record_phi_increments (slsr_cand_t basis, gimple *phi) { unsigned i; - slsr_cand_t phi_cand = base_cand_from_table (gimple_phi_result (phi)); + slsr_cand_t phi_cand = *stmt_cand_map->get (phi); for (i = 0; i < gimple_phi_num_args (phi); i++) { @@ -2622,7 +2622,7 @@ phi_incr_cost (slsr_cand_t c, const widest_int &incr, gimple *phi, unsigned i; int cost = 0; slsr_cand_t basis = lookup_cand (c->basis); - slsr_cand_t phi_cand = base_cand_from_table (gimple_phi_result (phi)); + slsr_cand_t phi_cand = *stmt_cand_map->get (phi); for (i = 0; i < gimple_phi_num_args (phi); i++) { @@ -2966,7 +2966,7 @@ ncd_with_phi (slsr_cand_t c, const widest_int &incr, gphi *phi, { unsigned i; slsr_cand_t basis = lookup_cand (c->basis); - slsr_cand_t phi_cand = base_cand_from_table (gimple_phi_result (phi)); + slsr_cand_t phi_cand = *stmt_cand_map->get (phi); for (i = 0; i < gimple_phi_num_args (phi); i++) { @@ -3176,7 +3176,7 @@ all_phi_incrs_profitable (slsr_cand_t c, gimple *phi) { unsigned i; slsr_cand_t basis = lookup_cand (c->basis); - slsr_cand_t phi_cand = base_cand_from_table (gimple_phi_result (phi)); + slsr_cand_t phi_cand = *stmt_cand_map->get (phi); for (i = 0; i < gimple_phi_num_args (phi); i++) { diff --git a/gcc/gimple.c b/gcc/gimple.c index 6442c647eb9..850e54669cd 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -1945,6 +1945,11 @@ gimple_could_trap_p_1 (gimple *s, bool include_mem, bool include_stores) && TYPE_OVERFLOW_TRAPS (t)), div)); + case GIMPLE_COND: + t = TREE_TYPE (gimple_cond_lhs (s)); + return operation_could_trap_p (gimple_cond_code (s), + FLOAT_TYPE_P (t), false, NULL_TREE); + default: break; } diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index d0199350c1b..1f1e763ae36 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -5599,8 +5599,8 @@ autopref_multipass_init (const rtx_insn *insn, int write) int i = 0; rtx prev_base = NULL_RTX; - int min_offset; - int max_offset; + int min_offset = 0; + int max_offset = 0; for (i = 0; i < n_elems; i++) { diff --git a/gcc/hash-table.h b/gcc/hash-table.h index 2c52a4a653f..e925e1e12d6 100644 --- a/gcc/hash-table.h +++ b/gcc/hash-table.h @@ -390,8 +390,8 @@ public: /* Return the current number of elements in this hash table. */ size_t elements_with_deleted () const { return m_n_elements; } - /* This function clears all entries in the given hash table. */ - void empty (); + /* This function clears all entries in this hash table. */ + void empty () { if (elements ()) empty_slow (); } /* This function clears a specified SLOT in a hash table. It is useful when you've already done the lookup and don't want to do it @@ -499,6 +499,8 @@ private: template friend void gt_cleare_cache (hash_table *); + void empty_slow (); + value_type *alloc_entries (size_t n CXX_MEM_STAT_INFO) const; value_type *find_empty_slot_for_expand (hashval_t); void expand (); @@ -755,9 +757,11 @@ hash_table::expand () ggc_free (oentries); } +/* Implements empty() in cases where it isn't a no-op. */ + template class Allocator> void -hash_table::empty () +hash_table::empty_slow () { size_t size = m_size; value_type *entries = m_entries; diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c index 1dbba93609f..fa0a579d74c 100644 --- a/gcc/lra-spills.c +++ b/gcc/lra-spills.c @@ -396,17 +396,19 @@ assign_stack_slot_num_and_sort_pseudos (int *pseudo_regnos, int n) /* Recursively process LOC in INSN and change spilled pseudos to the corresponding memory or spilled hard reg. Ignore spilled pseudos - created from the scratches. */ -static void + created from the scratches. Return true if the pseudo nrefs equal + to 0 (don't change the pseudo in this case). Otherwise return false. */ +static bool remove_pseudos (rtx *loc, rtx_insn *insn) { int i; rtx hard_reg; const char *fmt; enum rtx_code code; - + bool res = false; + if (*loc == NULL_RTX) - return; + return res; code = GET_CODE (*loc); if (code == REG && (i = REGNO (*loc)) >= FIRST_PSEUDO_REGISTER && lra_get_regno_hard_regno (i) < 0 @@ -416,6 +418,9 @@ remove_pseudos (rtx *loc, rtx_insn *insn) into scratches back. */ && ! lra_former_scratch_p (i)) { + if (lra_reg_info[i].nrefs == 0 + && pseudo_slots[i].mem == NULL && spill_hard_reg[i] == NULL) + return true; if ((hard_reg = spill_hard_reg[i]) != NULL_RTX) *loc = copy_rtx (hard_reg); else @@ -425,22 +430,23 @@ remove_pseudos (rtx *loc, rtx_insn *insn) false, false, 0, true); *loc = x != pseudo_slots[i].mem ? x : copy_rtx (x); } - return; + return res; } fmt = GET_RTX_FORMAT (code); for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) { if (fmt[i] == 'e') - remove_pseudos (&XEXP (*loc, i), insn); + res = remove_pseudos (&XEXP (*loc, i), insn) || res; else if (fmt[i] == 'E') { int j; for (j = XVECLEN (*loc, i) - 1; j >= 0; j--) - remove_pseudos (&XVECEXP (*loc, i, j), insn); + res = remove_pseudos (&XVECEXP (*loc, i, j), insn) || res; } } + return res; } /* Convert spilled pseudos into their stack slots or spill hard regs, @@ -450,7 +456,7 @@ static void spill_pseudos (void) { basic_block bb; - rtx_insn *insn; + rtx_insn *insn, *curr; int i; bitmap_head spilled_pseudos, changed_insns; @@ -467,52 +473,70 @@ spill_pseudos (void) } FOR_EACH_BB_FN (bb, cfun) { - FOR_BB_INSNS (bb, insn) - if (bitmap_bit_p (&changed_insns, INSN_UID (insn))) - { - rtx *link_loc, link; - remove_pseudos (&PATTERN (insn), insn); - if (CALL_P (insn)) - remove_pseudos (&CALL_INSN_FUNCTION_USAGE (insn), insn); - for (link_loc = ®_NOTES (insn); - (link = *link_loc) != NULL_RTX; - link_loc = &XEXP (link, 1)) - { - switch (REG_NOTE_KIND (link)) - { - case REG_FRAME_RELATED_EXPR: - case REG_CFA_DEF_CFA: - case REG_CFA_ADJUST_CFA: - case REG_CFA_OFFSET: - case REG_CFA_REGISTER: - case REG_CFA_EXPRESSION: - case REG_CFA_RESTORE: - case REG_CFA_SET_VDRAP: - remove_pseudos (&XEXP (link, 0), insn); - break; - default: - break; - } - } - if (lra_dump_file != NULL) - fprintf (lra_dump_file, - "Changing spilled pseudos to memory in insn #%u\n", - INSN_UID (insn)); - lra_push_insn (insn); - if (lra_reg_spill_p || targetm.different_addr_displacement_p ()) - lra_set_used_insn_alternative (insn, -1); - } - else if (CALL_P (insn)) - /* Presence of any pseudo in CALL_INSN_FUNCTION_USAGE does - not affect value of insn_bitmap of the corresponding - lra_reg_info. That is because we don't need to reload - pseudos in CALL_INSN_FUNCTION_USAGEs. So if we process - only insns in the insn_bitmap of given pseudo here, we - can miss the pseudo in some - CALL_INSN_FUNCTION_USAGEs. */ - remove_pseudos (&CALL_INSN_FUNCTION_USAGE (insn), insn); - bitmap_and_compl_into (df_get_live_in (bb), &spilled_pseudos); - bitmap_and_compl_into (df_get_live_out (bb), &spilled_pseudos); + FOR_BB_INSNS_SAFE (bb, insn, curr) + { + bool removed_pseudo_p = false; + + if (bitmap_bit_p (&changed_insns, INSN_UID (insn))) + { + rtx *link_loc, link; + + removed_pseudo_p = remove_pseudos (&PATTERN (insn), insn); + if (CALL_P (insn) + && remove_pseudos (&CALL_INSN_FUNCTION_USAGE (insn), insn)) + removed_pseudo_p = true; + for (link_loc = ®_NOTES (insn); + (link = *link_loc) != NULL_RTX; + link_loc = &XEXP (link, 1)) + { + switch (REG_NOTE_KIND (link)) + { + case REG_FRAME_RELATED_EXPR: + case REG_CFA_DEF_CFA: + case REG_CFA_ADJUST_CFA: + case REG_CFA_OFFSET: + case REG_CFA_REGISTER: + case REG_CFA_EXPRESSION: + case REG_CFA_RESTORE: + case REG_CFA_SET_VDRAP: + if (remove_pseudos (&XEXP (link, 0), insn)) + removed_pseudo_p = true; + break; + default: + break; + } + } + if (lra_dump_file != NULL) + fprintf (lra_dump_file, + "Changing spilled pseudos to memory in insn #%u\n", + INSN_UID (insn)); + lra_push_insn (insn); + if (lra_reg_spill_p || targetm.different_addr_displacement_p ()) + lra_set_used_insn_alternative (insn, -1); + } + else if (CALL_P (insn) + /* Presence of any pseudo in CALL_INSN_FUNCTION_USAGE + does not affect value of insn_bitmap of the + corresponding lra_reg_info. That is because we + don't need to reload pseudos in + CALL_INSN_FUNCTION_USAGEs. So if we process only + insns in the insn_bitmap of given pseudo here, we + can miss the pseudo in some + CALL_INSN_FUNCTION_USAGEs. */ + && remove_pseudos (&CALL_INSN_FUNCTION_USAGE (insn), insn)) + removed_pseudo_p = true; + if (removed_pseudo_p) + { + lra_assert (DEBUG_INSN_P (insn)); + lra_set_insn_deleted (insn); + if (lra_dump_file != NULL) + fprintf (lra_dump_file, + "Debug insn #%u is deleted as containing removed pseudo\n", + INSN_UID (insn)); + } + bitmap_and_compl_into (df_get_live_in (bb), &spilled_pseudos); + bitmap_and_compl_into (df_get_live_out (bb), &spilled_pseudos); + } } bitmap_clear (&spilled_pseudos); bitmap_clear (&changed_insns); @@ -548,12 +572,14 @@ lra_spill (void) if (lra_reg_info[i].nrefs != 0 && lra_get_regno_hard_regno (i) < 0 /* We do not want to assign memory for former scratches. */ && ! lra_former_scratch_p (i)) - { - spill_hard_reg[i] = NULL_RTX; - pseudo_regnos[n++] = i; - } + pseudo_regnos[n++] = i; lra_assert (n > 0); pseudo_slots = XNEWVEC (struct pseudo_slot, regs_num); + for (i = FIRST_PSEUDO_REGISTER; i < regs_num; i++) + { + spill_hard_reg[i] = NULL_RTX; + pseudo_slots[i].mem = NULL_RTX; + } slots = XNEWVEC (struct slot, regs_num); /* Sort regnos according their usage frequencies. */ qsort (pseudo_regnos, n, sizeof (int), regno_freq_compare); diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 352fe17eecb..ae2aba22e2f 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,14 @@ +2016-01-12 Jan Hubicka + + PR lto/69003 + * lto-partition.c (rename_statics): Fix pasto. + +2016-01-18 Richard Biener + + PR lto/69337 + * lto-symtab.c (lto_symtab_merge): Return early for mismatched + function vs. variable. + 2016-01-12 Richard Biener PR lto/69077 diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 0a5617086c2..eb28fed625c 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -1096,8 +1096,8 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node *node) IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (s->get_alias_target()->decl)))) && ((s->real_symbol_p () - && !DECL_EXTERNAL (node->decl) - && !TREE_PUBLIC (node->decl)) + && !DECL_EXTERNAL (s->decl) + && !TREE_PUBLIC (s->decl)) || may_need_named_section_p (encoder, s)) && (!encoder || lto_symtab_encoder_lookup (encoder, s) != LCC_NOT_FOUND)) diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index a6f6d01dda1..b22dea87376 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -303,6 +303,9 @@ lto_symtab_merge (symtab_node *prevailing, symtab_node *entry) if (prevailing_decl == decl) return true; + if (TREE_CODE (decl) != TREE_CODE (prevailing_decl)) + return false; + /* Merge decl state in both directions, we may still end up using the new decl. */ TREE_ADDRESSABLE (prevailing_decl) |= TREE_ADDRESSABLE (decl); diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 5b4082cb6a5..cb2ef767c1e 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -12108,10 +12108,14 @@ expand_omp_atomic_fetch_op (basic_block load_bb, gcc_assert (gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_ATOMIC_STORE); gsi_remove (&gsi, true); gsi = gsi_last_bb (store_bb); + stmt = gsi_stmt (gsi); gsi_remove (&gsi, true); if (gimple_in_ssa_p (cfun)) - update_ssa (TODO_update_ssa_no_phi); + { + release_defs (stmt); + update_ssa (TODO_update_ssa_no_phi); + } return true; } @@ -12485,7 +12489,7 @@ replace_oacc_fn_attrib (tree fn, tree dims) function attribute. Push any that are non-constant onto the ARGS list, along with an appropriate GOMP_LAUNCH_DIM tag. */ -static void +void set_oacc_fn_attrib (tree fn, tree clauses, vec *args) { /* Must match GOMP_DIM ordering. */ @@ -12627,7 +12631,7 @@ mark_loops_in_oacc_kernels_region (basic_block region_entry, /* Don't parallelize the kernels region if it contains more than one outer loop. */ unsigned int nr_outer_loops = 0; - struct loop *single_outer; + struct loop *single_outer = NULL; for (struct loop *loop = outer->inner; loop != NULL; loop = loop->next) { gcc_assert (loop_outer (loop) == outer); diff --git a/gcc/omp-low.h b/gcc/omp-low.h index 3459c1b7c7a..64caef8db69 100644 --- a/gcc/omp-low.h +++ b/gcc/omp-low.h @@ -33,6 +33,7 @@ extern tree omp_member_access_dummy_var (tree); extern void replace_oacc_fn_attrib (tree, tree); extern tree build_oacc_routine_dims (tree); extern tree get_oacc_fn_attrib (tree); +extern void set_oacc_fn_attrib (tree, tree, vec *); extern int get_oacc_ifn_dim_arg (const gimple *); extern int get_oacc_fn_dim_size (tree, int); diff --git a/gcc/passes.def b/gcc/passes.def index a6a171982a2..a6dae769121 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -124,7 +124,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_lim); NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */); NEXT_PASS (pass_dce); - /* pass_parallelize_loops_oacc_kernels */ + NEXT_PASS (pass_parallelize_loops, true /* oacc_kernels_p */); NEXT_PASS (pass_expand_omp_ssa); NEXT_PASS (pass_rebuild_cgraph_edges); POP_INSERT_PASSES () @@ -273,10 +273,8 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_dce); POP_INSERT_PASSES () NEXT_PASS (pass_iv_canon); - NEXT_PASS (pass_parallelize_loops); - PUSH_INSERT_PASSES_WITHIN (pass_parallelize_loops) - NEXT_PASS (pass_expand_omp_ssa); - POP_INSERT_PASSES () + NEXT_PASS (pass_parallelize_loops, false /* oacc_kernels_p */); + NEXT_PASS (pass_expand_omp_ssa); NEXT_PASS (pass_ch_vect); NEXT_PASS (pass_if_conversion); /* pass_vectorize must immediately follow pass_if_conversion. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bc6105d922e..da5bfa931f1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,242 @@ +2016-01-18 David Malcolm + + PR testsuite/69181 + * gcc.dg/pr69181-1.c: New test file. + * gcc.dg/pr69181-2.c: New test file. + * lib/gcc-dg.exp (dg-test): Consolidate post-test cleanup of + globals by moving it to... + (cleanup-after-saved-dg-test): ...this new function. Add + "global additional_sources_used". Add reset of global + multiline_expected_outputs to the empty list. + * lib/multiline.exp (_multiline_expected_outputs): Rename this + global to... + (multiline_expected_outputs): ...this, and updated comments to + note that it is modified from gcc-dg.exp. + (dg-end-multiline-output): Update for the above renaming. + (handle-multiline-outputs): Likewise. Remove the clearing + of the expected outputs to the empty list. + +2016-01-18 Richard Biener + + PR tree-optimization/69297 + * gcc.dg/vect/costmodel/x86_64/costmodel-pr69297.c: New testcase. + +2016-01-18 Joseph Myers + + * gcc.target/mips/mips-3d-1.c: Use forbid_cpu=octeon.* in + dg-options. + * gcc.target/mips/mips-3d-2.c: Likewise. + * gcc.target/mips/mips-3d-3.c: Likewise. + * gcc.target/mips/mips-3d-4.c: Likewise. + * gcc.target/mips/mips-3d-5.c: Likewise. + * gcc.target/mips/mips-3d-6.c: Likewise. + * gcc.target/mips/mips-3d-7.c: Likewise. + * gcc.target/mips/mips-3d-8.c: Likewise. + * gcc.target/mips/mips-3d-9.c: Likewise. + * gcc.target/mips/mips-ps-1.c: Likewise. + * gcc.target/mips/mips-ps-2.c: Likewise. + * gcc.target/mips/mips-ps-3.c: Likewise. + * gcc.target/mips/mips-ps-4.c: Likewise. + * gcc.target/mips/mips-ps-5.c: Likewise. + * gcc.target/mips/mips-ps-6.c: Likewise. + * gcc.target/mips/mips-ps-7.c: Likewise. + * gcc.target/mips/mips-ps-type.c: Likewise. + * gcc.target/mips/mips-ps-type-2.c: Likewise. + * gcc.target/mips/mips16-attributes-6.c: Likewise. + +2016-01-18 Tom de Vries + + * c-c++-common/goacc/kernels-counter-vars-function-scope.c: New test. + * c-c++-common/goacc/kernels-double-reduction.c: New test. + * c-c++-common/goacc/kernels-empty.c: New test. + * c-c++-common/goacc/kernels-eternal.c: New test. + * c-c++-common/goacc/kernels-loop-2.c: New test. + * c-c++-common/goacc/kernels-loop-3.c: New test. + * c-c++-common/goacc/kernels-loop-data-2.c: New test. + * c-c++-common/goacc/kernels-loop-data-enter-exit-2.c: New test. + * c-c++-common/goacc/kernels-loop-data-enter-exit.c: New test. + * c-c++-common/goacc/kernels-loop-data-update.c: New test. + * c-c++-common/goacc/kernels-loop-data.c: New test. + * c-c++-common/goacc/kernels-loop-g.c: New test. + * c-c++-common/goacc/kernels-loop-mod-not-zero.c: New test. + * c-c++-common/goacc/kernels-loop-n.c: New test. + * c-c++-common/goacc/kernels-loop-nest.c: New test. + * c-c++-common/goacc/kernels-loop.c: New test. + * c-c++-common/goacc/kernels-noreturn.c: New test. + * c-c++-common/goacc/kernels-one-counter-var.c: New test. + * c-c++-common/goacc/kernels-parallel-loop-data-enter-exit.c: New test. + * c-c++-common/goacc/kernels-reduction.c: New test. + +2016-01-18 Tom de Vries + + * gcc.dg/autopar/outer-1.c: Update for new parloops instantiation. + * gcc.dg/autopar/outer-2.c: Same. + * gcc.dg/autopar/outer-3.c: Same. + * gcc.dg/autopar/outer-4.c: Same. + * gcc.dg/autopar/outer-5.c: Same. + * gcc.dg/autopar/outer-6.c: Same. + * gcc.dg/autopar/parallelization-1.c: Same. + * gcc.dg/autopar/parloops-exit-first-loop-alt-2.c: Same. + * gcc.dg/autopar/parloops-exit-first-loop-alt-3.c: Same. + * gcc.dg/autopar/parloops-exit-first-loop-alt-4.c: Same. + * gcc.dg/autopar/parloops-exit-first-loop-alt-5.c: Same. + * gcc.dg/autopar/parloops-exit-first-loop-alt-6.c: Same. + * gcc.dg/autopar/parloops-exit-first-loop-alt-7.c: Same. + * gcc.dg/autopar/parloops-exit-first-loop-alt-pr66652.c: Same. + * gcc.dg/autopar/parloops-exit-first-loop-alt.c: Same. + * gcc.dg/autopar/pr39500-1.c: Same. + * gcc.dg/autopar/pr39500-2.c: Same. + * gcc.dg/autopar/pr46193.c: Same. + * gcc.dg/autopar/pr46194.c: Same. + * gcc.dg/autopar/pr49580.c: Same. + * gcc.dg/autopar/pr49960-1.c: Same. + * gcc.dg/autopar/pr49960.c: Same. + * gcc.dg/autopar/pr68373.c: Same. + * gcc.dg/autopar/reduc-1.c: Same. + * gcc.dg/autopar/reduc-1char.c: Same. + * gcc.dg/autopar/reduc-1short.c: Same. + * gcc.dg/autopar/reduc-2.c: Same. + * gcc.dg/autopar/reduc-2char.c: Same. + * gcc.dg/autopar/reduc-2short.c: Same. + * gcc.dg/autopar/reduc-3.c: Same. + * gcc.dg/autopar/reduc-4.c: Same. + * gcc.dg/autopar/reduc-6.c: Same. + * gcc.dg/autopar/reduc-7.c: Same. + * gcc.dg/autopar/reduc-8.c: Same. + * gcc.dg/autopar/reduc-9.c: Same. + * gcc.dg/autopar/uns-outer-4.c: Same. + * gcc.dg/autopar/uns-outer-5.c: Same. + * gcc.dg/autopar/uns-outer-6.c: Same. + * gfortran.dg/parloops-exit-first-loop-alt-2.f95: Same. + * gfortran.dg/parloops-exit-first-loop-alt.f95: Same. + +2016-01-18 Alan Lawrence + + PR target/63679 + * gcc.dg/tree-ssa/ssa-dom-cse-2.c: Remove XFAIL for powerpc(32), hppa, + aarch64, sparc, s390. Add --param sra-max-scalarization-size-Ospeed. + +2016-01-18 Alan Lawrence + + PR target/63679 + * gcc.dg/tree-ssa/ssa-dom-cse-5.c: New. + * gcc.dg/tree-ssa/ssa-dom-cse-6.c: New. + * gcc.dg/tree-ssa/ssa-dom-cse-7.c: New. + +2016-01-18 Alan Lawrence + + PR target/63679 + * gcc.dg/tree-ssa/sra-17.c: New. + * gcc.dg/tree-ssa/sra-18.c: New. + +2016-01-18 Ilya Enkovich + + * gcc.target/i386/pr65105-5.c: Adjust to andn generation. + +2016-01-18 Eric Botcazou + + * gnat.dg/inline12.adb: New test. + +2016-01-18 Bin Cheng + + PR tree-optimization/66797 + * gcc.c-torture/execute/pr65447.c: Relax check condition. + +2016-01-18 Richard Biener + + PR tree-optimization/69170 + * gcc.dg/torture/pr69170.c: New testcase. + +2016-01-17 John David Anglin + + * gcc.dg/torture/builtin-integral-1.c: Require c99_runtime. + +2016-01-16 Tom de Vries + + * c-c++-common/goacc/kernels-alias-ipa-pta-4.c: New test. + +2016-01-16 Tom de Vries + + * gcc.dg/parloops-exit-first-loop-alt.c: Move ... + * gcc.dg/autopar/parloops-exit-first-loop-alt.c: ... here. Remove + redundant dg-require-effective-target pthread. + * gcc.dg/parloops-exit-first-loop-alt-2.c: Same. + * gcc.dg/parloops-exit-first-loop-alt-3.c: Same. + * gcc.dg/parloops-exit-first-loop-alt-4.c: Same. + * gcc.dg/parloops-exit-first-loop-alt-5.c: Same. + * gcc.dg/parloops-exit-first-loop-alt-6.c: Same. + * gcc.dg/parloops-exit-first-loop-alt-7.c: Same. + * gcc.dg/parloops-exit-first-loop-alt-pr66652.c: Same. + +2016-01-16 David Edelsohn + + PR target/68609 + * gcc.target/powerpc/recip-6.c: Enable on AIX. + * gcc.target/powerpc/recip-7.c: Same. + +2016-01-16 Patrick Palka + + PR c++/69091 + * g++.dg/template/pr69091.C: New test. + +2016-01-16 Patrick Palka + + * c-c++-common/cilk-plus/AN/an-if.c: Check that the original + dump does not contain an error_mark_node. + * c-c++-common/cilk-plus/CK/pr60469.c: Likewise. + * c-c++-common/cilk-plus/AN/fn_ptr-2.c: New xfail'd test. + +2016-01-16 Patrick Palka + + PR c++/68936 + * g++.dg/template/pr68936.C: New test. + +2016-01-15 David Edelsohn + + PR target/68609 + * gcc.target/powerpc/recip-1.c: Adjust for Goldschmidt's Algorithm. + * gcc.target/powerpc/recip-2.c: Same. + * gcc.target/powerpc/recip-3.c: Same. + * gcc.target/powerpc/recip-4.c: Same. + * gcc.target/powerpc/recip-sqrtf.c: Same. + +2016-01-15 Jeff Law + + PR tree-optimization/69270 + * gcc.dg/tree-ssa/pr69270-2.c: New test. + * gcc.dg/tree-ssa/pr69270-3.c: New test. + +2016-01-15 Paul Thomas + + PR fortran/49630 + * gfortran.dg/deferred_character_13.f90: New test for the fix + of comment 3 of the PR. + + PR fortran/54070 + * gfortran.dg/deferred_character_8.f90: New test + * gfortran.dg/allocate_error_5.f90: New test + + PR fortran/60593 + * gfortran.dg/deferred_character_10.f90: New test + + PR fortran/60795 + * gfortran.dg/deferred_character_14.f90: New test + + PR fortran/61147 + * gfortran.dg/deferred_character_11.f90: New test + + PR fortran/64324 + * gfortran.dg/deferred_character_9.f90: New test + +2016-01-15 Vladimir Makarov + + PR rtl-optimization/69030 + * gcc.target/i386/pr69030.c: New. + +2016-01-15 Kyrylo Tkachov + + * gcc.target/aarch64/target_attr_17.c: New test. + 2016-01-15 Richard Biener PR tree-optimization/66856 diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/an-if.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/an-if.c index 4bf85b5ca93..4ac46abc404 100644 --- a/gcc/testsuite/c-c++-common/cilk-plus/AN/an-if.c +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/an-if.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-fcilkplus" } */ +/* { dg-options "-fcilkplus -fdump-tree-original" } */ #if HAVE_IO #include @@ -46,3 +46,6 @@ int main() { } return 0; } + +/* The C++ FE once emitted a bogus error_mark_node for this test case. */ +/* { dg-final { scan-tree-dump-not "<<< error >>>" "original" } } */ diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/fn_ptr-2.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/fn_ptr-2.c new file mode 100644 index 00000000000..4e1990fcc34 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/fn_ptr-2.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-fcilkplus" } */ + +typedef void (*f) (void *); +f b[1024]; +void *c[1024][1024]; + +int +main (void) +{ + (b[:]) (c[:][:]); /* { dg-error "rank mismatch" "" { xfail *-*-* } } */ + return 0; +} + diff --git a/gcc/testsuite/c-c++-common/cilk-plus/CK/pr60469.c b/gcc/testsuite/c-c++-common/cilk-plus/CK/pr60469.c index ca0cf7f68bc..670df17faa2 100644 --- a/gcc/testsuite/c-c++-common/cilk-plus/CK/pr60469.c +++ b/gcc/testsuite/c-c++-common/cilk-plus/CK/pr60469.c @@ -1,6 +1,6 @@ /* PR middle-end/60469 */ /* { dg-do compile } */ -/* { dg-options "-fcilkplus" } */ +/* { dg-options "-fcilkplus -fdump-tree-original" } */ void foo() {} @@ -13,3 +13,6 @@ int main(int argc, char* argv[]) _Cilk_spawn foo(); return 0; } + +/* The C++ FE once emitted a bogus error_mark_node for this test case. */ +/* { dg-final { scan-tree-dump-not "<<< error >>>" "original" } } */ diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-alias-ipa-pta-4.c b/gcc/testsuite/c-c++-common/goacc/kernels-alias-ipa-pta-4.c new file mode 100644 index 00000000000..20b21dcb577 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-alias-ipa-pta-4.c @@ -0,0 +1,21 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-fipa-pta -fdump-tree-optimized" } */ + +void +foo (void) +{ + unsigned int a; + unsigned int b; + unsigned int c; + +#pragma acc kernels pcopyout (a, b, c) + { + a = 0; + b = 1; + c = a; + } +} + +/* { dg-final { scan-tree-dump-times "(?n)= 0;$" 2 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "(?n)= 1;$" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "(?n)= \\*_\[0-9\];$" 0 "optimized" } } */ diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-counter-vars-function-scope.c b/gcc/testsuite/c-c++-common/goacc/kernels-counter-vars-function-scope.c new file mode 100644 index 00000000000..e8b5357cc01 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-counter-vars-function-scope.c @@ -0,0 +1,54 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N (1024 * 512) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + COUNTERTYPE i; + COUNTERTYPE ii; + + a = (unsigned int *)malloc (N * sizeof (unsigned int)); + b = (unsigned int *)malloc (N * sizeof (unsigned int)); + c = (unsigned int *)malloc (N * sizeof (unsigned int)); + + for (i = 0; i < N; i++) + a[i] = i * 2; + + for (i = 0; i < N; i++) + b[i] = i * 4; + +#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) + { + for (ii = 0; ii < N; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (i = 0; i < N; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-double-reduction-n.c b/gcc/testsuite/c-c++-common/goacc/kernels-double-reduction-n.c new file mode 100644 index 00000000000..c39d67458f8 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-double-reduction-n.c @@ -0,0 +1,37 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N 500 + +unsigned int a[N][N]; + +void __attribute__((noinline,noclone)) +foo (unsigned int n) +{ + int i, j; + unsigned int sum = 1; + +#pragma acc kernels copyin (a[0:n]) copy (sum) + { + for (i = 0; i < n; ++i) + for (j = 0; j < n; ++j) + sum += a[i][j]; + } + + if (sum != 5001) + abort (); +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*foo.*._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-double-reduction.c b/gcc/testsuite/c-c++-common/goacc/kernels-double-reduction.c new file mode 100644 index 00000000000..3501d0df152 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-double-reduction.c @@ -0,0 +1,37 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N 500 + +unsigned int a[N][N]; + +void __attribute__((noinline,noclone)) +foo (void) +{ + int i, j; + unsigned int sum = 1; + +#pragma acc kernels copyin (a[0:N]) copy (sum) + { + for (i = 0; i < N; ++i) + for (j = 0; j < N; ++j) + sum += a[i][j]; + } + + if (sum != 5001) + abort (); +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*foo.*._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-empty.c b/gcc/testsuite/c-c++-common/goacc/kernels-empty.c new file mode 100644 index 00000000000..e91b81c8d04 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-empty.c @@ -0,0 +1,6 @@ +void +foo (void) +{ +#pragma acc kernels + ; +} diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-eternal.c b/gcc/testsuite/c-c++-common/goacc/kernels-eternal.c new file mode 100644 index 00000000000..edc17d2960c --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-eternal.c @@ -0,0 +1,11 @@ +int +main (void) +{ +#pragma acc kernels + { + while (1) + ; + } + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop-2.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop-2.c new file mode 100644 index 00000000000..f97584dd22d --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop-2.c @@ -0,0 +1,70 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N (1024 * 512) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + + a = (unsigned int *)malloc (N * sizeof (unsigned int)); + b = (unsigned int *)malloc (N * sizeof (unsigned int)); + c = (unsigned int *)malloc (N * sizeof (unsigned int)); + +#pragma acc kernels copyout (a[0:N]) + { +#ifdef ACC_LOOP + #pragma acc loop +#endif + for (COUNTERTYPE i = 0; i < N; i++) + a[i] = i * 2; + } + +#pragma acc kernels copyout (b[0:N]) + { +#ifdef ACC_LOOP + #pragma acc loop +#endif + for (COUNTERTYPE i = 0; i < N; i++) + b[i] = i * 4; + } + +#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) + { +#ifdef ACC_LOOP + #pragma acc loop +#endif + for (COUNTERTYPE ii = 0; ii < N; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (COUNTERTYPE i = 0; i < N; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} + +/* Check that only three loops are analyzed, and that all can be + parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.1" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.2" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 3 "parloops1" } } */ diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop-3.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop-3.c new file mode 100644 index 00000000000..530d62ab867 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop-3.c @@ -0,0 +1,49 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N (1024 * 512) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int i; + + unsigned int *__restrict c; + + c = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + + for (COUNTERTYPE i = 0; i < N; i++) + c[i] = i * 2; + +#pragma acc kernels copy (c[0:N]) + { +#ifdef ACC_LOOP + #pragma acc loop +#endif + for (COUNTERTYPE ii = 0; ii < N; ii++) + c[ii] = c[ii] + ii + 1; + } + + for (COUNTERTYPE i = 0; i < N; i++) + if (c[i] != i * 2 + i + 1) + abort (); + + free (c); + + return 0; +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ + diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c new file mode 100644 index 00000000000..4f1c2c5cb21 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop-g.c @@ -0,0 +1,17 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-g" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include "kernels-loop.c" + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ + diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop-mod-not-zero.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop-mod-not-zero.c new file mode 100644 index 00000000000..151db518330 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop-mod-not-zero.c @@ -0,0 +1,52 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N ((1024 * 512) + 1) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + + a = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + b = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + c = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + + for (COUNTERTYPE i = 0; i < N; i++) + a[i] = i * 2; + + for (COUNTERTYPE i = 0; i < N; i++) + b[i] = i * 4; + +#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) + { + for (COUNTERTYPE ii = 0; ii < N; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (COUNTERTYPE i = 0; i < N; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop-n.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop-n.c new file mode 100644 index 00000000000..bee5f5a6098 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop-n.c @@ -0,0 +1,56 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N ((1024 * 512) + 1) +#define COUNTERTYPE unsigned int + +int +foo (COUNTERTYPE n) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + + a = (unsigned int *__restrict)malloc (n * sizeof (unsigned int)); + b = (unsigned int *__restrict)malloc (n * sizeof (unsigned int)); + c = (unsigned int *__restrict)malloc (n * sizeof (unsigned int)); + + for (COUNTERTYPE i = 0; i < n; i++) + a[i] = i * 2; + + for (COUNTERTYPE i = 0; i < n; i++) + b[i] = i * 4; + +#pragma acc kernels copyin (a[0:n], b[0:n]) copyout (c[0:n]) + { +#ifdef ACC_LOOP + #pragma acc loop +#endif + for (COUNTERTYPE ii = 0; ii < n; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (COUNTERTYPE i = 0; i < n; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*foo.*._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ + diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop-nest.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop-nest.c new file mode 100644 index 00000000000..ea0e342ffba --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop-nest.c @@ -0,0 +1,39 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +/* Based on autopar/outer-1.c. */ + +#include + +#define N 1000 + +int +main (void) +{ + int x[N][N]; + +#pragma acc kernels copyout (x) + { + for (int ii = 0; ii < N; ii++) + for (int jj = 0; jj < N; jj++) + x[ii][jj] = ii + jj + 3; + } + + for (int i = 0; i < N; i++) + for (int j = 0; j < N; j++) + if (x[i][j] != i + j + 3) + abort (); + + return 0; +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-loop.c b/gcc/testsuite/c-c++-common/goacc/kernels-loop.c new file mode 100644 index 00000000000..ab5dfb9ca03 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-loop.c @@ -0,0 +1,56 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N (1024 * 512) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + + a = (unsigned int *)malloc (N * sizeof (unsigned int)); + b = (unsigned int *)malloc (N * sizeof (unsigned int)); + c = (unsigned int *)malloc (N * sizeof (unsigned int)); + + for (COUNTERTYPE i = 0; i < N; i++) + a[i] = i * 2; + + for (COUNTERTYPE i = 0; i < N; i++) + b[i] = i * 4; + +#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) + { +#ifdef ACC_LOOP + #pragma acc loop +#endif + for (COUNTERTYPE ii = 0; ii < N; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (COUNTERTYPE i = 0; i < N; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ + diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-noreturn.c b/gcc/testsuite/c-c++-common/goacc/kernels-noreturn.c new file mode 100644 index 00000000000..1a8cc6778e8 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-noreturn.c @@ -0,0 +1,12 @@ +int +main (void) +{ + +#pragma acc kernels + { + __builtin_abort (); + } + + return 0; +} + diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-one-counter-var.c b/gcc/testsuite/c-c++-common/goacc/kernels-one-counter-var.c new file mode 100644 index 00000000000..b16a8cd2b1c --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-one-counter-var.c @@ -0,0 +1,54 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define N (1024 * 512) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + COUNTERTYPE i; + + a = (unsigned int *)malloc (N * sizeof (unsigned int)); + b = (unsigned int *)malloc (N * sizeof (unsigned int)); + c = (unsigned int *)malloc (N * sizeof (unsigned int)); + + for (i = 0; i < N; i++) + a[i] = i * 2; + + for (i = 0; i < N; i++) + b[i] = i * 4; + +#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) + { + for (i = 0; i < N; i++) + c[i] = a[i] + b[i]; + } + + for (i = 0; i < N; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*main._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ + diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-reduction.c b/gcc/testsuite/c-c++-common/goacc/kernels-reduction.c new file mode 100644 index 00000000000..61c5df3a626 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/kernels-reduction.c @@ -0,0 +1,36 @@ +/* { dg-additional-options "-O2" } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-fdump-tree-parloops1-all" } */ +/* { dg-additional-options "-fdump-tree-optimized" } */ + +#include + +#define n 10000 + +unsigned int a[n]; + +void __attribute__((noinline,noclone)) +foo (void) +{ + int i; + unsigned int sum = 1; + +#pragma acc kernels copyin (a[0:n]) copy (sum) + { + for (i = 0; i < n; ++i) + sum += a[i]; + } + + if (sum != 5001) + abort (); +} + +/* Check that only one loop is analyzed, and that it can be parallelized. */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops1" } } */ +/* { dg-final { scan-tree-dump-not "FAILED:" "parloops1" } } */ + +/* Check that the loop has been split off into a function. */ +/* { dg-final { scan-tree-dump-times "(?n);; Function .*foo.*._omp_fn.0" 1 "optimized" } } */ + +/* { dg-final { scan-tree-dump-times "(?n)oacc function \\(32," 1 "parloops1" } } */ + diff --git a/gcc/testsuite/g++.dg/template/pr68936.C b/gcc/testsuite/g++.dg/template/pr68936.C new file mode 100644 index 00000000000..ecfc09ed73e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr68936.C @@ -0,0 +1,20 @@ +// PR c++/68936 + +class A {}; + +struct predefined_macros { + struct B { + A (predefined_macros::*generator)(); + }; +}; + +template class C { + void m_fn1(); + predefined_macros predef; +}; + +predefined_macros::B m; + +template void C::m_fn1() { + (predef.*m.generator)(); +} diff --git a/gcc/testsuite/g++.dg/template/pr69091.C b/gcc/testsuite/g++.dg/template/pr69091.C new file mode 100644 index 00000000000..ec7bb256912 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr69091.C @@ -0,0 +1,25 @@ +// PR c++/69091 +// { dg-do compile { target c++14 } } + +template +struct Option {}; + +template +auto operator|(Option, OptionsRhs) { + return Value; +} + +enum canine_t { no, yes }; +Option cat; +Option dog; + +template +void f(T) { + cat | dog; +} + +struct A {}; +int main() { + f(A{}); + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/Wnonnull2.C b/gcc/testsuite/g++.dg/warn/Wnonnull2.C new file mode 100644 index 00000000000..6757437de12 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wnonnull2.C @@ -0,0 +1,9 @@ +// PR c++/68767 +// { dg-options "-Wnonnull" } + +extern int len (const char*) __attribute__ ((__nonnull__ (1))); + +int f (int x) +{ + return len ((x ? "x" : 0) ? (x ? "x" : 0) : "x"); +} diff --git a/gcc/testsuite/gcc.dg/autopar/outer-1.c b/gcc/testsuite/gcc.dg/autopar/outer-1.c index d36b5576c3b..6607ed054ba 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-1.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -27,5 +27,5 @@ int main(void) /* Check that outer loop is parallelized. */ -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-2.c b/gcc/testsuite/gcc.dg/autopar/outer-2.c index fd7c2be9dda..9533e8d8427 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-2.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -27,5 +27,5 @@ int main(void) return 0; } -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-3.c b/gcc/testsuite/gcc.dg/autopar/outer-3.c index 55454a43eaa..130a9743b31 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-3.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -27,5 +27,5 @@ int main(void) /* Check that outer loop is parallelized. */ -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-4.c b/gcc/testsuite/gcc.dg/autopar/outer-4.c index 681cf856e3f..b002b0e80da 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-4.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-4.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -25,6 +25,6 @@ parloop (int N) } -/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 0 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 0 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-5.c b/gcc/testsuite/gcc.dg/autopar/outer-5.c index d6e0dd32836..84b2de17043 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-5.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-5.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -44,5 +44,5 @@ int main(void) return 0; } -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/outer-6.c b/gcc/testsuite/gcc.dg/autopar/outer-6.c index 726794c25ca..fff7bce138a 100644 --- a/gcc/testsuite/gcc.dg/autopar/outer-6.c +++ b/gcc/testsuite/gcc.dg/autopar/outer-6.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -44,6 +44,6 @@ int main(void) /* Check that outer loop is parallelized. */ -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 0 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 0 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parallelization-1.c b/gcc/testsuite/gcc.dg/autopar/parallelization-1.c index 222831a9dea..1b400fbfb33 100644 --- a/gcc/testsuite/gcc.dg/autopar/parallelization-1.c +++ b/gcc/testsuite/gcc.dg/autopar/parallelization-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -27,5 +27,5 @@ int main(void) /* Check that the first loop in parloop got parallelized. */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-2.c b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-2.c new file mode 100644 index 00000000000..fbd3af80008 --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-2.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ + +/* Constant bound, vector addition. */ + +#define N 1000 + +unsigned int a[N]; +unsigned int b[N]; +unsigned int c[N]; + +void +f (void) +{ + int i; + + for (i = 0; i < N; ++i) + c[i] = a[i] + b[i]; +} + +/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-3.c b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-3.c new file mode 100644 index 00000000000..f7a7323bc95 --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-3.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ + +/* Variable bound, reduction. */ + +unsigned int *a; + +unsigned int +f (unsigned int n, unsigned int *__restrict__ a) +{ + int i; + unsigned int sum = 1; + + for (i = 0; i < n; ++i) + sum += a[i]; + + return sum; +} + +/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-4.c b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-4.c new file mode 100644 index 00000000000..6b1a776cae1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-4.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ + +/* Constant bound, reduction. */ + +#define N 4000 + +unsigned int *a; + +unsigned int +f (void) +{ + int i; + unsigned int sum = 1; + + for (i = 0; i < N; ++i) + sum += a[i]; + + return sum; +} + +/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-5.c b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-5.c new file mode 100644 index 00000000000..f3f8a3b45ca --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-5.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ + +/* Variable bound, vector addition, unsigned loop counter, unsigned bound. */ + +void +f (unsigned int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b, + unsigned int *__restrict__ c) +{ + unsigned int i; + + for (i = 0; i < n; ++i) + c[i] = a[i] + b[i]; +} + +/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-6.c b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-6.c new file mode 100644 index 00000000000..186eab32e9b --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-6.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ + +/* Variable bound, vector addition, unsigned loop counter, signed bound. */ + +void +f (int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b, + unsigned int *__restrict__ c) +{ + unsigned int i; + + for (i = 0; i < n; ++i) + c[i] = a[i] + b[i]; +} + +/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-7.c b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-7.c new file mode 100644 index 00000000000..46c5ac4fd48 --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-7.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ + +/* Variable bound, vector addition, signed loop counter, signed bound. */ + +void +f (int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b, + unsigned int *__restrict__ c) +{ + int i; + + for (i = 0; i < n; ++i) + c[i] = a[i] + b[i]; +} + +/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-pr66652.c b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-pr66652.c new file mode 100644 index 00000000000..a02e183902b --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt-pr66652.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ + +#include +#include +#include + +unsigned int +f (unsigned int n, unsigned int sum) +{ + unsigned int i; + + i = UINT_MAX; + do + { + sum += i % 13; + i++; + } + while (i < n - 1); + + return sum; +} + +/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 1 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 0 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt.c b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt.c new file mode 100644 index 00000000000..dce9c92dd57 --- /dev/null +++ b/gcc/testsuite/gcc.dg/autopar/parloops-exit-first-loop-alt.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ + +/* Variable bound, vector addition, signed loop counter, unsigned bound. */ + +void +f (unsigned int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b, + unsigned int *__restrict__ c) +{ + int i; + + for (i = 0; i < n; ++i) + c[i] = a[i] + b[i]; +} + +/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } */ + diff --git a/gcc/testsuite/gcc.dg/autopar/pr39500-1.c b/gcc/testsuite/gcc.dg/autopar/pr39500-1.c index 33b93b37aba..28f47897b37 100644 --- a/gcc/testsuite/gcc.dg/autopar/pr39500-1.c +++ b/gcc/testsuite/gcc.dg/autopar/pr39500-1.c @@ -1,7 +1,7 @@ /* pr39500: autopar fails to parallel */ /* origin: nemokingdom@gmail.com(LiFeng) */ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details" } */ void abort (void); @@ -24,4 +24,4 @@ int main (void) /* Check that the first loop in parloop got parallelized. */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/pr39500-2.c b/gcc/testsuite/gcc.dg/autopar/pr39500-2.c index 12fa909e07f..98363e4923a 100644 --- a/gcc/testsuite/gcc.dg/autopar/pr39500-2.c +++ b/gcc/testsuite/gcc.dg/autopar/pr39500-2.c @@ -1,7 +1,7 @@ /* pr39500: autopar fails to parallel */ /* origin: nemokingdom@gmail.com(LiFeng) */ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details" } */ int main (void) { @@ -16,4 +16,4 @@ int main (void) /* This loop cannot be parallelized due to a dependence. */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 0 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 0 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/pr46193.c b/gcc/testsuite/gcc.dg/autopar/pr46193.c index 544a5dabcec..36f89c17385 100644 --- a/gcc/testsuite/gcc.dg/autopar/pr46193.c +++ b/gcc/testsuite/gcc.dg/autopar/pr46193.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ extern void abort (void); @@ -35,4 +35,4 @@ foo2 (int count, char **list) return maxaddr; } -/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 2 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 2 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/pr46194.c b/gcc/testsuite/gcc.dg/autopar/pr46194.c index 3daf2ab2d3a..2a184a01ac3 100644 --- a/gcc/testsuite/gcc.dg/autopar/pr46194.c +++ b/gcc/testsuite/gcc.dg/autopar/pr46194.c @@ -1,6 +1,6 @@ /* PR tree-optimization/46194 */ /* { dg-do compile } */ -/* { dg-options "-O -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ +/* { dg-options "-O -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ #define N 1000 int a[N]; @@ -20,4 +20,4 @@ int foo (void) /* This loop cannot be parallelized due to a dependence. */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 0 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 0 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/pr49580.c b/gcc/testsuite/gcc.dg/autopar/pr49580.c index ddb622f6e0d..e2c8be8360a 100644 --- a/gcc/testsuite/gcc.dg/autopar/pr49580.c +++ b/gcc/testsuite/gcc.dg/autopar/pr49580.c @@ -1,6 +1,6 @@ /* PR debug/49580 */ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details" } */ #include #include @@ -33,5 +33,5 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/pr49960-1.c b/gcc/testsuite/gcc.dg/autopar/pr49960-1.c index 34d55529e2b..bd65c22c309 100644 --- a/gcc/testsuite/gcc.dg/autopar/pr49960-1.c +++ b/gcc/testsuite/gcc.dg/autopar/pr49960-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -30,5 +30,5 @@ int main() } /* Check that no loop gets parallelized. */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 0 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 0 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 0 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/pr49960.c b/gcc/testsuite/gcc.dg/autopar/pr49960.c index c4132783198..e3fb04d99c1 100644 --- a/gcc/testsuite/gcc.dg/autopar/pr49960.c +++ b/gcc/testsuite/gcc.dg/autopar/pr49960.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized -fno-partial-inlining" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized -fno-partial-inlining" } */ #include #define MB 100 @@ -50,5 +50,5 @@ void main () /* Check that the outer most loop doesn't get parallelized (thus no loop gets parallelized) */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 0 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 0 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 0 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/pr68373.c b/gcc/testsuite/gcc.dg/autopar/pr68373.c index 8e0f8a5160e..ecac6138637 100644 --- a/gcc/testsuite/gcc.dg/autopar/pr68373.c +++ b/gcc/testsuite/gcc.dg/autopar/pr68373.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops2-details" } */ unsigned int foo (int *a, unsigned int n) @@ -11,4 +11,4 @@ foo (int *a, unsigned int n) return i; } -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-1.c b/gcc/testsuite/gcc.dg/autopar/reduc-1.c index 6e9a2801454..1e5f923376f 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-1.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -66,6 +66,6 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 4 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 4 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-1char.c b/gcc/testsuite/gcc.dg/autopar/reduc-1char.c index 48ead887a9d..0d611b96eae 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-1char.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-1char.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -60,6 +60,6 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 4 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 4 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-1short.c b/gcc/testsuite/gcc.dg/autopar/reduc-1short.c index f3f547cf7e9..92654e34533 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-1short.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-1short.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -59,6 +59,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 4 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 4 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-2.c b/gcc/testsuite/gcc.dg/autopar/reduc-2.c index 2f4883d08e4..b94b2d4eabc 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-2.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -63,6 +63,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 4 "parloops" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops2" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 4 "parloops2" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-2char.c b/gcc/testsuite/gcc.dg/autopar/reduc-2char.c index a2dad446511..d48d9f91039 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-2char.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-2char.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -61,10 +61,10 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops2" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops2" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-2short.c b/gcc/testsuite/gcc.dg/autopar/reduc-2short.c index a50e14f0cb4..f5466f0b5dd 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-2short.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-2short.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -59,8 +59,8 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 3 "parloops2" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops2" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-3.c b/gcc/testsuite/gcc.dg/autopar/reduc-3.c index 0d4baeff185..9ed1c908a9d 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-3.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -50,6 +50,6 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "Detected reduction" 1 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 1 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-4.c b/gcc/testsuite/gcc.dg/autopar/reduc-4.c index 80b15e2852d..fb331ccc6fb 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-4.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-4.c @@ -1,4 +1,4 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized --param parloops-chunk-size=100" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized --param parloops-chunk-size=100" } */ #include "reduc-3.c" diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-6.c b/gcc/testsuite/gcc.dg/autopar/reduc-6.c index 91f679eed04..22a2e6255f4 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-6.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-6.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include #include @@ -56,6 +56,6 @@ int main (void) /* need -ffast-math to parallelize these loops. */ -/* { dg-final { scan-tree-dump-times "Detected reduction" 0 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "FAILED: it is not a part of reduction" 3 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 0 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 1 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "FAILED: it is not a part of reduction" 3 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-7.c b/gcc/testsuite/gcc.dg/autopar/reduc-7.c index 77b99e152ec..efae736db1d 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-7.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-7.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include @@ -84,6 +84,6 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-8.c b/gcc/testsuite/gcc.dg/autopar/reduc-8.c index 18ba03d5632..b3c0cda55c4 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-8.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-8.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include @@ -85,5 +85,5 @@ main (void) } -/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 2 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/reduc-9.c b/gcc/testsuite/gcc.dg/autopar/reduc-9.c index 90f4db2861f..99f9298f193 100644 --- a/gcc/testsuite/gcc.dg/autopar/reduc-9.c +++ b/gcc/testsuite/gcc.dg/autopar/reduc-9.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ #include @@ -84,5 +84,5 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "Detected reduction" 2 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "SUCCESS: may be parallelized" 3 "parloops2" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/uns-outer-4.c b/gcc/testsuite/gcc.dg/autopar/uns-outer-4.c index 5eb67ea74fc..ee4bb82cf9d 100644 --- a/gcc/testsuite/gcc.dg/autopar/uns-outer-4.c +++ b/gcc/testsuite/gcc.dg/autopar/uns-outer-4.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -21,5 +21,5 @@ parloop (int N) g_sum = sum; } -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/uns-outer-5.c b/gcc/testsuite/gcc.dg/autopar/uns-outer-5.c index a929e5dc727..2d93a2daf51 100644 --- a/gcc/testsuite/gcc.dg/autopar/uns-outer-5.c +++ b/gcc/testsuite/gcc.dg/autopar/uns-outer-5.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -45,5 +45,5 @@ main (void) return 0; } -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c b/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c index 5c745f80e93..dc2870be8d4 100644 --- a/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c +++ b/gcc/testsuite/gcc.dg/autopar/uns-outer-6.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops-details -fdump-tree-optimized" } */ +/* { dg-options "-O2 -ftree-parallelize-loops=4 -fdump-tree-parloops2-details -fdump-tree-optimized" } */ void abort (void); @@ -46,6 +46,6 @@ main (void) /* Check that outer loop is parallelized. */ -/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 0 "parloops" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing outer loop" 1 "parloops2" } } */ +/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 0 "parloops2" } } */ /* { dg-final { scan-tree-dump-times "loopfn" 4 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-2.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-2.c deleted file mode 100644 index f1cf75f1f5f..00000000000 --- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-2.c +++ /dev/null @@ -1,22 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target pthread } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ - -/* Constant bound, vector addition. */ - -#define N 1000 - -unsigned int a[N]; -unsigned int b[N]; -unsigned int c[N]; - -void -f (void) -{ - int i; - - for (i = 0; i < N; ++i) - c[i] = a[i] + b[i]; -} - -/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } */ diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c deleted file mode 100644 index c7154ba09ad..00000000000 --- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-3.c +++ /dev/null @@ -1,21 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target pthread } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ - -/* Variable bound, reduction. */ - -unsigned int *a; - -unsigned int -f (unsigned int n, unsigned int *__restrict__ a) -{ - int i; - unsigned int sum = 1; - - for (i = 0; i < n; ++i) - sum += a[i]; - - return sum; -} - -/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } */ diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-4.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-4.c deleted file mode 100644 index 5f7fe684133..00000000000 --- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-4.c +++ /dev/null @@ -1,23 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target pthread } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ - -/* Constant bound, reduction. */ - -#define N 4000 - -unsigned int *a; - -unsigned int -f (void) -{ - int i; - unsigned int sum = 1; - - for (i = 0; i < N; ++i) - sum += a[i]; - - return sum; -} - -/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } */ diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-5.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-5.c deleted file mode 100644 index 3c1e99b58ac..00000000000 --- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-5.c +++ /dev/null @@ -1,17 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target pthread } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ - -/* Variable bound, vector addition, unsigned loop counter, unsigned bound. */ - -void -f (unsigned int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b, - unsigned int *__restrict__ c) -{ - unsigned int i; - - for (i = 0; i < n; ++i) - c[i] = a[i] + b[i]; -} - -/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } */ diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-6.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-6.c deleted file mode 100644 index edc60ba5253..00000000000 --- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-6.c +++ /dev/null @@ -1,17 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target pthread } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ - -/* Variable bound, vector addition, unsigned loop counter, signed bound. */ - -void -f (int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b, - unsigned int *__restrict__ c) -{ - unsigned int i; - - for (i = 0; i < n; ++i) - c[i] = a[i] + b[i]; -} - -/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } */ diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-7.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-7.c deleted file mode 100644 index 38be2e8fee5..00000000000 --- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-7.c +++ /dev/null @@ -1,17 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target pthread } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ - -/* Variable bound, vector addition, signed loop counter, signed bound. */ - -void -f (int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b, - unsigned int *__restrict__ c) -{ - int i; - - for (i = 0; i < n; ++i) - c[i] = a[i] + b[i]; -} - -/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } */ diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c deleted file mode 100644 index 6f3ece59d2e..00000000000 --- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt-pr66652.c +++ /dev/null @@ -1,26 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target pthread } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ - -#include -#include -#include - -unsigned int -f (unsigned int n, unsigned int sum) -{ - unsigned int i; - - i = UINT_MAX; - do - { - sum += i % 13; - i++; - } - while (i < n - 1); - - return sum; -} - -/* { dg-final { scan-tree-dump-times "parallelizing inner loop" 1 "parloops" } } */ -/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 0 "parloops" } } */ diff --git a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt.c b/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt.c deleted file mode 100644 index 44596e3858a..00000000000 --- a/gcc/testsuite/gcc.dg/parloops-exit-first-loop-alt.c +++ /dev/null @@ -1,18 +0,0 @@ -/* { dg-do compile } */ -/* { dg-require-effective-target pthread } */ -/* { dg-options "-O2 -ftree-parallelize-loops=2 -fdump-tree-parloops-details" } */ - -/* Variable bound, vector addition, signed loop counter, unsigned bound. */ - -void -f (unsigned int n, unsigned int *__restrict__ a, unsigned int *__restrict__ b, - unsigned int *__restrict__ c) -{ - int i; - - for (i = 0; i < n; ++i) - c[i] = a[i] + b[i]; -} - -/* { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } */ - diff --git a/gcc/testsuite/gcc.dg/pr69181-1.c b/gcc/testsuite/gcc.dg/pr69181-1.c new file mode 100644 index 00000000000..e851f0c8a47 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr69181-1.c @@ -0,0 +1,7 @@ +/* { dg-do compile { target this_will_not_be_matched-*-* } } */ + +/* { dg-begin-multiline-output "" } + This message should never be checked for. + In particular, it shouldn't be checked for in the *next* + test case. + { dg-end-multiline-output "" } */ diff --git a/gcc/testsuite/gcc.dg/pr69181-2.c b/gcc/testsuite/gcc.dg/pr69181-2.c new file mode 100644 index 00000000000..dca90dcbf12 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr69181-2.c @@ -0,0 +1,4 @@ +/* Dummy test case, to verify that the dg-begin-multiline-output directive + from pr69181-1.c isn't erroneously expected to be handled in *this* + test case. */ +int make_non_empty; diff --git a/gcc/testsuite/gcc.dg/torture/builtin-integral-1.c b/gcc/testsuite/gcc.dg/torture/builtin-integral-1.c index f3c3338342e..74d4ab047c6 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-integral-1.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-integral-1.c @@ -10,6 +10,8 @@ that various math functions are marked const/pure and can be folded. */ /* { dg-options "-ffinite-math-only -fno-math-errno" } */ +/* { dg-add-options c99_runtime } */ +/* { dg-require-effective-target c99_runtime } */ /* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ extern int link_failure (int); diff --git a/gcc/testsuite/gcc.dg/torture/pr69170.c b/gcc/testsuite/gcc.dg/torture/pr69170.c new file mode 100644 index 00000000000..2af0bde7dad --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69170.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +typedef long sha2_word_t; +typedef struct { + sha2_word_t length_upper, length_lower; + char buf[]; +} hash_state; +int a; +hash_state b; +void fn1() +{ + a = 0; + for (; a < 8; a++) + b.buf[a + 1024 / 8] = b.length_upper >> (1 - a) * 5; + a = 0; + for (; a < 8; a++) + b.buf[a + 1024 / 8 + 8] = b.length_lower >> (1 - a) * 5; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr65447.c b/gcc/testsuite/gcc.dg/tree-ssa/pr65447.c index 4c910389d66..b30a639d2c1 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr65447.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr65447.c @@ -50,4 +50,4 @@ void foo (double *p) } /* We should groups address type IV uses. */ -/* { dg-final { scan-tree-dump-not "\\nuse 5\\n" "ivopts" } } */ +/* { dg-final { scan-tree-dump-not "\\nuse 21\\n" "ivopts" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69270-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr69270-2.c new file mode 100644 index 00000000000..15c7bdda15a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69270-2.c @@ -0,0 +1,52 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-dom3-details -w" } */ + +/* There should be a reference to usecount that turn into + constants. */ +/* { dg-final { scan-tree-dump-times "Replaced .usecount_\[0-9\]+. with constant .1." 1 "dom3"} } */ + +/* And an assignment using usecount ought to fold down to constants. */ +/* { dg-final { scan-tree-dump-times "Folded to: usecount_\[0-9\]+ = 2;" 1 "dom3"} } */ + +/* The arithmetic using usecount should be gone, except for the one in the + details debugging. */ +/* { dg-final { scan-tree-dump-times "usecount_\[0-9\]+ = usecount_\[0-9\]+ . 1;" 1 "dom3"} } */ + +typedef union tree_node *tree; +typedef union gimple_statement_d *gimple; +extern const int tree_code_type[]; +union tree_node +{ + int code:16; +}; +typedef struct immediate_use_iterator_d +{ +} +imm_use_iterator; +void +insert_debug_temp_for_var_def (gimple stmt) +{ + gimple def_stmt = ((void *) 0); + int usecount = 0; + tree value = ((void *) 0); + for (; arf ();) + { + if (!gimple_debug_bind_p (stmt)) + continue; + if (usecount++) + break; + unsigned char no_value = 0; + if (!gimple_bb (def_stmt)) + no_value = 1; + if (!no_value) + value = gimple_assign_rhs_to_tree (); + } + if (value) + { + if ((tree_code_type[(int) (((value)->code))] == 42) + || (usecount == 1 && (is_gimple_min_invariant (value)))) + value = unshare_expr (value); + } +} + + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c new file mode 100644 index 00000000000..89735f67de2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-uncprop-details -w" } */ + +/* We're looking for a constant argument a PHI node. There + should only be one if we unpropagate correctly. */ +/* { dg-final { scan-tree-dump-times ", 1" 1 "uncprop1"} } */ + +typedef long unsigned int size_t; +typedef union gimple_statement_d *gimple; +unsigned char +propagate_with_phi () +{ + gimple use_stmt; + unsigned char phi_inserted; + phi_inserted = 0; + for (; !end_imm_use_stmt_p (); next_imm_use_stmt ()) + { + if (!(arf () == 10 && boo () == 20)) + continue; + if (!phi_inserted) + phi_inserted = 1; + else + update_stmt (); + } +} + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-17.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-17.c new file mode 100644 index 00000000000..25667f4e0d2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-17.c @@ -0,0 +1,19 @@ +/* { dg-do run { target { aarch64*-*-* alpha*-*-* arm*-*-* hppa*-*-* powerpc*-*-* s390*-*-* } } } */ +/* { dg-options "-O2 -fdump-tree-esra --param sra-max-scalarization-size-Ospeed=32" } */ + +extern void abort (void); + +int +main (int argc, char **argv) +{ + long a[4] = { 7, 19, 11, 255 }; + int tot = 0; + for (int i = 0; i < 4; i++) + tot = (tot*256) + a[i]; + if (tot == 0x07130bff) + return 0; + abort (); +} + +/* { dg-final { scan-tree-dump-times "Removing load: a = \\\*.LC0;" 1 "esra" } } */ +/* { dg-final { scan-tree-dump-times "SR.\[0-9_\]+ = \\\*.LC0\\\[" 4 "esra" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-18.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-18.c new file mode 100644 index 00000000000..609fb11c23c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-18.c @@ -0,0 +1,28 @@ +/* { dg-do run { target { aarch64*-*-* alpha*-*-* arm*-*-* hppa*-*-* powerpc*-*-* s390*-*-* } } } */ +/* { dg-options "-O2 -fdump-tree-esra --param sra-max-scalarization-size-Ospeed=32" } */ + +extern void abort (void); +struct foo { long x; }; + +struct bar { struct foo f[2]; }; + +struct baz { struct bar b[2]; }; + +int +main (int argc, char **argv) +{ + struct baz a = { { { { { 4 }, { 5 } } }, { { { 6 }, { 7 } } } } }; + int tot = 0; + for (int i = 0; i < 2; i++) + for (int j = 0; j < 2; j++) + tot = (tot*256) + a.b[i].f[j].x; + if (tot == 0x04050607) + return 0; + abort (); +} + +/* { dg-final { scan-tree-dump-times "Removing load: a = \\\*.LC0;" 1 "esra" } } */ +/* { dg-final { scan-tree-dump-times "SR.\[0-9_\]+ = \\\*.LC0\\.b\\\[0\\\]\\.f\\\[0\\\]\\.x" 1 "esra" } } */ +/* { dg-final { scan-tree-dump-times "SR.\[0-9_\]+ = \\\*.LC0\\.b\\\[0\\\]\\.f\\\[1\\\]\\.x" 1 "esra" } } */ +/* { dg-final { scan-tree-dump-times "SR.\[0-9_\]+ = \\\*.LC0\\.b\\\[1\\\]\\.f\\\[0\\\]\\.x" 1 "esra" } } */ +/* { dg-final { scan-tree-dump-times "SR.\[0-9_\]+ = \\\*.LC0\\.b\\\[1\\\]\\.f\\\[1\\\]\\.x" 1 "esra" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-2.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-2.c index 9eccdc963e7..748448e5245 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fno-tree-fre -fno-tree-pre -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-tree-fre -fno-tree-pre -fdump-tree-optimized --param sra-max-scalarization-size-Ospeed=32" } */ int foo () @@ -17,7 +17,8 @@ foo () /* After late unrolling the above loop completely DOM should be able to optimize this to return 28. */ -/* See PR63679 and PR64159, if the target forces the initializer to memory then - DOM is not able to perform this optimization. */ +/* On alpha, the vectorizer generates writes of two vector elements at once, + but the loop reads only one element at a time, and DOM cannot resolve these. + The same happens on powerpc depending on the SIMD support available. */ -/* { dg-final { scan-tree-dump "return 28;" "optimized" { xfail aarch64*-*-* alpha*-*-* hppa*-*-* powerpc*-*-* sparc*-*-* s390*-*-* } } } */ +/* { dg-final { scan-tree-dump "return 28;" "optimized" { xfail alpha*-*-* powerpc64*-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-5.c new file mode 100644 index 00000000000..cd38d3eb537 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-5.c @@ -0,0 +1,18 @@ +/* Test normalization of ARRAY_REF expressions to MEM_REFs in dom. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-fre -fdump-tree-dom2" } */ + +#define N 8 + +int +main (int argc, char **argv) +{ + int a[N]; + for (int i = 0; i < N; i++) + a[i] = 2*i + 1; + int *p = &a[0]; + __builtin_printf ("%d\n", a[argc]); + return *(++p); +} + +/* { dg-final { scan-tree-dump-times "return 3;" 1 "dom2"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-6.c new file mode 100644 index 00000000000..002fd81367d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-6.c @@ -0,0 +1,20 @@ +/* Test normalization of ARRAY_REF expressions to MEM_REFs in dom. */ +/* { dg-do compile } */ +/* { dg-options "-O1 -fno-tree-fre -fdump-tree-dom2" } */ + +int +main (int argc, char **argv) +{ + union { + int a[4]; + int b[2]; + } u; + u.a[0] = 1; + u.a[1] = 42; + u.a[2] = 3; + u.a[3] = 4; + __builtin_printf ("%d\n", u.a[argc]); + return u.b[1]; +} + +/* { dg-final { scan-tree-dump-times "return 42;" 1 "dom2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-7.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-7.c new file mode 100644 index 00000000000..151e5d4e343 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-cse-7.c @@ -0,0 +1,21 @@ +/* Test normalization of MEM_REF expressions in dom. */ +/* { dg-do compile } */ +/* { dg-options "-O3 -fno-tree-fre -fno-tree-pre -fdump-tree-optimized" } */ + +typedef struct { + int a[8]; +} foo; + +foo f; + +int +test () +{ + foo g; + g.a[0] = 1; g.a[1] = 2; g.a[2] = 3; g.a[3] = 4; + g.a[4] = 5; g.a[5] = 6; g.a[6] = 7; g.a[7] = 8; + f=g; + return f.a[2]; +} + +/* { dg-final { scan-tree-dump-times "return 3;" 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr69297.c b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr69297.c new file mode 100644 index 00000000000..e65a30c06d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr69297.c @@ -0,0 +1,83 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-march=core-avx2 -fdump-tree-slp-details" } */ + +#define abs(x) (x) < 0 ? -(x) : (x) +int +foo (int* diff) +{ + int k, satd = 0, m[16], d[16]; + + m[ 0] = diff[ 0] + diff[12]; + m[ 4] = diff[ 4] + diff[ 8]; + m[ 8] = diff[ 4] - diff[ 8]; + m[12] = diff[ 0] - diff[12]; + m[ 1] = diff[ 1] + diff[13]; + m[ 5] = diff[ 5] + diff[ 9]; + m[ 9] = diff[ 5] - diff[ 9]; + m[13] = diff[ 1] - diff[13]; + m[ 2] = diff[ 2] + diff[14]; + m[ 6] = diff[ 6] + diff[10]; + m[10] = diff[ 6] - diff[10]; + m[14] = diff[ 2] - diff[14]; + m[ 3] = diff[ 3] + diff[15]; + m[ 7] = diff[ 7] + diff[11]; + m[11] = diff[ 7] - diff[11]; + m[15] = diff[ 3] - diff[15]; + + d[ 0] = m[ 0] + m[ 4]; + d[ 8] = m[ 0] - m[ 4]; + d[ 4] = m[ 8] + m[12]; + d[12] = m[12] - m[ 8]; + d[ 1] = m[ 1] + m[ 5]; + d[ 9] = m[ 1] - m[ 5]; + d[ 5] = m[ 9] + m[13]; + d[13] = m[13] - m[ 9]; + d[ 2] = m[ 2] + m[ 6]; + d[10] = m[ 2] - m[ 6]; + d[ 6] = m[10] + m[14]; + d[14] = m[14] - m[10]; + d[ 3] = m[ 3] + m[ 7]; + d[11] = m[ 3] - m[ 7]; + d[ 7] = m[11] + m[15]; + d[15] = m[15] - m[11]; + + m[ 0] = d[ 0] + d[ 3]; + m[ 1] = d[ 1] + d[ 2]; + m[ 2] = d[ 1] - d[ 2]; + m[ 3] = d[ 0] - d[ 3]; + m[ 4] = d[ 4] + d[ 7]; + m[ 5] = d[ 5] + d[ 6]; + m[ 6] = d[ 5] - d[ 6]; + m[ 7] = d[ 4] - d[ 7]; + m[ 8] = d[ 8] + d[11]; + m[ 9] = d[ 9] + d[10]; + m[10] = d[ 9] - d[10]; + m[11] = d[ 8] - d[11]; + m[12] = d[12] + d[15]; + m[13] = d[13] + d[14]; + m[14] = d[13] - d[14]; + m[15] = d[12] - d[15]; + + d[ 0] = m[ 0] + m[ 1]; + d[ 1] = m[ 0] - m[ 1]; + d[ 2] = m[ 2] + m[ 3]; + d[ 3] = m[ 3] - m[ 2]; + d[ 4] = m[ 4] + m[ 5]; + d[ 5] = m[ 4] - m[ 5]; + d[ 6] = m[ 6] + m[ 7]; + d[ 7] = m[ 7] - m[ 6]; + d[ 8] = m[ 8] + m[ 9]; + d[ 9] = m[ 8] - m[ 9]; + d[10] = m[10] + m[11]; + d[11] = m[11] - m[10]; + d[12] = m[12] + m[13]; + d[13] = m[12] - m[13]; + d[14] = m[14] + m[15]; + d[15] = m[15] - m[14]; + for (k=0; k<16; k++) + satd += abs(d[k]); + return satd; +} + +/* { dg-final { scan-tree-dump "vectorization is not profitable" "slp1" } } */ +/* { dg-final { scan-tree-dump-not "basic block vectorized" "slp1" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/target_attr_17.c b/gcc/testsuite/gcc.target/aarch64/target_attr_17.c new file mode 100644 index 00000000000..483cc6d4a1d --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/target_attr_17.c @@ -0,0 +1,8 @@ +__attribute__((target("invalid-attr-string"))) +int +foo (int a) +{ + return a + 5; +} + +/* { dg-error "target attribute.*is invalid" "" { target *-*-* } 0 } */ \ No newline at end of file diff --git a/gcc/testsuite/gcc.target/i386/pr65105-5.c b/gcc/testsuite/gcc.target/i386/pr65105-5.c index 5818c1c0bac..639bbe1eb14 100644 --- a/gcc/testsuite/gcc.target/i386/pr65105-5.c +++ b/gcc/testsuite/gcc.target/i386/pr65105-5.c @@ -1,7 +1,7 @@ /* PR target/pr65105 */ /* { dg-do compile { target { ia32 } } } */ /* { dg-options "-O2 -march=core-avx2" } */ -/* { dg-final { scan-assembler "pand" } } */ +/* { dg-final { scan-assembler "pandn" } } */ /* { dg-final { scan-assembler "pxor" } } */ /* { dg-final { scan-assembler "ptest" } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr69030.c b/gcc/testsuite/gcc.target/i386/pr69030.c new file mode 100644 index 00000000000..30919c72c91 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr69030.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -g -w" } */ + +int a, b, c = 7, d; +static unsigned e, g; +char f; +static unsigned fn1() { + unsigned h = e - b ^ c; + int i = h / c & a * g, j = g * h; + if (h) { + if (d) + h = e; + j = a; + a = (a && (g % f && i) % h) | c | ~2; + if (b) + printf("", 1); + } + c = i; + a = j; + return 2; +} + +int main() { + for (; b < -18; --b) + g = 0; + fn1(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-1.c b/gcc/testsuite/gcc.target/mips/mips-3d-1.c index f11ffc5a80f..9c675130927 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-1.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-1.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Test MIPS-3D builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-2.c b/gcc/testsuite/gcc.target/mips/mips-3d-2.c index b04c3bfb5d5..4da059f9ec0 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-2.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-2.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Test MIPS-3D branch-if-any-two builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-3.c b/gcc/testsuite/gcc.target/mips/mips-3d-3.c index e4de8fb19bf..fcdcf24e6c0 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-3.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-3.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Test MIPS-3D absolute compare builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-4.c b/gcc/testsuite/gcc.target/mips/mips-3d-4.c index 3d28d7f2c66..340921c586e 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-4.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-4.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Test MIPS-3D branch-if-any-four builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-5.c b/gcc/testsuite/gcc.target/mips/mips-3d-5.c index a433675cab9..e7dbfebef63 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-5.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-5.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Test MIPS-3D absolute-compare & branch-if-any-four builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-6.c b/gcc/testsuite/gcc.target/mips/mips-3d-6.c index e6b44f07585..d75faa1a91b 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-6.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-6.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Test MIPS-3D absolute compare (floats) builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-7.c b/gcc/testsuite/gcc.target/mips/mips-3d-7.c index 2531ddf8b1a..8e69d49b122 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-7.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-7.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Test MIPS-3D absolute compare (doubles) builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-8.c b/gcc/testsuite/gcc.target/mips/mips-3d-8.c index 1d199d7d0c0..0ad8c482aa1 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-8.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-8.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Test MIPS-3D absolute compare and conditional move builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-3d-9.c b/gcc/testsuite/gcc.target/mips/mips-3d-9.c index d697efdedf1..0c302528506 100644 --- a/gcc/testsuite/gcc.target/mips/mips-3d-9.c +++ b/gcc/testsuite/gcc.target/mips/mips-3d-9.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mips3d" } */ +/* { dg-options "-mips3d forbid_cpu=octeon.*" } */ /* Matrix Multiplications */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-1.c b/gcc/testsuite/gcc.target/mips/mips-ps-1.c index 73598a840bd..980dd05db84 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-1.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-1.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mpaired-single" } */ +/* { dg-options "-mpaired-single forbid_cpu=octeon.*" } */ /* Test v2sf calculations */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-2.c b/gcc/testsuite/gcc.target/mips/mips-ps-2.c index 52642558664..654aa062d80 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-2.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-2.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mpaired-single" } */ +/* { dg-options "-mpaired-single forbid_cpu=octeon.*" } */ /* Test MIPS paired-single builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-3.c b/gcc/testsuite/gcc.target/mips/mips-ps-3.c index 7e6ffd0667b..fc892a805a1 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-3.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-3.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mpaired-single" } */ +/* { dg-options "-mpaired-single forbid_cpu=octeon.*" } */ /* Test MIPS paired-single conditional move */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-4.c b/gcc/testsuite/gcc.target/mips/mips-ps-4.c index 06850adb300..7871e56d2b9 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-4.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-4.c @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-mpaired-single" } */ +/* { dg-options "-mpaired-single forbid_cpu=octeon.*" } */ /* Test MIPS paired-single comparisons */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-5.c b/gcc/testsuite/gcc.target/mips/mips-ps-5.c index 077076f4736..4499e54ed1e 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-5.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-5.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mpaired-single -mgp64 -ftree-vectorize" } */ +/* { dg-options "-mpaired-single -mgp64 -ftree-vectorize forbid_cpu=octeon.*" } */ /* { dg-skip-if "requires vectorization" { *-*-* } { "-O0" "-Os" } { "" } } */ extern float a[] __attribute__ ((aligned (8))); diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-6.c b/gcc/testsuite/gcc.target/mips/mips-ps-6.c index 5bdfe436f40..42c1756136f 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-6.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-6.c @@ -1,7 +1,7 @@ /* mips-ps-2.c with an extra -ffinite-math-only option. This option changes the way that abs.ps is handled. */ /* { dg-do run } */ -/* { dg-options "-mpaired-single -ffinite-math-only" } */ +/* { dg-options "-mpaired-single -ffinite-math-only forbid_cpu=octeon.*" } */ /* Test MIPS paired-single builtin functions */ #include diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-7.c b/gcc/testsuite/gcc.target/mips/mips-ps-7.c index 3b4e5308598..29e29aa1050 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-7.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-7.c @@ -1,6 +1,6 @@ /* mips-ps-5.c with -mgp32 instead of -mgp64. */ /* { dg-do compile } */ -/* { dg-options "-mgp32 -mpaired-single -ftree-vectorize" } */ +/* { dg-options "-mgp32 -mpaired-single -ftree-vectorize forbid_cpu=octeon.*" } */ /* { dg-skip-if "requires vectorization" { *-*-* } { "-O0" "-Os" } { "" } } */ extern float a[] __attribute__ ((aligned (8))); diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-type-2.c b/gcc/testsuite/gcc.target/mips/mips-ps-type-2.c index a4dfbaea645..6aba81507e7 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-type-2.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-type-2.c @@ -1,7 +1,7 @@ /* Test v2sf calculations. The nmadd and nmsub patterns need -ffinite-math-only. */ /* { dg-do compile } */ -/* { dg-options "(HAS_MADDPS) -mgp32 -mpaired-single -ffinite-math-only" } */ +/* { dg-options "(HAS_MADDPS) -mgp32 -mpaired-single -ffinite-math-only forbid_cpu=octeon.*" } */ /* { dg-skip-if "nmadd and nmsub need combine" { *-*-* } { "-O0" } { "" } } */ /* { dg-final { scan-assembler "\tcvt.ps.s\t" } } */ /* { dg-final { scan-assembler "\tmov.ps\t" } } */ diff --git a/gcc/testsuite/gcc.target/mips/mips-ps-type.c b/gcc/testsuite/gcc.target/mips/mips-ps-type.c index c36dc25c9d9..454ffc34957 100644 --- a/gcc/testsuite/gcc.target/mips/mips-ps-type.c +++ b/gcc/testsuite/gcc.target/mips/mips-ps-type.c @@ -1,7 +1,7 @@ /* Test v2sf calculations. The nmadd and nmsub patterns need -ffinite-math-only. */ /* { dg-do compile } */ -/* { dg-options "-mpaired-single -mgp64 -ffinite-math-only" } */ +/* { dg-options "-mpaired-single -mgp64 -ffinite-math-only forbid_cpu=octeon.*" } */ /* { dg-skip-if "nmadd and nmsub need combine" { *-*-* } { "-O0" } { "" } } */ /* { dg-final { scan-assembler "\tcvt.ps.s\t" } } */ /* { dg-final { scan-assembler "\tmov.ps\t" } } */ diff --git a/gcc/testsuite/gcc.target/mips/mips16-attributes-6.c b/gcc/testsuite/gcc.target/mips/mips16-attributes-6.c index 99bdf8c3ef6..12f3ad0fee1 100644 --- a/gcc/testsuite/gcc.target/mips/mips16-attributes-6.c +++ b/gcc/testsuite/gcc.target/mips/mips16-attributes-6.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mips16 addressing=absolute -mips3d" } */ +/* { dg-options "-mips16 addressing=absolute -mips3d forbid_cpu=octeon.*" } */ static inline NOMIPS16 float i1 (float f) diff --git a/gcc/testsuite/gcc.target/powerpc/recip-1.c b/gcc/testsuite/gcc.target/powerpc/recip-1.c index 3c41d476a42..33df28e9198 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-1.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-1.c @@ -3,9 +3,9 @@ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power6" } } */ /* { dg-options "-O2 -mrecip -ffast-math -mcpu=power6" } */ /* { dg-final { scan-assembler-times "frsqrte" 2 } } */ -/* { dg-final { scan-assembler-times "fmsub" 2 } } */ -/* { dg-final { scan-assembler-times "fmul" 6 } } */ +/* { dg-final { scan-assembler-times "fmul" 4 } } */ /* { dg-final { scan-assembler-times "fnmsub" 3 } } */ +/* { dg-final { scan-assembler-times "fmadd" 4 } } */ double rsqrt_d (double a) diff --git a/gcc/testsuite/gcc.target/powerpc/recip-2.c b/gcc/testsuite/gcc.target/powerpc/recip-2.c index e841302a301..bf8d96838b7 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-2.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-2.c @@ -3,9 +3,10 @@ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power5" } } */ /* { dg-options "-O2 -mrecip -ffast-math -mcpu=power5" } */ /* { dg-final { scan-assembler-times "frsqrtes" 1 } } */ -/* { dg-final { scan-assembler-times "fmsubs" 1 } } */ -/* { dg-final { scan-assembler-times "fmuls" 6 } } */ +/* { dg-final { scan-assembler-times "fmuls" 2 } } */ /* { dg-final { scan-assembler-times "fnmsubs" 3 } } */ +/* { dg-final { scan-assembler-times "fmadds" 5 } } */ +/* { dg-final { scan-assembler-times "fadds" 1 } } */ /* { dg-final { scan-assembler-times "fsqrt" 1 } } */ /* power5 resqrte is not accurate enough, and should not be generated by diff --git a/gcc/testsuite/gcc.target/powerpc/recip-3.c b/gcc/testsuite/gcc.target/powerpc/recip-3.c index a1ed5c34e44..e3496ab82b3 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-3.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-3.c @@ -3,12 +3,12 @@ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */ /* { dg-options "-O2 -mrecip -ffast-math -mcpu=power7" } */ /* { dg-final { scan-assembler-times "xsrsqrtedp\|frsqrte\ " 1 } } */ -/* { dg-final { scan-assembler-times "xsmsub.dp\|fmsub\ " 1 } } */ -/* { dg-final { scan-assembler-times "xsmuldp\|fmul\ " 4 } } */ +/* { dg-final { scan-assembler-times "xsmuldp\|fmul\ " 2 } } */ /* { dg-final { scan-assembler-times "xsnmsub.dp\|fnmsub\ " 2 } } */ +/* { dg-final { scan-assembler-times "xsmadd.dp\|fmadd\ " 3 } } */ /* { dg-final { scan-assembler-times "xsrsqrtesp\|frsqrtes" 1 } } */ -/* { dg-final { scan-assembler-times "xsmsub.sp\|fmsubs" 1 } } */ /* { dg-final { scan-assembler-times "xsmulsp\|fmuls" 2 } } */ +/* { dg-final { scan-assembler-times "xsmadd.sp\|fmadds" 1 } } */ /* { dg-final { scan-assembler-times "xsnmsub.sp\|fnmsubs" 1 } } */ double diff --git a/gcc/testsuite/gcc.target/powerpc/recip-4.c b/gcc/testsuite/gcc.target/powerpc/recip-4.c index 7d95cc97a9a..54002d3c7a0 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-4.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-4.c @@ -3,13 +3,13 @@ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */ /* { dg-options "-O3 -ftree-vectorize -mrecip -ffast-math -mcpu=power7 -fno-unroll-loops" } */ /* { dg-final { scan-assembler-times "xvrsqrtedp" 1 } } */ -/* { dg-final { scan-assembler-times "xvmsub.dp" 1 } } */ -/* { dg-final { scan-assembler-times "xvmuldp" 4 } } */ +/* { dg-final { scan-assembler-times "xvmuldp" 2 } } */ /* { dg-final { scan-assembler-times "xvnmsub.dp" 2 } } */ +/* { dg-final { scan-assembler-times "xvmadd.dp" 3 } } */ /* { dg-final { scan-assembler-times "xvrsqrtesp" 1 } } */ -/* { dg-final { scan-assembler-times "xvmsub.sp" 1 } } */ /* { dg-final { scan-assembler-times "xvmulsp" 2 } } */ /* { dg-final { scan-assembler-times "xvnmsub.sp" 1 } } */ +/* { dg-final { scan-assembler-times "xvmadd.sp" 1 } } */ #define SIZE 1024 diff --git a/gcc/testsuite/gcc.target/powerpc/recip-6.c b/gcc/testsuite/gcc.target/powerpc/recip-6.c index e71403e77a2..fbee0c9d386 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-6.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-6.c @@ -1,4 +1,4 @@ -/* { dg-do run { target { powerpc*-*-linux* } } } */ +/* { dg-do run { target { powerpc*-*-linux* powerpc*-ibm-aix* } } } */ /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ /* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ /* { dg-require-effective-target vsx_hw } */ diff --git a/gcc/testsuite/gcc.target/powerpc/recip-7.c b/gcc/testsuite/gcc.target/powerpc/recip-7.c index 7b32ba076a3..3d84bedc75a 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-7.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-7.c @@ -1,4 +1,4 @@ -/* { dg-do run { target { powerpc*-*-linux* } } } */ +/* { dg-do run { target { powerpc*-*-linux* powerpc*-ibm-aix* } } } */ /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ /* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */ /* { dg-require-effective-target ppc_recip_hw } */ diff --git a/gcc/testsuite/gcc.target/powerpc/recip-sqrtf.c b/gcc/testsuite/gcc.target/powerpc/recip-sqrtf.c index 92798837e3e..29839da8c14 100644 --- a/gcc/testsuite/gcc.target/powerpc/recip-sqrtf.c +++ b/gcc/testsuite/gcc.target/powerpc/recip-sqrtf.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -ffast-math -mcpu=power5 -mrecip" } */ +/* { dg-options "-O2 -ffast-math -mcpu=power6 -mrecip" } */ extern float sqrtf (float); diff --git a/gcc/testsuite/gfortran.dg/allocate_error_5.f90 b/gcc/testsuite/gfortran.dg/allocate_error_5.f90 new file mode 100644 index 00000000000..4e5f4bd3b30 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocate_error_5.f90 @@ -0,0 +1,23 @@ +! { dg-do run } +! { dg-additional-options "-fcheck=mem" } +! { dg-shouldfail "Fortran runtime error: Assignment of scalar to unallocated array" } +! +! This omission was encountered in the course of fixing PR54070. Whilst this is a +! very specific case, others such as allocatable components have been tested. +! +! Contributed by Tobias Burnus +! +function g(a) result (res) + character(len=*) :: a + character(len=:),allocatable :: res(:) + res = a ! Since 'res' is not allocated, a runtime error should occur. +end function + + interface + function g(a) result(res) + character(len=*) :: a + character(len=:),allocatable :: res(:) + end function + end interface + print *, g("ABC") +end diff --git a/gcc/testsuite/gfortran.dg/deferred_character_10.f90 b/gcc/testsuite/gfortran.dg/deferred_character_10.f90 new file mode 100644 index 00000000000..6a3674150a1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_10.f90 @@ -0,0 +1,52 @@ +! { dg-do run } +! +! Checks that PR60593 is fixed (Revision: 214757) +! +! Contributed by Steve Kargl +! +! Main program added for this test. +! +module stringhelper_m + + implicit none + + type :: string_t + character(:), allocatable :: string + end type + + interface len + function strlen(s) bind(c,name='strlen') + use iso_c_binding + implicit none + type(c_ptr), intent(in), value :: s + integer(c_size_t) :: strlen + end function + end interface + + contains + + function C2FChar(c_charptr) result(res) + use iso_c_binding + type(c_ptr), intent(in) :: c_charptr + character(:), allocatable :: res + character(kind=c_char,len=1), pointer :: string_p(:) + integer i, c_str_len + c_str_len = int(len(c_charptr)) + call c_f_pointer(c_charptr, string_p, [c_str_len]) + allocate(character(c_str_len) :: res) + forall (i = 1:c_str_len) res(i:i) = string_p(i) + end function + +end module + + use stringhelper_m + use iso_c_binding + implicit none + type(c_ptr) :: cptr + character(20), target :: str + + str = "abcdefghij"//char(0) + cptr = c_loc (str) + if (len (C2FChar (cptr)) .ne. 10) call abort + if (C2FChar (cptr) .ne. "abcdefghij") call abort +end diff --git a/gcc/testsuite/gfortran.dg/deferred_character_11.f90 b/gcc/testsuite/gfortran.dg/deferred_character_11.f90 new file mode 100644 index 00000000000..454cf47e1b1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_11.f90 @@ -0,0 +1,39 @@ +! { dg-do run } +! +! Test the fix for PR61147. +! +! Contributed by Thomas Clune +! +module B_mod + + type :: B + character(:), allocatable :: string + end type B + +contains + + function toPointer(this) result(ptr) + character(:), pointer :: ptr + class (B), intent(in), target :: this + + ptr => this%string + + end function toPointer + +end module B_mod + +program main + use B_mod + + type (B) :: obj + character(:), pointer :: p + + obj%string = 'foo' + p => toPointer(obj) + + If (len (p) .ne. 3) call abort + If (p .ne. "foo") call abort + +end program main + + diff --git a/gcc/testsuite/gfortran.dg/deferred_character_12.f90 b/gcc/testsuite/gfortran.dg/deferred_character_12.f90 new file mode 100644 index 00000000000..cdb6c893756 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_12.f90 @@ -0,0 +1,37 @@ +! { dg-do run } +! +! Tests the fix for PR63232 +! +! Contributed by Balint Aradi +! +module mymod + implicit none + + type :: wrapper + character(:), allocatable :: string + end type wrapper + +contains + + + subroutine sub2(mystring) + character(:), allocatable, intent(out) :: mystring + + mystring = "test" + + end subroutine sub2 + +end module mymod + + +program test + use mymod + implicit none + + type(wrapper) :: mywrapper + + call sub2(mywrapper%string) + if (.not. allocated(mywrapper%string)) call abort + if (trim(mywrapper%string) .ne. "test") call abort + +end program test diff --git a/gcc/testsuite/gfortran.dg/deferred_character_13.f90 b/gcc/testsuite/gfortran.dg/deferred_character_13.f90 new file mode 100644 index 00000000000..822cc5de3a8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_13.f90 @@ -0,0 +1,34 @@ +! { dg-do run } +! +! Tests the fix for PR49630 comment #3. +! +! Contributed by Janus Weil +! +module abc + implicit none + + type::abc_type + contains + procedure::abc_function + end type abc_type + +contains + + function abc_function(this) + class(abc_type),intent(in)::this + character(:),allocatable::abc_function + allocate(abc_function,source="hello") + end function abc_function + + subroutine do_something(this) + class(abc_type),intent(in)::this + if (this%abc_function() .ne. "hello") call abort + end subroutine do_something + +end module abc + + + use abc + type(abc_type) :: a + call do_something(a) +end diff --git a/gcc/testsuite/gfortran.dg/deferred_character_14.f90 b/gcc/testsuite/gfortran.dg/deferred_character_14.f90 new file mode 100644 index 00000000000..3c4163ee7ac --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_14.f90 @@ -0,0 +1,30 @@ +! { dg-do run } +! +! Test fix for PR60795 comments #1 and #4 +! +! Contributed by Kergonath +! +module m +contains + subroutine allocate_array(s_array) + character(:), dimension(:), allocatable, intent(out) :: s_array + + allocate(character(2) :: s_array(2)) + s_array = ["ab","cd"] + end subroutine +end module + +program stringtest + use m + character(:), dimension(:), allocatable :: s4 + character(:), dimension(:), allocatable :: s +! Comment #1 + allocate(character(1) :: s(10)) + if (size (s) .ne. 10) call abort + if (len (s) .ne. 1) call abort +! Comment #4 + call allocate_array(s4) + if (size (s4) .ne. 2) call abort + if (len (s4) .ne. 2) call abort + if (any (s4 .ne. ["ab", "cd"])) call abort + end program diff --git a/gcc/testsuite/gfortran.dg/deferred_character_8.f90 b/gcc/testsuite/gfortran.dg/deferred_character_8.f90 new file mode 100644 index 00000000000..009acc1d290 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_8.f90 @@ -0,0 +1,84 @@ +! { dg-do run } +! +! Test the fix for all the remaining issues in PR54070. These were all +! concerned with deferred length characters being returned as function results, +! except for comment #23 where the descriptor dtype was not correctly set and +! array IO failed in consequence. +! +! Contributed by Tobias Burnus +! +! The original comment #1 with an allocate statement. +! Allocatable, deferred length scalar resul. +function f() + character(len=:),allocatable :: f + allocate (f, source = "abc") + f ="ABC" +end function +! +! Allocatable, deferred length, explicit, array result +function g(a) result (res) + character(len=*) :: a(:) + character(len (a)) :: b(size (a)) + character(len=:),allocatable :: res(:) + integer :: i + allocate (character(len(a)) :: res(2*size(a))) + do i = 1, len (a) + b(:)(i:i) = char (ichar (a(:)(i:i)) + 4) + end do + res = [a, b] +end function +! +! Allocatable, deferred length, array result +function h(a) + character(len=*) :: a(:) + character(len(a)) :: b (size(a)) + character(len=:),allocatable :: h(:) + integer :: i + allocate (character(len(a)) :: h(size(a))) + do i = 1, len (a) + b(:)(i:i) = char (ichar (a(:)(i:i)) + 32) + end do + h = b +end function + +module deferred_length_char_array +contains + function return_string(argument) + character(*) :: argument + character(:), dimension(:), allocatable :: return_string + allocate (character (len(argument)) :: return_string(2)) + return_string = argument + end function +end module + + use deferred_length_char_array + character(len=3) :: chr(3) + character(:), pointer :: s(:) + character(6) :: buffer + interface + function f() + character(len=:),allocatable :: f + end function + function g(a) result(res) + character(len=*) :: a(:) + character(len=:),allocatable :: res(:) + end function + function h(a) + character(len=*) :: a(:) + character(len=:),allocatable :: h(:) + end function + end interface + + if (f () .ne. "ABC") call abort + if (any (g (["ab","cd"]) .ne. ["ab","cd","ef","gh"])) call abort + chr = h (["ABC","DEF","GHI"]) + if (any (chr .ne. ["abc","def","ghi"])) call abort + if (any (return_string ("abcdefg") .ne. ["abcdefg","abcdefg"])) call abort + +! Comment #23 + allocate(character(3)::s(2)) + s(1) = 'foo' + s(2) = 'bar' + write (buffer, '(2A3)') s + if (buffer .ne. 'foobar') call abort +end diff --git a/gcc/testsuite/gfortran.dg/deferred_character_9.f90 b/gcc/testsuite/gfortran.dg/deferred_character_9.f90 new file mode 100644 index 00000000000..f88de7a4ad5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_9.f90 @@ -0,0 +1,28 @@ +! { dg-do run } +! +! Test the fix for PR64324 in which deferred length user ops +! were being mistaken as assumed length and so rejected. +! +! Contributed by Ian Harvey +! +MODULE m + IMPLICIT NONE + INTERFACE OPERATOR(.ToString.) + MODULE PROCEDURE tostring + END INTERFACE OPERATOR(.ToString.) +CONTAINS + FUNCTION tostring(arg) + INTEGER, INTENT(IN) :: arg + CHARACTER(:), ALLOCATABLE :: tostring + allocate (character(5) :: tostring) + write (tostring, "(I5)") arg + END FUNCTION tostring +END MODULE m + + use m + character(:), allocatable :: str + integer :: i = 999 + str = .ToString. i + if (str .ne. " 999") call abort +end + diff --git a/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt-2.f95 b/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt-2.f95 index 52434f2a9e3..236480cb6c6 100644 --- a/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt-2.f95 +++ b/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt-2.f95 @@ -1,7 +1,7 @@ ! { dg-additional-options "-O2" } ! { dg-require-effective-target pthread } ! { dg-additional-options "-ftree-parallelize-loops=2" } -! { dg-additional-options "-fdump-tree-parloops-details" } +! { dg-additional-options "-fdump-tree-parloops2-details" } ! Constant bound, vector addition. @@ -16,4 +16,4 @@ subroutine foo () end do end subroutine foo -! { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } +! { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } diff --git a/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt.f95 b/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt.f95 index 1eb9dfd801e..a33e11db017 100644 --- a/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt.f95 +++ b/gcc/testsuite/gfortran.dg/parloops-exit-first-loop-alt.f95 @@ -1,7 +1,7 @@ ! { dg-additional-options "-O2" } ! { dg-require-effective-target pthread } ! { dg-additional-options "-ftree-parallelize-loops=2" } -! { dg-additional-options "-fdump-tree-parloops-details" } +! { dg-additional-options "-fdump-tree-parloops2-details" } ! Variable bound, vector addition. @@ -17,5 +17,5 @@ subroutine foo (nr) end do end subroutine foo -! { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops" } } +! { dg-final { scan-tree-dump-times "alternative exit-first loop transform succeeded" 1 "parloops2" } } diff --git a/gcc/testsuite/gnat.dg/inline12.adb b/gcc/testsuite/gnat.dg/inline12.adb new file mode 100644 index 00000000000..e73f3c1aeb6 --- /dev/null +++ b/gcc/testsuite/gnat.dg/inline12.adb @@ -0,0 +1,23 @@ +-- PR ada/69219 +-- Testcae by yuta tomino */ + +-- { dg-do compile } + +procedure Inline12 is + + procedure NI; + + procedure IA; + pragma Convention (Intrinsic, IA); + pragma Inline_Always (IA); + + procedure IA is + begin + NI; + end; + + procedure NI is null; + +begin + IA; +end; diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp index f9ec2068bed..c0033283313 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -826,33 +826,21 @@ proc output-exists-not { args } { if { [info procs saved-dg-test] == [list] } { rename dg-test saved-dg-test - proc dg-test { args } { + # Helper function for cleanups that should happen after the call + # to the real dg-test, whether or not it returns normally, or + # fails with an error. + proc cleanup-after-saved-dg-test { } { global additional_files global additional_sources + global additional_sources_used global additional_prunes - global errorInfo global compiler_conditional_xfail_data global shouldfail global testname_with_flags global set_target_env_var global keep_saved_temps_suffixes + global multiline_expected_outputs - if { [ catch { eval saved-dg-test $args } errmsg ] } { - set saved_info $errorInfo - set additional_files "" - set additional_sources "" - set additional_sources_used "" - set additional_prunes "" - set shouldfail 0 - if [info exists compiler_conditional_xfail_data] { - unset compiler_conditional_xfail_data - } - if [info exists testname_with_flags] { - unset testname_with_flags - } - unset_timeout_vars - error $errmsg $saved_info - } set additional_files "" set additional_sources "" set additional_sources_used "" @@ -871,6 +859,18 @@ if { [info procs saved-dg-test] == [list] } { if [info exists testname_with_flags] { unset testname_with_flags } + set multiline_expected_outputs [] + } + + proc dg-test { args } { + global errorInfo + + if { [ catch { eval saved-dg-test $args } errmsg ] } { + set saved_info $errorInfo + cleanup-after-saved-dg-test + error $errmsg $saved_info + } + cleanup-after-saved-dg-test } } diff --git a/gcc/testsuite/lib/multiline.exp b/gcc/testsuite/lib/multiline.exp index 6b2c1da9c87..fd7affcfafd 100644 --- a/gcc/testsuite/lib/multiline.exp +++ b/gcc/testsuite/lib/multiline.exp @@ -47,17 +47,18 @@ # to have the testsuite verify the expected output. ############################################################################ -# Global variables. Although global, these are intended to only be used from -# within multiline.exp. +# Global variables. ############################################################################ +# This is intended to only be used from within multiline.exp. # The line number of the last dg-begin-multiline-output directive. set _multiline_last_beginning_line -1 # A list of # first-line-number, last-line-number, lines # where each "lines" is a list of strings. -set _multiline_expected_outputs [] +# This is cleared at the end of each test by gcc-dg.exp's wrapper for dg-test. +set multiline_expected_outputs [] ############################################################################ # Exported functions. @@ -94,9 +95,9 @@ proc dg-end-multiline-output { args } { verbose "lines: $lines" 3 # Create an entry of the form: first-line, last-line, lines set entry [list $_multiline_last_beginning_line $line $lines] - global _multiline_expected_outputs - lappend _multiline_expected_outputs $entry - verbose "within dg-end-multiline-output: _multiline_expected_outputs: $_multiline_expected_outputs" 3 + global multiline_expected_outputs + lappend multiline_expected_outputs $entry + verbose "within dg-end-multiline-output: multiline_expected_outputs: $multiline_expected_outputs" 3 set _multiline_last_beginning_line -1 } @@ -107,14 +108,12 @@ proc dg-end-multiline-output { args } { # those that weren't found. # # It returns a pruned version of its output. -# -# It also clears the list of expected multiline outputs. proc handle-multiline-outputs { text } { - global _multiline_expected_outputs + global multiline_expected_outputs global testname_with_flags set index 0 - foreach entry $_multiline_expected_outputs { + foreach entry $multiline_expected_outputs { verbose " entry: $entry" 3 set start_line [lindex $entry 0] set end_line [lindex $entry 1] @@ -140,9 +139,6 @@ proc handle-multiline-outputs { text } { set index [expr $index + 1] } - # Clear the list of expected multiline outputs - set _multiline_expected_outputs [] - return $text } diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index dbfa506c5d8..b54545d1bba 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3437,10 +3437,10 @@ verify_gimple_call (gcall *stmt) } /* Verifies the gimple comparison with the result type TYPE and - the operands OP0 and OP1. */ + the operands OP0 and OP1, comparison code is CODE. */ static bool -verify_gimple_comparison (tree type, tree op0, tree op1) +verify_gimple_comparison (tree type, tree op0, tree op1, enum tree_code code) { tree op0_type = TREE_TYPE (op0); tree op1_type = TREE_TYPE (op1); @@ -3474,13 +3474,17 @@ verify_gimple_comparison (tree type, tree op0, tree op1) && (TREE_CODE (type) == BOOLEAN_TYPE || TYPE_PRECISION (type) == 1)) { - if (TREE_CODE (op0_type) == VECTOR_TYPE - || TREE_CODE (op1_type) == VECTOR_TYPE) - { - error ("vector comparison returning a boolean"); - debug_generic_expr (op0_type); - debug_generic_expr (op1_type); - return true; + if ((TREE_CODE (op0_type) == VECTOR_TYPE + || TREE_CODE (op1_type) == VECTOR_TYPE) + && code != EQ_EXPR && code != NE_EXPR + && !VECTOR_BOOLEAN_TYPE_P (op0_type) + && !VECTOR_INTEGER_TYPE_P (op0_type)) + { + error ("unsupported operation or type for vector comparison" + " returning a boolean"); + debug_generic_expr (op0_type); + debug_generic_expr (op1_type); + return true; } } /* Or a boolean vector type with the same element count @@ -3861,7 +3865,7 @@ verify_gimple_assign_binary (gassign *stmt) case LTGT_EXPR: /* Comparisons are also binary, but the result type is not connected to the operand types. */ - return verify_gimple_comparison (lhs_type, rhs1, rhs2); + return verify_gimple_comparison (lhs_type, rhs1, rhs2, rhs_code); case WIDEN_MULT_EXPR: if (TREE_CODE (lhs_type) != INTEGER_TYPE) @@ -4570,7 +4574,8 @@ verify_gimple_cond (gcond *stmt) return verify_gimple_comparison (boolean_type_node, gimple_cond_lhs (stmt), - gimple_cond_rhs (stmt)); + gimple_cond_rhs (stmt), + gimple_cond_code (stmt)); } /* Verify the GIMPLE statement STMT. Returns true if there is an diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c index 46d70ac56c1..7749d34fab3 100644 --- a/gcc/tree-parloops.c +++ b/gcc/tree-parloops.c @@ -53,6 +53,10 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa.h" #include "params.h" #include "params-enum.h" +#include "tree-ssa-alias.h" +#include "tree-eh.h" +#include "gomp-constants.h" +#include "tree-dfa.h" /* This pass tries to distribute iterations of loops into several threads. The implementation is straightforward -- for each loop we test whether its @@ -192,6 +196,8 @@ struct reduction_info of the reduction variable when existing the loop. */ tree initial_value; /* The initial value of the reduction var before entering the loop. */ tree field; /* the name of the field in the parloop data structure intended for reduction. */ + tree reduc_addr; /* The address of the reduction variable for + openacc reductions. */ tree init; /* reduction initialization value. */ gphi *new_phi; /* (helper field) Newly created phi node whose result will be passed to the atomic operation. Represents @@ -1085,10 +1091,29 @@ create_call_for_reduction_1 (reduction_info **slot, struct clsn_data *clsn_data) tree tmp_load, name; gimple *load; - load_struct = build_simple_mem_ref (clsn_data->load); - t = build3 (COMPONENT_REF, type, load_struct, reduc->field, NULL_TREE); + if (reduc->reduc_addr == NULL_TREE) + { + load_struct = build_simple_mem_ref (clsn_data->load); + t = build3 (COMPONENT_REF, type, load_struct, reduc->field, NULL_TREE); + + addr = build_addr (t); + } + else + { + /* Set the address for the atomic store. */ + addr = reduc->reduc_addr; - addr = build_addr (t); + /* Remove the non-atomic store '*addr = sum'. */ + tree res = PHI_RESULT (reduc->keep_res); + use_operand_p use_p; + gimple *stmt; + bool single_use_p = single_imm_use (res, &use_p, &stmt); + gcc_assert (single_use_p); + replace_uses_by (gimple_vdef (stmt), + gimple_vuse (stmt)); + gimple_stmt_iterator gsi = gsi_for_stmt (stmt); + gsi_remove (&gsi, true); + } /* Create phi node. */ bb = clsn_data->load_bb; @@ -1994,10 +2019,11 @@ transform_to_exit_first_loop (struct loop *loop, static void create_parallel_loop (struct loop *loop, tree loop_fn, tree data, - tree new_data, unsigned n_threads, location_t loc) + tree new_data, unsigned n_threads, location_t loc, + bool oacc_kernels_p) { gimple_stmt_iterator gsi; - basic_block bb, paral_bb, for_bb, ex_bb, continue_bb; + basic_block for_bb, ex_bb, continue_bb; tree t, param; gomp_parallel *omp_par_stmt; gimple *omp_return_stmt1, *omp_return_stmt2; @@ -2009,40 +2035,50 @@ create_parallel_loop (struct loop *loop, tree loop_fn, tree data, edge exit, nexit, guard, end, e; /* Prepare the GIMPLE_OMP_PARALLEL statement. */ - bb = loop_preheader_edge (loop)->src; - paral_bb = single_pred (bb); - gsi = gsi_last_bb (paral_bb); + if (oacc_kernels_p) + { + tree clause = build_omp_clause (loc, OMP_CLAUSE_NUM_GANGS); + OMP_CLAUSE_NUM_GANGS_EXPR (clause) + = build_int_cst (integer_type_node, n_threads); + set_oacc_fn_attrib (cfun->decl, clause, NULL); + } + else + { + basic_block bb = loop_preheader_edge (loop)->src; + basic_block paral_bb = single_pred (bb); + gsi = gsi_last_bb (paral_bb); - t = build_omp_clause (loc, OMP_CLAUSE_NUM_THREADS); - OMP_CLAUSE_NUM_THREADS_EXPR (t) - = build_int_cst (integer_type_node, n_threads); - omp_par_stmt = gimple_build_omp_parallel (NULL, t, loop_fn, data); - gimple_set_location (omp_par_stmt, loc); + t = build_omp_clause (loc, OMP_CLAUSE_NUM_THREADS); + OMP_CLAUSE_NUM_THREADS_EXPR (t) + = build_int_cst (integer_type_node, n_threads); + omp_par_stmt = gimple_build_omp_parallel (NULL, t, loop_fn, data); + gimple_set_location (omp_par_stmt, loc); - gsi_insert_after (&gsi, omp_par_stmt, GSI_NEW_STMT); + gsi_insert_after (&gsi, omp_par_stmt, GSI_NEW_STMT); - /* Initialize NEW_DATA. */ - if (data) - { - gassign *assign_stmt; + /* Initialize NEW_DATA. */ + if (data) + { + gassign *assign_stmt; - gsi = gsi_after_labels (bb); + gsi = gsi_after_labels (bb); - param = make_ssa_name (DECL_ARGUMENTS (loop_fn)); - assign_stmt = gimple_build_assign (param, build_fold_addr_expr (data)); - gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT); + param = make_ssa_name (DECL_ARGUMENTS (loop_fn)); + assign_stmt = gimple_build_assign (param, build_fold_addr_expr (data)); + gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT); - assign_stmt = gimple_build_assign (new_data, - fold_convert (TREE_TYPE (new_data), param)); - gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT); - } + assign_stmt = gimple_build_assign (new_data, + fold_convert (TREE_TYPE (new_data), param)); + gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT); + } - /* Emit GIMPLE_OMP_RETURN for GIMPLE_OMP_PARALLEL. */ - bb = split_loop_exit_edge (single_dom_exit (loop)); - gsi = gsi_last_bb (bb); - omp_return_stmt1 = gimple_build_omp_return (false); - gimple_set_location (omp_return_stmt1, loc); - gsi_insert_after (&gsi, omp_return_stmt1, GSI_NEW_STMT); + /* Emit GIMPLE_OMP_RETURN for GIMPLE_OMP_PARALLEL. */ + bb = split_loop_exit_edge (single_dom_exit (loop)); + gsi = gsi_last_bb (bb); + omp_return_stmt1 = gimple_build_omp_return (false); + gimple_set_location (omp_return_stmt1, loc); + gsi_insert_after (&gsi, omp_return_stmt1, GSI_NEW_STMT); + } /* Extract data for GIMPLE_OMP_FOR. */ gcc_assert (loop->header == single_dom_exit (loop)->src); @@ -2107,39 +2143,50 @@ create_parallel_loop (struct loop *loop, tree loop_fn, tree data, PENDING_STMT (e) = NULL; /* Emit GIMPLE_OMP_FOR. */ - gimple_cond_set_lhs (cond_stmt, cvar_base); - type = TREE_TYPE (cvar); - t = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE); - int chunk_size = PARAM_VALUE (PARAM_PARLOOPS_CHUNK_SIZE); - enum PARAM_PARLOOPS_SCHEDULE_KIND schedule_type \ - = (enum PARAM_PARLOOPS_SCHEDULE_KIND) PARAM_VALUE (PARAM_PARLOOPS_SCHEDULE); - switch (schedule_type) + if (oacc_kernels_p) + /* In combination with the NUM_GANGS on the parallel. */ + t = build_omp_clause (loc, OMP_CLAUSE_GANG); + else { - case PARAM_PARLOOPS_SCHEDULE_KIND_static: - OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_STATIC; - break; - case PARAM_PARLOOPS_SCHEDULE_KIND_dynamic: - OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_DYNAMIC; - break; - case PARAM_PARLOOPS_SCHEDULE_KIND_guided: - OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_GUIDED; - break; - case PARAM_PARLOOPS_SCHEDULE_KIND_auto: - OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_AUTO; - chunk_size = 0; - break; - case PARAM_PARLOOPS_SCHEDULE_KIND_runtime: - OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_RUNTIME; - chunk_size = 0; - break; - default: - gcc_unreachable (); + t = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE); + int chunk_size = PARAM_VALUE (PARAM_PARLOOPS_CHUNK_SIZE); + enum PARAM_PARLOOPS_SCHEDULE_KIND schedule_type \ + = (enum PARAM_PARLOOPS_SCHEDULE_KIND) PARAM_VALUE (PARAM_PARLOOPS_SCHEDULE); + switch (schedule_type) + { + case PARAM_PARLOOPS_SCHEDULE_KIND_static: + OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_STATIC; + break; + case PARAM_PARLOOPS_SCHEDULE_KIND_dynamic: + OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_DYNAMIC; + break; + case PARAM_PARLOOPS_SCHEDULE_KIND_guided: + OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_GUIDED; + break; + case PARAM_PARLOOPS_SCHEDULE_KIND_auto: + OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_AUTO; + chunk_size = 0; + break; + case PARAM_PARLOOPS_SCHEDULE_KIND_runtime: + OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_RUNTIME; + chunk_size = 0; + break; + default: + gcc_unreachable (); + } + if (chunk_size != 0) + OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (t) + = build_int_cst (integer_type_node, chunk_size); } - if (chunk_size != 0) - OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (t) - = build_int_cst (integer_type_node, chunk_size); - for_stmt = gimple_build_omp_for (NULL, GF_OMP_FOR_KIND_FOR, t, 1, NULL); + for_stmt = gimple_build_omp_for (NULL, + (oacc_kernels_p + ? GF_OMP_FOR_KIND_OACC_LOOP + : GF_OMP_FOR_KIND_FOR), + t, 1, NULL); + + gimple_cond_set_lhs (cond_stmt, cvar_base); + type = TREE_TYPE (cvar); gimple_set_location (for_stmt, loc); gimple_omp_for_set_index (for_stmt, 0, initvar); gimple_omp_for_set_initial (for_stmt, 0, cvar_init); @@ -2181,7 +2228,8 @@ create_parallel_loop (struct loop *loop, tree loop_fn, tree data, static void gen_parallel_loop (struct loop *loop, reduction_info_table_type *reduction_list, - unsigned n_threads, struct tree_niter_desc *niter) + unsigned n_threads, struct tree_niter_desc *niter, + bool oacc_kernels_p) { tree many_iterations_cond, type, nit; tree arg_struct, new_arg_struct; @@ -2262,40 +2310,44 @@ gen_parallel_loop (struct loop *loop, if (stmts) gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts); - if (loop->inner) - m_p_thread=2; - else - m_p_thread=MIN_PER_THREAD; - - many_iterations_cond = - fold_build2 (GE_EXPR, boolean_type_node, - nit, build_int_cst (type, m_p_thread * n_threads)); - - many_iterations_cond - = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, - invert_truthvalue (unshare_expr (niter->may_be_zero)), - many_iterations_cond); - many_iterations_cond - = force_gimple_operand (many_iterations_cond, &stmts, false, NULL_TREE); - if (stmts) - gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts); - if (!is_gimple_condexpr (many_iterations_cond)) + if (!oacc_kernels_p) { + if (loop->inner) + m_p_thread=2; + else + m_p_thread=MIN_PER_THREAD; + + many_iterations_cond = + fold_build2 (GE_EXPR, boolean_type_node, + nit, build_int_cst (type, m_p_thread * n_threads)); + many_iterations_cond - = force_gimple_operand (many_iterations_cond, &stmts, - true, NULL_TREE); + = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, + invert_truthvalue (unshare_expr (niter->may_be_zero)), + many_iterations_cond); + many_iterations_cond + = force_gimple_operand (many_iterations_cond, &stmts, false, NULL_TREE); if (stmts) gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts); - } + if (!is_gimple_condexpr (many_iterations_cond)) + { + many_iterations_cond + = force_gimple_operand (many_iterations_cond, &stmts, + true, NULL_TREE); + if (stmts) + gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), + stmts); + } - initialize_original_copy_tables (); + initialize_original_copy_tables (); - /* We assume that the loop usually iterates a lot. */ - prob = 4 * REG_BR_PROB_BASE / 5; - loop_version (loop, many_iterations_cond, NULL, - prob, prob, REG_BR_PROB_BASE - prob, true); - update_ssa (TODO_update_ssa); - free_original_copy_tables (); + /* We assume that the loop usually iterates a lot. */ + prob = 4 * REG_BR_PROB_BASE / 5; + loop_version (loop, many_iterations_cond, NULL, + prob, prob, REG_BR_PROB_BASE - prob, true); + update_ssa (TODO_update_ssa); + free_original_copy_tables (); + } /* Base all the induction variables in LOOP on a single control one. */ canonicalize_loop_ivs (loop, &nit, true); @@ -2315,6 +2367,9 @@ gen_parallel_loop (struct loop *loop, } else { + if (oacc_kernels_p) + n_threads = 1; + /* Fall back on the method that handles more cases, but duplicates the loop body: move the exit condition of LOOP to the beginning of its header, and duplicate the part of the last iteration that gets disabled @@ -2331,19 +2386,34 @@ gen_parallel_loop (struct loop *loop, entry = loop_preheader_edge (loop); exit = single_dom_exit (loop); - eliminate_local_variables (entry, exit); - /* In the old loop, move all variables non-local to the loop to a structure - and back, and create separate decls for the variables used in loop. */ - separate_decls_in_region (entry, exit, reduction_list, &arg_struct, - &new_arg_struct, &clsn_data); + /* This rewrites the body in terms of new variables. This has already + been done for oacc_kernels_p in pass_lower_omp/lower_omp (). */ + if (!oacc_kernels_p) + { + eliminate_local_variables (entry, exit); + /* In the old loop, move all variables non-local to the loop to a + structure and back, and create separate decls for the variables used in + loop. */ + separate_decls_in_region (entry, exit, reduction_list, &arg_struct, + &new_arg_struct, &clsn_data); + } + else + { + arg_struct = NULL_TREE; + new_arg_struct = NULL_TREE; + clsn_data.load = NULL_TREE; + clsn_data.load_bb = exit->dest; + clsn_data.store = NULL_TREE; + clsn_data.store_bb = NULL; + } /* Create the parallel constructs. */ loc = UNKNOWN_LOCATION; cond_stmt = last_stmt (loop->header); if (cond_stmt) loc = gimple_location (cond_stmt); - create_parallel_loop (loop, create_loop_fn (loc), arg_struct, - new_arg_struct, n_threads, loc); + create_parallel_loop (loop, create_loop_fn (loc), arg_struct, new_arg_struct, + n_threads, loc, oacc_kernels_p); if (reduction_list->elements () > 0) create_call_for_reduction (loop, reduction_list, &clsn_data); @@ -2542,12 +2612,65 @@ try_get_loop_niter (loop_p loop, struct tree_niter_desc *niter) return true; } +/* Return the default def of the first function argument. */ + +static tree +get_omp_data_i_param (void) +{ + tree decl = DECL_ARGUMENTS (cfun->decl); + gcc_assert (DECL_CHAIN (decl) == NULL_TREE); + return ssa_default_def (cfun, decl); +} + +/* For PHI in loop header of LOOP, look for pattern: + + + .omp_data_i = &.omp_data_arr; + addr = .omp_data_i->sum; + sum_a = *addr; + + : + sum_b = PHI + + and return addr. Otherwise, return NULL_TREE. */ + +static tree +find_reduc_addr (struct loop *loop, gphi *phi) +{ + edge e = loop_preheader_edge (loop); + tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e); + gimple *stmt = SSA_NAME_DEF_STMT (arg); + if (!gimple_assign_single_p (stmt)) + return NULL_TREE; + tree memref = gimple_assign_rhs1 (stmt); + if (TREE_CODE (memref) != MEM_REF) + return NULL_TREE; + tree addr = TREE_OPERAND (memref, 0); + + gimple *stmt2 = SSA_NAME_DEF_STMT (addr); + if (!gimple_assign_single_p (stmt2)) + return NULL_TREE; + tree compref = gimple_assign_rhs1 (stmt2); + if (TREE_CODE (compref) != COMPONENT_REF) + return NULL_TREE; + tree addr2 = TREE_OPERAND (compref, 0); + if (TREE_CODE (addr2) != MEM_REF) + return NULL_TREE; + addr2 = TREE_OPERAND (addr2, 0); + if (TREE_CODE (addr2) != SSA_NAME + || addr2 != get_omp_data_i_param ()) + return NULL_TREE; + + return addr; +} + /* Try to initialize REDUCTION_LIST for code generation part. REDUCTION_LIST describes the reductions. */ static bool try_create_reduction_list (loop_p loop, - reduction_info_table_type *reduction_list) + reduction_info_table_type *reduction_list, + bool oacc_kernels_p) { edge exit = single_dom_exit (loop); gphi_iterator gsi; @@ -2647,6 +2770,26 @@ try_create_reduction_list (loop_p loop, } } + if (oacc_kernels_p) + { + for (gsi = gsi_start_phis (loop->header); !gsi_end_p (gsi); + gsi_next (&gsi)) + { + gphi *phi = gsi.phi (); + tree def = PHI_RESULT (phi); + affine_iv iv; + + if (!virtual_operand_p (def) + && !simple_iv (loop, loop, def, &iv, true)) + { + tree addr = find_reduc_addr (loop, phi); + if (addr == NULL_TREE) + return false; + struct reduction_info *red = reduction_phi (reduction_list, phi); + red->reduc_addr = addr; + } + } + } return true; } @@ -2679,6 +2822,350 @@ loop_has_phi_with_address_arg (struct loop *loop) } end: free (bbs); + + return res; +} + +/* Return true if memory ref REF (corresponding to the stmt at GSI in + REGIONS_BB[I]) conflicts with the statements in REGIONS_BB[I] after gsi, + or the statements in REGIONS_BB[I + n]. REF_IS_STORE indicates if REF is a + store. Ignore conflicts with SKIP_STMT. */ + +static bool +ref_conflicts_with_region (gimple_stmt_iterator gsi, ao_ref *ref, + bool ref_is_store, vec region_bbs, + unsigned int i, gimple *skip_stmt) +{ + basic_block bb = region_bbs[i]; + gsi_next (&gsi); + + while (true) + { + for (; !gsi_end_p (gsi); + gsi_next (&gsi)) + { + gimple *stmt = gsi_stmt (gsi); + if (stmt == skip_stmt) + { + if (dump_file) + { + fprintf (dump_file, "skipping reduction store: "); + print_gimple_stmt (dump_file, stmt, 0, 0); + } + continue; + } + + if (!gimple_vdef (stmt) + && !gimple_vuse (stmt)) + continue; + + if (gimple_code (stmt) == GIMPLE_RETURN) + continue; + + if (ref_is_store) + { + if (ref_maybe_used_by_stmt_p (stmt, ref)) + { + if (dump_file) + { + fprintf (dump_file, "Stmt "); + print_gimple_stmt (dump_file, stmt, 0, 0); + } + return true; + } + } + else + { + if (stmt_may_clobber_ref_p_1 (stmt, ref)) + { + if (dump_file) + { + fprintf (dump_file, "Stmt "); + print_gimple_stmt (dump_file, stmt, 0, 0); + } + return true; + } + } + } + i++; + if (i == region_bbs.length ()) + break; + bb = region_bbs[i]; + gsi = gsi_start_bb (bb); + } + + return false; +} + +/* Return true if the bbs in REGION_BBS but not in in_loop_bbs can be executed + in parallel with REGION_BBS containing the loop. Return the stores of + reduction results in REDUCTION_STORES. */ + +static bool +oacc_entry_exit_ok_1 (bitmap in_loop_bbs, vec region_bbs, + reduction_info_table_type *reduction_list, + bitmap reduction_stores) +{ + tree omp_data_i = get_omp_data_i_param (); + + unsigned i; + basic_block bb; + FOR_EACH_VEC_ELT (region_bbs, i, bb) + { + if (bitmap_bit_p (in_loop_bbs, bb->index)) + continue; + + gimple_stmt_iterator gsi; + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); + gsi_next (&gsi)) + { + gimple *stmt = gsi_stmt (gsi); + gimple *skip_stmt = NULL; + + if (is_gimple_debug (stmt) + || gimple_code (stmt) == GIMPLE_COND) + continue; + + ao_ref ref; + bool ref_is_store = false; + if (gimple_assign_load_p (stmt)) + { + tree rhs = gimple_assign_rhs1 (stmt); + tree base = get_base_address (rhs); + if (TREE_CODE (base) == MEM_REF + && operand_equal_p (TREE_OPERAND (base, 0), omp_data_i, 0)) + continue; + + tree lhs = gimple_assign_lhs (stmt); + if (TREE_CODE (lhs) == SSA_NAME + && has_single_use (lhs)) + { + use_operand_p use_p; + gimple *use_stmt; + single_imm_use (lhs, &use_p, &use_stmt); + if (gimple_code (use_stmt) == GIMPLE_PHI) + { + struct reduction_info *red; + red = reduction_phi (reduction_list, use_stmt); + tree val = PHI_RESULT (red->keep_res); + if (has_single_use (val)) + { + single_imm_use (val, &use_p, &use_stmt); + if (gimple_store_p (use_stmt)) + { + unsigned int id + = SSA_NAME_VERSION (gimple_vdef (use_stmt)); + bitmap_set_bit (reduction_stores, id); + skip_stmt = use_stmt; + if (dump_file) + { + fprintf (dump_file, "found reduction load: "); + print_gimple_stmt (dump_file, stmt, 0, 0); + } + } + } + } + } + + ao_ref_init (&ref, rhs); + } + else if (gimple_store_p (stmt)) + { + ao_ref_init (&ref, gimple_assign_lhs (stmt)); + ref_is_store = true; + } + else if (gimple_code (stmt) == GIMPLE_OMP_RETURN) + continue; + else if (!gimple_has_side_effects (stmt) + && !gimple_could_trap_p (stmt) + && !stmt_could_throw_p (stmt) + && !gimple_vdef (stmt) + && !gimple_vuse (stmt)) + continue; + else if (is_gimple_call (stmt) + && gimple_call_internal_p (stmt) + && gimple_call_internal_fn (stmt) == IFN_GOACC_DIM_POS) + continue; + else if (gimple_code (stmt) == GIMPLE_RETURN) + continue; + else + { + if (dump_file) + { + fprintf (dump_file, "Unhandled stmt in entry/exit: "); + print_gimple_stmt (dump_file, stmt, 0, 0); + } + return false; + } + + if (ref_conflicts_with_region (gsi, &ref, ref_is_store, region_bbs, + i, skip_stmt)) + { + if (dump_file) + { + fprintf (dump_file, "conflicts with entry/exit stmt: "); + print_gimple_stmt (dump_file, stmt, 0, 0); + } + return false; + } + } + } + + return true; +} + +/* Find stores inside REGION_BBS and outside IN_LOOP_BBS, and guard them with + gang_pos == 0, except when the stores are REDUCTION_STORES. Return true + if any changes were made. */ + +static bool +oacc_entry_exit_single_gang (bitmap in_loop_bbs, vec region_bbs, + bitmap reduction_stores) +{ + tree gang_pos = NULL_TREE; + bool changed = false; + + unsigned i; + basic_block bb; + FOR_EACH_VEC_ELT (region_bbs, i, bb) + { + if (bitmap_bit_p (in_loop_bbs, bb->index)) + continue; + + gimple_stmt_iterator gsi; + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);) + { + gimple *stmt = gsi_stmt (gsi); + + if (!gimple_store_p (stmt)) + { + /* Update gsi to point to next stmt. */ + gsi_next (&gsi); + continue; + } + + if (bitmap_bit_p (reduction_stores, + SSA_NAME_VERSION (gimple_vdef (stmt)))) + { + if (dump_file) + { + fprintf (dump_file, + "skipped reduction store for single-gang" + " neutering: "); + print_gimple_stmt (dump_file, stmt, 0, 0); + } + + /* Update gsi to point to next stmt. */ + gsi_next (&gsi); + continue; + } + + changed = true; + + if (gang_pos == NULL_TREE) + { + tree arg = build_int_cst (integer_type_node, GOMP_DIM_GANG); + gcall *gang_single + = gimple_build_call_internal (IFN_GOACC_DIM_POS, 1, arg); + gang_pos = make_ssa_name (integer_type_node); + gimple_call_set_lhs (gang_single, gang_pos); + gimple_stmt_iterator start + = gsi_start_bb (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun))); + tree vuse = ssa_default_def (cfun, gimple_vop (cfun)); + gimple_set_vuse (gang_single, vuse); + gsi_insert_before (&start, gang_single, GSI_SAME_STMT); + } + + if (dump_file) + { + fprintf (dump_file, + "found store that needs single-gang neutering: "); + print_gimple_stmt (dump_file, stmt, 0, 0); + } + + { + /* Split block before store. */ + gimple_stmt_iterator gsi2 = gsi; + gsi_prev (&gsi2); + edge e; + if (gsi_end_p (gsi2)) + { + e = split_block_after_labels (bb); + gsi2 = gsi_last_bb (bb); + } + else + e = split_block (bb, gsi_stmt (gsi2)); + basic_block bb2 = e->dest; + + /* Split block after store. */ + gimple_stmt_iterator gsi3 = gsi_start_bb (bb2); + edge e2 = split_block (bb2, gsi_stmt (gsi3)); + basic_block bb3 = e2->dest; + + gimple *cond + = gimple_build_cond (EQ_EXPR, gang_pos, integer_zero_node, + NULL_TREE, NULL_TREE); + gsi_insert_after (&gsi2, cond, GSI_NEW_STMT); + + edge e3 = make_edge (bb, bb3, EDGE_FALSE_VALUE); + e->flags = EDGE_TRUE_VALUE; + + tree vdef = gimple_vdef (stmt); + tree vuse = gimple_vuse (stmt); + + tree phi_res = copy_ssa_name (vdef); + gphi *new_phi = create_phi_node (phi_res, bb3); + replace_uses_by (vdef, phi_res); + add_phi_arg (new_phi, vuse, e3, UNKNOWN_LOCATION); + add_phi_arg (new_phi, vdef, e2, UNKNOWN_LOCATION); + + /* Update gsi to point to next stmt. */ + bb = bb3; + gsi = gsi_start_bb (bb); + } + } + } + + return changed; +} + +/* Return true if the statements before and after the LOOP can be executed in + parallel with the function containing the loop. Resolve conflicting stores + outside LOOP by guarding them such that only a single gang executes them. */ + +static bool +oacc_entry_exit_ok (struct loop *loop, + reduction_info_table_type *reduction_list) +{ + basic_block *loop_bbs = get_loop_body_in_dom_order (loop); + vec region_bbs + = get_all_dominated_blocks (CDI_DOMINATORS, ENTRY_BLOCK_PTR_FOR_FN (cfun)); + + bitmap in_loop_bbs = BITMAP_ALLOC (NULL); + bitmap_clear (in_loop_bbs); + for (unsigned int i = 0; i < loop->num_nodes; i++) + bitmap_set_bit (in_loop_bbs, loop_bbs[i]->index); + + bitmap reduction_stores = BITMAP_ALLOC (NULL); + bool res = oacc_entry_exit_ok_1 (in_loop_bbs, region_bbs, reduction_list, + reduction_stores); + + if (res) + { + bool changed = oacc_entry_exit_single_gang (in_loop_bbs, region_bbs, + reduction_stores); + if (changed) + { + free_dominance_info (CDI_DOMINATORS); + calculate_dominance_info (CDI_DOMINATORS); + } + } + + free (loop_bbs); + + BITMAP_FREE (in_loop_bbs); + BITMAP_FREE (reduction_stores); + return res; } @@ -2687,7 +3174,7 @@ loop_has_phi_with_address_arg (struct loop *loop) otherwise. */ static bool -parallelize_loops (void) +parallelize_loops (bool oacc_kernels_p) { unsigned n_threads = flag_tree_parallelize_loops; bool changed = false; @@ -2699,19 +3186,29 @@ parallelize_loops (void) source_location loop_loc; /* Do not parallelize loops in the functions created by parallelization. */ - if (parallelized_function_p (cfun->decl)) + if (!oacc_kernels_p + && parallelized_function_p (cfun->decl)) return false; + + /* Do not parallelize loops in offloaded functions. */ + if (!oacc_kernels_p + && get_oacc_fn_attrib (cfun->decl) != NULL) + return false; + if (cfun->has_nonlocal_label) return false; gcc_obstack_init (&parloop_obstack); reduction_info_table_type reduction_list (10); + calculate_dominance_info (CDI_DOMINATORS); + FOR_EACH_LOOP (loop, 0) { if (loop == skip_loop) { - if (dump_file && (dump_flags & TDF_DETAILS)) + if (!loop->in_oacc_kernels_region + && dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Skipping loop %d as inner loop of parallelized loop\n", loop->num); @@ -2723,6 +3220,22 @@ parallelize_loops (void) skip_loop = NULL; reduction_list.empty (); + + if (oacc_kernels_p) + { + if (!loop->in_oacc_kernels_region) + continue; + + /* Don't try to parallelize inner loops in an oacc kernels region. */ + if (loop->inner) + skip_loop = loop->inner; + + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "Trying loop %d with header bb %d in oacc kernels" + " region\n", loop->num, loop->header->index); + } + if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, "Trying loop %d as candidate\n",loop->num); @@ -2764,6 +3277,7 @@ parallelize_loops (void) /* FIXME: Bypass this check as graphite doesn't update the count and frequency correctly now. */ if (!flag_loop_parallelize_all + && !oacc_kernels_p && ((estimated != -1 && estimated <= (HOST_WIDE_INT) n_threads * MIN_PER_THREAD) /* Do not bother with loops in cold areas. */ @@ -2773,7 +3287,7 @@ parallelize_loops (void) if (!try_get_loop_niter (loop, &niter_desc)) continue; - if (!try_create_reduction_list (loop, &reduction_list)) + if (!try_create_reduction_list (loop, &reduction_list, oacc_kernels_p)) continue; if (loop_has_phi_with_address_arg (loop)) @@ -2783,6 +3297,14 @@ parallelize_loops (void) && !loop_parallel_p (loop, &parloop_obstack)) continue; + if (oacc_kernels_p + && !oacc_entry_exit_ok (loop, &reduction_list)) + { + if (dump_file) + fprintf (dump_file, "entry/exit not ok: FAILED\n"); + continue; + } + changed = true; skip_loop = loop->inner; if (dump_file && (dump_flags & TDF_DETAILS)) @@ -2796,8 +3318,9 @@ parallelize_loops (void) fprintf (dump_file, "\nloop at %s:%d: ", LOCATION_FILE (loop_loc), LOCATION_LINE (loop_loc)); } + gen_parallel_loop (loop, &reduction_list, - n_threads, &niter_desc); + n_threads, &niter_desc, oacc_kernels_p); } obstack_free (&parloop_obstack, NULL); @@ -2832,35 +3355,62 @@ class pass_parallelize_loops : public gimple_opt_pass { public: pass_parallelize_loops (gcc::context *ctxt) - : gimple_opt_pass (pass_data_parallelize_loops, ctxt) + : gimple_opt_pass (pass_data_parallelize_loops, ctxt), + oacc_kernels_p (false) {} /* opt_pass methods: */ virtual bool gate (function *) { return flag_tree_parallelize_loops > 1; } virtual unsigned int execute (function *); + opt_pass * clone () { return new pass_parallelize_loops (m_ctxt); } + void set_pass_param (unsigned int n, bool param) + { + gcc_assert (n == 0); + oacc_kernels_p = param; + } + private: + bool oacc_kernels_p; }; // class pass_parallelize_loops unsigned pass_parallelize_loops::execute (function *fun) { - if (number_of_loops (fun) <= 1) - return 0; - tree nthreads = builtin_decl_explicit (BUILT_IN_OMP_GET_NUM_THREADS); if (nthreads == NULL_TREE) return 0; - if (parallelize_loops ()) + bool in_loop_pipeline = scev_initialized_p (); + if (!in_loop_pipeline) + loop_optimizer_init (LOOPS_NORMAL + | LOOPS_HAVE_RECORDED_EXITS); + + if (number_of_loops (fun) <= 1) + return 0; + + if (!in_loop_pipeline) + { + rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa); + scev_initialize (); + } + + unsigned int todo = 0; + if (parallelize_loops (oacc_kernels_p)) { fun->curr_properties &= ~(PROP_gimple_eomp); checking_verify_loop_structure (); - return TODO_update_ssa; + todo |= TODO_update_ssa; + } + + if (!in_loop_pipeline) + { + scev_finalize (); + loop_optimizer_finalize (); } - return 0; + return todo; } } // anon namespace diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 2bfc50fd016..c36a0398db6 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -1522,6 +1522,34 @@ analyze_evolution_in_loop (gphi *loop_phi_node, return evolution_function; } +/* Looks to see if VAR is a copy of a constant (via straightforward assignments + or degenerate phi's). If so, returns the constant; else, returns VAR. */ + +static tree +follow_copies_to_constant (tree var) +{ + tree res = var; + while (TREE_CODE (res) == SSA_NAME) + { + gimple *def = SSA_NAME_DEF_STMT (res); + if (gphi *phi = dyn_cast (def)) + { + if (tree rhs = degenerate_phi_result (phi)) + res = rhs; + else + break; + } + else if (gimple_assign_single_p (def)) + /* Will exit loop if not an SSA_NAME. */ + res = gimple_assign_rhs1 (def); + else + break; + } + if (CONSTANT_CLASS_P (res)) + return res; + return var; +} + /* Given a loop-phi-node, return the initial conditions of the variable on entry of the loop. When the CCP has propagated constants into the loop-phi-node, the initial condition is @@ -1574,21 +1602,9 @@ analyze_initial_condition (gphi *loop_phi_node) if (init_cond == chrec_not_analyzed_yet) init_cond = chrec_dont_know; - /* During early loop unrolling we do not have fully constant propagated IL. - Handle degenerate PHIs here to not miss important unrollings. */ - if (TREE_CODE (init_cond) == SSA_NAME) - { - gimple *def = SSA_NAME_DEF_STMT (init_cond); - if (gphi *phi = dyn_cast (def)) - { - tree res = degenerate_phi_result (phi); - if (res != NULL_TREE - /* Only allow invariants here, otherwise we may break - loop-closed SSA form. */ - && is_gimple_min_invariant (res)) - init_cond = res; - } - } + /* We may not have fully constant propagated IL. Handle degenerate PHIs here + to not miss important early loop unrollings. */ + init_cond = follow_copies_to_constant (init_cond); if (dump_file && (dump_flags & TDF_SCEV)) { @@ -1968,8 +1984,8 @@ analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res) if (bb == NULL || !flow_bb_inside_loop_p (loop, bb)) { - /* Keep the symbolic form. */ - res = var; + /* Keep symbolic form, but look through obvious copies for constants. */ + res = follow_copies_to_constant (var); goto set_and_end; } diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 2d6b8448daa..740542fde0a 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -328,6 +328,10 @@ candidate (unsigned uid) those which cannot be (because they are and need be used as a whole). */ static bitmap should_scalarize_away_bitmap, cannot_scalarize_away_bitmap; +/* Bitmap of candidates in the constant pool, which cannot be scalarized + because this would produce non-constant expressions (e.g. Ada). */ +static bitmap disqualified_constants; + /* Obstack for creation of fancy names. */ static struct obstack name_obstack; @@ -652,6 +656,7 @@ sra_initialize (void) (vec_safe_length (cfun->local_decls) / 2); should_scalarize_away_bitmap = BITMAP_ALLOC (NULL); cannot_scalarize_away_bitmap = BITMAP_ALLOC (NULL); + disqualified_constants = BITMAP_ALLOC (NULL); gcc_obstack_init (&name_obstack); base_access_vec = new hash_map >; memset (&sra_stats, 0, sizeof (sra_stats)); @@ -670,6 +675,7 @@ sra_deinitialize (void) candidates = NULL; BITMAP_FREE (should_scalarize_away_bitmap); BITMAP_FREE (cannot_scalarize_away_bitmap); + BITMAP_FREE (disqualified_constants); access_pool.release (); assign_link_pool.release (); obstack_free (&name_obstack, NULL); @@ -677,6 +683,13 @@ sra_deinitialize (void) delete base_access_vec; } +/* Return true if DECL is a VAR_DECL in the constant pool, false otherwise. */ + +static bool constant_decl_p (tree decl) +{ + return TREE_CODE (decl) == VAR_DECL && DECL_IN_CONSTANT_POOL (decl); +} + /* Remove DECL from candidates for SRA and write REASON to the dump file if there is one. */ static void @@ -684,6 +697,8 @@ disqualify_candidate (tree decl, const char *reason) { if (bitmap_clear_bit (candidate_bitmap, DECL_UID (decl))) candidates->remove_elt_with_hash (decl, DECL_UID (decl)); + if (constant_decl_p (decl)) + bitmap_set_bit (disqualified_constants, DECL_UID (decl)); if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -835,8 +850,11 @@ create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size) return access; } +static bool maybe_add_sra_candidate (tree); + /* Create and insert access for EXPR. Return created access, or NULL if it is - not possible. */ + not possible. Also scan for uses of constant pool as we go along and add + to candidates. */ static struct access * create_access (tree expr, gimple *stmt, bool write) @@ -859,6 +877,25 @@ create_access (tree expr, gimple *stmt, bool write) else ptr = false; + /* For constant-pool entries, check we can substitute the constant value. */ + if (constant_decl_p (base) + && (sra_mode == SRA_MODE_EARLY_INTRA || sra_mode == SRA_MODE_INTRA)) + { + gcc_assert (!bitmap_bit_p (disqualified_constants, DECL_UID (base))); + if (expr != base + && !is_gimple_reg_type (TREE_TYPE (expr)) + && dump_file && (dump_flags & TDF_DETAILS)) + { + /* This occurs in Ada with accesses to ARRAY_RANGE_REFs, + and elements of multidimensional arrays (which are + multi-element arrays in their own right). */ + fprintf (dump_file, "Allowing non-reg-type load of part" + " of constant-pool entry: "); + print_generic_expr (dump_file, expr, 0); + } + maybe_add_sra_candidate (base); + } + if (!DECL_P (base) || !bitmap_bit_p (candidate_bitmap, DECL_UID (base))) return NULL; @@ -918,6 +955,8 @@ static bool scalarizable_type_p (tree type) { gcc_assert (!is_gimple_reg_type (type)); + if (type_contains_placeholder_p (type)) + return false; switch (TREE_CODE (type)) { @@ -1852,7 +1891,10 @@ maybe_add_sra_candidate (tree var) reject (var, "not aggregate"); return false; } - if (needs_to_live_in_memory (var)) + /* Allow constant-pool entries (that "need to live in memory") + unless we are doing IPA SRA. */ + if (needs_to_live_in_memory (var) + && (sra_mode == SRA_MODE_EARLY_IPA || !constant_decl_p (var))) { reject (var, "needs to live in memory"); return false; @@ -3113,7 +3155,7 @@ load_assign_lhs_subreplacements (struct access *lacc, if (racc && racc->grp_to_be_replaced) { - if (racc->grp_write) + if (racc->grp_write || constant_decl_p (racc->base)) drhs = get_access_replacement (racc); else drhs = NULL; @@ -3272,6 +3314,9 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi) racc = get_access_for_expr (rhs); if (!lacc && !racc) return SRA_AM_NONE; + /* Avoid modifying initializations of constant-pool replacements. */ + if (racc && (racc->replacement_decl == lhs)) + return SRA_AM_NONE; loc = gimple_location (stmt); if (lacc && lacc->grp_to_be_replaced) @@ -3388,7 +3433,8 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi) || contains_vce_or_bfcref_p (lhs) || stmt_ends_bb_p (stmt)) { - if (access_has_children_p (racc)) + /* No need to copy into a constant-pool, it comes pre-initialized. */ + if (access_has_children_p (racc) && !constant_decl_p (racc->base)) generate_subtree_copies (racc->first_child, rhs, racc->offset, 0, 0, gsi, false, false, loc); if (access_has_children_p (lacc)) @@ -3491,6 +3537,54 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi) } } +/* Set any scalar replacements of values in the constant pool to the initial + value of the constant. (Constant-pool decls like *.LC0 have effectively + been initialized before the program starts, we must do the same for their + replacements.) Thus, we output statements like 'SR.1 = *.LC0[0];' into + the function's entry block. */ + +static void +initialize_constant_pool_replacements (void) +{ + gimple_seq seq = NULL; + gimple_stmt_iterator gsi = gsi_start (seq); + bitmap_iterator bi; + unsigned i; + + EXECUTE_IF_SET_IN_BITMAP (candidate_bitmap, 0, i, bi) + if (bitmap_bit_p (should_scalarize_away_bitmap, i) + && !bitmap_bit_p (cannot_scalarize_away_bitmap, i)) + { + tree var = candidate (i); + if (!constant_decl_p (var)) + continue; + vec *access_vec = get_base_access_vector (var); + if (!access_vec) + continue; + for (unsigned i = 0; i < access_vec->length (); i++) + { + struct access *access = (*access_vec)[i]; + if (!access->replacement_decl) + continue; + gassign *stmt = gimple_build_assign ( + get_access_replacement (access), unshare_expr (access->expr)); + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, "Generating constant initializer: "); + print_gimple_stmt (dump_file, stmt, 0, 1); + fprintf (dump_file, "\n"); + } + gsi_insert_after (&gsi, stmt, GSI_NEW_STMT); + update_stmt (stmt); + } + } + + seq = gsi_seq (gsi); + if (seq) + gsi_insert_seq_on_edge_immediate ( + single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)), seq); +} + /* Traverse the function body and all modifications as decided in analyze_all_variable_accesses. Return true iff the CFG has been changed. */ @@ -3501,6 +3595,8 @@ sra_modify_function_body (void) bool cfg_changed = false; basic_block bb; + initialize_constant_pool_replacements (); + FOR_EACH_BB_FN (bb, cfun) { gimple_stmt_iterator gsi = gsi_start_bb (bb); diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index f2257b33dd3..829863794a3 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -316,39 +316,6 @@ record_conditions (struct edge_info *edge_info, tree cond, tree inverted) edge_info->cond_equivalences.safe_push (c); } -/* Return TRUE is OP, an SSA_NAME has a range of values [0..1], false - otherwise. - - This can be because it is a boolean type, any unsigned integral - type with a single bit of precision, or has known range of [0..1] - via VRP analysis. */ - -static bool -ssa_name_has_boolean_range (tree op) -{ - /* Boolean types always have a range [0..1]. */ - if (TREE_CODE (TREE_TYPE (op)) == BOOLEAN_TYPE) - return true; - - /* An integral type with a single bit of precision. */ - if (INTEGRAL_TYPE_P (TREE_TYPE (op)) - && TYPE_UNSIGNED (TREE_TYPE (op)) - && TYPE_PRECISION (TREE_TYPE (op)) == 1) - return true; - - /* An integral type with more precision, but the object - only takes on values [0..1] as determined by VRP - analysis. */ - wide_int min, max; - if (INTEGRAL_TYPE_P (TREE_TYPE (op)) - && get_range_info (op, &min, &max) == VR_RANGE - && wi::eq_p (min, 0) - && wi::eq_p (max, 1)) - return true; - - return false; -} - /* We have finished optimizing BB, record any information implied by taking a specific outgoing edge from BB. */ diff --git a/gcc/tree-ssa-scopedtables.c b/gcc/tree-ssa-scopedtables.c index 16d29d628cd..af79535cc02 100644 --- a/gcc/tree-ssa-scopedtables.c +++ b/gcc/tree-ssa-scopedtables.c @@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "fold-const.h" #include "tree-eh.h" #include "internal-fn.h" +#include "tree-dfa.h" static bool hashable_expr_equal_p (const struct hashable_expr *, const struct hashable_expr *); @@ -209,11 +210,70 @@ avail_expr_hash (class expr_hash_elt *p) const struct hashable_expr *expr = p->expr (); inchash::hash hstate; + if (expr->kind == EXPR_SINGLE) + { + /* T could potentially be a switch index or a goto dest. */ + tree t = expr->ops.single.rhs; + if (TREE_CODE (t) == MEM_REF || TREE_CODE (t) == ARRAY_REF) + { + /* Make equivalent statements of both these kinds hash together. + Dealing with both MEM_REF and ARRAY_REF allows us not to care + about equivalence with other statements not considered here. */ + bool reverse; + HOST_WIDE_INT offset, size, max_size; + tree base = get_ref_base_and_extent (t, &offset, &size, &max_size, + &reverse); + /* Strictly, we could try to normalize variable-sized accesses too, + but here we just deal with the common case. */ + if (size == max_size) + { + enum tree_code code = MEM_REF; + hstate.add_object (code); + inchash::add_expr (base, hstate); + hstate.add_object (offset); + hstate.add_object (size); + return hstate.end (); + } + } + } + inchash::add_hashable_expr (expr, hstate); return hstate.end (); } +/* Compares trees T0 and T1 to see if they are MEM_REF or ARRAY_REFs equivalent + to each other. (That is, they return the value of the same bit of memory.) + + Return TRUE if the two are so equivalent; FALSE if not (which could still + mean the two are equivalent by other means). */ + +static bool +equal_mem_array_ref_p (tree t0, tree t1) +{ + if (TREE_CODE (t0) != MEM_REF && TREE_CODE (t0) != ARRAY_REF) + return false; + if (TREE_CODE (t1) != MEM_REF && TREE_CODE (t1) != ARRAY_REF) + return false; + + if (!types_compatible_p (TREE_TYPE (t0), TREE_TYPE (t1))) + return false; + bool rev0; + HOST_WIDE_INT off0, sz0, max0; + tree base0 = get_ref_base_and_extent (t0, &off0, &sz0, &max0, &rev0); + + bool rev1; + HOST_WIDE_INT off1, sz1, max1; + tree base1 = get_ref_base_and_extent (t1, &off1, &sz1, &max1, &rev1); + + /* Types were compatible, so these are sanity checks. */ + gcc_assert (sz0 == sz1); + gcc_assert (max0 == max1); + gcc_assert (rev0 == rev1); + + return (off0 == off1) && operand_equal_p (base0, base1, 0); +} + /* Compare two hashable_expr structures for equivalence. They are considered equivalent when the expressions they denote must necessarily be equal. The logic is intended to follow that of @@ -246,9 +306,10 @@ hashable_expr_equal_p (const struct hashable_expr *expr0, switch (expr0->kind) { case EXPR_SINGLE: - return operand_equal_p (expr0->ops.single.rhs, - expr1->ops.single.rhs, 0); - + return equal_mem_array_ref_p (expr0->ops.single.rhs, + expr1->ops.single.rhs) + || operand_equal_p (expr0->ops.single.rhs, + expr1->ops.single.rhs, 0); case EXPR_UNARY: if (expr0->ops.unary.op != expr1->ops.unary.op) return false; diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c index 4b575780700..307bb1fd134 100644 --- a/gcc/tree-ssa-uncprop.c +++ b/gcc/tree-ssa-uncprop.c @@ -94,23 +94,26 @@ associate_equivalences_with_edges (void) can record an equivalence for OP0 rather than COND. */ if (TREE_CODE (op0) == SSA_NAME && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0) - && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE + && ssa_name_has_boolean_range (op0) && is_gimple_min_invariant (op1)) { + tree true_val = constant_boolean_node (true, TREE_TYPE (op0)); + tree false_val = constant_boolean_node (false, + TREE_TYPE (op0)); if (code == EQ_EXPR) { equivalency = XNEW (struct edge_equivalency); equivalency->lhs = op0; equivalency->rhs = (integer_zerop (op1) - ? boolean_false_node - : boolean_true_node); + ? false_val + : true_val); true_edge->aux = equivalency; equivalency = XNEW (struct edge_equivalency); equivalency->lhs = op0; equivalency->rhs = (integer_zerop (op1) - ? boolean_true_node - : boolean_false_node); + ? true_val + : false_val); false_edge->aux = equivalency; } else @@ -118,15 +121,15 @@ associate_equivalences_with_edges (void) equivalency = XNEW (struct edge_equivalency); equivalency->lhs = op0; equivalency->rhs = (integer_zerop (op1) - ? boolean_true_node - : boolean_false_node); + ? true_val + : false_val); true_edge->aux = equivalency; equivalency = XNEW (struct edge_equivalency); equivalency->lhs = op0; equivalency->rhs = (integer_zerop (op1) - ? boolean_false_node - : boolean_true_node); + ? false_val + : true_val); false_edge->aux = equivalency; } } diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c index 82866b28097..b6f72e2ba2c 100644 --- a/gcc/tree-ssanames.c +++ b/gcc/tree-ssanames.c @@ -411,6 +411,40 @@ get_nonzero_bits (const_tree name) return ri->get_nonzero_bits (); } +/* Return TRUE is OP, an SSA_NAME has a range of values [0..1], false + otherwise. + + This can be because it is a boolean type, any unsigned integral + type with a single bit of precision, or has known range of [0..1] + via VRP analysis. */ + +bool +ssa_name_has_boolean_range (tree op) +{ + gcc_assert (TREE_CODE (op) == SSA_NAME); + + /* Boolean types always have a range [0..1]. */ + if (TREE_CODE (TREE_TYPE (op)) == BOOLEAN_TYPE) + return true; + + /* An integral type with a single bit of precision. */ + if (INTEGRAL_TYPE_P (TREE_TYPE (op)) + && TYPE_UNSIGNED (TREE_TYPE (op)) + && TYPE_PRECISION (TREE_TYPE (op)) == 1) + return true; + + /* An integral type with more precision, but the object + only takes on values [0..1] as determined by VRP + analysis. */ + if (INTEGRAL_TYPE_P (TREE_TYPE (op)) + && (TYPE_PRECISION (TREE_TYPE (op)) > 1 + || TYPE_UNSIGNED (TREE_TYPE (op))) + && wi::eq_p (get_nonzero_bits (op), 1)) + return true; + + return false; +} + /* We no longer need the SSA_NAME expression VAR, release it so that it may be reused. diff --git a/gcc/tree-ssanames.h b/gcc/tree-ssanames.h index d8ce684b600..c81b1a14184 100644 --- a/gcc/tree-ssanames.h +++ b/gcc/tree-ssanames.h @@ -75,6 +75,7 @@ extern enum value_range_type get_range_info (const_tree, wide_int *, wide_int *); extern void set_nonzero_bits (tree, const wide_int_ref &); extern wide_int get_nonzero_bits (const_tree); +extern bool ssa_name_has_boolean_range (tree); extern void init_ssanames (struct function *, int); extern void fini_ssanames (struct function *); extern void ssanames_print_statistics (void); diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 5767e19e884..30e8c153fe6 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -966,7 +966,12 @@ vect_build_slp_tree (vec_info *vinfo, { /* If we have all children of child built up from scalars then just throw that away and build it up this node from scalars. */ - if (!SLP_TREE_CHILDREN (child).is_empty ()) + if (!SLP_TREE_CHILDREN (child).is_empty () + /* ??? Rejecting patterns this way doesn't work. We'd have to + do extra work to cancel the pattern so the uses see the + scalar version. */ + && !is_pattern_stmt_p + (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0]))) { slp_tree grandchild; @@ -1110,7 +1115,12 @@ vect_build_slp_tree (vec_info *vinfo, /* If we have all children of child built up from scalars then just throw that away and build it up this node from scalars. */ - if (!SLP_TREE_CHILDREN (child).is_empty ()) + if (!SLP_TREE_CHILDREN (child).is_empty () + /* ??? Rejecting patterns this way doesn't work. We'd have + to do extra work to cancel the pattern so the uses see the + scalar version. */ + && !is_pattern_stmt_p + (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0]))) { unsigned int j; slp_tree grandchild; @@ -2399,6 +2409,11 @@ vect_bb_slp_scalar_cost (basic_block bb, if ((*life)[i]) continue; + /* Count scalar stmts only once. */ + if (gimple_visited_p (stmt)) + continue; + gimple_set_visited (stmt, true); + stmt_info = vinfo_for_stmt (stmt); if (STMT_VINFO_DATA_REF (stmt_info)) { @@ -2441,6 +2456,11 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo) &life); } + /* Unset visited flag. */ + for (gimple_stmt_iterator gsi = bb_vinfo->region_begin; + gsi_stmt (gsi) != gsi_stmt (bb_vinfo->region_end); gsi_next (&gsi)) + gimple_set_visited (gsi_stmt (gsi), false); + /* Complete the target-specific cost calculation. */ finish_cost (BB_VINFO_TARGET_COST_DATA (bb_vinfo), &vec_prologue_cost, &vec_inside_cost, &vec_epilogue_cost); diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 8f35eb73277..159d4870ee8 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -5067,8 +5067,9 @@ extract_code_and_val_from_cond_with_ops (tree name, enum tree_code cond_code, if (invert) comp_code = invert_tree_comparison (comp_code, 0); - /* VRP does not handle float types. */ - if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (val))) + /* VRP only handles integral and pointer types. */ + if (! INTEGRAL_TYPE_P (TREE_TYPE (val)) + && ! POINTER_TYPE_P (TREE_TYPE (val))) return false; /* Do not register always-false predicates. diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 362c835899f..c993191f371 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,8 @@ +2016-01-15 Jakub Jelinek + + * intrinsics/execute_command_line.c (set_cmdstat): Use "%s", msg + instead of msg to avoid -Wformat-security warning. + 2016-01-04 Jakub Jelinek Update copyright years. diff --git a/libgfortran/intrinsics/execute_command_line.c b/libgfortran/intrinsics/execute_command_line.c index 256c12dc3ee..c9f9176c2a2 100644 --- a/libgfortran/intrinsics/execute_command_line.c +++ b/libgfortran/intrinsics/execute_command_line.c @@ -1,6 +1,6 @@ /* Implementation of the EXECUTE_COMMAND_LINE intrinsic. Copyright (C) 2009-2016 Free Software Foundation, Inc. - Contributed by François-Xavier Coudert. + Contributed by François-Xavier Coudert. This file is part of the GNU Fortran runtime library (libgfortran). @@ -55,7 +55,7 @@ set_cmdstat (int *cmdstat, int value) #define MSGLEN 200 char msg[MSGLEN] = "EXECUTE_COMMAND_LINE: "; strncat (msg, cmdmsg_values[value], MSGLEN - strlen(msg) - 1); - runtime_error (msg); + runtime_error ("%s", msg); } } diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index be30656532a..2efc516624a 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,34 @@ +2016-01-18 Tom de Vries + + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-2.c: New test. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-3.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-2.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-3.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-4.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-5.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-6.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-collapse.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-data-2.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-data-enter-exit-2.c: + Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-data-enter-exit.c: + Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-data-update.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-data.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-g.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-mod-not-zero.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-n.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop-nest.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-loop.c: Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-parallel-loop-data-enter-exit.c: + Same. + * testsuite/libgomp.oacc-c-c++-common/kernels-reduction.c: Same. + +2016-01-15 Jakub Jelinek + + * task.c (GOMP_PLUGIN_target_task_completion): Add missing return. + 2016-01-15 Cesar Philippidis * testsuite/libgomp.oacc-fortran/kernels-data.f90: New test. diff --git a/libgomp/task.c b/libgomp/task.c index 90bdb1c47b0..0f45c444623 100644 --- a/libgomp/task.c +++ b/libgomp/task.c @@ -579,6 +579,7 @@ GOMP_PLUGIN_target_task_completion (void *data) { ttask->state = GOMP_TARGET_TASK_FINISHED; gomp_mutex_unlock (&team->task_lock); + return; } ttask->state = GOMP_TARGET_TASK_FINISHED; free (ttask->firstprivate_copies); diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-2.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-2.c new file mode 100644 index 00000000000..13e57bd9877 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-2.c @@ -0,0 +1,47 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N (1024 * 512) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + + a = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + b = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + c = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + +#pragma acc kernels copyout (a[0:N]) + { + for (COUNTERTYPE i = 0; i < N; i++) + a[i] = i * 2; + } + +#pragma acc kernels copyout (b[0:N]) + { + for (COUNTERTYPE i = 0; i < N; i++) + b[i] = i * 4; + } + +#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) + { + for (COUNTERTYPE ii = 0; ii < N; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (COUNTERTYPE i = 0; i < N; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-3.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-3.c new file mode 100644 index 00000000000..f61a74a00fb --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-3.c @@ -0,0 +1,34 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N (1024 * 512) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int i; + + unsigned int *__restrict c; + + c = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + + for (COUNTERTYPE i = 0; i < N; i++) + c[i] = i * 2; + +#pragma acc kernels copy (c[0:N]) + { + for (COUNTERTYPE ii = 0; ii < N; ii++) + c[ii] = c[ii] + ii + 1; + } + + for (COUNTERTYPE i = 0; i < N; i++) + if (c[i] != i * 2 + i + 1) + abort (); + + free (c); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-2.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-2.c new file mode 100644 index 00000000000..2e4100fa7a2 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-2.c @@ -0,0 +1,36 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N 32 + +unsigned int +foo (int n, unsigned int *a) +{ +#pragma acc kernels copy (a[0:N]) + { + a[0] = a[0] + 1; + + for (int i = 0; i < n; i++) + a[i] = 1; + } + + return a[0]; +} + +int +main (void) +{ + unsigned int a[N]; + unsigned res, i; + + for (i = 0; i < N; ++i) + a[i] = i % 4; + + res = foo (N, a); + if (res != 1) + abort (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-3.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-3.c new file mode 100644 index 00000000000..b3e736bf358 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-3.c @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N 32 + +unsigned int +foo (int n, unsigned int *a) +{ + +#pragma acc kernels copy (a[0:N]) + { + for (int i = 0; i < n; i++) + a[i] = 1; + + a[0] = 2; + } + + return a[0]; +} + +int +main (void) +{ + unsigned int a[N]; + unsigned res, i; + + for (i = 0; i < N; ++i) + a[i] = i % 4; + + res = foo (N, a); + if (res != 2) + abort (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-4.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-4.c new file mode 100644 index 00000000000..8b9affabedc --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-4.c @@ -0,0 +1,36 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N 32 + +unsigned int +foo (int n, unsigned int *a) +{ +#pragma acc kernels copy (a[0:N]) + { + a[0] = 2; + + for (int i = 0; i < n; i++) + a[i] = 1; + } + + return a[0]; +} + +int +main (void) +{ + unsigned int a[N]; + unsigned res, i; + + for (i = 0; i < N; ++i) + a[i] = i % 4; + + res = foo (N, a); + if (res != 1) + abort (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-5.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-5.c new file mode 100644 index 00000000000..83d4e7faf8f --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-5.c @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N 32 + +unsigned int +foo (int n, unsigned int *a) +{ + int r; +#pragma acc kernels copyout(r) copy (a[0:N]) + { + r = a[0]; + + for (int i = 0; i < n; i++) + a[i] = 1; + } + + return r; +} + +int +main (void) +{ + unsigned int a[N]; + unsigned res, i; + + for (i = 0; i < N; ++i) + a[i] = i % 4; + + res = foo (N, a); + if (res != 0) + abort (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-6.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-6.c new file mode 100644 index 00000000000..01d5e5e4c24 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq-6.c @@ -0,0 +1,36 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N 32 + +unsigned int +foo (int n, unsigned int *a) +{ +#pragma acc kernels copy (a[0:N]) + { + int r = a[0]; + + for (int i = 0; i < n; i++) + a[i] = 1 + r; + } + + return a[0]; +} + +int +main (void) +{ + unsigned int a[N]; + unsigned res, i; + + for (i = 0; i < N; ++i) + a[i] = i % 4; + + res = foo (N, a); + if (res != 1) + abort (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq.c new file mode 100644 index 00000000000..61d1283a36a --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-and-seq.c @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N 32 + +unsigned int +foo (int n, unsigned int *a) +{ + +#pragma acc kernels copy (a[0:N]) + { + for (int i = 0; i < n; i++) + a[i] = 1; + + a[0] = a[0] + 1; + } + + return a[0]; +} + +int +main (void) +{ + unsigned int a[N]; + unsigned res, i; + + for (i = 0; i < N; ++i) + a[i] = i % 4; + + res = foo (N, a); + if (res != 2) + abort (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-collapse.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-collapse.c new file mode 100644 index 00000000000..f7f04cb9ed5 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-collapse.c @@ -0,0 +1,40 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N 100 + +int a[N][N]; + +void __attribute__((noinline, noclone)) +foo (int m, int n) +{ + int i, j; + #pragma acc kernels + { +#pragma acc loop collapse(2) + for (i = 0; i < m; i++) + for (j = 0; j < n; j++) + a[i][j] = 1; + } +} + +int +main (void) +{ + int i, j; + + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) + a[i][j] = 0; + + foo (N, N); + + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) + if (a[i][j] != 1) + abort (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-g.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-g.c new file mode 100644 index 00000000000..96b6e4eaf45 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-g.c @@ -0,0 +1,5 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ +/* { dg-additional-options "-g" } */ + +#include "kernels-loop.c" diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-mod-not-zero.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-mod-not-zero.c new file mode 100644 index 00000000000..1433cb203b8 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-mod-not-zero.c @@ -0,0 +1,41 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N ((1024 * 512) + 1) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + + a = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + b = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + c = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + + for (COUNTERTYPE i = 0; i < N; i++) + a[i] = i * 2; + + for (COUNTERTYPE i = 0; i < N; i++) + b[i] = i * 4; + +#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) + { + for (COUNTERTYPE ii = 0; ii < N; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (COUNTERTYPE i = 0; i < N; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-n.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-n.c new file mode 100644 index 00000000000..fd0d5b193a8 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-n.c @@ -0,0 +1,47 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N ((1024 * 512) + 1) +#define COUNTERTYPE unsigned int + +static int __attribute__((noinline,noclone)) +foo (COUNTERTYPE n) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + + a = (unsigned int *__restrict)malloc (n * sizeof (unsigned int)); + b = (unsigned int *__restrict)malloc (n * sizeof (unsigned int)); + c = (unsigned int *__restrict)malloc (n * sizeof (unsigned int)); + + for (COUNTERTYPE i = 0; i < n; i++) + a[i] = i * 2; + + for (COUNTERTYPE i = 0; i < n; i++) + b[i] = i * 4; + +#pragma acc kernels copyin (a[0:n], b[0:n]) copyout (c[0:n]) + { + for (COUNTERTYPE ii = 0; ii < n; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (COUNTERTYPE i = 0; i < n; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} + +int +main (void) +{ + return foo (N); +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-nest.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-nest.c new file mode 100644 index 00000000000..21d2599f0aa --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop-nest.c @@ -0,0 +1,26 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N 1000 + +int +main (void) +{ + int x[N][N]; + +#pragma acc kernels copyout (x) + { + for (int ii = 0; ii < N; ii++) + for (int jj = 0; jj < N; jj++) + x[ii][jj] = ii + jj + 3; + } + + for (int i = 0; i < N; i++) + for (int j = 0; j < N; j++) + if (x[i][j] != i + j + 3) + abort (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop.c new file mode 100644 index 00000000000..3762e5a8b9a --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-loop.c @@ -0,0 +1,41 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define N (1024 * 512) +#define COUNTERTYPE unsigned int + +int +main (void) +{ + unsigned int *__restrict a; + unsigned int *__restrict b; + unsigned int *__restrict c; + + a = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + b = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + c = (unsigned int *__restrict)malloc (N * sizeof (unsigned int)); + + for (COUNTERTYPE i = 0; i < N; i++) + a[i] = i * 2; + + for (COUNTERTYPE i = 0; i < N; i++) + b[i] = i * 4; + +#pragma acc kernels copyin (a[0:N], b[0:N]) copyout (c[0:N]) + { + for (COUNTERTYPE ii = 0; ii < N; ii++) + c[ii] = a[ii] + b[ii]; + } + + for (COUNTERTYPE i = 0; i < N; i++) + if (c[i] != a[i] + b[i]) + abort (); + + free (a); + free (b); + free (c); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-reduction.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-reduction.c new file mode 100644 index 00000000000..511e25f882a --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/kernels-reduction.c @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-parallelize-loops=32" } */ + +#include + +#define n 10000 + +unsigned int a[n]; + +void __attribute__((noinline,noclone)) +foo (void) +{ + int i; + unsigned int sum = 1; + +#pragma acc kernels copyin (a[0:n]) copy (sum) + { + for (i = 0; i < n; ++i) + sum += a[i]; + } + + if (sum != 5001) + abort (); +} + +int +main () +{ + int i; + + for (i = 0; i < n; ++i) + a[i] = i % 2; + + foo (); + + return 0; +} diff --git a/libitm/ChangeLog b/libitm/ChangeLog index adcbf1d4f57..fd41c82d858 100644 --- a/libitm/ChangeLog +++ b/libitm/ChangeLog @@ -1,3 +1,14 @@ +2016-01-16 Torvald Riegel + + * method-gl.cc (gl_wt_dispatch::trycommit): Ensure proxy privatization + safety. + * method-ml.cc (ml_wt_dispatch::trycommit): Likewise. + * libitm/testsuite/libitm.c/priv-1.c: New. + +2015-01-15 Torvald Riegel + + testsuite/libitm.c++/libstdc++-safeexc.C: New. + 2016-01-13 Torvald Riegel * beginend.cc (gtm_thread::trycommit): Fix seq_cst fences. diff --git a/libitm/method-gl.cc b/libitm/method-gl.cc index b2e2bcad71e..b51c802f191 100644 --- a/libitm/method-gl.cc +++ b/libitm/method-gl.cc @@ -291,12 +291,18 @@ public: // See begin_or_restart() for why we need release memory order here. v = gl_mg::clear_locked(v) + 1; o_gl_mg.orec.store(v, memory_order_release); - - // Need to ensure privatization safety. Every other transaction must - // have a snapshot time that is at least as high as our commit time - // (i.e., our commit must be visible to them). - priv_time = v; } + + // Need to ensure privatization safety. Every other transaction must have + // a snapshot time that is at least as high as our commit time (i.e., our + // commit must be visible to them). Because of proxy privatization, we + // must ensure that even if we are a read-only transaction. See + // ml_wt_dispatch::trycommit() for details: We can't get quite the same + // set of problems because we just use one orec and thus, for example, + // there cannot be concurrent writers -- but we can still get pending + // loads to privatized data when not ensuring privatization safety, which + // is problematic if the program unmaps the privatized memory. + priv_time = v; return true; } diff --git a/libitm/method-ml.cc b/libitm/method-ml.cc index 723643ab97c..c1a6771d3f9 100644 --- a/libitm/method-ml.cc +++ b/libitm/method-ml.cc @@ -513,6 +513,21 @@ public: if (!tx->writelog.size()) { tx->readlog.clear(); + // We still need to ensure privatization safety, unfortunately. While + // we cannot have privatized anything by ourselves (because we are not + // an update transaction), we can have observed the commits of + // another update transaction that privatized something. Because any + // commit happens before ensuring privatization, our snapshot and + // commit can thus have happened before ensuring privatization safety + // for this commit/snapshot time. Therefore, before we can return to + // nontransactional code that might use the privatized data, we must + // ensure privatization safety for our snapshot time. + // This still seems to be better than not allowing use of the + // snapshot time before privatization safety has been ensured because + // we at least can run transactions such as this one, and in the + // meantime the transaction producing this commit time might have + // finished ensuring privatization safety for it. + priv_time = tx->shared_state.load(memory_order_relaxed); return true; } diff --git a/libitm/testsuite/libitm.c++/libstdc++-safeexc.C b/libitm/testsuite/libitm.c++/libstdc++-safeexc.C new file mode 100644 index 00000000000..3e1655e83ec --- /dev/null +++ b/libitm/testsuite/libitm.c++/libstdc++-safeexc.C @@ -0,0 +1,89 @@ +// Tests that the exceptions declared by the TM TS (N4514) as transaction_safe +// are indeed that. Thus, this also tests the transactional clones in +// libstdc++ and libsupc++. + +// { dg-do run } + +#include +#include +#include +#include + +using namespace std; + +template void thrower(const T& t) +{ + try + { + atomic_commit + { + throw t; + } + } + catch (T ex) + { + if (ex != t) abort (); + } +} + +template void thrower1(const string& what) +{ + try + { + atomic_commit + { + throw T (); + } + } + catch (T ex) + { + if (what != ex.what()) abort (); + } +} + +template void thrower2(const string& what) +{ + try + { + atomic_commit + { + throw T (what); + } + } + catch (T ex) + { + if (what != ex.what()) abort (); + } +} + + +int main () +{ + thrower (23); + thrower (23); + thrower (23); + thrower (23); + thrower (23); + thrower (23); + thrower (42); + thrower (42); + thrower (42); + thrower (42); + thrower (23.42); + thrower (23.42); + thrower (23.42); + thrower (0); + thrower (0); + thrower1 ("std::exception"); + thrower1 ("std::bad_exception"); + thrower2 ("test"); + thrower2 ("test"); + thrower2 ("test"); + thrower2 ("test"); + thrower2 ("test"); + thrower2 ("test"); + thrower2 ("test"); + thrower2 ("test"); + thrower2 ("test"); + return 0; +} diff --git a/libitm/testsuite/libitm.c/priv-1.c b/libitm/testsuite/libitm.c/priv-1.c new file mode 100644 index 00000000000..635d5237f29 --- /dev/null +++ b/libitm/testsuite/libitm.c/priv-1.c @@ -0,0 +1,116 @@ +/* Quick stress test for proxy privatization. */ + +/* We need to use a TM method that has to enforce privatization safety + explicitly. */ +/* { dg-set-target-env-var ITM_DEFAULT_METHOD "ml_wt" } */ + +#include +#include +#include + +/* Make them likely to be mapped to different orecs. */ +#define ALIGN __attribute__((aligned (256))) +/* Don't make these static to work around PR 68591. */ +int x ALIGN; +int *ptr ALIGN; +int *priv_ptr ALIGN; +int priv_value ALIGN; +int barrier ALIGN = 0; +const int iters = 100; + +static void arrive_and_wait (int expected_value) +{ + int now = __atomic_add_fetch (&barrier, 1, __ATOMIC_ACQ_REL); + while (now < expected_value) + __atomic_load (&barrier, &now, __ATOMIC_ACQUIRE); +} + +static void __attribute__((transaction_pure,noinline)) delay (int i) +{ + for (volatile int v = 0; v < i; v++); +} + +/* This tries to catch a case in which proxy privatization safety is not + ensured by privatization_user. Specifically, it's access to the value + of it's transactional snapshot of ptr must read from an uncommitted write + by writer; thus, writer must still be active but must have read ptr before + proxy can privatize *ptr by assigning to ptr. + We try to make this interleaving more likely by delaying the commit of + writer and the start of proxy. */ +static void *writer (void *dummy __attribute__((unused))) +{ + for (int i = 0; i < iters; i++) + { + /* Initialize state in each round. */ + x = 0; + ptr = &x; + priv_ptr = NULL; + int wrote = 1; + arrive_and_wait (i * 6 + 3); + /* Interference by another writer. Has a conflict with the proxy + privatizer. */ + __transaction_atomic + { + if (ptr != NULL) + *ptr = 1; + else + wrote = 0; + delay (2000000); + } + arrive_and_wait (i * 6 + 6); + /* If the previous transaction committed first, wrote == 1 and x == 1; + otherwise, if the proxy came first, wrote == 0 and priv_value == 0. + */ + if (wrote != priv_value) + abort (); + } + return NULL; +} + +static void *proxy (void *dummy __attribute__((unused))) +{ + for (int i = 0; i < iters; i++) + { + arrive_and_wait (i * 6 + 3); + delay(1000000); + __transaction_atomic + { + /* Hand-off to privatization-user and its read-only transaction and + subsequent use of privatization. */ + priv_ptr = ptr; + ptr = NULL; + } + arrive_and_wait (i * 6 + 6); + } + return NULL; +} + +static void *privatization_user (void *dummy __attribute__((unused))) +{ + for (int i = 0; i < iters; i++) + { + arrive_and_wait (i * 6 + 3); + /* Spin until we have gotten a pointer from the proxy. Then access + the value pointed to nontransactionally. */ + int *p = NULL; + while (p == NULL) + __transaction_atomic { p = priv_ptr; } + priv_value = *p; + arrive_and_wait (i * 6 + 6); + } + return NULL; +} + +int main() +{ + pthread_t p[3]; + + pthread_create (p+0, NULL, writer, NULL); + pthread_create (p+1, NULL, proxy, NULL); + pthread_create (p+2, NULL, privatization_user, NULL); + + for (int i = 0; i < 3; ++i) + pthread_join (p[i], NULL); + + return 0; +} diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 392ab2c571d..0b7ca1b6852 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,76 @@ +2016-01-18 Jonathan Wakely + + PR libstdc++/60637 + * testsuite/26_numerics/headers/cmath/60637.cc: Add test. + + PR libstdc++/69243 + * include/std/functional (_Function_base::_M_not_empty_function): + Change overloads for pointers to take arguments by value. + * testsuite/20_util/function/cons/57465.cc: Add tests for + pointer-to-member cases. + + PR libstdc++/69340 + * src/c++11/cow-stdexcept.cc (_txnal_cow_string_C1_for_exceptions): + Use macros for exception handling and fix unused parameter warning. + +2016-01-17 John David Anglin + + PR libstdc++/68734 + * config/abi/post/hppa-linux-gnu/baseline_symbols.txt: Update. + +2016-01-17 Torvald Riegel + + * src/c++11/cow-stdexcept.cc (txnal_read_ptr): Fix static_assert. + +2016-01-16 H.J. Lu + + * config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt: Add + __int128 symbols. + +2016-01-15 Jonathan Wakely + + PR libstdc++/69293 + * include/bits/uses_allocator.h (__uses_alloc): Add + static assertion that type is constructible from the arguments. + * testsuite/20_util/scoped_allocator/69293_neg.cc: New. + * testsuite/20_util/uses_allocator/69293_neg.cc: New. + * testsuite/20_util/uses_allocator/cons_neg.cc: Adjust dg-error. + + PR libstdc++/69294 + * acinclude.m4 (GLIBCXX_CHECK_MATH11_PROTO): Check for obsolete isinf + and isnan on AIX. Quote variables. + * configure: Regenerate. + +2016-01-15 Torvald Riegel + + * include/bits/basic_string.h (basic_string): Declare friends. + * include/bits/c++config (_GLIBCXX_TXN_SAFE, + _GLIBCXX_TXN_SAFE_DYN, _GLIBCXX_USE_ALLOCATOR_NEW): New. + * include/std/stdexcept (logic_error, domain_error, invalid_argument, + length_error, out_of_range, runtime_error, range_error, + underflow_error, overflow_error): Declare members as transaction-safe. + (logic_error, runtime_error): Declare friend functions. + * libsupc++/exception (exception, bad_exception): Declare members as + transaction-safe. + * src/c++11/cow-stdexcept.cc: Define transactional clones for the + transaction-safe members of exceptions and helper functions. + * libsupc++/eh_exception.cc: Adjust and define transactional clones. + * config/abi/pre/gnu.ver (GLIBCXX_3.4.22) Add transactional clones. + (CXXABI_1.3.10): New. + * acinclude.m4 (GLIBCXX_CHECK_SIZE_T_MANGLING): New. + (GLIBCXX_ENABLE_ALLOCATOR): Set ENABLE_ALLOCATOR_NEW. + * configure.ac: Call GLIBCXX_CHECK_SIZE_T_MANGLING. + * include/Makefile.am: Write ENABLE_ALLOCATOR_NEW to c++config.h. + * include/Makefile.in: Regenerate. + * config.h.in: Regenerate. + * configure: Regenerate. + * testsuite/util/testsuite_abi.cc (check_version): Add CXXABI_1.3.10. + +2016-01-15 Steve Ellcey + + * include/ext/random.tcc: Use __builtin_isfinite instead of + std::isfinite. + 2016-01-15 Jonathan Wakely * include/bits/std_mutex.h: Fix Doxygen @file name. diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index b76e8d51b96..f8dbb95265a 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -2186,7 +2186,7 @@ AC_DEFUN([GLIBCXX_CHECK_MATH11_PROTO], [ fi AC_MSG_RESULT([$glibcxx_cv_math11_overload]) ;; - *-*-*gnu*) + *-*-*gnu* | *-*-aix*) # If defines the obsolete isinf(double) and isnan(double) # functions (instead of or as well as the C99 generic macros) then we # can't define std::isinf(double) and std::isnan(double) in @@ -2594,6 +2594,8 @@ AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [ ;; esac + GLIBCXX_CONDITIONAL(ENABLE_ALLOCATOR_NEW, + test $enable_libstdcxx_allocator_flag = new) AC_SUBST(ALLOCATOR_H) AC_SUBST(ALLOCATOR_NAME) ]) @@ -3443,9 +3445,9 @@ EOF AC_LANG_RESTORE # Set atomicity_dir to builtins if all but the long long test above passes. - if test $glibcxx_cv_atomic_bool = yes \ - && test $glibcxx_cv_atomic_short = yes \ - && test $glibcxx_cv_atomic_int = yes; then + if test "$glibcxx_cv_atomic_bool" = yes \ + && test "$glibcxx_cv_atomic_short" = yes \ + && test "$glibcxx_cv_atomic_int" = yes; then AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1, [Define if the compiler supports C++11 atomics.]) atomicity_dir=cpu/generic/atomicity_builtins @@ -4344,6 +4346,34 @@ dnl AC_LANG_RESTORE ]) +dnl +dnl Check how size_t is mangled. Copied from libitm. +dnl +AC_DEFUN([GLIBCXX_CHECK_SIZE_T_MANGLING], [ + AC_CACHE_CHECK([how size_t is mangled], + glibcxx_cv_size_t_mangling, [ + AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned long x;], + [glibcxx_cv_size_t_mangling=m], [ + AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned int x;], + [glibcxx_cv_size_t_mangling=j], [ + AC_TRY_COMPILE([], + [extern __SIZE_TYPE__ x; extern unsigned long long x;], + [glibcxx_cv_size_t_mangling=y], [ + AC_TRY_COMPILE([], + [extern __SIZE_TYPE__ x; extern unsigned short x;], + [glibcxx_cv_size_t_mangling=t], + [glibcxx_cv_size_t_mangling=x]) + ]) + ]) + ]) + ]) + if test $glibcxx_cv_size_t_mangling = x; then + AC_MSG_ERROR([Unknown underlying type for size_t]) + fi + AC_DEFINE_UNQUOTED(_GLIBCXX_MANGLE_SIZE_T, [$glibcxx_cv_size_t_mangling], + [Define to the letter to which size_t is mangled.]) +]) + # Macros from the top-level gcc directory. m4_include([../config/gc++filt.m4]) m4_include([../config/tls.m4]) diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in index 5fb0cd3dc26..4600b2366db 100644 --- a/libstdc++-v3/config.h.in +++ b/libstdc++-v3/config.h.in @@ -791,6 +791,9 @@ /* Define if compatibility should be provided for -mlong-double-64. */ #undef _GLIBCXX_LONG_DOUBLE_COMPAT +/* Define to the letter to which size_t is mangled. */ +#undef _GLIBCXX_MANGLE_SIZE_T + /* Define if ptrdiff_t is int. */ #undef _GLIBCXX_PTRDIFF_T_IS_INT diff --git a/libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt b/libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt index 22ab14489a5..ab3704541c9 100644 --- a/libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt +++ b/libstdc++-v3/config/abi/post/hppa-linux-gnu/baseline_symbols.txt @@ -64,10 +64,13 @@ FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__ FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4.10 +FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEC1EP8_IO_FILE@@GLIBCXX_3.4.10 +FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEC2EP8_IO_FILE@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4.10 +FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE4fileEv@@GLIBCXX_3.4.2 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE5uflowEv@@GLIBCXX_3.4.10 @@ -78,10 +81,13 @@ FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__ FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4.10 +FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEC1EP8_IO_FILE@@GLIBCXX_3.4.10 +FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEC2EP8_IO_FILE@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4.10 FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4.10 +FUNC:_ZN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.3 FUNC:_ZN9__gnu_cxx6__poolILb0EE10_M_destroyEv@@GLIBCXX_3.4.4 FUNC:_ZN9__gnu_cxx6__poolILb0EE13_M_initializeEv@@GLIBCXX_3.4.4 @@ -409,6 +415,27 @@ FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4 FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4 FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4 FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4 +FUNC:_ZNKSt19__codecvt_utf8_baseIDiE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDiE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDiE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDiE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDiE5do_inER11__mbstate_tPKcS4_RS4_PDiS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDiE6do_outER11__mbstate_tPKDiS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDiE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDsE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDsE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDsE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDsE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDsE5do_inER11__mbstate_tPKcS4_RS4_PDsS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDsE6do_outER11__mbstate_tPKDsS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIDsE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIwE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIwE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIwE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIwE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIwE5do_inER11__mbstate_tPKcS4_RS4_PwS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIwE6do_outER11__mbstate_tPKwS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt19__codecvt_utf8_baseIwE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4 FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4 FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4 @@ -417,7 +444,56 @@ FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4 FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4 FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4 FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4 +FUNC:_ZNKSt20__codecvt_utf16_baseIDiE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDiE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDiE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDiE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDiE5do_inER11__mbstate_tPKcS4_RS4_PDiS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDiE6do_outER11__mbstate_tPKDiS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDiE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDsE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDsE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDsE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDsE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDsE5do_inER11__mbstate_tPKcS4_RS4_PDsS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDsE6do_outER11__mbstate_tPKDsS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIDsE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIwE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIwE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIwE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIwE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIwE5do_inER11__mbstate_tPKcS4_RS4_PwS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIwE6do_outER11__mbstate_tPKwS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt20__codecvt_utf16_baseIwE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 FUNC:_ZNKSt20bad_array_new_length4whatEv@@CXXABI_1.3.8 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDiE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDiE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDiE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDiE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDiE5do_inER11__mbstate_tPKcS4_RS4_PDiS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDiE6do_outER11__mbstate_tPKDiS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDiE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDsE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDsE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDsE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDsE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDsE5do_inER11__mbstate_tPKcS4_RS4_PDsS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDsE6do_outER11__mbstate_tPKDsS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIDsE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIwE10do_unshiftER11__mbstate_tPcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIwE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIwE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIwE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIwE5do_inER11__mbstate_tPKcS4_RS4_PwS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIwE6do_outER11__mbstate_tPKwS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt25__codecvt_utf8_utf16_baseIwE9do_lengthER11__mbstate_tPKcS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt3_V214error_category10_M_messageB5cxx11Ei@@GLIBCXX_3.4.21 +FUNC:_ZNKSt3_V214error_category10_M_messageEi@@GLIBCXX_3.4.21 +FUNC:_ZNKSt3_V214error_category10equivalentERKSt10error_codei@@GLIBCXX_3.4.21 +FUNC:_ZNKSt3_V214error_category10equivalentEiRKSt15error_condition@@GLIBCXX_3.4.21 +FUNC:_ZNKSt3_V214error_category23default_error_conditionEi@@GLIBCXX_3.4.21 +FUNC:_ZNKSt3tr14hashINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEclES6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt3tr14hashINSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEEclES6_@@GLIBCXX_3.4.21 FUNC:_ZNKSt3tr14hashIRKSbIwSt11char_traitsIwESaIwEEEclES6_@@GLIBCXX_3.4.10 FUNC:_ZNKSt3tr14hashIRKSsEclES2_@@GLIBCXX_3.4.10 FUNC:_ZNKSt3tr14hashISbIwSt11char_traitsIwESaIwEEEclES4_@@GLIBCXX_3.4.10 @@ -453,8 +529,345 @@ FUNC:_ZNKSt5ctypeIwE8do_widenEc@@GLIBCXX_3.4 FUNC:_ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc@@GLIBCXX_3.4 FUNC:_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCXX_3.4 FUNC:_ZNKSt6locale2id5_M_idEv@@GLIBCXX_3.4 +FUNC:_ZNKSt6locale4nameB5cxx11Ev@@GLIBCXX_3.4.21 FUNC:_ZNKSt6locale4nameEv@@GLIBCXX_3.4 FUNC:_ZNKSt6localeeqERKS_@@GLIBCXX_3.4 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE10neg_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE10pos_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE11curr_symbolEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE11do_groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE11frac_digitsEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE13decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE13do_neg_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE13do_pos_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE13negative_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE13positive_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE13thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE14do_curr_symbolEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE14do_frac_digitsEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE16do_decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE16do_negative_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE16do_positive_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE16do_thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb0EE8groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE10neg_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE10pos_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE11curr_symbolEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE11do_groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE11frac_digitsEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE13decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE13do_neg_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE13do_pos_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE13negative_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE13positive_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE13thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE14do_curr_symbolEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE14do_frac_digitsEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE16do_decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE16do_negative_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE16do_positive_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE16do_thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIcLb1EE8groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE10neg_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE10pos_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE11curr_symbolEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE11do_groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE11frac_digitsEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE13decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE13do_neg_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE13do_pos_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE13negative_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE13positive_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE13thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE14do_curr_symbolEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE14do_frac_digitsEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE16do_decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE16do_negative_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE16do_positive_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE16do_thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb0EE8groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE10neg_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE10pos_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE11curr_symbolEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE11do_groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE11frac_digitsEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE13decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE13do_neg_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE13do_pos_formatEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE13negative_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE13positive_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE13thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE14do_curr_symbolEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE14do_frac_digitsEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE16do_decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE16do_negative_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE16do_positive_signEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE16do_thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1110moneypunctIwLb1EE8groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_disjunctEPKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_is_localEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEPKcjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12find_last_ofEcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_local_dataEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEPKcjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13find_first_ofEcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13get_allocatorEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE15_M_check_lengthEjjPKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_get_allocatorEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEPKcjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEPKcjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17find_first_not_ofEcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE2atEj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE3endEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4backEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4cendEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4copyEPcjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4dataEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEPKcjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4rendEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4sizeEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5beginEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5crendEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5emptyEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5frontEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEPKcjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5rfindEcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6cbeginEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6rbeginEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6substrEjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_M_dataEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEPKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEjjPKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEjjPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEjjRKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEjjRKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7crbeginEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_checkEjPKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_limitEjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8capacityEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8max_sizeEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEixEj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE11_M_is_localEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12find_last_ofEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12find_last_ofEPKwjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12find_last_ofERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12find_last_ofEwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13_M_local_dataEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13find_first_ofEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13find_first_ofEPKwjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13find_first_ofERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13find_first_ofEwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13get_allocatorEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE15_M_check_lengthEjjPKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE16_M_get_allocatorEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE16find_last_not_ofEwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE17find_first_not_ofEwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE2atEj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE3endEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4backEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4cendEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4copyEPwjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4dataEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4findEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4findEPKwjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4findERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4findEwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4sizeEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5c_strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5crendEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5emptyEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5frontEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5rfindEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5rfindEPKwjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5rfindERKS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5rfindEwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6cbeginEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6substrEjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7_M_dataEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7compareEPKw@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7compareERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7compareEjjPKw@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7compareEjjPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7compareEjjRKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7compareEjjRKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7crbeginEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE8_M_checkEjPKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE8_M_limitEjj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE8capacityEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE8max_sizeEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEixEj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIcE10_M_compareEPKcS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIcE10do_compareEPKcS3_S3_S3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIcE12_M_transformEPcPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIcE12do_transformEPKcS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIcE4hashEPKcS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIcE7compareEPKcS3_S3_S3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIcE7do_hashEPKcS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIcE9transformEPKcS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIwE10_M_compareEPKwS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIwE10do_compareEPKwS3_S3_S3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIwE12_M_transformEPwPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIwE12do_transformEPKwS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIwE4hashEPKwS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIwE7compareEPKwS3_S3_S3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIwE7do_hashEPKwS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx117collateIwE9transformEPKwS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE18_M_convert_to_charERKNS_12basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE20_M_convert_from_charEPc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE3getEiiiRKNS_12basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE4openERKNS_12basic_stringIcSt11char_traitsIcESaIcEEERKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE4openERKNS_12basic_stringIcSt11char_traitsIcESaIcEEERKSt6localePKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE5closeEi@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE6do_getEiiiRKNS_12basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE7do_openERKNS_12basic_stringIcSt11char_traitsIcESaIcEEERKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIcE8do_closeEi@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE18_M_convert_to_charERKNS_12basic_stringIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE20_M_convert_from_charEPc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE3getEiiiRKNS_12basic_stringIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE4openERKNS_12basic_stringIcSt11char_traitsIcESaIcEEERKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE4openERKNS_12basic_stringIcSt11char_traitsIcESaIcEEERKSt6localePKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE5closeEi@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE6do_getEiiiRKNS_12basic_stringIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE7do_openERKNS_12basic_stringIcSt11char_traitsIcESaIcEEERKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118messagesIwE8do_closeEi@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE11do_groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE11do_truenameEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE12do_falsenameEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE13decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE13thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE16do_decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE16do_thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE8groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE8truenameEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIcE9falsenameEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE11do_groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE11do_truenameEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE12do_falsenameEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE13decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE13thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE16do_decimal_pointEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE16do_thousands_sepEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE8groupingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE8truenameEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118numpunctIwE9falsenameEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES4_S4_RiiijRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES4_S4_RiPPKcjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE24_M_extract_wday_or_monthES4_S4_RiPPKcjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmPKcSD_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmcc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmcc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES4_S4_RiiijRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES4_S4_RiPPKwjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE24_M_extract_wday_or_monthES4_S4_RiPPKwjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmPKwSD_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmcc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tmcc@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES4_S4_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRNS_12basic_stringIcS3_SaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRNS_12basic_stringIcS3_SaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRNS_12basic_stringIcS3_SaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRNS_12basic_stringIcS3_SaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRNS_12basic_stringIcS2_IcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRNS_12basic_stringIcS2_IcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRNS_12basic_stringIwS3_SaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRNS_12basic_stringIwS3_SaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES4_S4_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_bRSt8ios_basecRKNS_12basic_stringIcS3_SaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES4_bRSt8ios_basece@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_bRSt8ios_basecRKNS_12basic_stringIcS3_SaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES4_bRSt8ios_basece@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES4_S4_RSt8ios_basecRKNS_12basic_stringIcS3_SaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES4_S4_RSt8ios_basecRKNS_12basic_stringIcS3_SaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_bRSt8ios_basewRKNS_12basic_stringIwS3_SaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES4_bRSt8ios_basewe@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_bRSt8ios_basewRKNS_12basic_stringIwS3_SaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES4_bRSt8ios_basewe@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES4_S4_RSt8ios_basewRKNS_12basic_stringIwS3_SaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES4_S4_RSt8ios_basewRKNS_12basic_stringIwS3_SaIwEEE@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDic11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDic11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDic11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDic11__mbstate_tE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDic11__mbstate_tE5do_inERS0_PKcS4_RS4_PDiS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDic11__mbstate_tE6do_outERS0_PKDiS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDic11__mbstate_tE9do_lengthERS0_PKcS4_j@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDsc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDsc11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDsc11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDsc11__mbstate_tE16do_always_noconvEv@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDsc11__mbstate_tE5do_inERS0_PKcS4_RS4_PDsS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDsc11__mbstate_tE6do_outERS0_PKDsS4_RS4_PcS6_RS6_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt7codecvtIDsc11__mbstate_tE9do_lengthERS0_PKcS4_j@@GLIBCXX_3.4.21 FUNC:_ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4 FUNC:_ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4 FUNC:_ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4 @@ -597,6 +1010,7 @@ FUNC:_ZNKSt8__detail20_Prime_rehash_policy11_M_next_bktEj@@GLIBCXX_3.4.18 FUNC:_ZNKSt8__detail20_Prime_rehash_policy14_M_need_rehashEjjj@@GLIBCXX_3.4.18 FUNC:_ZNKSt8bad_cast4whatEv@@GLIBCXX_3.4.9 FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCXX_3.4 +FUNC:_ZNKSt8ios_base7failureB5cxx114whatEv@@GLIBCXX_3.4.21 FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCXX_3.4 FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCXX_3.4 FUNC:_ZNKSt8messagesIcE3getEiiiRKSs@@GLIBCXX_3.4 @@ -648,6 +1062,8 @@ FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_ FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4 FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCXX_3.4 FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE24_M_extract_wday_or_monthES3_S3_RiPPKcjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4.14 +FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKcSC_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmcc@@GLIBCXX_3.4.21 FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4 FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4 FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4 @@ -664,6 +1080,8 @@ FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_ FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4 FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@@GLIBCXX_3.4 FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE24_M_extract_wday_or_monthES3_S3_RiPPKwjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4.14 +FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKwSC_@@GLIBCXX_3.4.21 +FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmcc@@GLIBCXX_3.4.21 FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4 FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4 FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4 @@ -687,6 +1105,7 @@ FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCXX_3.4 FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@@GLIBCXX_3.4 FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@@GLIBCXX_3.4 FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@@GLIBCXX_3.4 +FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvbEv@@GLIBCXX_3.4.21 FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@@GLIBCXX_3.4 FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE10exceptionsEv@@GLIBCXX_3.4 FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3badEv@@GLIBCXX_3.4 @@ -700,6 +1119,7 @@ FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5widenEc@@GLIBCXX_3.4 FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE6narrowEwc@@GLIBCXX_3.4 FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE7rdstateEv@@GLIBCXX_3.4 FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEcvPvEv@@GLIBCXX_3.4 +FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEcvbEv@@GLIBCXX_3.4.21 FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEntEv@@GLIBCXX_3.4 FUNC:_ZNKSt9exception4whatEv@@GLIBCXX_3.4 FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4 @@ -872,13 +1292,17 @@ FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEPKw@@GLIBCXX_3.4 FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLERKS2_@@GLIBCXX_3.4 FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLESt16initializer_listIwE@@GLIBCXX_3.4.11 FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEw@@GLIBCXX_3.4 +FUNC:_ZNSd4swapERSd@@GLIBCXX_3.4.21 +FUNC:_ZNSdC1EOSd@@GLIBCXX_3.4.21 FUNC:_ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 FUNC:_ZNSdC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSdC2EOSd@@GLIBCXX_3.4.21 FUNC:_ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 FUNC:_ZNSdC2Ev@@GLIBCXX_3.4 FUNC:_ZNSdD0Ev@@GLIBCXX_3.4 FUNC:_ZNSdD1Ev@@GLIBCXX_3.4 FUNC:_ZNSdD2Ev@@GLIBCXX_3.4 +FUNC:_ZNSdaSEOSd@@GLIBCXX_3.4.21 FUNC:_ZNSi10_M_extractIPvEERSiRT_@@GLIBCXX_3.4.9 FUNC:_ZNSi10_M_extractIbEERSiRT_@@GLIBCXX_3.4.9 FUNC:_ZNSi10_M_extractIdEERSiRT_@@GLIBCXX_3.4.9 @@ -898,6 +1322,7 @@ FUNC:_ZNSi3getERc@@GLIBCXX_3.4 FUNC:_ZNSi3getEv@@GLIBCXX_3.4 FUNC:_ZNSi4peekEv@@GLIBCXX_3.4 FUNC:_ZNSi4readEPci@@GLIBCXX_3.4 +FUNC:_ZNSi4swapERSi@@GLIBCXX_3.4.21 FUNC:_ZNSi4syncEv@@GLIBCXX_3.4 FUNC:_ZNSi5seekgESt4fposI11__mbstate_tE@@GLIBCXX_3.4 FUNC:_ZNSi5seekgExSt12_Ios_Seekdir@@GLIBCXX_3.4 @@ -914,13 +1339,16 @@ FUNC:_ZNSi7getlineEPci@@GLIBCXX_3.4 FUNC:_ZNSi7getlineEPcic@@GLIBCXX_3.4 FUNC:_ZNSi7putbackEc@@GLIBCXX_3.4 FUNC:_ZNSi8readsomeEPci@@GLIBCXX_3.4 +FUNC:_ZNSiC1EOSi@@GLIBCXX_3.4.21 FUNC:_ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 FUNC:_ZNSiC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSiC2EOSi@@GLIBCXX_3.4.21 FUNC:_ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 FUNC:_ZNSiC2Ev@@GLIBCXX_3.4 FUNC:_ZNSiD0Ev@@GLIBCXX_3.4 FUNC:_ZNSiD1Ev@@GLIBCXX_3.4 FUNC:_ZNSiD2Ev@@GLIBCXX_3.4 +FUNC:_ZNSiaSEOSi@@GLIBCXX_3.4.21 FUNC:_ZNSirsEPFRSiS_E@@GLIBCXX_3.4 FUNC:_ZNSirsEPFRSt8ios_baseS0_E@@GLIBCXX_3.4 FUNC:_ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCXX_3.4 @@ -939,6 +1367,7 @@ FUNC:_ZNSirsERt@@GLIBCXX_3.4 FUNC:_ZNSirsERx@@GLIBCXX_3.4 FUNC:_ZNSirsERy@@GLIBCXX_3.4 FUNC:_ZNSo3putEc@@GLIBCXX_3.4 +FUNC:_ZNSo4swapERSo@@GLIBCXX_3.4.21 FUNC:_ZNSo5flushEv@@GLIBCXX_3.4 FUNC:_ZNSo5seekpESt4fposI11__mbstate_tE@@GLIBCXX_3.4 FUNC:_ZNSo5seekpExSt12_Ios_Seekdir@@GLIBCXX_3.4 @@ -957,13 +1386,18 @@ FUNC:_ZNSo9_M_insertIlEERSoT_@@GLIBCXX_3.4.9 FUNC:_ZNSo9_M_insertImEERSoT_@@GLIBCXX_3.4.9 FUNC:_ZNSo9_M_insertIxEERSoT_@@GLIBCXX_3.4.9 FUNC:_ZNSo9_M_insertIyEERSoT_@@GLIBCXX_3.4.9 +FUNC:_ZNSoC1EOSo@@GLIBCXX_3.4.21 FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 +FUNC:_ZNSoC1ERSd@@GLIBCXX_3.4.21 FUNC:_ZNSoC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSoC2EOSo@@GLIBCXX_3.4.21 FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4 +FUNC:_ZNSoC2ERSd@@GLIBCXX_3.4.21 FUNC:_ZNSoC2Ev@@GLIBCXX_3.4 FUNC:_ZNSoD0Ev@@GLIBCXX_3.4 FUNC:_ZNSoD1Ev@@GLIBCXX_3.4 FUNC:_ZNSoD2Ev@@GLIBCXX_3.4 +FUNC:_ZNSoaSEOSo@@GLIBCXX_3.4.21 FUNC:_ZNSolsEPFRSoS_E@@GLIBCXX_3.4 FUNC:_ZNSolsEPFRSt8ios_baseS0_E@@GLIBCXX_3.4 FUNC:_ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCXX_3.4 @@ -1109,6 +1543,12 @@ FUNC:_ZNSspLEPKc@@GLIBCXX_3.4 FUNC:_ZNSspLERKSs@@GLIBCXX_3.4 FUNC:_ZNSspLESt16initializer_listIcE@@GLIBCXX_3.4.11 FUNC:_ZNSspLEc@@GLIBCXX_3.4 +FUNC:_ZNSt10_Sp_lockerC1EPKv@@GLIBCXX_3.4.21 +FUNC:_ZNSt10_Sp_lockerC1EPKvS1_@@GLIBCXX_3.4.21 +FUNC:_ZNSt10_Sp_lockerC2EPKv@@GLIBCXX_3.4.21 +FUNC:_ZNSt10_Sp_lockerC2EPKvS1_@@GLIBCXX_3.4.21 +FUNC:_ZNSt10_Sp_lockerD1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt10_Sp_lockerD2Ev@@GLIBCXX_3.4.21 FUNC:_ZNSt10__num_base15_S_format_floatERKSt8ios_basePcc@@GLIBCXX_3.4 FUNC:_ZNSt10bad_typeidD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt10bad_typeidD1Ev@@GLIBCXX_3.4 @@ -1199,12 +1639,23 @@ FUNC:_ZNSt11char_traitsIcE2eqERKcS2_@@GLIBCXX_3.4.5 FUNC:_ZNSt11char_traitsIcE2eqERKcS2_@GLIBCXX_3.4 FUNC:_ZNSt11char_traitsIwE2eqERKwS2_@@GLIBCXX_3.4.5 FUNC:_ZNSt11char_traitsIwE2eqERKwS2_@GLIBCXX_3.4 +FUNC:_ZNSt11logic_errorC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt11logic_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNSt11logic_errorC1ERKS_@@GLIBCXX_3.4.21 FUNC:_ZNSt11logic_errorC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt11logic_errorC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt11logic_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNSt11logic_errorC2ERKS_@@GLIBCXX_3.4.21 FUNC:_ZNSt11logic_errorC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt11logic_errorD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt11logic_errorD1Ev@@GLIBCXX_3.4 FUNC:_ZNSt11logic_errorD2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt11logic_erroraSERKS_@@GLIBCXX_3.4.21 +FUNC:_ZNSt11range_errorC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt11range_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt11range_errorC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt11range_errorC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt11range_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt11range_errorC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt11range_errorD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt11range_errorD1Ev@@GLIBCXX_3.4 @@ -1235,16 +1686,28 @@ FUNC:_ZNSt12bad_weak_ptrD0Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt12bad_weak_ptrD1Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt12bad_weak_ptrD2Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt12ctype_bynameIcEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt12ctype_bynameIcEC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt12ctype_bynameIcEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt12ctype_bynameIcEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt12ctype_bynameIcEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt12ctype_bynameIcEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt12ctype_bynameIcED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt12ctype_bynameIcED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt12ctype_bynameIcED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt12ctype_bynameIwEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt12ctype_bynameIwEC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt12ctype_bynameIwEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt12ctype_bynameIwEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt12ctype_bynameIwEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt12ctype_bynameIwEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt12ctype_bynameIwED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt12ctype_bynameIwED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt12ctype_bynameIwED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt12domain_errorC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt12domain_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt12domain_errorC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt12domain_errorC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt12domain_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt12domain_errorC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt12domain_errorD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt12domain_errorD1Ev@@GLIBCXX_3.4 @@ -1252,12 +1715,20 @@ FUNC:_ZNSt12domain_errorD2Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt12future_errorD0Ev@@GLIBCXX_3.4.14 FUNC:_ZNSt12future_errorD1Ev@@GLIBCXX_3.4.14 FUNC:_ZNSt12future_errorD2Ev@@GLIBCXX_3.4.14 +FUNC:_ZNSt12length_errorC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt12length_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt12length_errorC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt12length_errorC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt12length_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt12length_errorC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt12length_errorD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt12length_errorD1Ev@@GLIBCXX_3.4 FUNC:_ZNSt12length_errorD2Ev@@GLIBCXX_3.4.15 +FUNC:_ZNSt12out_of_rangeC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt12out_of_rangeC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt12out_of_rangeC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt12out_of_rangeC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt12out_of_rangeC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt12out_of_rangeC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt12out_of_rangeD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt12out_of_rangeD1Ev@@GLIBCXX_3.4 @@ -1303,6 +1774,7 @@ FUNC:_ZNSt13__future_base12_Result_baseC2Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt13__future_base12_Result_baseD0Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt13__future_base12_Result_baseD1Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt13__future_base12_Result_baseD2Ev@@GLIBCXX_3.4.15 +FUNC:_ZNSt13__future_base13_State_baseV211_Make_ready6_M_setEv@@GLIBCXX_3.4.21 FUNC:_ZNSt13__future_base19_Async_state_commonD0Ev@@GLIBCXX_3.4.17 FUNC:_ZNSt13__future_base19_Async_state_commonD1Ev@@GLIBCXX_3.4.17 FUNC:_ZNSt13__future_base19_Async_state_commonD2Ev@@GLIBCXX_3.4.17 @@ -1318,7 +1790,9 @@ FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPci@@GLIB FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 +FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4 @@ -1332,11 +1806,14 @@ FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEi@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE14_M_get_ext_posER11__mbstate_t@@GLIBCXX_3.4.15 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE15_M_create_pbackEv@@GLIBCXX_3.4 @@ -1346,7 +1823,9 @@ FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwi@@GLIB FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE26_M_destroy_internal_bufferEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE27_M_allocate_internal_bufferEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 +FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4 @@ -1360,37 +1839,54 @@ FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9showmanycEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 +FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1ERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2ERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 +FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1ERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2ERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIPvEERS2_RT_@@GLIBCXX_3.4.9 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIbEERS2_RT_@@GLIBCXX_3.4.9 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIdEERS2_RT_@@GLIBCXX_3.4.9 @@ -1410,6 +1906,7 @@ FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERw@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4peekEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwi@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgESt4fposI11__mbstate_tE@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgExSt12_Ios_Seekdir@@GLIBCXX_3.4 @@ -1426,13 +1923,16 @@ FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwi@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwiw@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7putbackEw@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwi@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRS2_S3_E@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt8ios_baseS4_E@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCXX_3.4 @@ -1451,6 +1951,7 @@ FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERt@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERx@@GLIBCXX_3.4 FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERy@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpESt4fposI11__mbstate_tE@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpExSt12_Ios_Seekdir@@GLIBCXX_3.4 @@ -1469,13 +1970,18 @@ FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIlEERS2_T_@@GLIBCXX_3.4. FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertImEERS2_T_@@GLIBCXX_3.4.9 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIxEERS2_T_@@GLIBCXX_3.4.9 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIyEERS2_T_@@GLIBCXX_3.4.9 +FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1ERSt14basic_iostreamIwS1_E@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2ERSt14basic_iostreamIwS1_E@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRS2_S3_E@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt8ios_baseS4_E@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCXX_3.4 @@ -1493,82 +1999,131 @@ FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCXX_3.4 FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCXX_3.4 +FUNC:_ZNSt13random_device14_M_init_pretr1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt13random_device14_M_init_pretr1ERKSs@@GLIBCXX_3.4.18 FUNC:_ZNSt13random_device16_M_getval_pretr1Ev@@GLIBCXX_3.4.18 FUNC:_ZNSt13random_device7_M_finiEv@@GLIBCXX_3.4.18 +FUNC:_ZNSt13random_device7_M_initERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt13random_device7_M_initERKSs@@GLIBCXX_3.4.18 FUNC:_ZNSt13random_device9_M_getvalEv@@GLIBCXX_3.4.18 +FUNC:_ZNSt13runtime_errorC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt13runtime_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNSt13runtime_errorC1ERKS_@@GLIBCXX_3.4.21 FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt13runtime_errorC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt13runtime_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNSt13runtime_errorC2ERKS_@@GLIBCXX_3.4.21 FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt13runtime_errorD1Ev@@GLIBCXX_3.4 FUNC:_ZNSt13runtime_errorD2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt13runtime_erroraSERKS_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 +FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1ERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2ERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 +FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1ERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2ERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEaSEOS2_@@GLIBCXX_3.4.21 +FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 +FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 +FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1ERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2ERKNSt7__cxx1112basic_stringIcS1_SaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 +FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1ERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2ERKNSt7__cxx1112basic_stringIcS0_IcESaIcEEESt13_Ios_Openmode@@GLIBCXX_3.4.21 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4.13 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEaSEOS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED2Ev@@GLIBCXX_3.4 @@ -1587,7 +2142,11 @@ FUNC:_ZNSt14error_categoryC2Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt14error_categoryD0Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt14error_categoryD1Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt14error_categoryD2Ev@@GLIBCXX_3.4.15 +FUNC:_ZNSt14overflow_errorC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt14overflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt14overflow_errorC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt14overflow_errorC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt14overflow_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt14overflow_errorC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt14overflow_errorD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt14overflow_errorD1Ev@@GLIBCXX_3.4 @@ -1619,6 +2178,7 @@ FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_gbumpEi@@GLIBCXX_3.4.16 FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE12__safe_pbumpEi@@GLIBCXX_3.4.16 FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@@GLIBCXX_3.4 FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4 FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@@GLIBCXX_3.4 FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4 @@ -1660,6 +2220,7 @@ FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_gbumpEi@@GLIBCXX_3.4.16 FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE12__safe_pbumpEi@@GLIBCXX_3.4.16 FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setgEPwS3_S3_@@GLIBCXX_3.4 FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setpEPwS3_@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4 FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5gbumpEi@@GLIBCXX_3.4 FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4 @@ -1698,6 +2259,7 @@ FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEaSERKS2_@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE15_M_update_egptrEv@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE4swapERS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcjj@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4 @@ -1707,15 +2269,19 @@ FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9showmanycEv@@GLIBCXX_3.4.6 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE15_M_update_egptrEv@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE4swapERS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwi@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwjj@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4 @@ -1725,53 +2291,78 @@ FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9showmanycEv@@GLIBCXX_3.4.6 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4 +FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt15messages_bynameIcEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15messages_bynameIcEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15messages_bynameIcEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15messages_bynameIcEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15messages_bynameIcED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15messages_bynameIcED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt15messages_bynameIcED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt15messages_bynameIwEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15messages_bynameIwEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15messages_bynameIwEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15messages_bynameIwEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15messages_bynameIwED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15messages_bynameIwED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt15messages_bynameIwED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt15numpunct_bynameIcEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15numpunct_bynameIcEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15numpunct_bynameIcEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15numpunct_bynameIcEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15numpunct_bynameIcED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15numpunct_bynameIcED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt15numpunct_bynameIcED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt15numpunct_bynameIwEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15numpunct_bynameIwEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15numpunct_bynameIwEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15numpunct_bynameIwEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15numpunct_bynameIwED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15numpunct_bynameIwED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt15numpunct_bynameIwED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKNSt7__cxx1112basic_stringIcS2_SaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKNSt7__cxx1112basic_stringIcS2_SaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt15underflow_errorC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt15underflow_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt15underflow_errorC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt15underflow_errorC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt15underflow_errorC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt15underflow_errorC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt15underflow_errorD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt15underflow_errorD1Ev@@GLIBCXX_3.4 @@ -1791,7 +2382,11 @@ FUNC:_ZNSt16__numpunct_cacheIwED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt16bad_array_lengthD0Ev@@CXXABI_1.3.8 FUNC:_ZNSt16bad_array_lengthD1Ev@@CXXABI_1.3.8 FUNC:_ZNSt16bad_array_lengthD2Ev@@CXXABI_1.3.8 +FUNC:_ZNSt16invalid_argumentC1EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt16invalid_argumentC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt16invalid_argumentC1ERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt16invalid_argumentC2EPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt16invalid_argumentC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZNSt16invalid_argumentC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt16invalid_argumentD0Ev@@GLIBCXX_3.4 FUNC:_ZNSt16invalid_argumentD1Ev@@GLIBCXX_3.4 @@ -1813,22 +2408,30 @@ FUNC:_ZNSt17bad_function_callD0Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt17bad_function_callD1Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt17bad_function_callD2Ev@@GLIBCXX_3.4.15 FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt17moneypunct_bynameIcLb0EED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIcLb0EED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIcLb0EED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt17moneypunct_bynameIcLb1EED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIcLb1EED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIcLb1EED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIwLb0EEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt17moneypunct_bynameIwLb0EEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt17moneypunct_bynameIwLb0EEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt17moneypunct_bynameIwLb0EEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt17moneypunct_bynameIwLb0EED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIwLb0EED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIwLb0EED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIwLb1EEC1EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt17moneypunct_bynameIwLb1EEC1ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt17moneypunct_bynameIwLb1EEC2EPKcj@@GLIBCXX_3.4 +FUNC:_ZNSt17moneypunct_bynameIwLb1EEC2ERKSsj@@GLIBCXX_3.4.21 FUNC:_ZNSt17moneypunct_bynameIwLb1EED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIwLb1EED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt17moneypunct_bynameIwLb1EED2Ev@@GLIBCXX_3.4 @@ -1857,21 +2460,29 @@ FUNC:_ZNSt18__moneypunct_cacheIwLb1EED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt18__moneypunct_cacheIwLb1EED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt18__moneypunct_cacheIwLb1EED2Ev@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE4swapERS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4 +FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE4swapERS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt18condition_variable10notify_allEv@@GLIBCXX_3.4.11 FUNC:_ZNSt18condition_variable10notify_oneEv@@GLIBCXX_3.4.11 FUNC:_ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE@@GLIBCXX_3.4.11 @@ -1879,42 +2490,76 @@ FUNC:_ZNSt18condition_variableC1Ev@@GLIBCXX_3.4.11 FUNC:_ZNSt18condition_variableC2Ev@@GLIBCXX_3.4.11 FUNC:_ZNSt18condition_variableD1Ev@@GLIBCXX_3.4.11 FUNC:_ZNSt18condition_variableD2Ev@@GLIBCXX_3.4.11 +FUNC:_ZNSt19__codecvt_utf8_baseIDiED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt19__codecvt_utf8_baseIDiED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt19__codecvt_utf8_baseIDiED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt19__codecvt_utf8_baseIDsED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt19__codecvt_utf8_baseIDsED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt19__codecvt_utf8_baseIDsED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt19__codecvt_utf8_baseIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt19__codecvt_utf8_baseIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt19__codecvt_utf8_baseIwED2Ev@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE4swapERS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE4swapERS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE4swapERS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE4swapERS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2EOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4 FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4 +FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEaSEOS3_@@GLIBCXX_3.4.21 FUNC:_ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv@@GLIBCXX_3.4.5 FUNC:_ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv@GLIBCXX_3.4 FUNC:_ZNSt19istreambuf_iteratorIwSt11char_traitsIwEEppEv@@GLIBCXX_3.4.5 FUNC:_ZNSt19istreambuf_iteratorIwSt11char_traitsIwEEppEv@GLIBCXX_3.4 +FUNC:_ZNSt20__codecvt_utf16_baseIDiED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt20__codecvt_utf16_baseIDiED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt20__codecvt_utf16_baseIDiED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt20__codecvt_utf16_baseIDsED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt20__codecvt_utf16_baseIDsED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt20__codecvt_utf16_baseIDsED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt20__codecvt_utf16_baseIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt20__codecvt_utf16_baseIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt20__codecvt_utf16_baseIwED2Ev@@GLIBCXX_3.4.21 FUNC:_ZNSt20bad_array_new_lengthD0Ev@@CXXABI_1.3.8 FUNC:_ZNSt20bad_array_new_lengthD1Ev@@CXXABI_1.3.8 FUNC:_ZNSt20bad_array_new_lengthD2Ev@@CXXABI_1.3.8 @@ -1922,6 +2567,22 @@ FUNC:_ZNSt22condition_variable_anyC1Ev@@GLIBCXX_3.4.11 FUNC:_ZNSt22condition_variable_anyC2Ev@@GLIBCXX_3.4.11 FUNC:_ZNSt22condition_variable_anyD1Ev@@GLIBCXX_3.4.11 FUNC:_ZNSt22condition_variable_anyD2Ev@@GLIBCXX_3.4.11 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIDiED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIDiED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIDiED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIDsED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIDsED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIDsED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt25__codecvt_utf8_utf16_baseIwED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt28__atomic_futex_unsigned_base19_M_futex_notify_allEPj@@GLIBCXX_3.4.21 +FUNC:_ZNSt28__atomic_futex_unsigned_base19_M_futex_wait_untilEPjjbNSt6chrono8durationIxSt5ratioILx1ELx1EEEENS2_IxS3_ILx1ELx1000000000EEEE@@GLIBCXX_3.4.21 +FUNC:_ZNSt3_V214error_categoryD0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt3_V214error_categoryD1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt3_V214error_categoryD2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt3_V215system_categoryEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt3_V216generic_categoryEv@@GLIBCXX_3.4.21 FUNC:_ZNSt5ctypeIcE13classic_tableEv@@GLIBCXX_3.4 FUNC:_ZNSt5ctypeIcEC1EP15__locale_structPKtbj@@GLIBCXX_3.4 FUNC:_ZNSt5ctypeIcEC1EPKtbj@@GLIBCXX_3.4 @@ -1994,9 +2655,629 @@ FUNC:_ZNSt6localeD2Ev@@GLIBCXX_3.4 FUNC:_ZNSt6localeaSERKS_@@GLIBCXX_3.4 FUNC:_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE@@GLIBCXX_3.4.11 FUNC:_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEEPFvvE@@GLIBCXX_3.4.21 +FUNC:_ZNSt6thread15_M_start_threadESt10unique_ptrINS_6_StateESt14default_deleteIS1_EEPFvvE@@GLIBCXX_3.4.22 FUNC:_ZNSt6thread20hardware_concurrencyEv@@GLIBCXX_3.4.17 FUNC:_ZNSt6thread4joinEv@@GLIBCXX_3.4.11 +FUNC:_ZNSt6thread6_StateD0Ev@@GLIBCXX_3.4.22 +FUNC:_ZNSt6thread6_StateD1Ev@@GLIBCXX_3.4.22 +FUNC:_ZNSt6thread6_StateD2Ev@@GLIBCXX_3.4.22 FUNC:_ZNSt6thread6detachEv@@GLIBCXX_3.4.11 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EEC1EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EEC2EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb0EED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EEC1EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EEC2EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIcLb1EED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EEC1EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EEC2EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb0EED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EEC1EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EEC2EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1110moneypunctIwLb1EED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_destroyEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_disposeEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEjjPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_S_compareEjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_M_capacityEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC1EPcRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderC2EPcRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructEjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIN9__gnu_cxx17__normal_iteratorIPKcS4_EEEEvT_SB_St20forward_iterator_tag@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIN9__gnu_cxx17__normal_iteratorIPcS4_EEEEvT_SA_St20forward_iterator_tag@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_local_dataEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_M_set_lengthEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcS4_EESA_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS5_S4_EES8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcPKcS7_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13_S_copy_charsEPcS5_S5_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE13shrink_to_fitEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEjjjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_get_allocatorEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE18_M_construct_aux_2Ejc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE2atEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE3endEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4backEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4rendEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5beginEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5clearEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEN9__gnu_cxx17__normal_iteratorIPKcS4_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEN9__gnu_cxx17__normal_iteratorIPcS4_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5eraseEjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5frontEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendERKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendESt16initializer_listIcE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6appendEjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignESt16initializer_listIcE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EEc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPKcS4_EEjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPcS4_EESt16initializer_listIcE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPcS4_EEc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEN9__gnu_cxx17__normal_iteratorIPcS4_EEjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjRKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjRKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertEjjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6insertIN9__gnu_cxx17__normal_iteratorIPcS4_EEEEvS9_T_SA_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6rbeginEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_M_dataEPc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_S_copyEPcPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7_S_moveEPcPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_NS6_IPcS4_EESB_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_PcSA_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_RKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_S8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_j@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S9_S9_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_St16initializer_listIcE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_jc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_NS6_IPKcS4_EESB_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_PKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_PKcSA_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_PKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_RKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_S7_S7_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_S8_S8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPcS4_EES8_jc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEjjPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEjjPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEjjRKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEjjRKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEjjjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8_M_eraseEjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE8pop_backEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_lengthEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEjjPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_S_assignEPcjc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9push_backEc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcjRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_jjRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ESt16initializer_listIcERKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EjcRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IN9__gnu_cxx17__normal_iteratorIPcS4_EEvEET_SA_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IPKcvEET_S8_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1IPcvEET_S7_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EOS4_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcjRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ERKS4_jjRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2ESt16initializer_listIcERKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EjcRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IN9__gnu_cxx17__normal_iteratorIPcS4_EEvEET_SA_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IPKcvEET_S8_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2IPcvEET_S7_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSESt16initializer_listIcE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEixEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEPKc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLESt16initializer_listIcE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEc@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE10_M_destroyEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE10_M_disposeEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE10_M_replaceEjjPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE10_S_compareEjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE11_M_capacityEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12_Alloc_hiderC1EPwRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12_Alloc_hiderC2EPwRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12_M_constructEjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12_M_constructIN9__gnu_cxx17__normal_iteratorIPKwS4_EEEEvT_SB_St20forward_iterator_tag@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12_M_constructIN9__gnu_cxx17__normal_iteratorIPwS4_EEEEvT_SA_St20forward_iterator_tag@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12_M_constructIPKwEEvT_S8_St20forward_iterator_tag@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE12_M_constructIPwEEvT_S7_St20forward_iterator_tag@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13_M_local_dataEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13_M_set_lengthEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS4_EESA_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS5_S4_EES8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS7_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS5_S5_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE13shrink_to_fitEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE14_M_replace_auxEjjjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE16_M_get_allocatorEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE18_M_construct_aux_2Ejw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE2atEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE3endEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4backEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5clearEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPKwS4_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS4_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5eraseEjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE5frontEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6appendEPKw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6appendEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6appendERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6appendERKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6appendESt16initializer_listIwE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6appendEjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6assignEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6assignEPKw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6assignEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6assignERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6assignERKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6assignESt16initializer_listIwE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6assignEjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPKwS4_EEjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPKwS4_EEw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS4_EESt16initializer_listIwE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS4_EEjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS4_EEw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjPKw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjRKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjRKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertEjjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6insertIN9__gnu_cxx17__normal_iteratorIPwS4_EEEEvS9_T_SA_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6resizeEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6resizeEjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7_M_dataEPw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7_S_copyEPwPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7_S_moveEPwPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_NS6_IPwS4_EESB_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_PwSA_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_RKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_S8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_S8_S8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_S8_j@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_S9_S9_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_St16initializer_listIwE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPKwS4_EES9_jw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_NS6_IPKwS4_EESB_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_PKw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_PKwSA_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_PKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_RKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_S7_S7_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_S8_S8_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS4_EES8_jw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEjjPKw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEjjPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEjjRKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEjjRKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7replaceEjjjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE7reserveEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE8_M_eraseEjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE8pop_backEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_appendEPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_assignERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_createERjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_lengthEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_M_mutateEjjPKwj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9_S_assignEPwjw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE9push_backEw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1EOS4_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1EPKwRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1EPKwjRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1ERKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1ERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1ERKS4_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1ERKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1ERKS4_jjRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1ESt16initializer_listIwERKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1EjwRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPwS4_EEvEET_SA_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1IPKwvEET_S8_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC1IPwvEET_S7_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2EOS4_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2EPKwRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2EPKwjRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2ERKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2ERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2ERKS4_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2ERKS4_jj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2ERKS4_jjRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2ESt16initializer_listIwERKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2EjwRKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPwS4_EEvEET_SA_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2IPKwvEET_S8_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEC2IPwvEET_S7_RKS3_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEaSEPKw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEaSERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEaSESt16initializer_listIwE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEaSEw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEixEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEpLEPKw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEpLERKS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEpLESt16initializer_listIwE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEpLEw@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIcEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIcEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIcEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIcEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIcED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIcED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIcED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIwEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIwEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIwEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIwEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1114collate_bynameIwED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE14__xfer_bufptrsC1ERKS4_PS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE14__xfer_bufptrsC2ERKS4_PS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE14__xfer_bufptrsD1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE14__xfer_bufptrsD2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE15_M_update_egptrEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE3strERKNS_12basic_stringIcS2_S3_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE8_M_pbumpEPcS5_x@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE9showmanycEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEC1EOS4_ONS4_14__xfer_bufptrsE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKNS_12basic_stringIcS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEC2EOS4_ONS4_14__xfer_bufptrsE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKNS_12basic_stringIcS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE14__xfer_bufptrsC1ERKS4_PS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE14__xfer_bufptrsC2ERKS4_PS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE14__xfer_bufptrsD1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE14__xfer_bufptrsD2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE15_M_update_egptrEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE3strERKNS_12basic_stringIwS2_S3_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwi@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwjj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE8_M_pbumpEPwS5_x@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE9showmanycEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEC1EOS4_ONS4_14__xfer_bufptrsE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKNS_12basic_stringIwS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEC2EOS4_ONS4_14__xfer_bufptrsE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKNS_12basic_stringIwS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIcEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIcEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIcEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIcEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIcED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIcED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIcED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIwEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIwEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIwEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIwEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115messages_bynameIwED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIcEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIcEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIcEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIcEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIcED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIcED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIcED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIwEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIwEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIwEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIwEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115numpunct_bynameIwED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1ERKNS_12basic_stringIcS3_SaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2ERKNS_12basic_stringIcS3_SaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1ERKNS_12basic_stringIcS2_IcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2ERKNS_12basic_stringIcS2_IcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb0EEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb0EEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb0EEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb0EEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb0EED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb0EED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb0EED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb1EEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb1EEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb1EEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb1EEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb1EED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb1EED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIcLb1EED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb0EEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb0EEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb0EEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb0EEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb0EED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb0EED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb0EED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb1EEC1EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb1EEC1ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb1EEC2EPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb1EEC2ERKNS_12basic_stringIcSt11char_traitsIcESaIcEEEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb1EED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb1EED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1117moneypunct_bynameIwLb1EED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKNS_12basic_stringIcS2_S3_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKNS_12basic_stringIcS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKNS_12basic_stringIcS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKNS_12basic_stringIwS2_S3_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKNS_12basic_stringIwS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKNS_12basic_stringIwS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKNS_12basic_stringIcS2_S3_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKNS_12basic_stringIcS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKNS_12basic_stringIcS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKNS_12basic_stringIwS2_S3_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKNS_12basic_stringIwS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKNS_12basic_stringIwS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKNS_12basic_stringIcS2_S3_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKNS_12basic_stringIcS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKNS_12basic_stringIcS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKNS_12basic_stringIwS2_S3_EE@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEE4swapERS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEC1EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKNS_12basic_stringIwS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEC2EOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKNS_12basic_stringIwS2_S3_EESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEaSEOS4_@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIcEC1EP15__locale_structj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIcEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIcEC2EP15__locale_structj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIcEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIcED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIcED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIcED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIwEC1EP15__locale_structj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIwEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIwEC2EP15__locale_structj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIwEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx117collateIwED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIcEC1EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIcEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIcEC2EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIcEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIcED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIcED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIcED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIwEC1EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIwEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIwEC2EP15__locale_structPKcj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIwEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118messagesIwED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcE22_M_initialize_numpunctEP15__locale_struct@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcEC1EP15__locale_structj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcEC1EPSt16__numpunct_cacheIcEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcEC2EP15__locale_structj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcEC2EPSt16__numpunct_cacheIcEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIcED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwE22_M_initialize_numpunctEP15__locale_struct@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwEC1EP15__locale_structj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwEC1EPSt16__numpunct_cacheIwEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwEC2EP15__locale_structj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwEC2EPSt16__numpunct_cacheIwEj@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118numpunctIwED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7codecvtIDic11__mbstate_tED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7codecvtIDic11__mbstate_tED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7codecvtIDic11__mbstate_tED2Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7codecvtIDsc11__mbstate_tED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7codecvtIDsc11__mbstate_tED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt7codecvtIDsc11__mbstate_tED2Ev@@GLIBCXX_3.4.21 FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structj@@GLIBCXX_3.4 FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1Ej@@GLIBCXX_3.4 FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structj@@GLIBCXX_3.4 @@ -2065,6 +3346,17 @@ FUNC:_ZNSt8ios_base4InitD2Ev@@GLIBCXX_3.4 FUNC:_ZNSt8ios_base5imbueERKSt6locale@@GLIBCXX_3.4 FUNC:_ZNSt8ios_base6xallocEv@@GLIBCXX_3.4 FUNC:_ZNSt8ios_base7_M_initEv@@GLIBCXX_3.4 +FUNC:_ZNSt8ios_base7_M_moveERS_@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7_M_swapERS_@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11C1EPKcRKSt10error_code@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11C1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11C1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10error_code@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11C2EPKcRKSt10error_code@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11C2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11C2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10error_code@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11D0Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11D1Ev@@GLIBCXX_3.4.21 +FUNC:_ZNSt8ios_base7failureB5cxx11D2Ev@@GLIBCXX_3.4.21 FUNC:_ZNSt8ios_base7failureC1ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt8ios_base7failureC2ERKSs@@GLIBCXX_3.4 FUNC:_ZNSt8ios_base7failureD0Ev@@GLIBCXX_3.4 @@ -2156,11 +3448,15 @@ FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_localeERKSt6locale@@GLIBCXX_ FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4 +FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4moveEOS2_@@GLIBCXX_3.4.21 +FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4moveERS2_@@GLIBCXX_3.4.21 +FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@@GLIBCXX_3.4 +FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE9set_rdbufEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4.21 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@@GLIBCXX_3.4 @@ -2174,11 +3470,15 @@ FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE15_M_cache_localeERKSt6locale@@GLIBCXX_ FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE3tieEPSt13basic_ostreamIwS1_E@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4fillEw@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 +FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4moveEOS2_@@GLIBCXX_3.4.21 +FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4moveERS2_@@GLIBCXX_3.4.21 +FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4swapERS2_@@GLIBCXX_3.4.21 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5clearESt12_Ios_Iostate@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5rdbufEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE7copyfmtERKS2_@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE8setstateESt12_Ios_Iostate@@GLIBCXX_3.4 +FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE9set_rdbufEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4.21 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4 FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4 @@ -2244,8 +3544,10 @@ FUNC:_ZSt16generic_categoryv@@GLIBCXX_3.4.11 FUNC:_ZSt17__copy_streambufsIcSt11char_traitsIcEEiPSt15basic_streambufIT_T0_ES6_@@GLIBCXX_3.4.6 FUNC:_ZSt17__copy_streambufsIwSt11char_traitsIwEEiPSt15basic_streambufIT_T0_ES6_@@GLIBCXX_3.4.6 FUNC:_ZSt17__throw_bad_allocv@@GLIBCXX_3.4 +FUNC:_ZSt17__verify_groupingPKcjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 FUNC:_ZSt17__verify_groupingPKcjRKSs@@GLIBCXX_3.4.10 FUNC:_ZSt17current_exceptionv@@CXXABI_1.3.3 +FUNC:_ZSt17iostream_categoryv@@GLIBCXX_3.4.21 FUNC:_ZSt17rethrow_exceptionNSt15__exception_ptr13exception_ptrE@@CXXABI_1.3.3 FUNC:_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4 FUNC:_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base@@GLIBCXX_3.4 @@ -2257,6 +3559,7 @@ FUNC:_ZSt19__throw_ios_failurePKc@@GLIBCXX_3.4 FUNC:_ZSt19__throw_logic_errorPKc@@GLIBCXX_3.4 FUNC:_ZSt19__throw_range_errorPKc@@GLIBCXX_3.4 FUNC:_ZSt19__throw_regex_errorNSt15regex_constants10error_typeE@@GLIBCXX_3.4.15 +FUNC:_ZSt19uncaught_exceptionsv@@GLIBCXX_3.4.22 FUNC:_ZSt20_Rb_tree_black_countPKSt18_Rb_tree_node_baseS1_@@GLIBCXX_3.4 FUNC:_ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0_@@GLIBCXX_3.4 FUNC:_ZSt20__throw_domain_errorPKc@@GLIBCXX_3.4 @@ -2274,6 +3577,7 @@ FUNC:_ZSt23__throw_underflow_errorPKc@@GLIBCXX_3.4 FUNC:_ZSt24__throw_invalid_argumentPKc@@GLIBCXX_3.4 FUNC:_ZSt24__throw_out_of_range_fmtPKcz@@GLIBCXX_3.4.20 FUNC:_ZSt25__throw_bad_function_callv@@GLIBCXX_3.4.14 +FUNC:_ZSt25notify_all_at_thread_exitRSt18condition_variableSt11unique_lockISt5mutexE@@GLIBCXX_3.4.21 FUNC:_ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS_@@GLIBCXX_3.4 FUNC:_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_@@GLIBCXX_3.4 FUNC:_ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@@GLIBCXX_3.4 @@ -2284,10 +3588,28 @@ FUNC:_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4 FUNC:_ZSt4endsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4 FUNC:_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4 FUNC:_ZSt5flushIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4 +FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21 +FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EES4_@@GLIBCXX_3.4.21 FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4 FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4 +FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21 +FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EES4_@@GLIBCXX_3.4.21 FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4 FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4 +FUNC:_ZSt9has_facetINSt7__cxx1110moneypunctIcLb0EEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx1110moneypunctIwLb0EEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx117collateIcEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx117collateIwEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx118messagesIcEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx118messagesIwEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx118numpunctIcEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx118numpunctIwEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEEbRKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9has_facetINSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEEbRKSt6locale@@GLIBCXX_3.4.21 FUNC:_ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCXX_3.4 FUNC:_ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@@GLIBCXX_3.4 FUNC:_ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCXX_3.4 @@ -2315,6 +3637,22 @@ FUNC:_ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE FUNC:_ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4 FUNC:_ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4 FUNC:_ZSt9terminatev@@GLIBCXX_3.4 +FUNC:_ZSt9use_facetINSt7__cxx1110moneypunctIcLb0EEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx1110moneypunctIcLb1EEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx1110moneypunctIwLb0EEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx1110moneypunctIwLb1EEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx117collateIcEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx117collateIwEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx118messagesIcEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx118messagesIwEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx118numpunctIcEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx118numpunctIwEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEERKT_RKSt6locale@@GLIBCXX_3.4.21 +FUNC:_ZSt9use_facetINSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEERKT_RKSt6locale@@GLIBCXX_3.4.21 FUNC:_ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@@GLIBCXX_3.4 FUNC:_ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@@GLIBCXX_3.4 FUNC:_ZSt9use_facetISt10moneypunctIwLb0EEERKT_RKSt6locale@@GLIBCXX_3.4 @@ -2355,6 +3693,7 @@ FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@ FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4 FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4 FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4 +FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21 FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4 FUNC:_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4 FUNC:_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4 @@ -2372,10 +3711,17 @@ FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCXX_3. FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4 FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4 FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_c@@GLIBCXX_3.4 +FUNC:_ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21 FUNC:_ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4 +FUNC:_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_@@GLIBCXX_3.4.21 +FUNC:_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_SA_@@GLIBCXX_3.4.21 +FUNC:_ZStplIcSt11char_traitsIcESaIcEENSt7__cxx1112basic_stringIT_T0_T1_EES5_RKS8_@@GLIBCXX_3.4.21 FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCXX_3.4 FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_@@GLIBCXX_3.4 FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@@GLIBCXX_3.4 +FUNC:_ZStplIwSt11char_traitsIwESaIwEENSt7__cxx1112basic_stringIT_T0_T1_EEPKS5_RKS8_@@GLIBCXX_3.4.21 +FUNC:_ZStplIwSt11char_traitsIwESaIwEENSt7__cxx1112basic_stringIT_T0_T1_EERKS8_SA_@@GLIBCXX_3.4.21 +FUNC:_ZStplIwSt11char_traitsIwESaIwEENSt7__cxx1112basic_stringIT_T0_T1_EES5_RKS8_@@GLIBCXX_3.4.21 FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCXX_3.4 FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ERKS6_S8_@@GLIBCXX_3.4 FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ES3_RKS6_@@GLIBCXX_3.4 @@ -2391,6 +3737,7 @@ FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@ FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4 FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4 FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4 +FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21 FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4 FUNC:_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4 FUNC:_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4 @@ -2406,6 +3753,7 @@ FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@ FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4 FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4 FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4 +FUNC:_ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21 FUNC:_ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4 FUNC:_ZThn8_NSdD0Ev@@GLIBCXX_3.4 FUNC:_ZThn8_NSdD1Ev@@GLIBCXX_3.4 @@ -2419,6 +3767,10 @@ FUNC:_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4 FUNC:_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4 +FUNC:_ZThn8_NSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZThn8_NSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZThn8_NSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZThn8_NSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 FUNC:_ZThn8_NSt9strstreamD0Ev@@GLIBCXX_3.4 FUNC:_ZThn8_NSt9strstreamD1Ev@@GLIBCXX_3.4 FUNC:_ZTv0_n12_NSdD0Ev@@GLIBCXX_3.4 @@ -2461,12 +3813,26 @@ FUNC:_ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3 FUNC:_ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4 FUNC:_ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4 FUNC:_ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4 +FUNC:_ZTv0_n12_NSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4.21 +FUNC:_ZTv0_n12_NSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21 FUNC:_ZTv0_n12_NSt9strstreamD0Ev@@GLIBCXX_3.4 FUNC:_ZTv0_n12_NSt9strstreamD1Ev@@GLIBCXX_3.4 FUNC:_ZdaPv@@GLIBCXX_3.4 FUNC:_ZdaPvRKSt9nothrow_t@@GLIBCXX_3.4 +FUNC:_ZdaPvj@@CXXABI_1.3.9 FUNC:_ZdlPv@@GLIBCXX_3.4 FUNC:_ZdlPvRKSt9nothrow_t@@GLIBCXX_3.4 +FUNC:_ZdlPvj@@CXXABI_1.3.9 FUNC:_Znaj@@GLIBCXX_3.4 FUNC:_ZnajRKSt9nothrow_t@@GLIBCXX_3.4 FUNC:_Znwj@@GLIBCXX_3.4 @@ -2561,6 +3927,7 @@ OBJECT:0:GLIBCXX_3.4.19 OBJECT:0:GLIBCXX_3.4.2 OBJECT:0:GLIBCXX_3.4.20 OBJECT:0:GLIBCXX_3.4.21 +OBJECT:0:GLIBCXX_3.4.22 OBJECT:0:GLIBCXX_3.4.3 OBJECT:0:GLIBCXX_3.4.4 OBJECT:0:GLIBCXX_3.4.5 @@ -2585,6 +3952,35 @@ OBJECT:12:_ZTIN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4 OBJECT:12:_ZTIN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:12:_ZTIN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4 OBJECT:12:_ZTINSt13__future_base19_Async_state_commonE@@GLIBCXX_3.4.17 +OBJECT:12:_ZTINSt7__cxx1114collate_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1114collate_bynameIwEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1115messages_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1115messages_bynameIwEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1115numpunct_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1115numpunct_bynameIwEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1117moneypunct_bynameIcLb0EEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1117moneypunct_bynameIcLb1EEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1117moneypunct_bynameIwLb0EEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1117moneypunct_bynameIwLb1EEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx117collateIcEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx117collateIwEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx118numpunctIcEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx118numpunctIwEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTINSt8ios_base7failureB5cxx11E@@GLIBCXX_3.4.21 OBJECT:12:_ZTINSt8ios_base7failureE@@GLIBCXX_3.4 OBJECT:12:_ZTISt10bad_typeid@@GLIBCXX_3.4 OBJECT:12:_ZTISt10istrstream@@GLIBCXX_3.4 @@ -2639,12 +4035,23 @@ OBJECT:12:_ZTISt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4 OBJECT:12:_ZTISt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4 OBJECT:12:_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4 OBJECT:12:_ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4 +OBJECT:12:_ZTISt19__codecvt_utf8_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTISt19__codecvt_utf8_baseIDsE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTISt19__codecvt_utf8_baseIwE@@GLIBCXX_3.4.21 OBJECT:12:_ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4 OBJECT:12:_ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4 OBJECT:12:_ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4 OBJECT:12:_ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4 +OBJECT:12:_ZTISt20__codecvt_utf16_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTISt20__codecvt_utf16_baseIDsE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTISt20__codecvt_utf16_baseIwE@@GLIBCXX_3.4.21 OBJECT:12:_ZTISt20bad_array_new_length@@CXXABI_1.3.8 +OBJECT:12:_ZTISt25__codecvt_utf8_utf16_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTISt25__codecvt_utf8_utf16_baseIDsE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTISt25__codecvt_utf8_utf16_baseIwE@@GLIBCXX_3.4.21 OBJECT:12:_ZTISt5ctypeIwE@@GLIBCXX_3.4 +OBJECT:12:_ZTISt7codecvtIDic11__mbstate_tE@@GLIBCXX_3.4.21 +OBJECT:12:_ZTISt7codecvtIDsc11__mbstate_tE@@GLIBCXX_3.4.21 OBJECT:12:_ZTISt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:12:_ZTISt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:12:_ZTISt7collateIcE@@GLIBCXX_3.4 @@ -2745,6 +4152,10 @@ OBJECT:16:_ZTIPx@@CXXABI_1.3 OBJECT:16:_ZTIPy@@CXXABI_1.3 OBJECT:16:_ZTSSt11logic_error@@GLIBCXX_3.4 OBJECT:16:_ZTSSt11range_error@@GLIBCXX_3.4 +OBJECT:16:_ZTTNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:16:_ZTTNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +OBJECT:16:_ZTTNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:16:_ZTTNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 OBJECT:16:_ZTTSt10istrstream@@GLIBCXX_3.4 OBJECT:16:_ZTTSt10ostrstream@@GLIBCXX_3.4 OBJECT:16:_ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4 @@ -2773,6 +4184,7 @@ OBJECT:18:_ZTSNSt6locale5facetE@@GLIBCXX_3.4 OBJECT:18:_ZTSSt13bad_exception@@GLIBCXX_3.4 OBJECT:18:_ZTSSt13messages_base@@GLIBCXX_3.4 OBJECT:18:_ZTSSt13runtime_error@@GLIBCXX_3.4 +OBJECT:19:_ZTSNSt6thread6_StateE@@GLIBCXX_3.4.22 OBJECT:19:_ZTSSt11__timepunctIcE@@GLIBCXX_3.4 OBJECT:19:_ZTSSt11__timepunctIwE@@GLIBCXX_3.4 OBJECT:19:_ZTSSt14error_category@@GLIBCXX_3.4.11 @@ -3065,6 +4477,14 @@ OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCXX_3.4 OBJECT:1:_ZNSt6chrono12system_clock12is_monotonicE@@GLIBCXX_3.4.11 OBJECT:1:_ZNSt6chrono3_V212steady_clock9is_steadyE@@GLIBCXX_3.4.19 OBJECT:1:_ZNSt6chrono3_V212system_clock9is_steadyE@@GLIBCXX_3.4.19 +OBJECT:1:_ZNSt7__cxx1110moneypunctIcLb0EE4intlE@@GLIBCXX_3.4.21 +OBJECT:1:_ZNSt7__cxx1110moneypunctIcLb1EE4intlE@@GLIBCXX_3.4.21 +OBJECT:1:_ZNSt7__cxx1110moneypunctIwLb0EE4intlE@@GLIBCXX_3.4.21 +OBJECT:1:_ZNSt7__cxx1110moneypunctIwLb1EE4intlE@@GLIBCXX_3.4.21 +OBJECT:1:_ZNSt7__cxx1117moneypunct_bynameIcLb0EE4intlE@@GLIBCXX_3.4.21 +OBJECT:1:_ZNSt7__cxx1117moneypunct_bynameIcLb1EE4intlE@@GLIBCXX_3.4.21 +OBJECT:1:_ZNSt7__cxx1117moneypunct_bynameIwLb0EE4intlE@@GLIBCXX_3.4.21 +OBJECT:1:_ZNSt7__cxx1117moneypunct_bynameIwLb1EE4intlE@@GLIBCXX_3.4.21 OBJECT:1:_ZSt10adopt_lock@@GLIBCXX_3.4.11 OBJECT:1:_ZSt10defer_lock@@GLIBCXX_3.4.11 OBJECT:1:_ZSt11try_to_lock@@GLIBCXX_3.4.11 @@ -3075,6 +4495,8 @@ OBJECT:20:_ZTSSt15underflow_error@@GLIBCXX_3.4 OBJECT:20:_ZTVNSt13__future_base11_State_baseE@@GLIBCXX_3.4.15 OBJECT:20:_ZTVNSt13__future_base12_Result_baseE@@GLIBCXX_3.4.15 OBJECT:20:_ZTVNSt13__future_base19_Async_state_commonE@@GLIBCXX_3.4.17 +OBJECT:20:_ZTVNSt6thread6_StateE@@GLIBCXX_3.4.22 +OBJECT:20:_ZTVNSt8ios_base7failureB5cxx11E@@GLIBCXX_3.4.21 OBJECT:20:_ZTVNSt8ios_base7failureE@@GLIBCXX_3.4 OBJECT:20:_ZTVSt10bad_typeid@@GLIBCXX_3.4 OBJECT:20:_ZTVSt10lock_error@@GLIBCXX_3.4.11 @@ -3119,15 +4541,37 @@ OBJECT:24:_ZTISi@@GLIBCXX_3.4 OBJECT:24:_ZTISo@@GLIBCXX_3.4 OBJECT:24:_ZTISt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4 OBJECT:24:_ZTISt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4 +OBJECT:24:_ZTSNSt7__cxx117collateIcEE@@GLIBCXX_3.4.21 +OBJECT:24:_ZTSNSt7__cxx117collateIwEE@@GLIBCXX_3.4.21 +OBJECT:24:_ZTVNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:24:_ZTVNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 +OBJECT:24:_ZTVNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:24:_ZTVNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 OBJECT:24:_ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:24:_ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 OBJECT:24:_ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:24:_ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 +OBJECT:25:_ZTSNSt7__cxx118messagesIcEE@@GLIBCXX_3.4.21 +OBJECT:25:_ZTSNSt7__cxx118messagesIwEE@@GLIBCXX_3.4.21 +OBJECT:25:_ZTSNSt7__cxx118numpunctIcEE@@GLIBCXX_3.4.21 +OBJECT:25:_ZTSNSt7__cxx118numpunctIwEE@@GLIBCXX_3.4.21 OBJECT:25:_ZTSSt20bad_array_new_length@@CXXABI_1.3.8 +OBJECT:27:_ZTSSt19__codecvt_utf8_baseIwE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTSSt19__codecvt_utf8_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTSSt19__codecvt_utf8_baseIDsE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTSSt20__codecvt_utf16_baseIwE@@GLIBCXX_3.4.21 OBJECT:28:_ZTSSt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:28:_ZTSSt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:28:_ZTTSd@@GLIBCXX_3.4 OBJECT:28:_ZTTSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4 +OBJECT:28:_ZTVNSt7__cxx1114collate_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTVNSt7__cxx1114collate_bynameIwEE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTVNSt7__cxx1115messages_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTVNSt7__cxx1115messages_bynameIwEE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTVNSt7__cxx117collateIcEE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTVNSt7__cxx117collateIwEE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTVNSt7__cxx118messagesIcEE@@GLIBCXX_3.4.21 +OBJECT:28:_ZTVNSt7__cxx118messagesIwEE@@GLIBCXX_3.4.21 OBJECT:28:_ZTVSt14collate_bynameIcE@@GLIBCXX_3.4 OBJECT:28:_ZTVSt14collate_bynameIwE@@GLIBCXX_3.4 OBJECT:28:_ZTVSt15messages_bynameIcE@@GLIBCXX_3.4 @@ -3136,14 +4580,20 @@ OBJECT:28:_ZTVSt7collateIcE@@GLIBCXX_3.4 OBJECT:28:_ZTVSt7collateIwE@@GLIBCXX_3.4 OBJECT:28:_ZTVSt8messagesIcE@@GLIBCXX_3.4 OBJECT:28:_ZTVSt8messagesIwE@@GLIBCXX_3.4 +OBJECT:29:_ZTSNSt8ios_base7failureB5cxx11E@@GLIBCXX_3.4.21 OBJECT:29:_ZTSSt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4 OBJECT:29:_ZTSSt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4 OBJECT:29:_ZTSSt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4 OBJECT:29:_ZTSSt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4 +OBJECT:29:_ZTSSt20__codecvt_utf16_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:29:_ZTSSt20__codecvt_utf16_baseIDsE@@GLIBCXX_3.4.21 OBJECT:29:_ZTSSt21__ctype_abstract_baseIcE@@GLIBCXX_3.4 OBJECT:29:_ZTSSt21__ctype_abstract_baseIwE@@GLIBCXX_3.4 +OBJECT:29:_ZTSSt7codecvtIDic11__mbstate_tE@@GLIBCXX_3.4.21 +OBJECT:29:_ZTSSt7codecvtIDsc11__mbstate_tE@@GLIBCXX_3.4.21 OBJECT:2:_ZNSt10ctype_base5alnumE@@GLIBCXX_3.4 OBJECT:2:_ZNSt10ctype_base5alphaE@@GLIBCXX_3.4 +OBJECT:2:_ZNSt10ctype_base5blankE@@GLIBCXX_3.4.21 OBJECT:2:_ZNSt10ctype_base5cntrlE@@GLIBCXX_3.4 OBJECT:2:_ZNSt10ctype_base5digitE@@GLIBCXX_3.4 OBJECT:2:_ZNSt10ctype_base5graphE@@GLIBCXX_3.4 @@ -3170,6 +4620,14 @@ OBJECT:2:_ZTSv@@CXXABI_1.3 OBJECT:2:_ZTSw@@CXXABI_1.3 OBJECT:2:_ZTSx@@CXXABI_1.3 OBJECT:2:_ZTSy@@CXXABI_1.3 +OBJECT:32:_ZTINSt7__cxx1110moneypunctIcLb0EEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTINSt7__cxx1110moneypunctIcLb1EEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTINSt7__cxx1110moneypunctIwLb0EEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTINSt7__cxx1110moneypunctIwLb1EEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTINSt7__cxx118messagesIcEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTINSt7__cxx118messagesIwEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTINSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTINSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 OBJECT:32:_ZTISd@@GLIBCXX_3.4 OBJECT:32:_ZTISt10moneypunctIcLb0EE@@GLIBCXX_3.4 OBJECT:32:_ZTISt10moneypunctIcLb1EE@@GLIBCXX_3.4 @@ -3185,15 +4643,28 @@ OBJECT:32:_ZTISt8messagesIcE@@GLIBCXX_3.4 OBJECT:32:_ZTISt8messagesIwE@@GLIBCXX_3.4 OBJECT:32:_ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:32:_ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 +OBJECT:32:_ZTSNSt7__cxx1110moneypunctIcLb0EEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTSNSt7__cxx1110moneypunctIcLb1EEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTSNSt7__cxx1110moneypunctIwLb0EEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTSNSt7__cxx1110moneypunctIwLb1EEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTSNSt7__cxx1114collate_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:32:_ZTSNSt7__cxx1114collate_bynameIwEE@@GLIBCXX_3.4.21 OBJECT:32:_ZTVN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3 OBJECT:32:_ZTVN10__cxxabiv117__array_type_infoE@@CXXABI_1.3 OBJECT:32:_ZTVN10__cxxabiv120__function_type_infoE@@CXXABI_1.3 OBJECT:32:_ZTVN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3 OBJECT:32:_ZTVSt9type_info@@GLIBCXX_3.4 OBJECT:33:_ZTSN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3 +OBJECT:33:_ZTSNSt7__cxx1115messages_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:33:_ZTSNSt7__cxx1115messages_bynameIwEE@@GLIBCXX_3.4.21 +OBJECT:33:_ZTSNSt7__cxx1115numpunct_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:33:_ZTSNSt7__cxx1115numpunct_bynameIwEE@@GLIBCXX_3.4.21 +OBJECT:33:_ZTSSt25__codecvt_utf8_utf16_baseIwE@@GLIBCXX_3.4.21 OBJECT:34:_ZTSN10__cxxabiv117__array_type_infoE@@CXXABI_1.3 OBJECT:34:_ZTSN10__cxxabiv117__class_type_infoE@@CXXABI_1.3 OBJECT:34:_ZTSN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3 +OBJECT:34:_ZTSSt25__codecvt_utf8_utf16_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:34:_ZTSSt25__codecvt_utf8_utf16_baseIDsE@@GLIBCXX_3.4.21 OBJECT:34:_ZTSSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4 OBJECT:34:_ZTSSt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4 OBJECT:36:_ZTSN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3 @@ -3202,6 +4673,10 @@ OBJECT:36:_ZTSSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:36:_ZTVN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3 OBJECT:36:_ZTVN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3 OBJECT:36:_ZTVN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3 +OBJECT:36:_ZTVNSt7__cxx1115numpunct_bynameIcEE@@GLIBCXX_3.4.21 +OBJECT:36:_ZTVNSt7__cxx1115numpunct_bynameIwEE@@GLIBCXX_3.4.21 +OBJECT:36:_ZTVNSt7__cxx118numpunctIcEE@@GLIBCXX_3.4.21 +OBJECT:36:_ZTVNSt7__cxx118numpunctIwEE@@GLIBCXX_3.4.21 OBJECT:36:_ZTVSt14error_category@@GLIBCXX_3.4.11 OBJECT:36:_ZTVSt15numpunct_bynameIcE@@GLIBCXX_3.4 OBJECT:36:_ZTVSt15numpunct_bynameIwE@@GLIBCXX_3.4 @@ -3210,6 +4685,10 @@ OBJECT:36:_ZTVSt8numpunctIwE@@GLIBCXX_3.4 OBJECT:37:_ZTSN10__cxxabiv120__function_type_infoE@@CXXABI_1.3 OBJECT:37:_ZTSN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3 OBJECT:38:_ZTSN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3 +OBJECT:39:_ZTSNSt7__cxx1117moneypunct_bynameIcLb0EEE@@GLIBCXX_3.4.21 +OBJECT:39:_ZTSNSt7__cxx1117moneypunct_bynameIcLb1EEE@@GLIBCXX_3.4.21 +OBJECT:39:_ZTSNSt7__cxx1117moneypunct_bynameIwLb0EEE@@GLIBCXX_3.4.21 +OBJECT:39:_ZTSNSt7__cxx1117moneypunct_bynameIwLb1EEE@@GLIBCXX_3.4.21 OBJECT:39:_ZTSSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4 OBJECT:39:_ZTSSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4 OBJECT:39:_ZTSSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4 @@ -3242,11 +4721,18 @@ OBJECT:40:_ZTSSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4 OBJECT:40:_ZTSSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4 OBJECT:40:_ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4 OBJECT:40:_ZTSSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4 +OBJECT:40:_ZTTNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:40:_ZTTNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 OBJECT:40:_ZTTSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4 OBJECT:40:_ZTTSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4 OBJECT:40:_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4 OBJECT:40:_ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4 OBJECT:40:_ZTTSt9strstream@@GLIBCXX_3.4 +OBJECT:40:_ZTVNSt3_V214error_categoryE@@GLIBCXX_3.4.21 +OBJECT:40:_ZTVNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:40:_ZTVNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +OBJECT:40:_ZTVNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:40:_ZTVNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 OBJECT:40:_ZTVSi@@GLIBCXX_3.4 OBJECT:40:_ZTVSo@@GLIBCXX_3.4 OBJECT:40:_ZTVSt10istrstream@@GLIBCXX_3.4 @@ -3271,10 +4757,25 @@ OBJECT:41:_ZTSSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4 OBJECT:44:_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3 OBJECT:44:_ZTVN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3 OBJECT:44:_ZTVN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3 +OBJECT:44:_ZTVNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 OBJECT:44:_ZTVSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:44:_ZTVSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4 +OBJECT:44:_ZTVSt19__codecvt_utf8_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt19__codecvt_utf8_baseIDsE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt19__codecvt_utf8_baseIwE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt20__codecvt_utf16_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt20__codecvt_utf16_baseIDsE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt20__codecvt_utf16_baseIwE@@GLIBCXX_3.4.21 OBJECT:44:_ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:44:_ZTVSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4 +OBJECT:44:_ZTVSt25__codecvt_utf8_utf16_baseIDiE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt25__codecvt_utf8_utf16_baseIDsE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt25__codecvt_utf8_utf16_baseIwE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt7codecvtIDic11__mbstate_tE@@GLIBCXX_3.4.21 +OBJECT:44:_ZTVSt7codecvtIDsc11__mbstate_tE@@GLIBCXX_3.4.21 OBJECT:44:_ZTVSt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:44:_ZTVSt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4 OBJECT:45:_ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4 @@ -3506,6 +5007,26 @@ OBJECT:4:_ZNSt6locale7collateE@@GLIBCXX_3.4 OBJECT:4:_ZNSt6locale7numericE@@GLIBCXX_3.4 OBJECT:4:_ZNSt6locale8messagesE@@GLIBCXX_3.4 OBJECT:4:_ZNSt6locale8monetaryE@@GLIBCXX_3.4 +OBJECT:4:_ZNSt7__cxx1110moneypunctIcLb0EE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx1110moneypunctIcLb1EE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx1110moneypunctIwLb0EE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx1110moneypunctIwLb1EE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4nposE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE4nposE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx117collateIcE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx117collateIwE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx118messagesIcE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx118messagesIwE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx118numpunctIcE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx118numpunctIwE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7codecvtIDic11__mbstate_tE2idE@@GLIBCXX_3.4.21 +OBJECT:4:_ZNSt7codecvtIDsc11__mbstate_tE2idE@@GLIBCXX_3.4.21 OBJECT:4:_ZNSt7codecvtIcc11__mbstate_tE2idE@@GLIBCXX_3.4 OBJECT:4:_ZNSt7codecvtIwc11__mbstate_tE2idE@@GLIBCXX_3.4 OBJECT:4:_ZNSt7collateIcE2idE@@GLIBCXX_3.4 @@ -3579,6 +5100,14 @@ OBJECT:50:_ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4 OBJECT:50:_ZTSSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4 OBJECT:50:_ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4 OBJECT:50:_ZTSSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4 +OBJECT:52:_ZTVNSt7__cxx1110moneypunctIcLb0EEE@@GLIBCXX_3.4.21 +OBJECT:52:_ZTVNSt7__cxx1110moneypunctIcLb1EEE@@GLIBCXX_3.4.21 +OBJECT:52:_ZTVNSt7__cxx1110moneypunctIwLb0EEE@@GLIBCXX_3.4.21 +OBJECT:52:_ZTVNSt7__cxx1110moneypunctIwLb1EEE@@GLIBCXX_3.4.21 +OBJECT:52:_ZTVNSt7__cxx1117moneypunct_bynameIcLb0EEE@@GLIBCXX_3.4.21 +OBJECT:52:_ZTVNSt7__cxx1117moneypunct_bynameIcLb1EEE@@GLIBCXX_3.4.21 +OBJECT:52:_ZTVNSt7__cxx1117moneypunct_bynameIwLb0EEE@@GLIBCXX_3.4.21 +OBJECT:52:_ZTVNSt7__cxx1117moneypunct_bynameIwLb1EEE@@GLIBCXX_3.4.21 OBJECT:52:_ZTVSt10moneypunctIcLb0EE@@GLIBCXX_3.4 OBJECT:52:_ZTVSt10moneypunctIcLb1EE@@GLIBCXX_3.4 OBJECT:52:_ZTVSt10moneypunctIwLb0EE@@GLIBCXX_3.4 @@ -3591,18 +5120,28 @@ OBJECT:54:_ZTSN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:54:_ZTSN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4 OBJECT:56:_ZNSt17__timepunct_cacheIcE12_S_timezonesE@@GLIBCXX_3.4 OBJECT:56:_ZNSt17__timepunct_cacheIwE12_S_timezonesE@@GLIBCXX_3.4 +OBJECT:56:_ZTSNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:56:_ZTSNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 OBJECT:58:_ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:58:_ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 OBJECT:58:_ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:58:_ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 +OBJECT:59:_ZTSNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:59:_ZTSNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 OBJECT:59:_ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:59:_ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 OBJECT:59:_ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:59:_ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 +OBJECT:60:_ZTSNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:60:_ZTSNSt7__cxx1119basic_istringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 +OBJECT:60:_ZTSNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:60:_ZTSNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 OBJECT:60:_ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:60:_ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 OBJECT:60:_ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:60:_ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 +OBJECT:60:_ZTVNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:60:_ZTVNSt7__cxx1118basic_stringstreamIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 OBJECT:60:_ZTVSd@@GLIBCXX_3.4 OBJECT:60:_ZTVSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4 OBJECT:60:_ZTVSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4 @@ -3614,6 +5153,8 @@ OBJECT:60:_ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX OBJECT:60:_ZTVSt9strstream@@GLIBCXX_3.4 OBJECT:64:_ZTVN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:64:_ZTVN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4 +OBJECT:64:_ZTVNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE@@GLIBCXX_3.4.21 +OBJECT:64:_ZTVNSt7__cxx1115basic_stringbufIwSt11char_traitsIwESaIwEEE@@GLIBCXX_3.4.21 OBJECT:64:_ZTVSt12ctype_bynameIwE@@GLIBCXX_3.4 OBJECT:64:_ZTVSt12strstreambuf@@GLIBCXX_3.4 OBJECT:64:_ZTVSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4 @@ -3629,12 +5170,36 @@ OBJECT:67:_ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE OBJECT:67:_ZTSSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 OBJECT:67:_ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4 OBJECT:67:_ZTSSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4 +OBJECT:69:_ZTSNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:69:_ZTSNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 +OBJECT:70:_ZTSNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:70:_ZTSNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 +OBJECT:70:_ZTSNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:70:_ZTSNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 +OBJECT:77:_ZTSNSt7__cxx1115time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEE@@GLIBCXX_3.4.21 +OBJECT:77:_ZTSNSt7__cxx1115time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEE@@GLIBCXX_3.4.21 OBJECT:8:_ZGVNSt10moneypunctIcLb0EE2idE@@GLIBCXX_3.4 OBJECT:8:_ZGVNSt10moneypunctIcLb1EE2idE@@GLIBCXX_3.4 OBJECT:8:_ZGVNSt10moneypunctIwLb0EE2idE@@GLIBCXX_3.4 OBJECT:8:_ZGVNSt10moneypunctIwLb1EE2idE@@GLIBCXX_3.4 OBJECT:8:_ZGVNSt11__timepunctIcE2idE@@GLIBCXX_3.4 OBJECT:8:_ZGVNSt11__timepunctIwE2idE@@GLIBCXX_3.4 +OBJECT:8:_ZGVNSt7__cxx1110moneypunctIcLb0EE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx1110moneypunctIcLb1EE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx1110moneypunctIwLb0EE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx1110moneypunctIwLb1EE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx117collateIcE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx117collateIwE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx118messagesIcE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx118messagesIwE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx118numpunctIcE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx118numpunctIwE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx118time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx118time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx119money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx119money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx119money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4.21 +OBJECT:8:_ZGVNSt7__cxx119money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4.21 OBJECT:8:_ZGVNSt7collateIcE2idE@@GLIBCXX_3.4 OBJECT:8:_ZGVNSt7collateIwE2idE@@GLIBCXX_3.4 OBJECT:8:_ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4 @@ -3663,7 +5228,9 @@ OBJECT:8:_ZTIN10__cxxabiv115__forced_unwindE@@CXXABI_1.3.2 OBJECT:8:_ZTIN10__cxxabiv119__foreign_exceptionE@@CXXABI_1.3.2 OBJECT:8:_ZTINSt13__future_base11_State_baseE@@GLIBCXX_3.4.15 OBJECT:8:_ZTINSt13__future_base12_Result_baseE@@GLIBCXX_3.4.15 +OBJECT:8:_ZTINSt3_V214error_categoryE@@GLIBCXX_3.4.21 OBJECT:8:_ZTINSt6locale5facetE@@GLIBCXX_3.4 +OBJECT:8:_ZTINSt6thread6_StateE@@GLIBCXX_3.4.22 OBJECT:8:_ZTISt10ctype_base@@GLIBCXX_3.4 OBJECT:8:_ZTISt10money_base@@GLIBCXX_3.4 OBJECT:8:_ZTISt12codecvt_base@@GLIBCXX_3.4 diff --git a/libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt b/libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt index 67b1f3e5c4f..6bc4a4b10c8 100644 --- a/libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt +++ b/libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt @@ -4618,6 +4618,8 @@ OBJECT:2:_ZTSi@@CXXABI_1.3 OBJECT:2:_ZTSj@@CXXABI_1.3 OBJECT:2:_ZTSl@@CXXABI_1.3 OBJECT:2:_ZTSm@@CXXABI_1.3 +OBJECT:2:_ZTSn@@CXXABI_1.3.9 +OBJECT:2:_ZTSo@@CXXABI_1.3.9 OBJECT:2:_ZTSs@@CXXABI_1.3 OBJECT:2:_ZTSt@@CXXABI_1.3 OBJECT:2:_ZTSv@@CXXABI_1.3 @@ -4711,6 +4713,8 @@ OBJECT:3:_ZTSPi@@CXXABI_1.3 OBJECT:3:_ZTSPj@@CXXABI_1.3 OBJECT:3:_ZTSPl@@CXXABI_1.3 OBJECT:3:_ZTSPm@@CXXABI_1.3 +OBJECT:3:_ZTSPn@@CXXABI_1.3.9 +OBJECT:3:_ZTSPo@@CXXABI_1.3.9 OBJECT:3:_ZTSPs@@CXXABI_1.3 OBJECT:3:_ZTSPt@@CXXABI_1.3 OBJECT:3:_ZTSPv@@CXXABI_1.3 @@ -5116,6 +5120,8 @@ OBJECT:4:_ZTSPKi@@CXXABI_1.3 OBJECT:4:_ZTSPKj@@CXXABI_1.3 OBJECT:4:_ZTSPKl@@CXXABI_1.3 OBJECT:4:_ZTSPKm@@CXXABI_1.3 +OBJECT:4:_ZTSPKn@@CXXABI_1.3.9 +OBJECT:4:_ZTSPKo@@CXXABI_1.3.9 OBJECT:4:_ZTSPKs@@CXXABI_1.3 OBJECT:4:_ZTSPKt@@CXXABI_1.3 OBJECT:4:_ZTSPKv@@CXXABI_1.3 diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index b3240315563..41069d156a3 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -1876,6 +1876,37 @@ GLIBCXX_3.4.22 { _ZNSt6thread6_StateD[012]Ev; _ZNSt6thread15_M_start_threadESt10unique_ptrINS_6_StateESt14default_deleteIS1_EEPFvvE; + # Support for the Transactional Memory TS (N4514) + _ZGTtNSt11logic_errorC[12]EPKc; + _ZGTtNSt11logic_errorC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNKSt11logic_error4whatEv; + _ZGTtNSt11logic_errorD[012]Ev; + _ZGTtNSt12domain_errorC[12]EPKc; + _ZGTtNSt12domain_errorC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNSt12domain_errorD[012]Ev; + _ZGTtNSt16invalid_argumentC[12]EPKc; + _ZGTtNSt16invalid_argumentC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNSt16invalid_argumentD[012]Ev; + _ZGTtNSt12length_errorC[12]EPKc; + _ZGTtNSt12length_errorC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNSt12length_errorD[012]Ev; + _ZGTtNSt12out_of_rangeC[12]EPKc; + _ZGTtNSt12out_of_rangeC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNSt12out_of_rangeD[012]Ev; + _ZGTtNSt13runtime_errorC[12]EPKc; + _ZGTtNSt13runtime_errorC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNKSt13runtime_error4whatEv; + _ZGTtNSt13runtime_errorD[012]Ev; + _ZGTtNSt11range_errorC[12]EPKc; + _ZGTtNSt11range_errorC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNSt11range_errorD[012]Ev; + _ZGTtNSt14overflow_errorC[12]EPKc; + _ZGTtNSt14overflow_errorC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNSt14overflow_errorD[012]Ev; + _ZGTtNSt15underflow_errorC[12]EPKc; + _ZGTtNSt15underflow_errorC[12]ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE; + _ZGTtNSt15underflow_errorD[012]Ev; + } GLIBCXX_3.4.21; # Symbols in the support library (libsupc++) have their own tag. @@ -2109,6 +2140,16 @@ CXXABI_1.3.9 { } CXXABI_1.3.8; +CXXABI_1.3.10 { + + # Support for the Transactional Memory TS (N4514) + _ZGTtNKSt9exceptionD1Ev; + _ZGTtNKSt9exception4whatEv; + _ZGTtNKSt13bad_exceptionD1Ev; + _ZGTtNKSt13bad_exception4whatEv; + +} CXXABI_1.3.9; + # Symbols in the support library (libsupc++) supporting transactional memory. CXXABI_TM_1 { diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 38f14f6729e..5e91deb0016 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -700,6 +700,8 @@ GLIBCXX_C_HEADERS_C_TRUE C_INCLUDE_DIR ALLOCATOR_NAME ALLOCATOR_H +ENABLE_ALLOCATOR_NEW_FALSE +ENABLE_ALLOCATOR_NEW_TRUE CLOCALE_INTERNAL_H CLOCALE_CC CTIME_CC @@ -11594,7 +11596,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11597 "configure" +#line 11599 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11700,7 +11702,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11703 "configure" +#line 11705 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -15386,7 +15388,7 @@ $as_echo "$glibcxx_cv_atomic_long_long" >&6; } # Fake what AC_TRY_COMPILE does. cat > conftest.$ac_ext << EOF -#line 15389 "configure" +#line 15391 "configure" int main() { typedef bool atomic_type; @@ -15421,7 +15423,7 @@ $as_echo "$glibcxx_cv_atomic_bool" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15424 "configure" +#line 15426 "configure" int main() { typedef short atomic_type; @@ -15456,7 +15458,7 @@ $as_echo "$glibcxx_cv_atomic_short" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15459 "configure" +#line 15461 "configure" int main() { // NB: _Atomic_word not necessarily int. @@ -15492,7 +15494,7 @@ $as_echo "$glibcxx_cv_atomic_int" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15495 "configure" +#line 15497 "configure" int main() { typedef long long atomic_type; @@ -15537,9 +15539,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Set atomicity_dir to builtins if all but the long long test above passes. - if test $glibcxx_cv_atomic_bool = yes \ - && test $glibcxx_cv_atomic_short = yes \ - && test $glibcxx_cv_atomic_int = yes; then + if test "$glibcxx_cv_atomic_bool" = yes \ + && test "$glibcxx_cv_atomic_short" = yes \ + && test "$glibcxx_cv_atomic_int" = yes; then $as_echo "#define _GLIBCXX_ATOMIC_BUILTINS 1" >>confdefs.h @@ -15571,7 +15573,7 @@ $as_echo "$as_me: WARNING: Performance of certain classes will degrade as a resu # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 15574 "configure" +#line 15576 "configure" int main() { _Decimal32 d1; @@ -15613,7 +15615,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 15616 "configure" +#line 15618 "configure" template struct same { typedef T2 type; }; @@ -15647,7 +15649,7 @@ $as_echo "$enable_int128" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15650 "configure" +#line 15652 "configure" template struct same { typedef T2 type; }; @@ -16285,6 +16287,7 @@ $as_echo "$enable_libstdcxx_allocator_flag" >&6; } + # Check whether --enable-cheaders was given. if test "${enable_cheaders+set}" = set; then : enableval=$enable_cheaders; @@ -18174,7 +18177,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_math11_overload" >&5 $as_echo "$glibcxx_cv_math11_overload" >&6; } ;; - *-*-*gnu*) + *-*-*gnu* | *-*-aix*) # If defines the obsolete isinf(double) and isnan(double) # functions (instead of or as well as the C99 generic macros) then we # can't define std::isinf(double) and std::isnan(double) in @@ -80294,6 +80297,99 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +# For Transactional Memory TS + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how size_t is mangled" >&5 +$as_echo_n "checking how size_t is mangled... " >&6; } +if test "${glibcxx_cv_size_t_mangling+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern __SIZE_TYPE__ x; extern unsigned long x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_size_t_mangling=m +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern __SIZE_TYPE__ x; extern unsigned int x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_size_t_mangling=j +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern __SIZE_TYPE__ x; extern unsigned long long x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_size_t_mangling=y +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern __SIZE_TYPE__ x; extern unsigned short x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glibcxx_cv_size_t_mangling=t +else + glibcxx_cv_size_t_mangling=x +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_size_t_mangling" >&5 +$as_echo "$glibcxx_cv_size_t_mangling" >&6; } + if test $glibcxx_cv_size_t_mangling = x; then + as_fn_error "Unknown underlying type for size_t" "$LINENO" 5 + fi + +cat >>confdefs.h <<_ACEOF +#define _GLIBCXX_MANGLE_SIZE_T $glibcxx_cv_size_t_mangling +_ACEOF + + + # Define documentation rules conditionally. # See if makeinfo has been installed and is modern enough @@ -80755,6 +80851,15 @@ else fi + if test $enable_libstdcxx_allocator_flag = new; then + ENABLE_ALLOCATOR_NEW_TRUE= + ENABLE_ALLOCATOR_NEW_FALSE='#' +else + ENABLE_ALLOCATOR_NEW_TRUE='#' + ENABLE_ALLOCATOR_NEW_FALSE= +fi + + if test $enable_cheaders = c; then GLIBCXX_C_HEADERS_C_TRUE= GLIBCXX_C_HEADERS_C_FALSE='#' @@ -81274,6 +81379,10 @@ if test -z "${GLIBCXX_BUILD_PCH_TRUE}" && test -z "${GLIBCXX_BUILD_PCH_FALSE}"; as_fn_error "conditional \"GLIBCXX_BUILD_PCH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${ENABLE_ALLOCATOR_NEW_TRUE}" && test -z "${ENABLE_ALLOCATOR_NEW_FALSE}"; then + as_fn_error "conditional \"ENABLE_ALLOCATOR_NEW\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${GLIBCXX_C_HEADERS_C_TRUE}" && test -z "${GLIBCXX_C_HEADERS_C_FALSE}"; then as_fn_error "conditional \"GLIBCXX_C_HEADERS_C\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index 4361cf0e450..9e19e9927fd 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -408,6 +408,9 @@ AC_CHECK_HEADERS([fcntl.h dirent.h sys/statvfs.h utime.h]) GLIBCXX_ENABLE_FILESYSTEM_TS GLIBCXX_CHECK_FILESYSTEM_DEPS +# For Transactional Memory TS +GLIBCXX_CHECK_SIZE_T_MANGLING + # Define documentation rules conditionally. # See if makeinfo has been installed and is modern enough diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index 07dc48a5567..39327d98b27 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -1200,6 +1200,14 @@ stamp-cxx11-abi: echo 0 > stamp-cxx11-abi endif +if ENABLE_ALLOCATOR_NEW +stamp-allocator-new: + echo 1 > stamp-allocator-new +else +stamp-allocator-new: + echo 0 > stamp-allocator-new +endif + # NB: The non-empty default ldbl_compat works around an AIX sed # oddity, see libstdc++/31957 for details. ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ @@ -1210,13 +1218,15 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ stamp-visibility \ stamp-extern-template \ stamp-dual-abi \ - stamp-cxx11-abi + stamp-cxx11-abi \ + stamp-allocator-new @date=`cat ${toplevel_srcdir}/gcc/DATESTAMP` ;\ ns_version=`cat stamp-namespace-version` ;\ visibility=`cat stamp-visibility` ;\ externtemplate=`cat stamp-extern-template` ;\ dualabi=`cat stamp-dual-abi` ;\ cxx11abi=`cat stamp-cxx11-abi` ;\ + allocatornew=`cat stamp-allocator-new` ;\ ldbl_compat='s,g,g,' ;\ grep "^[ ]*#[ ]*define[ ][ ]*_GLIBCXX_LONG_DOUBLE_COMPAT[ ][ ]*1[ ]*$$" \ ${CONFIG_HEADER} > /dev/null 2>&1 \ @@ -1227,6 +1237,7 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ -e "s,define _GLIBCXX_EXTERN_TEMPLATE$$, define _GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \ -e "s,define _GLIBCXX_USE_DUAL_ABI, define _GLIBCXX_USE_DUAL_ABI $$dualabi," \ -e "s,define _GLIBCXX_USE_CXX11_ABI, define _GLIBCXX_USE_CXX11_ABI $$cxx11abi," \ + -e "s,define _GLIBCXX_USE_ALLOCATOR_NEW, define _GLIBCXX_USE_ALLOCATOR_NEW $$allocatornew," \ -e "$$ldbl_compat" \ < ${glibcxx_srcdir}/include/bits/c++config > $@ ;\ sed -e 's/HAVE_/_GLIBCXX_HAVE_/g' \ diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index f2fb4daeb05..e74fae8b849 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -1631,6 +1631,11 @@ stamp-host: ${host_headers} ${bits_host_headers} ${ext_host_headers} ${host_head @ENABLE_CXX11_ABI_FALSE@stamp-cxx11-abi: @ENABLE_CXX11_ABI_FALSE@ echo 0 > stamp-cxx11-abi +@ENABLE_ALLOCATOR_NEW_TRUE@stamp-allocator-new: +@ENABLE_ALLOCATOR_NEW_TRUE@ echo 1 > stamp-allocator-new +@ENABLE_ALLOCATOR_NEW_FALSE@stamp-allocator-new: +@ENABLE_ALLOCATOR_NEW_FALSE@ echo 0 > stamp-allocator-new + # NB: The non-empty default ldbl_compat works around an AIX sed # oddity, see libstdc++/31957 for details. ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ @@ -1641,13 +1646,15 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ stamp-visibility \ stamp-extern-template \ stamp-dual-abi \ - stamp-cxx11-abi + stamp-cxx11-abi \ + stamp-allocator-new @date=`cat ${toplevel_srcdir}/gcc/DATESTAMP` ;\ ns_version=`cat stamp-namespace-version` ;\ visibility=`cat stamp-visibility` ;\ externtemplate=`cat stamp-extern-template` ;\ dualabi=`cat stamp-dual-abi` ;\ cxx11abi=`cat stamp-cxx11-abi` ;\ + allocatornew=`cat stamp-allocator-new` ;\ ldbl_compat='s,g,g,' ;\ grep "^[ ]*#[ ]*define[ ][ ]*_GLIBCXX_LONG_DOUBLE_COMPAT[ ][ ]*1[ ]*$$" \ ${CONFIG_HEADER} > /dev/null 2>&1 \ @@ -1658,6 +1665,7 @@ ${host_builddir}/c++config.h: ${CONFIG_HEADER} \ -e "s,define _GLIBCXX_EXTERN_TEMPLATE$$, define _GLIBCXX_EXTERN_TEMPLATE $$externtemplate," \ -e "s,define _GLIBCXX_USE_DUAL_ABI, define _GLIBCXX_USE_DUAL_ABI $$dualabi," \ -e "s,define _GLIBCXX_USE_CXX11_ABI, define _GLIBCXX_USE_CXX11_ABI $$cxx11abi," \ + -e "s,define _GLIBCXX_USE_ALLOCATOR_NEW, define _GLIBCXX_USE_ALLOCATOR_NEW $$allocatornew," \ -e "$$ldbl_compat" \ < ${glibcxx_srcdir}/include/bits/c++config > $@ ;\ sed -e 's/HAVE_/_GLIBCXX_HAVE_/g' \ diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index e7460bbed21..374c9851539 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -4902,6 +4902,18 @@ _GLIBCXX_END_NAMESPACE_CXX11 int compare(size_type __pos, size_type __n1, const _CharT* __s, size_type __n2) const; + +# ifdef _GLIBCXX_TM_TS_INTERNAL + friend void + ::_txnal_cow_string_C1_for_exceptions(void* that, const char* s, + void* exc); + friend const char* + ::_txnal_cow_string_c_str(const void *that); + friend void + ::_txnal_cow_string_D1(void *that); + friend void + ::_txnal_cow_string_D1_commit(void *that); +# endif }; #endif // !_GLIBCXX_USE_CXX11_ABI diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 6b13f5c6251..387a7bb57fe 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -481,6 +481,22 @@ namespace std # define _GLIBCXX_BEGIN_EXTERN_C extern "C" { # define _GLIBCXX_END_EXTERN_C } +#define _GLIBCXX_USE_ALLOCATOR_NEW + +// Conditionally enable annotations for the Transactional Memory TS on C++11. +// Most of the following conditions are due to limitations in the current +// implementation. +#if __cplusplus >= 201103L && _GLIBCXX_USE_CXX11_ABI \ + && _GLIBCXX_USE_DUAL_ABI && __cpp_transactional_memory >= 201505L \ + && !_GLIBCXX_FULLY_DYNAMIC_STRING && __GXX_WEAK__ \ + && _GLIBCXX_USE_ALLOCATOR_NEW +#define _GLIBCXX_TXN_SAFE transaction_safe +#define _GLIBCXX_TXN_SAFE_DYN transaction_safe_dynamic +#else +#define _GLIBCXX_TXN_SAFE +#define _GLIBCXX_TXN_SAFE_DYN +#endif + #else // !__cplusplus # define _GLIBCXX_BEGIN_EXTERN_C # define _GLIBCXX_END_EXTERN_C diff --git a/libstdc++-v3/include/bits/uses_allocator.h b/libstdc++-v3/include/bits/uses_allocator.h index 70ba0076a16..b1ff58a294b 100644 --- a/libstdc++-v3/include/bits/uses_allocator.h +++ b/libstdc++-v3/include/bits/uses_allocator.h @@ -85,7 +85,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value, __uses_alloc1<_Alloc>, __uses_alloc2<_Alloc>>::type - { }; + { + static_assert(__or_< + is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>, + is_constructible<_Tp, _Args..., _Alloc>>::value, "construction with" + " an allocator must be possible if uses_allocator is true"); + }; template struct __uses_alloc diff --git a/libstdc++-v3/include/ext/random.tcc b/libstdc++-v3/include/ext/random.tcc index a9c5a2ba4d2..52350e87314 100644 --- a/libstdc++-v3/include/ext/random.tcc +++ b/libstdc++-v3/include/ext/random.tcc @@ -1570,7 +1570,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __t; }); __norm = std::sqrt(__sum); } - while (__norm == _RealType(0) || ! std::isfinite(__norm)); + while (__norm == _RealType(0) || ! __builtin_isfinite(__norm)); std::transform(__ret.begin(), __ret.end(), __ret.begin(), [__norm](_RealType __val){ return __val / __norm; }); diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index 557156a358c..979941072ba 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -1633,13 +1633,13 @@ _GLIBCXX_MEM_FN_TRAITS(&&, false_type, true_type) template static bool - _M_not_empty_function(_Tp* const& __fp) - { return __fp; } + _M_not_empty_function(_Tp* __fp) + { return __fp != nullptr; } template static bool - _M_not_empty_function(_Tp _Class::* const& __mp) - { return __mp; } + _M_not_empty_function(_Tp _Class::* __mp) + { return __mp != nullptr; } template static bool diff --git a/libstdc++-v3/include/std/stdexcept b/libstdc++-v3/include/std/stdexcept index 9983501150a..aef27cc3617 100644 --- a/libstdc++-v3/include/std/stdexcept +++ b/libstdc++-v3/include/std/stdexcept @@ -117,11 +117,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION public: /** Takes a character string describing the error. */ explicit - logic_error(const string& __arg); + logic_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit - logic_error(const char*); + logic_error(const char*) _GLIBCXX_TXN_SAFE; #endif #if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS @@ -129,12 +129,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION logic_error& operator=(const logic_error&) _GLIBCXX_USE_NOEXCEPT; #endif - virtual ~logic_error() _GLIBCXX_USE_NOEXCEPT; + virtual ~logic_error() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; /** Returns a C-style character string describing the general cause of * the current error (the same string passed to the ctor). */ virtual const char* - what() const _GLIBCXX_USE_NOEXCEPT; + what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; + +# ifdef _GLIBCXX_TM_TS_INTERNAL + friend void* + ::_txnal_logic_error_get_msg(void* e); +# endif }; /** Thrown by the library, or by you, to report domain errors (domain in @@ -142,9 +147,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class domain_error : public logic_error { public: - explicit domain_error(const string& __arg); + explicit domain_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L - explicit domain_error(const char*); + explicit domain_error(const char*) _GLIBCXX_TXN_SAFE; #endif virtual ~domain_error() _GLIBCXX_USE_NOEXCEPT; }; @@ -153,9 +158,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class invalid_argument : public logic_error { public: - explicit invalid_argument(const string& __arg); + explicit invalid_argument(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L - explicit invalid_argument(const char*); + explicit invalid_argument(const char*) _GLIBCXX_TXN_SAFE; #endif virtual ~invalid_argument() _GLIBCXX_USE_NOEXCEPT; }; @@ -165,9 +170,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class length_error : public logic_error { public: - explicit length_error(const string& __arg); + explicit length_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L - explicit length_error(const char*); + explicit length_error(const char*) _GLIBCXX_TXN_SAFE; #endif virtual ~length_error() _GLIBCXX_USE_NOEXCEPT; }; @@ -177,9 +182,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class out_of_range : public logic_error { public: - explicit out_of_range(const string& __arg); + explicit out_of_range(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L - explicit out_of_range(const char*); + explicit out_of_range(const char*) _GLIBCXX_TXN_SAFE; #endif virtual ~out_of_range() _GLIBCXX_USE_NOEXCEPT; }; @@ -196,11 +201,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION public: /** Takes a character string describing the error. */ explicit - runtime_error(const string& __arg); + runtime_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L explicit - runtime_error(const char*); + runtime_error(const char*) _GLIBCXX_TXN_SAFE; #endif #if _GLIBCXX_USE_CXX11_ABI || _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS @@ -208,21 +213,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION runtime_error& operator=(const runtime_error&) _GLIBCXX_USE_NOEXCEPT; #endif - virtual ~runtime_error() _GLIBCXX_USE_NOEXCEPT; + virtual ~runtime_error() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; /** Returns a C-style character string describing the general cause of * the current error (the same string passed to the ctor). */ virtual const char* - what() const _GLIBCXX_USE_NOEXCEPT; + what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; + +# ifdef _GLIBCXX_TM_TS_INTERNAL + friend void* + ::_txnal_runtime_error_get_msg(void* e); +# endif }; /** Thrown to indicate range errors in internal computations. */ class range_error : public runtime_error { public: - explicit range_error(const string& __arg); + explicit range_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L - explicit range_error(const char*); + explicit range_error(const char*) _GLIBCXX_TXN_SAFE; #endif virtual ~range_error() _GLIBCXX_USE_NOEXCEPT; }; @@ -231,9 +241,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class overflow_error : public runtime_error { public: - explicit overflow_error(const string& __arg); + explicit overflow_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L - explicit overflow_error(const char*); + explicit overflow_error(const char*) _GLIBCXX_TXN_SAFE; #endif virtual ~overflow_error() _GLIBCXX_USE_NOEXCEPT; }; @@ -242,9 +252,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class underflow_error : public runtime_error { public: - explicit underflow_error(const string& __arg); + explicit underflow_error(const string& __arg) _GLIBCXX_TXN_SAFE; #if __cplusplus >= 201103L - explicit underflow_error(const char*); + explicit underflow_error(const char*) _GLIBCXX_TXN_SAFE; #endif virtual ~underflow_error() _GLIBCXX_USE_NOEXCEPT; }; diff --git a/libstdc++-v3/libsupc++/eh_exception.cc b/libstdc++-v3/libsupc++/eh_exception.cc index cfd835a845e..32f9df73a66 100644 --- a/libstdc++-v3/libsupc++/eh_exception.cc +++ b/libstdc++-v3/libsupc++/eh_exception.cc @@ -26,16 +26,18 @@ #include "exception" #include -std::exception::~exception() _GLIBCXX_USE_NOEXCEPT { } +std::exception::~exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT { } -std::bad_exception::~bad_exception() _GLIBCXX_USE_NOEXCEPT { } +std::bad_exception::~bad_exception() _GLIBCXX_TXN_SAFE_DYN + _GLIBCXX_USE_NOEXCEPT +{ } abi::__forced_unwind::~__forced_unwind() throw() { } abi::__foreign_exception::~__foreign_exception() throw() { } const char* -std::exception::what() const _GLIBCXX_USE_NOEXCEPT +std::exception::what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT { // NB: Another elegant option would be returning typeid(*this).name() // and not overriding what() in bad_exception, bad_alloc, etc. In @@ -44,7 +46,41 @@ std::exception::what() const _GLIBCXX_USE_NOEXCEPT } const char* -std::bad_exception::what() const _GLIBCXX_USE_NOEXCEPT +std::bad_exception::what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT { return "std::bad_exception"; } + +// Transactional clones for the destructors and what(). +// what() is effectively transaction_pure, but we do not want to annotate it +// as such; thus, we call exactly the respective nontransactional function. +extern "C" { + +void +_ZGTtNKSt9exceptionD1Ev(const std::exception*) +{ } + +const char* +_ZGTtNKSt9exception4whatEv(const std::exception* that) +{ + // We really want the non-virtual call here. We already executed the + // indirect call representing the virtual call, and the TM runtime or the + // compiler resolved it to this transactional clone. In the clone, we want + // to do the same as for the nontransactional original, so we just call it. + return that->std::exception::what(); +} + +void +_ZGTtNKSt13bad_exceptionD1Ev( + const std::bad_exception*) +{ } + +const char* +_ZGTtNKSt13bad_exception4whatEv( + const std::bad_exception* that) +{ + // Also see _ZGTtNKSt9exception4whatEv. + return that->std::bad_exception::what(); +} + +} diff --git a/libstdc++-v3/libsupc++/exception b/libstdc++-v3/libsupc++/exception index 01dd9c296db..63631f6d1d1 100644 --- a/libstdc++-v3/libsupc++/exception +++ b/libstdc++-v3/libsupc++/exception @@ -61,11 +61,12 @@ namespace std { public: exception() _GLIBCXX_USE_NOEXCEPT { } - virtual ~exception() _GLIBCXX_USE_NOEXCEPT; + virtual ~exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; /** Returns a C-style character string describing the general cause * of the current error. */ - virtual const char* what() const _GLIBCXX_USE_NOEXCEPT; + virtual const char* + what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; }; /** If an %exception is thrown which is not listed in a function's @@ -77,10 +78,11 @@ namespace std // This declaration is not useless: // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 - virtual ~bad_exception() _GLIBCXX_USE_NOEXCEPT; + virtual ~bad_exception() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; // See comment in eh_exception.cc. - virtual const char* what() const _GLIBCXX_USE_NOEXCEPT; + virtual const char* + what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; }; /// If you write a replacement %terminate handler, it must be of this type. diff --git a/libstdc++-v3/src/c++11/cow-stdexcept.cc b/libstdc++-v3/src/c++11/cow-stdexcept.cc index 782b96c6d4f..eddb36b48c4 100644 --- a/libstdc++-v3/src/c++11/cow-stdexcept.cc +++ b/libstdc++-v3/src/c++11/cow-stdexcept.cc @@ -26,6 +26,21 @@ // ISO C++ 14882: 19.1 Exception classes // +// Enable hooks for support for the Transactional Memory TS (N4514). +#define _GLIBCXX_TM_TS_INTERNAL +void +_txnal_cow_string_C1_for_exceptions(void* that, const char* s, void* exc); +const char* +_txnal_cow_string_c_str(const void* that); +void +_txnal_cow_string_D1(void* that); +void +_txnal_cow_string_D1_commit(void* that); +void* +_txnal_logic_error_get_msg(void* e); +void* +_txnal_runtime_error_get_msg(void* e); + // All exception classes still use the classic COW std::string. #define _GLIBCXX_USE_CXX11_ABI 0 #define _GLIBCXX_DEFINE_STDEXCEPT_COPY_OPS 1 @@ -151,3 +166,278 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace + +// Support for the Transactional Memory TS (N4514). +// +// logic_error and runtime_error both carry a message in the form of a COW +// string. This COW string is never made visible to users of the exception +// because what() returns a C string. The COW string can be constructed as +// either a copy of a COW string of another logic_error/runtime_error, or +// using a C string or SSO string; thus, the COW string's _Rep is only +// accessed by logic_error operations. We control all txnal clones of those +// operations and thus can ensure that _Rep is never accessed transactionally. +// Furthermore, _Rep will always have been allocated or deallocated via +// global new or delete, so nontransactional writes we do to _Rep cannot +// interfere with transactional accesses. +extern "C" { + +#ifndef _GLIBCXX_MANGLE_SIZE_T +#error Mangled name of size_t type not defined. +#endif +#define CONCAT1(x,y) x##y +#define CONCAT(x,y) CONCAT1(x,y) +#define _ZGTtnaX CONCAT(_ZGTtna,_GLIBCXX_MANGLE_SIZE_T) + +#ifdef __i386__ +/* Only for 32-bit x86. */ +# define ITM_REGPARM __attribute__((regparm(2))) +#else +# define ITM_REGPARM +#endif + +#if __GXX_WEAK__ +// Declare all libitm symbols we rely on, but make them weak so that we do +// not depend on libitm. +extern void* _ZGTtnaX (size_t sz) __attribute__((weak)); +extern void _ZGTtdlPv (void* ptr) __attribute__((weak)); +extern uint8_t _ITM_RU1(const uint8_t *p) + ITM_REGPARM __attribute__((weak)); +extern uint32_t _ITM_RU4(const uint32_t *p) + ITM_REGPARM __attribute__((weak)); +extern uint64_t _ITM_RU8(const uint64_t *p) + ITM_REGPARM __attribute__((weak)); +extern void _ITM_memcpyRtWn(void *, const void *, size_t) + ITM_REGPARM __attribute__((weak)); +extern void _ITM_memcpyRnWt(void *, const void *, size_t) + ITM_REGPARM __attribute__((weak)); +extern void _ITM_addUserCommitAction(void (*)(void *), uint64_t, void *) + ITM_REGPARM __attribute__((weak)); + +#else +// If there is no support for weak symbols, create dummies. The exceptions +// will not be declared transaction_safe in this case. +void* _ZGTtnaX (size_t) { return NULL; } +void _ZGTtdlPv (void*) { } +uint8_t _ITM_RU1(const uint8_t *) { return 0; } +uint32_t _ITM_RU4(const uint32_t *) { return 0; } +uint64_t _ITM_RU8(const uint64_t *) { return 0; } +void _ITM_memcpyRtWn(void *, const void *, size_t) { } +void _ITM_memcpyRnWt(void *, const void *, size_t) { } +void _ITM_addUserCommitAction(void (*)(void *), uint64_t, void *) { }; +#endif + +} + +// A transactional version of basic_string::basic_string(const char *s) +// that also notifies the TM runtime about allocations belonging to this +// exception. +void +_txnal_cow_string_C1_for_exceptions(void* that, const char* s, + void *exc __attribute__((unused))) +{ + typedef std::basic_string bs_type; + bs_type *bs = (bs_type*) that; + + // First, do a transactional strlen, but including the trailing zero. + bs_type::size_type len = 1; + for (const char *ss = s; _ITM_RU1((const uint8_t*) ss) != 0; ss++, len++); + + + // Allocate memory for the string and the refcount. We use the + // transactional clone of global new[]; if this throws, it will do so in a + // transaction-compatible way. + // The allocation belongs to this exception, so tell the runtime about it. + // TODO Once this is supported, link the following allocation to this + // exception: void *prev = _ITM_setAssociatedException(exc); + bs_type::_Rep *rep; + __try + { + rep = (bs_type::_Rep*) _ZGTtnaX (len + sizeof (bs_type::_Rep)); + } + __catch (...) + { + // Pop the association with this exception. + // TODO Once this is supported, link the following allocation to this + // exception: _ITM_setAssociatedException(prev); + // We do not need to instrument a rethrow. + __throw_exception_again; + } + // Pop the association with this exception. + // TODO Once this is supported, link the following allocation to this + // exception: _ITM_setAssociatedException(prev); + + // Now initialize the rest of the string and copy the C string. The memory + // will be freshly allocated, so nontransactional accesses are sufficient, + // including the writes when copying the string (see above). + rep->_M_set_sharable(); + rep->_M_length = rep->_M_capacity = len - 1; + _ITM_memcpyRtWn(rep->_M_refdata(), s, len); + new (&bs->_M_dataplus) bs_type::_Alloc_hider(rep->_M_refdata(), + bs_type::allocator_type()); +} + +static void* txnal_read_ptr(void* const * ptr) +{ + static_assert(sizeof(uint64_t) == sizeof(void*) + || sizeof(uint32_t) == sizeof(void*), + "Pointers must be 32 bits or 64 bits wide"); +#if __UINTPTR_MAX__ == __UINT64_MAX__ + return (void*)_ITM_RU8((const uint64_t*)ptr); +#else + return (void*)_ITM_RU4((const uint32_t*)ptr); +#endif +} + +// We must access the data pointer in the COW string transactionally because +// another transaction can delete the string and reuse the memory. +const char* +_txnal_cow_string_c_str(const void* that) +{ + typedef std::basic_string bs_type; + const bs_type *bs = (const bs_type*) that; + + return (const char*) txnal_read_ptr((void**)&bs->_M_dataplus._M_p); +} + +const char* +_txnal_sso_string_c_str(const void* that) +{ + return (const char*) txnal_read_ptr( + (void* const*)const_cast( + &((const std::__sso_string*) that)->_M_s._M_p)); +} + +void +_txnal_cow_string_D1_commit(void* data) +{ + typedef std::basic_string bs_type; + bs_type::_Rep *rep = (bs_type::_Rep*) data; + rep->_M_dispose(bs_type::allocator_type()); +} + +void +_txnal_cow_string_D1(void* that) +{ + typedef std::basic_string bs_type; + bs_type::_Rep *rep = reinterpret_cast( + const_cast(_txnal_cow_string_c_str(that))) - 1; + + // The string can be shared, in which case we would need to decrement the + // reference count. We cannot undo that because we might lose the string + // otherwise. Therefore, we register a commit action that will dispose of + // the string's _Rep. + enum {_ITM_noTransactionId = 1}; + _ITM_addUserCommitAction(_txnal_cow_string_D1_commit, _ITM_noTransactionId, + rep); +} + +void* +_txnal_logic_error_get_msg(void* e) +{ + std::logic_error* le = (std::logic_error*) e; + return &le->_M_msg; +} + +void* +_txnal_runtime_error_get_msg(void* e) +{ + std::runtime_error* le = (std::runtime_error*) e; + return &le->_M_msg; +} + +// The constructors are only declared transaction-safe if the C++11 ABI is +// used for std::string and the exception classes use a COW string internally. +// A user must not call these constructors otherwise; if they do, it will +// result in undefined behavior, which is in this case not initializing this +// string. +#if _GLIBCXX_USE_DUAL_ABI +#define CTORDTORSTRINGCSTR(s) _txnal_sso_string_c_str((s)) +#else +#define CTORDTORSTRINGCSTR(s) "" +#endif + +// This macro defines transaction constructors and destructors for a specific +// exception class. NAME is the variable part of the mangled name, CLASS is +// the class name, and BASE must be logic_error or runtime_error (which is +// then used to call the proper friend function that can return a pointer to +// the _M_msg member declared by the given (base) class). +#define CTORDTOR(NAME, CLASS, BASE) \ +void \ +_ZGTtNSt##NAME##C1EPKc (CLASS* that, const char* s) \ +{ \ + /* This will use the singleton _Rep for an empty string and just \ + point to it instead of allocating memory. Thus, we can use it as \ + source, copy it into the object we are constructing, and then \ + construct the COW string in the latter manually. Note that the \ + exception classes will not be declared transaction_safe if the \ + shared empty _Rep is disabled with --enable-fully-dynamic-string \ + (in which case _GLIBCXX_FULLY_DYNAMIC_STRING is nonzero). */ \ + CLASS e(""); \ + _ITM_memcpyRnWt(that, &e, sizeof(CLASS)); \ + _txnal_cow_string_C1_for_exceptions(_txnal_##BASE##_get_msg(that), \ + s, that); \ +} \ +void \ +_ZGTtNSt##NAME##C2EPKc (CLASS*, const char*) \ + __attribute__((alias ("_ZGTtNSt" #NAME "C1EPKc"))); \ +void \ +_ZGTtNSt##NAME##C1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE( \ + CLASS* that, const std::__sso_string& s) \ +{ \ + CLASS e(""); \ + _ITM_memcpyRnWt(that, &e, sizeof(CLASS)); \ + /* Get the C string from the SSO string. */ \ + _txnal_cow_string_C1_for_exceptions(_txnal_##BASE##_get_msg(that), \ + CTORDTORSTRINGCSTR(&s), that); \ +} \ +void \ +_ZGTtNSt##NAME##C2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE( \ + CLASS*, const std::__sso_string&) __attribute__((alias \ +("_ZGTtNSt" #NAME \ + "C1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"))); \ +void \ +_ZGTtNSt##NAME##D1Ev(CLASS* that) \ +{ _txnal_cow_string_D1(_txnal_##BASE##_get_msg(that)); } \ +void \ +_ZGTtNSt##NAME##D2Ev(CLASS*) \ +__attribute__((alias ("_ZGTtNSt" #NAME "D1Ev"))); \ +void \ +_ZGTtNSt##NAME##D0Ev(CLASS* that) \ +{ \ + _ZGTtNSt##NAME##D1Ev(that); \ + _ZGTtdlPv(that); \ +} + +// Now create all transactional constructors and destructors, as well as the +// two virtual what() functions. +extern "C" { + +CTORDTOR(11logic_error, std::logic_error, logic_error) + +const char* +_ZGTtNKSt11logic_error4whatEv(const std::logic_error* that) +{ + return _txnal_cow_string_c_str(_txnal_logic_error_get_msg( + const_cast(that))); +} + +CTORDTOR(12domain_error, std::domain_error, logic_error) +CTORDTOR(16invalid_argument, std::invalid_argument, logic_error) +CTORDTOR(12length_error, std::length_error, logic_error) +CTORDTOR(12out_of_range, std::out_of_range, logic_error) + + +CTORDTOR(13runtime_error, std::runtime_error, runtime_error) + +const char* +_ZGTtNKSt13runtime_error4whatEv(const std::runtime_error* that) +{ + return _txnal_cow_string_c_str(_txnal_runtime_error_get_msg( + const_cast(that))); +} + +CTORDTOR(11range_error, std::range_error, runtime_error) +CTORDTOR(14overflow_error, std::overflow_error, runtime_error) +CTORDTOR(15underflow_error, std::underflow_error, runtime_error) + +} diff --git a/libstdc++-v3/testsuite/20_util/function/cons/57465.cc b/libstdc++-v3/testsuite/20_util/function/cons/57465.cc index be2d13272a5..7b13d4b285b 100644 --- a/libstdc++-v3/testsuite/20_util/function/cons/57465.cc +++ b/libstdc++-v3/testsuite/20_util/function/cons/57465.cc @@ -15,17 +15,33 @@ // with this library; see the file COPYING3. If not see // . -// libstdc++/57465 - // { dg-options "-std=gnu++11" } #include #include -int main() +void test01() { using F = void(); F* f = nullptr; std::function x(f); - VERIFY( !x ); + VERIFY( !x ); // libstdc++/57465 +} + +void test02() +{ + struct X { }; + int (X::*mf)() = nullptr; + std::function f = mf; + VERIFY( !f ); // libstdc++/69243 + + int X::*mp = nullptr; + f = mp; + VERIFY( !f ); +} + +int main() +{ + test01(); + test02(); } diff --git a/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc b/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc new file mode 100644 index 00000000000..f3b2d87ab99 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc @@ -0,0 +1,51 @@ +// Copyright (C) 2016 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// PR libstdc++/69293 + +#include +#include + +using std::allocator; +using std::allocator_arg_t; +using std::uses_allocator; +using std::scoped_allocator_adaptor; +using std::is_constructible; + +struct X +{ + using allocator_type = allocator; +}; + +using scoped_alloc = scoped_allocator_adaptor, X::allocator_type>; +using inner_alloc_type = scoped_alloc::inner_allocator_type; + +static_assert(uses_allocator{}, ""); +static_assert(!is_constructible{}, ""); +static_assert(!is_constructible{}, ""); + +void +test01() +{ + scoped_alloc sa; + auto p = sa.allocate(1); + sa.construct(p); // this is required to be ill-formed + // { dg-error "static assertion failed" "" { target *-*-* } 89 } +} diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc new file mode 100644 index 00000000000..19417fc2cef --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc @@ -0,0 +1,49 @@ +// Copyright (C) 2016 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// PR libstdc++/69293 + +#include +#include + +using std::allocator; +using std::allocator_arg_t; +using std::uses_allocator; +using std::tuple; +using std::is_constructible; + +struct X +{ + using allocator_type = allocator; +}; + +using alloc_type = X::allocator_type; + +static_assert(uses_allocator{}, ""); +static_assert(!is_constructible{}, ""); +static_assert(!is_constructible{}, ""); + +void +test01() +{ + alloc_type a; + std::tuple t(std::allocator_arg, a); // this is required to be ill-formed + // { dg-error "static assertion failed" "" { target *-*-* } 89 } +} diff --git a/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc b/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc index 00f96d684b8..b3df4ae9d7d 100644 --- a/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc +++ b/libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc @@ -44,4 +44,4 @@ void test01() tuple t(allocator_arg, a, 1); } -// { dg-error "no matching function" "" { target *-*-* } 92 } +// { dg-error "static assertion failed" "" { target *-*-* } 89 } diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cmath/60637.cc b/libstdc++-v3/testsuite/26_numerics/headers/cmath/60637.cc new file mode 100644 index 00000000000..16a78963e6c --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/headers/cmath/60637.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2016 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++98 -ffast-math" } +// { dg-do run { target i?86-*-* x86_64-*-* } } + +#include +#include + +void +test01() +{ + long double ld = -5.3165867831218916301793863361917824e-2467L; + VERIFY( std::signbit(ld) == 1 ); +} + +int +main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/util/testsuite_abi.cc b/libstdc++-v3/testsuite/util/testsuite_abi.cc index bb7ef6d9ce0..caf154400f9 100644 --- a/libstdc++-v3/testsuite/util/testsuite_abi.cc +++ b/libstdc++-v3/testsuite/util/testsuite_abi.cc @@ -214,6 +214,7 @@ check_version(symbol& test, bool added) known_versions.push_back("CXXABI_1.3.7"); known_versions.push_back("CXXABI_1.3.8"); known_versions.push_back("CXXABI_1.3.9"); + known_versions.push_back("CXXABI_1.3.10"); known_versions.push_back("CXXABI_TM_1"); known_versions.push_back("CXXABI_FLOAT128"); } @@ -232,7 +233,7 @@ check_version(symbol& test, bool added) // Check that added symbols are added in the latest pre-release version. bool latestp = (test.version_name == "GLIBCXX_3.4.22" - || test.version_name == "CXXABI_1.3.9" + || test.version_name == "CXXABI_1.3.10" || test.version_name == "CXXABI_FLOAT128" || test.version_name == "CXXABI_TM_1"); if (added && !latestp) -- cgit v1.2.3