Piotr Trojanek [Thu, 5 Nov 2020 20:09:28 +0000 (21:09 +0100)]
[Ada] Restore access type instead of mode out parameter
gcc/ada/
* sem_eval.ads (Compile_Time_Compare): Restore parameter Diff to
be of an access type.
* sem_eval.adb (Compile_Time_Compare): Adapt body and callers.
* sem_attr.adb (Eval_Attribute): Adapt callers.
Eric Botcazou [Thu, 5 Nov 2020 12:28:16 +0000 (13:28 +0100)]
[Ada] Small improvement to System.Value_R.Scan_Raw_Real
gcc/ada/
* libgnat/s-valuer.adb (Scan_Decimal_Digits): Round Extra.
(Scan_Integral_Digits): Likewise.
Yannick Moy [Wed, 4 Nov 2020 15:11:51 +0000 (16:11 +0100)]
[Ada] Do not apply range checks inside generics in GNATprove mode
gcc/ada/
* checks.adb (Selected_Range_Checks): Adapt the condition for
applying range checks so that it is not done inside generics.
Eric Botcazou [Wed, 4 Nov 2020 16:27:17 +0000 (17:27 +0100)]
[Ada] Do not use 128-bit division for 64-bit fixed-point types
gcc/ada/
* exp_fixd.adb (Build_Double_Divide): Only use a 128-bit
division if one of the operands is larger than 64 bits.
(Build_Double_Divide_Code): Likewise.
(Build_Scaled_Divide): Likewise.
(Build_Scaled_Divide_Code): Likewise.
Arnaud Charlet [Wed, 4 Nov 2020 13:58:47 +0000 (08:58 -0500)]
[Ada] To_GM_Time returning invalid value for Invalid_Time
gcc/ada/
* libgnat/s-os_lib.adb (To_GM_Time): Return valid and consistent
values for Invalid_Time.
Steve Baird [Wed, 21 Oct 2020 23:57:04 +0000 (16:57 -0700)]
[Ada] Implement AI12-0187 (Stable properties of abstract data types)
gcc/ada/
* snames.ads-tmpl: Define new Name_Stable_Properties Name_Id
value.
* aspects.ads, aspects.adb: Add new Aspect_Stable_Properties
enumeration literal to Aspect_Id type. Add Class_Present
parameter to Find_Aspect and related
functions (Find_Value_Of_Aspect and Has_Aspect).
* sem_util.adb (Has_Nontrivial_Precondition): Fix
previously-latent bug uncovered by adding Class_Present
parameter to Aspect.Find_Aspect. The code was wrong before, but
with the change the bug was more likely to make a user-visible
difference.
* sem_ch6.adb (Analyze_Operator_Symbol): If a string literal
like "abs" or "-" occurs in a Stable_Properties aspect
specification, then it is to be interpreted as an operator
symbol and not as a string literal.
* sem_ch13.ads: Export new Parse_Aspect_Stable_Properties
function, analogous to the existing Parse_Aspect_Aggregate
exported procedure.
* sem_ch13.adb: (Parse_Aspect_Stable_Properties): New function;
analogous to existing Parse_Aspect_Aggregate.
(Validate_Aspect_Stable_Properties): New procedure; analogous to
existing Validate_Aspect_Aggregate. Called from the same case
statement (casing on an Aspect_Id value) where
Validate_Aspect_Aggregate is called.
(Resolve_Aspect_Stable_Properties): New procedure; analogous to
existing Resolve_Aspect_Aggregate. Called from the same two case
statements (each casing on an Aspect_Id value) where
Resolve_Aspect_Aggregate is called.
(Analyze_Aspect_Specifications): Set Has_Delayed_Aspects and
Is_Delayed_Aspect attributes for Aspect_Stable_Properties aspect
specifications.
(Check_Aspect_At_End_Of_Declarations): The syntactic
"expression" for a Stable_Properties aspect specification is not
semantically an expression; it doesn't have a type. Thus, force
T to be empty in this case.
* contracts.adb (Expand_Subprogram_Contract): Add call to new
local procedure,
Expand_Subprogram_Contract.Add_Stable_Property_Contracts, which
generates Postcondition pragmas corresponding to stable property
checks.
Piotr Trojanek [Tue, 3 Nov 2020 19:44:03 +0000 (20:44 +0100)]
[Ada] Default_Initial_Condition assertion policy is now RM defined
gcc/ada/
* doc/gnat_rm/implementation_defined_pragmas.rst:
(Assertion_Policy): Move "Default_Initial_Condition" from
ID_ASSERTION_KIND to RM_ASSERTION_KIND section.
* gnat_rm.texi: Regenerate.
Piotr Trojanek [Tue, 3 Nov 2020 18:43:07 +0000 (19:43 +0100)]
[Ada] Sync doc and code for pragma Assertion_Policy
gcc/ada/
* doc/gnat_rm/implementation_defined_pragmas.rst
(Assertion_Policy): Add "Default_Initial_Condition",
"Initial_Condition" and "Subprogram_Variant".
* gnat_rm.texi: Regenerate.
Piotr Trojanek [Tue, 3 Nov 2020 18:34:17 +0000 (19:34 +0100)]
[Ada] Assertion_Policy is not a valid assertion policy
gcc/ada/
* sem_prag.adb (Is_Valid_Assertion_Kind): Return False on
"Assertion_Policy"
Eric Botcazou [Wed, 4 Nov 2020 13:11:41 +0000 (14:11 +0100)]
[Ada] Do not compile predefined units with -gnatp in gnatmake
gcc/ada/
* make.adb (GNAT_Flag): Change to "-gnatg".
(Compile): Adjust comments accordingly.
Piotr Trojanek [Tue, 3 Nov 2020 23:59:00 +0000 (00:59 +0100)]
[Ada] Restore general case for folding comparison of static strings
gcc/ada/
* exp_ch4.adb (Rewrite_Comparison): Add assertion to confirm
that evaluation folds comparisons with static operands; when
folding comparison with non-static operands, the resulting
literal is non-static.
* sem_eval.adb (Eval_Relational_Op): Refactor nested IF
statement for the special case in the THEN branch; move code for
the "general case" out of the ELSE branch.
* sem_res.adb (Resolve_Comparison_Op): Only apply a dubious
special-case for GNATprove in the GNATprove_Mode.
Piotr Trojanek [Tue, 3 Nov 2020 21:59:35 +0000 (22:59 +0100)]
[Ada] Change parameter from access type to mode out
gcc/ada/
* sem_eval.ads (Compile_Time_Compare): Change parameter Diff
from access to mode out.
* sem_eval.adb (Compile_Time_Compare): Adapt body and callers.
* sem_attr.adb (Eval_Attribute): Adapt callers.
Eric Botcazou [Tue, 3 Nov 2020 16:17:21 +0000 (17:17 +0100)]
[Ada] Move down call to Narrow_Large_Operation in Expand_N_Op_Multiply
gcc/ada/
* exp_ch4.adb (Expand_N_Op_Multiply): Move down block calling
Narrow_Large_Operation if the type is Universal_Integer.
Eric Botcazou [Tue, 3 Nov 2020 10:50:40 +0000 (11:50 +0100)]
[Ada] Reimplement Ada.Numerics.Big_Numbers.Big_Reals.Float_Conversions
gcc/ada/
* libgnat/a-nbnbre.adb: Remove clauses for System.Img_Real and
add them for System.Unsigned_Types.
(Float_Conversions.To_Big_Real): Reimplement.
(Float_Conversions.From_Big_Real): Likewise.
Eric Botcazou [Mon, 2 Nov 2020 21:54:01 +0000 (22:54 +0100)]
[Ada] Optimize generation of checks for fixed-point types
gcc/ada/
* checks.ads (Determine_Range_To_Discrete): New procedure.
* checks.adb (Apply_Scalar_Range_Check): Call it to determine
a range for the expression when the target type is discrete.
And also apply the tests for discrete types to fixed-point
types when they are treated as integers.
(Apply_Type_Conversion_Checks): Apply checks to conversions
involving fixed-point types when they are treated as integers.
(Determine_Range) <N_Type_Conversion>: Factor out code into...
(Determine_Range_To_Discrete): ...this new procedure and add
support for fixed-point types when they are treated as integers.
* einfo.ads (Type_High_Bound): Remove obsolete sentence.
(Type_Low_Bound): Likewise.
* exp_ch4.adb (Discrete_Range_Check): Remove obsolete code.
(Real_Range_Check): Likewise.
(Expand_N_Type_Conversion): In case of a no-op conversion, clear
the Do_Range_Check flag on the operand before substituting it.
Remove calls to Real_Range_Check and Discrete_Range_Check that
are not guarded by the Do_Range_Check flag, and an assertion.
* sem_res.adb (Resolve_Type_Conversion): Always apply range
checks in GNATprove mode; in normal mode, use the updated type
of the operand in the test against Universal_Fixed. Remove
obsolete code setting the Do_Range_Check flag at the end.
Piotr Trojanek [Tue, 3 Nov 2020 08:39:10 +0000 (09:39 +0100)]
[Ada] Simplify check for illegal non-returning procedures
gcc/ada/
* sem_prag.adb (Analyze_Pragma): Change "Ref Manual" to RM;
replace uses of an unnecessary "Ok" variable with RETURN
statements; replace nested IF with ELSIF.
Arnaud Charlet [Mon, 2 Nov 2020 10:02:00 +0000 (05:02 -0500)]
[Ada] Abort defer mismatch with SJLJ exceptions
gcc/ada/
* libgnarl/s-tasren.adb (Local_Complete_Rendezvous): Always call
Defer_Abort.
* libgnat/a-except.adb: Abort does not need to be deferred.
* libgnarl/s-tpobop.adb (Exceptional_Complete_Entry_Body): Abort
never needs to be undeferred here.
* exp_ch11.adb (Expand_Exception_Handlers): Remove difference
between ZCX and SJLJ.
* exp_ch9.adb (Expand_N_Asynchronous_Select): Remove different
handling for sjlj.
* exp_sel.ads, exp_sel.adb (Build_Abort_Block,
Build_Abort_Block_Handler): Ditto.
Ghjuvan Lacambre [Wed, 28 Oct 2020 10:03:16 +0000 (11:03 +0100)]
[Ada] Emit error messages for null/generic nonreturning procedures
gcc/ada/
* sem_prag.adb (Analyze_Pragma): declare new Check_No_Return
function and call it.
Arnaud Charlet [Mon, 2 Nov 2020 11:21:45 +0000 (06:21 -0500)]
[Ada] Fix tree for expanded instantiations corresponding to formal packages
gcc/ada/
* sem_ch12.adb (Instantiate_Object): Consistently use
New_Copy_Tree instead of New_Copy.
Eric Botcazou [Sun, 1 Nov 2020 13:32:06 +0000 (14:32 +0100)]
[Ada] Adjust head comment of various subprograms in Exp_Fixd
gcc/ada/
* exp_fixd.adb (Build_Conversion): Adjust head comment.
(Build_Divide): Likewise.
(Build_Double_Divide): Likewise.
(Build_Multiply): Likewise.
(Build_Rem): Likewise.
(Build_Scaled_Divide): Likewise.
Arnaud Charlet [Fri, 30 Oct 2020 15:29:00 +0000 (11:29 -0400)]
[Ada] To_Big_Integer and 128bits integers
gcc/ada/
* libgnat/s-genbig.ads, libgnat/s-genbig.adb (To_Bignum): New
variant taking an Unsigned_128.
* libgnat/a-nbnbin.adb (To_Big_Integer): Add support for 128
bits signed and unsigned types.
Eric Botcazou [Sat, 31 Oct 2020 23:15:52 +0000 (00:15 +0100)]
[Ada] Small tweaks to new implementation of Set_Image_Fixed
gcc/ada/
* libgnat/s-imagef.adb (Set_Image_Fixed): Pass the full value
of the quotient to Set_Image_Integer during the first round and
adjust the handling of the minus sign.
Arnaud Charlet [Fri, 30 Oct 2020 15:17:29 +0000 (11:17 -0400)]
[Ada] Error in Big_Real comparison
gcc/ada/
* libgnat/a-nbnbre.adb ("=", "<"): Fix.
Eric Botcazou [Sat, 31 Oct 2020 13:03:04 +0000 (14:03 +0100)]
[Ada] Fix oversignt in genericized package System.Value_R
gcc/ada/
* libgnat/s-valuer.adb (Scan_Raw_Real): Move pragma Annotate around
and adjust its parameters.
Eric Botcazou [Sat, 31 Oct 2020 11:41:18 +0000 (12:41 +0100)]
[Ada] Optimize magnitude of integer operations for fixed point
gcc/ada/
* exp_fixd.adb (Build_Double_Divide): Use the RM size of types and
a more precise estimate for the size of the denominator.
(Build_Double_Divide_Code): Likewise.
(Build_Multiply): Use a more precise estimate for the size of the
result.
(Build_Scaled_Divide): Use the RM size of types and a more precise
estimate for the size of the numerator.
(Build_Scaled_Divide_Code): Likewise.
Xionghu Luo [Fri, 27 Nov 2020 05:38:33 +0000 (23:38 -0600)]
rs6000: Change rs6000_expand_vector_set param
rs6000_expand_vector_set could accept insert either to constant position
or variable position, so change the operand to reg_or_cint_operand.
gcc/ChangeLog:
2020-11-27 Xionghu Luo <luoxhu@linux.ibm.com>
* config/rs6000/rs6000-call.c (altivec_expand_vec_set_builtin):
Change call param 2 from type int to rtx.
* config/rs6000/rs6000-protos.h (rs6000_expand_vector_set):
Likewise.
* config/rs6000/rs6000.c (rs6000_expand_vector_init):
Change call param 2 from type int to rtx.
(rs6000_expand_vector_set): Likewise.
* config/rs6000/vector.md (vec_set<mode>): Support both constant
and variable index vec_set.
Haochen Gui [Thu, 26 Nov 2020 06:23:45 +0000 (14:23 +0800)]
This patch adds absolute jump table support for rs6000.
gcc/ChangeLog:
* config/rs6000/rs6000-protos.h (rs6000_output_addr_vec_elt): Declare.
* config/rs6000/rs6000.c (TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC):
Define.
(rs6000_gen_pic_addr_diff_vec, rs6000_output_addr_vec_elt): Implement.
* config/rs6000/rs6000.h (CASE_VECTOR_PC_RELATIVE,
CASE_VECTOR_MODE, ASM_OUTPUT_ADDR_VEC_ELT): Define.
* config/rs6000/rs6000.md (tablejump<mode>_absolute,
tablejump<mode>_absolute_nospec): New expanders.
* config/rs6000/rs6000.opt (mrelative-jumptables): New.
GCC Administrator [Fri, 27 Nov 2020 00:16:31 +0000 (00:16 +0000)]
Daily bump.
Jonathan Wakely [Thu, 26 Nov 2020 22:23:11 +0000 (22:23 +0000)]
libstdc++: Define (and use) _GLIBCXX_HAVE_ATOMIC_WAIT
In order to simplify the preprocessor checks for whether __atomic_wait
is available, this commit does:
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
The original was wrong anyway, as it should have used 'defined' to check
_GLIBCXX_HAVE_LINUX_FUTEX (for consistency with how that's used
elsewhere).
The new macro is defined in <bits/atomic_wait.h> when the file is
defines __atomic_wait and related facilities. All other code that
depends on those features can just check the one macro.
libstdc++-v3/ChangeLog:
* include/bits/atomic_wait.h (_GLIBCXX_HAVE_ATOMIC_WAIT):
Define.
* include/bits/atomic_base.h: Check _GLIBCXX_HAVE_ATOMIC_WAIT.
* include/bits/atomic_timed_wait.h: Likewise.
* include/bits/semaphore_base.h: Likewise.
* include/std/atomic: Likewise.
* include/std/latch: Likewise.
* include/std/semaphore: Likewise.
Jonathan Wakely [Thu, 26 Nov 2020 21:54:46 +0000 (21:54 +0000)]
libstdc++: Only define std::latch if atomic waiting is available
libstdc++-v3/ChangeLog:
* include/std/latch: Depend on _GLIBCXX_HAS_GTHREADS and
_GLIBCXX_HAVE_LINUX_FUTEX.
* include/std/version (__cpp_lib_latch): Define conditionally.
Jonathan Wakely [Thu, 26 Nov 2020 21:41:15 +0000 (21:41 +0000)]
libstc++: Fix typo in new check_effective_target_gthreads proc
Also fix copy&pasted comments referring to the wrong things.
libstdc++-v3/ChangeLog:
* testsuite/lib/libstdc++.exp (check_effective_target_gthreads):
Call check_v3_target_gthreads not check_v3_target_gthreads_timed.
Maciej W. Rozycki [Thu, 26 Nov 2020 17:26:43 +0000 (17:26 +0000)]
libgfortran: Verify the presence of all functions for POSIX 2008 locale
While we have `configure' checks for the individual POSIX 2008 extended
locale functions we refer to and use to guard the respective call sites,
we only verify the presence of `newlocale' for our global feature enable
check. Consequently compilation fails for targets like NetBSD that only
have partial support for POSIX 2008 locale features and in particular
lack the `uselocale' function:
.../libgfortran/io/transfer.c: In function 'data_transfer_init_worker':
.../libgfortran/io/transfer.c:3416:30: error:
'old_locale_lock' undeclared (first use in this function)
3416 | __gthread_mutex_lock (&old_locale_lock);
| ^~~~~~~~~~~~~~~
.../libgfortran/io/transfer.c:3416:30: note: each undeclared identifier is reported only once for each function it appears in
.../libgfortran/io/transfer.c:3417:12: error:
'old_locale_ctr' undeclared (first use in this function)
3417 | if (!old_locale_ctr++)
| ^~~~~~~~~~~~~~
.../libgfortran/io/transfer.c:3419:11: error:
'old_locale' undeclared (first use in this function); did you mean 'c_locale'?
3419 | old_locale = setlocale (LC_NUMERIC, NULL);
| ^~~~~~~~~~
| c_locale
.../libgfortran/io/transfer.c: In function 'finalize_transfer':
.../libgfortran/io/transfer.c:4253:26: error:
'old_locale_lock' undeclared (first use in this function)
4253 | __gthread_mutex_lock (&old_locale_lock);
| ^~~~~~~~~~~~~~~
.../libgfortran/io/transfer.c:4254:10: error:
'old_locale_ctr' undeclared (first use in this function)
4254 | if (!--old_locale_ctr)
| ^~~~~~~~~~~~~~
.../libgfortran/io/transfer.c:4256:30: error:
'old_locale' undeclared (first use in this function); did you mean 'c_locale'?
4256 | setlocale (LC_NUMERIC, old_locale);
| ^~~~~~~~~~
| c_locale
make[3]: *** [Makefile:6221: transfer.lo] Error 1
Only enable the use of POSIX 2008 extended locale features then when all
the three functions required are present, removing said build errors.
libgfortran/
* io/io.h [HAVE_NEWLOCALE]: Also check for HAVE_FREELOCALE and
HAVE_USELOCALE.
[HAVE_FREELOCALE && HAVE_NEWLOCALE && HAVE_USELOCALE]
(HAVE_POSIX_2008_LOCALE): New macro.
(st_parameter_dt) [HAVE_NEWLOCALE]: Check for
HAVE_POSIX_2008_LOCALE instead.
* io/transfer.c (data_transfer_init_worker, finalize_transfer)
[HAVE_USELOCALE]: Check for HAVE_POSIX_2008_LOCALE instead.
* io/unit.c [HAVE_NEWLOCALE]: Likewise.
(init_units) [HAVE_NEWLOCALE]: Likewise.
(close_units) [HAVE_FREELOCALE]: Likewise.
* runtime/error.c (gf_strerror) [HAVE_USELOCALE]: Likewise.
Maciej W. Rozycki [Thu, 26 Nov 2020 17:26:43 +0000 (17:26 +0000)]
libgfortran: Correct FP feature macro checks
The *_HAS_* floating-point feature macros are defined as 0/1 rather than
#undef/#define settings by gcc/c-family/c-cppbuiltin.c. Consequently we
choose to use infinity and NaN features even with non-IEEE-754 targets
such as `vax-netbsdelf' that lack them, causing build warnings and
failures like:
In file included from .../libgfortran/generated/maxval_r4.c:26:
.../libgfortran/generated/maxval_r4.c: In function 'maxval_r4':
.../libgfortran/libgfortran.h:292:30: warning: target format does not support infinity
292 | # define GFC_REAL_4_INFINITY __builtin_inff ()
| ^~~~~~~~~~~~~~
.../libgfortran/generated/maxval_r4.c:149:19:
note: in expansion of macro 'GFC_REAL_4_INFINITY'
149 | result = -GFC_REAL_4_INFINITY;
| ^~~~~~~~~~~~~~~~~~~
.../libgfortran/generated/maxval_r4.c: In function 'mmaxval_r4':
.../libgfortran/libgfortran.h:292:30: warning: target format does not support infinity
292 | # define GFC_REAL_4_INFINITY __builtin_inff ()
| ^~~~~~~~~~~~~~
.../libgfortran/generated/maxval_r4.c:363:19:
note: in expansion of macro 'GFC_REAL_4_INFINITY'
363 | result = -GFC_REAL_4_INFINITY;
| ^~~~~~~~~~~~~~~~~~~
{standard input}: Assembler messages:
{standard input}:204: Fatal error: Can't relocate expression
make[3]: *** [Makefile:3358: maxval_r4.lo] Error 1
Correct the checks then for __FLT_HAS_INFINITY__, __DBL_HAS_INFINITY__,
__LDBL_HAS_INFINITY__, __FLT_HAS_QUIET_NAN__, __DBL_HAS_QUIET_NAN__, and
__LDBL_HAS_QUIET_NAN__ to match semantics and remove build issues coming
from the misinterpretation of these macros.
libgfortran/
* libgfortran.h: Use #if rather than #ifdef with
__FLT_HAS_INFINITY__, __DBL_HAS_INFINITY__,
__LDBL_HAS_INFINITY__, __FLT_HAS_QUIET_NAN__,
__DBL_HAS_QUIET_NAN__, and __LDBL_HAS_QUIET_NAN__.
Jonathan Wakely [Thu, 26 Nov 2020 15:16:25 +0000 (15:16 +0000)]
libstdc++: Set dg-timeout-factor for some slow tests
These tests are very, very slow to compile. If the testsuite is run with
a low tool_timeout value they are likely to fail. By adding a
multiplication factor to those tests, it's still possible to use a low
timeout without spurious failures.
libstdc++-v3/ChangeLog:
* testsuite/28_regex/algorithms/regex_match/basic/string_range_01_03.cc:
Add dg-timeout-factor directive.
* testsuite/28_regex/algorithms/regex_match/cstring_bracket_01.cc:
Likewise.
* testsuite/28_regex/algorithms/regex_match/ecma/char/backref.cc:
Likewise.
* testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/63199.cc:
Likewise.
* testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/anymatcher.cc:
Likewise.
* testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/cjk_match.cc:
Likewise.
* testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/hex.cc:
Likewise.
* testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc:
Likewise.
* testsuite/28_regex/algorithms/regex_search/61720.cc: Likewise.
* testsuite/28_regex/algorithms/regex_search/ecma/assertion.cc:
Likewise.
* testsuite/28_regex/algorithms/regex_search/ecma/string_01.cc:
Likewise.
* testsuite/28_regex/basic_regex/ctors/deduction.cc: Likewise.
Jonathan Wakely [Thu, 26 Nov 2020 14:42:09 +0000 (14:42 +0000)]
libstdc++: Allow dejagnu tool_timeout to be overridden
This allows the default timeout for libstdc++ tests to be set by the
user, either in ~/.dejagnurc or a site.exp file that $DEJAGNU names.
libstdc++-v3/ChangeLog:
* testsuite/lib/libstdc++.exp (libstdc++_init): Only set
tool_timeout if it hasn't been set by the user already.
Jonathan Wakely [Thu, 26 Nov 2020 12:55:47 +0000 (12:55 +0000)]
libstdc++: Fix some more deadlocks in tests [PR 97936]
The missed notifications fixed in r11-5383 also happen in some other
tests which have similar code.
libstdc++-v3/ChangeLog:
PR libstdc++/97936
* testsuite/29_atomics/atomic/wait_notify/bool.cc: Fix missed
notifications by making the new thread wait until the parent
thread is waiting on the condition variable.
* testsuite/29_atomics/atomic/wait_notify/pointers.cc: Likewise.
* testsuite/29_atomics/atomic_flag/wait_notify/1.cc: Likewise.
* testsuite/29_atomics/atomic_ref/wait_notify.cc: Likewise.
Jonathan Wakely [Thu, 26 Nov 2020 14:13:32 +0000 (14:13 +0000)]
libstdc++: Add "futex" and "gthreads" effective-target keywords
This adds a new "futex" effective-target keyword that can be used to
selectively enable/disable tests based on _GLIBCXX_HAVE_LINUX_FUTEX,
instead of checking for that macro in the code.
It also adds "gthreads" as another one, to make the result of the
dg-require-gthreads directive usable in target selectors.
With these new keywords two tests that are currently only run for linux
can also be run for targets using gthr-single.h (e.g. AIX single-thread
multilib, and targets without a gthreads implementation).
libstdc++-v3/ChangeLog:
* testsuite/18_support/96817.cc: Use new effective-target
keywords to select supported targets more effectively.
* testsuite/30_threads/call_once/66146.cc: Likewise.
* testsuite/lib/libstdc++.exp (check_effective_target_futex):
Define new proc.
(check_effective_target_gthreads): Define new proc to replace
dg-require-gthreads.
Eric Botcazou [Thu, 26 Nov 2020 15:38:35 +0000 (16:38 +0100)]
Fix PR target/96607
After 15 years trying to find out what can go into the delay slot of
the call to __tls_get_addr with the Solaris linker, it's now time to
concede defeat and consider it as not to be filled.
gcc/ChangeLog:
PR target/96607
* config/sparc/sparc-protos.h (eligible_for_call_delay): Delete.
* config/sparc/sparc.c (eligible_for_call_delay): Likewise.
* config/sparc/sparc.md (in_call_delay): Likewise.
(tls_delay_slot): New attribute.
(define_delay [call]): Use in_branch_delay.
(tgd_call<P:mode>): Set type to call_no_delay_slot when
tls_delay_slot is false.
(tldm_call<P:mode>): Likewise.
Jakub Jelinek [Thu, 26 Nov 2020 15:24:07 +0000 (16:24 +0100)]
match.pd: Use ranges to optimize some x * y / y to x [PR97997]
For signed integers with undefined overflow we already optimize x * y / y
into x, but for signed integers with -fwrapv or unsigned integers we don't.
The following patch allows optimizing that into just x if value ranges
prove that x * y will never overflow.
It uses the global SSA_NAME_RANGE_INFO only, because like mentioned
in another PR we don't currently have a way to tell the ranger from match.pd
the use stmt (and we'd need in that case to tell ranger to only follow
SSA_NAME_DEF_STMTs + SSA_NAME_RANGE_INFO and never go in the other
direction, as following immediate uses seems forbidden in match.pd).
Another possibility would be to optimize this during vrp, but on the
other side the optimization itself is match.pd-ish.
2020-11-26 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/97997
* match.pd ((t * 2) / 2) -> t): Optimize even for defined
overflow if ranges prove there is no overflow.
* gcc.dg/tree-ssa/pr97997-1.c: New test.
* gcc.dg/tree-ssa/pr97997-2.c: New test.
Richard Biener [Thu, 26 Nov 2020 15:13:08 +0000 (16:13 +0100)]
tree-optimization/97953 - fix bougs range recorded by EVRP
EVRP records some ranges from asserts into SSA_NAME_RANGE_INFO
but fails to assert that the condition the range is derived from
is always true after the SSA names definition. The patch implements
the simplest post-dominance check, basic-block equality.
2020-11-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/97953
* gimple-ssa-evrp-analyze.c
(evrp_range_analyzer::record_ranges_from_incoming_edge): Make
sure the condition post-dominates the SSA definition before
recording into SSA_NAME_RANGE_INFO.
* gcc.dg/pr97953.c: New testcase.
Richard Biener [Thu, 26 Nov 2020 15:11:43 +0000 (16:11 +0100)]
tree-optimization/98015 - fix VEC_COND_EXPR lowering condition
This fixes the condition to match the comment and only lower
VECTOR_BOOLEAN_TYPE_P VEC_COND_EXPRs.
2020-11-26 Richard Biener <rguenther@suse.de>
* gimple-isel.cc (gimple_expand_vec_cond_expr): Only
lower VECTOR_BOOLEAN_TYPE_P VEC_COND_EXPRs.
Andrew Stubbs [Thu, 22 Oct 2020 12:27:47 +0000 (13:27 +0100)]
Fix early-debug relocations
The relocation symbols were inadvertantly wiped when the type was set in
mkoffload.
gcc/ChangeLog
* config/gcn/mkoffload.c (copy_early_debug_info): Don't wipe
relocation symbols.
Uros Bizjak [Thu, 26 Nov 2020 14:18:26 +0000 (15:18 +0100)]
i386: Cleanup argument handling in ix86_expand_*_builtin functions.
There is no need for struct with rtx and mode members since mode is never used.
2020-11-26 Uroš Bizjak <ubizjak@gmail.com>
gcc/
* config/i386/i386-expand.c (ix86_expand_multi_arg_builtin):
Remove args array of structs, declare rtx xops array instead.
Update all uses.
(ix86_expand_args_builtin): Ditto.
(ix86_expand_round_builtin): Ditto.
(ix86_expand_special_args_builtin): Ditto.
Martin Liska [Wed, 25 Nov 2020 09:11:08 +0000 (10:11 +0100)]
dwarf: fix language_string for C2X
gcc/ChangeLog:
* dwarf2out.c (gen_compile_unit_die): Fix missing == 0 in a
strcmp.
Rainer Orth [Thu, 26 Nov 2020 12:01:30 +0000 (13:01 +0100)]
ada: c++: Get rid of libposix4, librt on Solaris
I recently noticed that neither libposix4 nor librt are needed on
Solaris 11 any longer:
* libposix4 was renamed to librt in Solaris 7 back in 1998.
* librt was folded into libc in the OpenSolaris timeframe, leaving librt
only as a filter on libc. Thus, it's no longer needed on either
Solaris 11 or Illumos.
The following patch removes both uses. At the same time, Ada's use of
libthread has gone: it was folded into libc in Solaris 10 already.
TIME_LIBRARY and friends in g++ are likewise removed: Solaris was the
only user.
Bootstrapped without regressions on i386-pc-solaris2.11,
sparc-sun-solaris2.11, and x86_64-pc-linux-gnu.
2020-11-16 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
gcc/cp:
* g++spec.c (TIMELIB, TIME_LIBRARY): Remove.
(lang_specific_driver): Remove TIME_LIBRARY handling.
gcc:
* config/sol2.h (TIME_LIBRARY): Remove.
libstdc++-v3:
* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Remove libposix4
references.
<solaris*>: Don't use -lrt any longer.
* configure: Regenerate.
* doc/xml/manual/configure.xml (--enable-libstdcxx-time=OPTION):
Remove libposix4 reference.
gcc/ada:
* Makefile.rtl <sparc*-sun-solaris*> (THREADSLIB): Remove.
(MISCLIB): Remove -lposix4.
<*86-*-solaris2*>: Likewise.
* libgnarl/s-osinte__solaris.ads (System.OS_Interface): Remove
-lposix4 -lthread.
Jonathan Wakely [Thu, 26 Nov 2020 11:25:55 +0000 (11:25 +0000)]
libstdc++: Fix undefined FILE* operations in test
We only need to check that the constructor doesn't clear errno, so
there's no need to use an invalid FILE* for that.
libstdc++-v3/ChangeLog:
PR libstdc++/98001
* testsuite/ext/stdio_filebuf/char/79820.cc: Do not pass invalid
FILE* to constructor.
Jonathan Wakely [Thu, 26 Nov 2020 11:25:55 +0000 (11:25 +0000)]
libstdc++: Add new headers to stdc++.h
libstdc++-v3/ChangeLog:
* include/precompiled/stdc++.h: Add new headers.
* include/std/stop_token: Include <semaphore> unconditionally.
Kewen Lin [Thu, 26 Nov 2020 09:20:40 +0000 (03:20 -0600)]
rs6000: Set param_vect_partial_vector_usage as 1 for P10
Due to the unexpected performance on Power9 of those vector
with length instructions, we didn't enable vectorization with
partial vectors before.
Some recent testings show that they perform expectedly on
Power10 now. This patch is to set
param_vect_partial_vector_usage as 1 for P10 or later.
The performance evaluation on the whole SPEC2017 with option
set power10/Ofast/unroll shows it can speed up 525.x264_r by
10.80% and 554.roms_r by 1.94%.
Bootstrapped/regtested on powerpc64le-linux-gnu P10.
gcc/ChangeLog:
* config/rs6000/rs6000.c (rs6000_option_override_internal):
Set param_vect_partial_vector_usage as 1 for Power10 and up
by default.
Jakub Jelinek [Thu, 26 Nov 2020 09:51:51 +0000 (10:51 +0100)]
gimple-fold: Use DECL_PADDING_P in __builtin_clear_padding
On Wed, Nov 25, 2020 at 12:26:17PM -0500, Jason Merrill wrote:
> I think you want to check DECL_PADDING_P here; the C and C++ front ends set
> it on unnamed bit-fields, and that's what is_empty_type looks at.
While the above has been written in the context of __builtin_bit_cast patch,
I think it applies to __builtin_clear_padding too.
So this patch implements that. The C FE sets DECL_PADDING_P solely on the
DECL_BIT_FIELD !DECL_NAME FIELD_DECLs, the C++ FE sets it on those and in
another spot I haven't really figured out what it is about.
2020-11-26 Jakub Jelinek <jakub@redhat.com>
* gimple-fold.c (clear_padding_union): Ignore DECL_PADDING_P
fields.
(clear_padding_type): Ignore DECL_PADDING_P fields, rather than
DECL_BIT_FIELD with NULL DECL_NAME.
Jakub Jelinek [Thu, 26 Nov 2020 09:50:23 +0000 (10:50 +0100)]
match.pd: Avoid ICE with shifts [PR97979]
My recent wide_int_binop changes caused ICE on this testcase.
The problem is that for shift where amount has MSB set now fails to optimize
into a constant (IMHO we should treat out of bounds shifts the same later),
but there is a precedent for that already - e.g. division by zero fails
to optimize into a constant too. I think it is better if path isolation
checks for these UBs and does something the user chooses (__builtin_trap vs.
__builtin_unreachable, and either a deferred warning about the UB or
nothing).
This patch just doesn't optimize if int_const_binop failed.
2020-11-26 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/97979
* match.pd ((X {&,^,|} C2) << C1 into (X << C1) {&,^,|} (C2 << C1)):
Only optimize if int_const_binop returned non-NULL.
* gcc.dg/pr97979.c: New test.
* gcc.c-torture/compile/pr97979.c: New test.
liuhongt [Thu, 26 Nov 2020 01:49:18 +0000 (09:49 +0800)]
Delete dead code in ix86_expand_special_args_builtin
gcc/ChangeLog:
* config/i386/i386-expand.c
(ix86_expand_special_args_builtin): Delete last_arg_constant
and match.
Richard Biener [Thu, 26 Nov 2020 09:07:06 +0000 (10:07 +0100)]
testsuite/98002 - fix gcc.dg/strncmp-2.c
This makes sure not to free() memory we have mprotected to PROT_NONE
by calling mprotect again with PROT_READ|PROT_WRITE. This avoids
crashing the allocator when in debug mode.
2020-11-16 Richard Biener <rguenther@suse.de>
PR testsuite/98002
* gcc.dg/strncmp-2.c: Call mprotect again before free.
Thomas Schwinge [Wed, 25 Nov 2020 19:36:55 +0000 (20:36 +0100)]
Don't create location wrapper nodes within OpenACC clauses
This fixes a GCC 11, 10, 9 regression introduced by commit
dfd7fdca2ac17d8b823a16700525824ca312ade0 (Subversion r267272) "C++: more
location wrapper nodes (PR c++/43064, PR c++/43486)". But: this isn't
intending to blame David, because back then, the problem hasn't been visible in
the testsuite (or else I'm sure would've been addressed right away) because of
our all dear friend: missing testsuite coverage. Thus, for GCC 8, I'm likewise
enhancing the testsuite, without the C++ front end code changes.
I actually had presumed that there may be an issue for OpenACC:
<http://mid.mail-archive.com/874lb9qr2u.fsf@euler.schwinge.homeip.net>, so here
we are, two years (and many "wasted" hours...) later...
gcc/cp/
* parser.c (cp_parser_omp_var_list_no_open): Assert that array
section's 'low_bound', 'length' are not location wrapper nodes.
(cp_parser_oacc_all_clauses, cp_parser_oacc_cache): Instantiate
'auto_suppress_location_wrappers'.
gcc/testsuite/
* c-c++-common/goacc/cache-3-1.c: New.
* c-c++-common/goacc/cache-3-2.c: Likewise.
* c-c++-common/goacc/data-clause-1.c: Likewise.
* c-c++-common/goacc/data-clause-2.c: Likewise.
* c-c++-common/gomp/map-1.c: Adjust.
* c-c++-common/gomp/map-2.c: Likewise.
* g++.dg/goacc/cache-3-1.C: New.
* g++.dg/goacc/cache-3-2.C: Likewise.
* g++.dg/goacc/data-clause-1.C: Likewise.
* g++.dg/goacc/data-clause-2.C: Likewise.
* g++.dg/gomp/map-1.C: Adjust.
* g++.dg/gomp/map-2.C: Likewise.
Reported-by: Sandra Loosemore <sandra@codesourcery.com>
Uros Bizjak [Thu, 26 Nov 2020 08:47:01 +0000 (09:47 +0100)]
i386: Use SDWIM mode iterator for abs and maxmin [PR97873]
Generate special double mode sequence also for QImode and HImode.
Without QImode and HImode patterns, middle-end extends operands to SImode
and emits SImode conditional move instruction with paradoxical SImode output
register. This form is not recognized by STV pass, but a single abs with
input operand in a register would not be converted anyway due to relatively
high register conversion cost.
2020-11-26 Uroš Bizjak <ubizjak@gmail.com>
PR target/97873
gcc/
* config/i386/i386.md (abs<mode>2): Use SDWIM mode iterator.
(*abs<mode>2_1): Use SWI mode iterator.
(<maxmin:code><mode>3): Use SDWIM mode iterator.
(*<maxmin:code><mode>3_1): Use SWI mode iterator.
gcc/testsuite/
* gcc.target/i386/pr97873-3.c: New test.
Arnaud Charlet [Fri, 30 Oct 2020 15:23:49 +0000 (11:23 -0400)]
[Ada] Ada.Numerics.Big_Numbers.Big_Reals.To_Big_Real looses precision
gcc/ada/
* libgnat/a-nbnbre.adb (To_Big_Real): Do not loose precision.
Arnaud Charlet [Wed, 28 Oct 2020 08:55:16 +0000 (04:55 -0400)]
[Ada] Ada 2020 AI12-0401 Renaming of qualified expression of variable
gcc/ada/
* sem_ch8.adb (Analyze_Object_Renaming): Check for AI12-0401.
Eric Botcazou [Tue, 13 Oct 2020 16:15:40 +0000 (18:15 +0200)]
[Ada] Add support for 128-bit fixed-point types on 64-bit platforms
gcc/ada/
* Makefile.rtl (GNATRTL_NONTASKING_OBJS): Likewise.
(GNATRTL_128BIT_OBJS): Likewise.
(GNATRTL_128BIT_PAIRS): Add new 128-bit variants.
* cstand.adb (Create_Standard): Create Standard_Integer_128.
* doc/gnat_rm/implementation_defined_characteristics.rst: Document
new limits on 64-bit platforms in entry for 3.5.9(10).
* gnat_rm.texi: Regenerate.
* exp_attr.adb: Add with and use clauses for Urealp.
(Expand_N_Attribute_Reference) <Attribute_Fore>: Call new routines
for decimal fixed-point types and common ordinary fixed-point types.
* exp_ch4.adb (Real_Range_Check): Extend conversion trick to all
ordinary fixed-point types and use Small_Integer_Type_For.
* exp_fixd.adb: Add with and use clauses for Ttypes.
(Build_Divide): Add special case for 32-bit values and deal with
128-bit types.
(Build_Double_Divide): Deal with 128-bit types.
(Build_Double_Divide_Code): Likewise. Do not apply conversions
before calling Build_Multiply.
(Build_Multiply): Likewise. Add special case for 32-bit values.
(Build_Scaled_Divide): Deal with 128-bit types.
(Build_Scaled_Divide_Code): Likewise. Fix size computation. Do not
apply conversions before calling Build_Multiply.
(Do_Multiply_Fixed_Fixed): Minor tweak.
(Integer_Literal): Deal with 128-bit values.
* exp_imgv.adb (Has_Decimal_Small): Delete.
(Expand_Image_Attribute): Call new routines for common ordinary
fixed-point types.
(Expand_Value_Attribute): Likewise.
(Expand_Width_Attribute): Add new expansion for fixed-point types.
* freeze.adb (Freeze_Entity): Move error checks for ordinary
fixed-point types to...
(Freeze_Fixed_Point_Type): ...here. Deal with 128-bit types and
adjust limitations for 32-bnt and 64-bit types.
* rtsfind.ads (RTU_Id): Add entries for new System_Fore, System_Img,
and System_Val units and remove them for obsolete units.
(RE_Id): Add entries for Double_Divide128, Scaled_Divide128, the new
Fore, Image, Value routines and remove them for obsolete units.
(RE_Unit_Table): Likewise.
* sem_ch3.adb (Decimal_Fixed_Point_Type_Declaration): Deal with
128-bit types.
* stand.ads (Standard_Entity_Type): Add Standard_Integer_128.
* uintp.ads (Uint_31): New deferred constant.
(Uint_Minus_18): Likewise.
(Uint_Minus_31): Likewise.
(Uint_Minus_76): Likewise.
(Uint_Minus_127): Likewise.
* urealp.ads (Ureal_2_31): New function.
(Ureal_2_63): Likewise.
(Ureal_2_127): Likewise.
(Ureal_2_M_127): Likewise.
(Ureal_2_10_18): Likewise.
(Ureal_M_2_10_18): Likewise.
(Ureal_9_10_36): Likewise.
(Ureal_M_9_10_36): Likewise.
(Ureal_10_76): Likewise.
(Ureal_M_10_76): Likewise.
(Ureal_10_36): Delete.
(Ureal_M_10_36): Likewise.
* urealp.adb (UR_2_10_18): New variable.
(UR_9_10_36): Likewise.
(UR_10_76): Likewise.
(UR_M_2_10_18): Likewise.
(UR_M_9_10_36): Likewise.
(UR_M_10_76): Likewise.
(UR_2_31): Likewise.
(UR_2_63): Likewise.
(UR_2_127): Likewise.
(UR_2_M_127): Likewise.
(UR_10_36): Delete.
(UR_M_10_36): Likewise.
(Initialize): Initialize them.
(UR_Write): Do not use awkward Ada literal style.
(Ureal_2_10_18): New function.
(Ureal_9_10_36): Likewise.
(Ureal_10_76): Likewise.
(Ureal_2_31): Likewise.
(Ureal_2_63): Likewise.
(Ureal_2_127): Likewise.
(Ureal_2_M_127): Likewise.
(Ureal_M_2_10_18): Likewise.
(Ureal_M_9_10_36): Likewise.
(Ureal_10_76): Likewise.
(Ureal_M_10_76): Likewise.
(Ureal_10_36): Delete.
(Ureal_M_10_36): Likewise.
* libgnat/a-decima__128.ads: New file.
* libgnat/a-tideau.ads, libgnat/a-tideau.adb: Reimplement as
generic unit.
* libgnat/a-tideio.adb: Reimplement.
* libgnat/a-tideio__128.adb: New file.
* libgnat/a-tifiau.ads, libgnat/a-tifiau.adb: New generic unit.
* libgnat/a-tifiio.adb: Move bulk of implementation to s-imagef
and reimplement.
* libgnat/a-tifiio__128.adb: New file.
* libgnat/a-tiflau.adb (Get): Minor consistency fix.
(Gets): Likewise.
* libgnat/a-wtdeau.ads, libgnat/a-wtdeau.adb: Reimplement as
generic unit.
* libgnat/a-wtdeio.adb: Reimplement.
* libgnat/a-wtdeio__128.adb: New file.
* libgnat/a-wtfiau.ads, libgnat/a-wtfiau.adb: New generic unit.
* libgnat/a-wtfiio.adb: Reimplement.
* libgnat/a-wtfiio__128.adb: New file.
* libgnat/a-ztdeau.ads, libgnat/a-ztdeau.adb: Reimplement as
generic unit.
* libgnat/a-ztdeio.adb: Reimplement.
* libgnat/a-ztdeio__128.adb: New file.
* libgnat/a-ztfiau.ads, libgnat/a-ztfiau.adb: New generic unit.
* libgnat/a-ztfiio.adb: Reimplement.
* libgnat/a-ztfiio__128.adb: New file.
* libgnat/g-rannum.adb (Random_Decimal_Fixed): Use a subtype of the
appropiate size for the instantiation.
(Random_Ordinary_Fixed): Likewise.
* libgnat/s-arit32.ads, libgnat/s-arit32.adb: New support unit.
* libgnat/s-fode128.ads: New instantiation.
* libgnat/s-fode32.ads: Likewise.
* libgnat/s-fode64.ads: Likewise.
* libgnat/s-fofi128.ads: Likewise.
* libgnat/s-fofi32.ads: Likewise.
* libgnat/s-fofi64.ads: Likewise.
* libgnat/s-fore_d.ads, libgnat/s-fore_d.adb: New generic unit.
* libgnat/s-fore_f.ads, libgnat/s-fore_f.adb: Likewise.
* libgnat/s-fore.ads, libgnat/s-fore.adb: Rename into...
* libgnat/s-forrea.ads, libgnat/s-forrea.adb: ...this.
* libgnat/s-imaged.ads, libgnat/s-imaged.adb: New generic unit.
* libgnat/s-imagef.ads, libgnat/s-imagef.adb: Likewise, taken
from a-tifiio.adb.
* libgnat/s-imde128.ads: New instantiation.
* libgnat/s-imde32.ads: Likewise.
* libgnat/s-imde64.ads: Likewise.
* libgnat/s-imfi128.ads: Likewise.
* libgnat/s-imfi32.ads: Likewise.
* libgnat/s-imfi64.ads: Likewise.
* libgnat/s-imgdec.ads, libgnat/s-imgdec.adb: Delete.
* libgnat/s-imglld.ads, libgnat/s-imglld.adb: Likewise.
* libgnat/s-imgrea.adb (Set_Image_Real): Replace Sign local variable
with Minus local variable for the sake of consistency.
* libgnat/s-imguti.ads, libgnat/s-imguti.adb: New support unit.
* libgnat/s-vade128.ads: New instantiation.
* libgnat/s-vade32.ads: Likewise.
* libgnat/s-vade64.ads: Likewise.
* libgnat/s-vafi128.ads: Likewise.
* libgnat/s-vafi32.ads: Likewise.
* libgnat/s-vafi64.ads: Likewise.
* libgnat/s-valdec.ads, libgnat/s-valdec.adb: Delete.
* libgnat/s-vallld.ads, libgnat/s-vallld.adb: Likewise.
* libgnat/s-valued.ads, libgnat/s-valued.adb: New generic unit.
* libgnat/s-valuef.ads, libgnat/s-valuef.adb: Likewise.
* libgnat/s-valuei.adb: Minor rewording.
* libgnat/s-valrea.adb: Move bulk of implementation to...
* libgnat/s-valuer.ads, libgnat/s-valuer.adb: ...here. New
generic unit.
* libgnat/system-aix.ads (Max_Mantissa): Adjust.
* libgnat/system-darwin-arm.ads (Max_Mantissa): Likewise.
* libgnat/system-darwin-ppc.ads (Max_Mantissa): Likewise.
* libgnat/system-darwin-x86.ads (Max_Mantissa): Likewise.
* libgnat/system-djgpp.ads (Max_Mantissa): Likewise.
* libgnat/system-dragonfly-x86_64.ads (Max_Mantissa): Likewise.
* libgnat/system-freebsd.ads (Max_Mantissa): Likewise.
* libgnat/system-hpux-ia64.ads (Max_Mantissa): Likewise.
* libgnat/system-hpux.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-alpha.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-arm.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-hppa.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-ia64.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-m68k.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-mips.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-ppc.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-riscv.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-s390.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-sh4.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-sparc.ads (Max_Mantissa): Likewise.
* libgnat/system-linux-x86.ads (Max_Mantissa): Likewise.
* libgnat/system-lynxos178-ppc.ads (Max_Mantissa): Likewise.
* libgnat/system-lynxos178-x86.ads (Max_Mantissa): Likewise.
* libgnat/system-mingw.ads (Max_Mantissa): Likewise.
* libgnat/system-qnx-aarch64.ads (Max_Mantissa): Likewise.
* libgnat/system-rtems.ads (Max_Mantissa): Likewise.
* libgnat/system-solaris-sparc.ads (Max_Mantissa): Likewise.
* libgnat/system-solaris-x86.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-arm-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-arm-rtp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-arm.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-e500-kernel.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-e500-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-e500-rtp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-e500-vthread.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-ppc-kernel.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-ppc-ravenscar.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-ppc-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-ppc-rtp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-ppc-vthread.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-ppc.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-x86-kernel.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-x86-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-x86-rtp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-x86-vthread.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks-x86.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-aarch64-rtp-smp.ads (Max_Mantissa):
Likewise.
* libgnat/system-vxworks7-aarch64.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-arm-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-arm.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-e500-kernel.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-e500-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-e500-rtp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-ppc-kernel.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-ppc-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-ppc-rtp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-ppc64-kernel.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-ppc64-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-x86-kernel.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-x86-rtp-smp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-x86-rtp.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-x86_64-kernel.ads (Max_Mantissa): Likewise.
* libgnat/system-vxworks7-x86_64-rtp-smp.ads (Max_Mantissa): Likewise.
gcc/testsuite/
* gnat.dg/multfixed.adb: Robustify.
Liaiss Merzougue [Fri, 30 Oct 2020 08:19:09 +0000 (08:19 +0000)]
[Ada] Add the remark concerning the use of Image_Ordinary_Fixed_Point
gcc/ada/
* libgnat/s-imgrea.ads (Image_Ordinary_Fixed_Point): Add a
remark concerning the irrelevant use of Inf and -0.0
Arnaud Charlet [Thu, 29 Oct 2020 09:41:22 +0000 (10:41 +0100)]
[Ada] Add support for .c output file
gcc/ada/
* osint-c.adb (Set_Output_Object_File_Name): Add support for
.c output file.
Piotr Trojanek [Wed, 28 Oct 2020 08:27:18 +0000 (09:27 +0100)]
[Ada] Reuse Is_Generic_Subprogram where possible
gcc/ada/
* lib-writ.adb, sem_ch8.adb, sem_prag.adb: Use
Is_Generic_Subprogram instead of low-level membership tests.
Gary Dismukes [Wed, 28 Oct 2020 05:08:44 +0000 (01:08 -0400)]
[Ada] Minor reformatting and a typo fix
gcc/ada/
* sem_ch6.adb (Analyze_Call_And_Resolve): Reformatted a comment.
* sem_prag.adb (Process_Restrictions_Or_Restriction_Warnings):
Fixed a typo.
Piotr Trojanek [Tue, 20 Oct 2020 08:15:20 +0000 (10:15 +0200)]
[Ada] Replace warning suppression with assertion
gcc/ada/
* sem_res.adb (Resolve_Membership_Op): Replace pragma Warnings
with pragma Assert.
Ed Schonberg [Tue, 27 Oct 2020 16:17:37 +0000 (12:17 -0400)]
[Ada] Improve error message on illegal prefixed procedure call
gcc/ada/
* sem_ch6.adb (Analyze_Call_And_Resolve): Add information to the
error message on an illegal procedure call, when the illegality
is due to the presence of a component of the full view of the
target object, as well as a procedure with the same name (See RM
4.1.3 (9.2/3)).
Ed Schonberg [Tue, 27 Oct 2020 13:24:51 +0000 (09:24 -0400)]
[Ada] Crash on task declaration with Restriction_Warning (No_Tasking)
gcc/ada/
* sem_prag.adb (Process_Restrictions_Or_Restriction_Warnings):
when the restriction is a configuration pragma and specifies
No_Tasking, a global flag is set to reject task declarations,
and to prevent the construction of Master entities. The flag
must not be set if the pragma is a Restriction_Warning, in which
case task declarationns are allowed.
Piotr Trojanek [Mon, 19 Oct 2020 14:23:31 +0000 (16:23 +0200)]
[Ada] Sync wide Ada.String hashing units
gcc/ada/
* libgnat/a-stzhas.adb (Wide_Wide_Hash): Instantiate inside a
wrapper function.
* libgnat/a-stzhas.ads (Wide_Wide_Hash): Likewise; remove wrong
comment, because this is indeed a RM unit, as described in Ada
RM A.4.8 (1/3).
Piotr Trojanek [Tue, 29 Sep 2020 10:40:39 +0000 (12:40 +0200)]
[Ada] Avoid potentially repeated calls to Prefix in Eval_Slice
gcc/ada/
* sem_eval.adb (Eval_Slice): Refactor repeated calls to Prefix
with a local constant (named just like in Resolve_Slice).
Piotr Trojanek [Wed, 15 Apr 2020 20:53:54 +0000 (22:53 +0200)]
[Ada] Warn on slices of the form A (subtype) for all objects
gcc/ada/
* sem_eval.adb (Eval_Slice): Emit warning not just for
constants, but for any objects.
Piotr Trojanek [Mon, 26 Oct 2020 13:25:22 +0000 (14:25 +0100)]
[Ada] Remove duplicated calls to Set_Entity
gcc/ada/
* sem_ch4.adb (Indicate_Name_And_Type): Fix whitespace in
comment.
* sem_res.adb (Resolve_Call): Remove redundant parens.
* sem_util.adb (Set_Entity_With_Checks): Remove extra call to
Set_Entity.
Bob Duff [Fri, 23 Oct 2020 21:27:34 +0000 (17:27 -0400)]
[Ada] Memory leak in concatenation with Initialize_Scalars
gcc/ada/
* exp_ch4.adb (Expand_Concatenate): Call Set_No_Initialization
on the N_Allocator node that is supposed to allocate on the
secondary stack.
Piotr Trojanek [Mon, 26 Oct 2020 11:15:34 +0000 (12:15 +0100)]
[Ada] Reuse Is_Concurrent_Type when detecting protected or task types
gcc/ada/
* exp_ch13.adb, exp_ch9.adb, sem_ch8.adb, sem_util.adb: Replace
a combination of Is_Protected_Type and Is_Task_Type by
Is_Concurrent_Type.
Arnaud Charlet [Sat, 24 Oct 2020 12:01:58 +0000 (08:01 -0400)]
[Ada] Constraint_Error in Task_Wrapper and -u0
gcc/ada/
* libgnarl/s-tassta.adb (Task_Wrapper): Fix computation of
Pattern_Size.
Bob Duff [Thu, 22 Oct 2020 21:49:07 +0000 (17:49 -0400)]
[Ada] Pass base type to Set_Has_Own_Invariants
gcc/ada/
* freeze.adb (Freeze_Array_Type): Remove propagation of
Has_Own_Invariants to the first subtype. This is a no-op,
because the current (incorrect) version of Has_Own_Invariants
calls Base_Type.
* sem_prag.adb, sem_util.adb: Pass the base type to
Set_Has_Own_Invariants.
Eric Botcazou [Fri, 23 Oct 2020 10:05:21 +0000 (12:05 +0200)]
[Ada] Adjust documentation of Aft_Value and Scale_Value
gcc/ada/
* einfo.ads (Aft_Value): Adjust documentation.
(Scale_Value): Likewise.
Justin Squirek [Fri, 23 Oct 2020 15:31:07 +0000 (11:31 -0400)]
[Ada] Incorrect runtime accessibility check on access discriminant
gcc/ada/
* exp_ch4.adb (Expand_N_Type_Conversion): Use the unexpanded
operand when generating accessibility checks.
Piotr Trojanek [Wed, 21 Oct 2020 13:04:48 +0000 (15:04 +0200)]
[Ada] Remove extra whitespace in bounded container Read procedures
gcc/ada/
* libgnat/a-cbhase.adb (Read): Remove extra whitespace.
* libgnat/a-cbmutr.ads (Read): Likewise.
* libgnat/a-cborse.adb (Read): Likewise.
Piotr Trojanek [Thu, 22 Oct 2020 11:19:52 +0000 (13:19 +0200)]
[Ada] Reuse Is_Access_Object_Type where possible
gcc/ada/
* exp_ch7.adb, exp_util.adb, freeze.adb: Rewrite with
Is_Access_Object_Type.
Piotr Trojanek [Tue, 20 Oct 2020 09:24:48 +0000 (11:24 +0200)]
[Ada] Simplify checks for library unit pragmas
gcc/ada/
* sem_prag.adb (Check_Valid_Library_Unit_Pragma): Raise
exception.
(Analyze_Pragma): Remove detection of rewritten pragmas.
Joffrey Huguet [Fri, 9 Oct 2020 09:48:12 +0000 (11:48 +0200)]
[Ada] Add contracts to Ada.Strings.Maps
gcc/ada/
* libgnat/a-strmap.ads: Add preconditions and postconditions to
all subprograms.
Yannick Moy [Fri, 16 Oct 2020 14:56:49 +0000 (16:56 +0200)]
[Ada] New warning on questionable missing parentheses
gcc/ada/
* sem_res.adb (Resolve_Equality_Op): Warn when -gnatwq is used
(the default) and the problematic case is encountered.
Yannick Moy [Tue, 20 Oct 2020 10:53:08 +0000 (12:53 +0200)]
[Ada] Issue advice for error regarding Old/Loop_Entry on unevaluated expr.
gcc/ada/
* sem_attr.adb (Analyze_Attribute): Issue a continuation message
to give proper recommendation here.
Gary Dismukes [Tue, 20 Oct 2020 18:02:25 +0000 (14:02 -0400)]
[Ada] Correct a typo, plus other minor reformatting
gcc/ada/
* exp_util.adb (Expand_Subtype_From_Expr): A typo correction,
plus other minor reformatting.
Ed Schonberg [Tue, 20 Oct 2020 13:42:57 +0000 (09:42 -0400)]
[Ada] Spurious error on formal package with overloaded subprograms
gcc/ada/
* sem_ch12.adb (Instantiate_Formal_Package): If previous matched
entity is overloadable, advance in the list of actuals of the
actual package, to prevent an erroneous match of two adjacent
overloadable homonyms with the same entity.
Justin Squirek [Fri, 16 Oct 2020 20:49:58 +0000 (16:49 -0400)]
[Ada] Compiler crash on named association in return aggregate
gcc/ada/
* sem_ch6.adb (First_Selector): Utility routine to return the
first selector or choice in an association.
(Check_Return_Construct_Accessibility): Modify loop to handle
named associations when iterating through discriminants.
Piotr Trojanek [Mon, 19 Oct 2020 14:57:01 +0000 (16:57 +0200)]
[Ada] Fix casing of "circular instantiation" error
gcc/ada/
* sem_ch12.adb: Fix casing from "Instantiation" to
"instantiation".
Jakub Jelinek [Thu, 26 Nov 2020 07:44:15 +0000 (08:44 +0100)]
i386: Optimize psubusw compared to 0 into pminuw compared to op0 [PR96906]
The following patch renames VI12_AVX2 iterator to VI12_AVX2_AVX512BW
for consistency with some other iterators, as I need VI12_AVX2 without
AVX512BW for this change.
The real meat is a combiner split which combine
can use to optimize psubusw compared to 0 into pminuw compared to op0
(and similarly for psubusb compared to 0 into pminub compared to op0).
According to Agner Fog's tables, psubus[bw] and pminu[bw] timings
are the same, but the advantage of pminu[bw] is that the comparison
doesn't need a zero operand, so e.g. for -msse4.1 it causes changes like
- psubusw %xmm1, %xmm0
- pxor %xmm1, %xmm1
+ pminuw %xmm0, %xmm1
pcmpeqw %xmm1, %xmm0
and similarly for avx2:
- vpsubusb %ymm1, %ymm0, %ymm0
- vpxor %xmm1, %xmm1, %xmm1
- vpcmpeqb %ymm1, %ymm0, %ymm0
+ vpminub %ymm1, %ymm0, %ymm1
+ vpcmpeqb %ymm0, %ymm1, %ymm0
I haven't done the AVX512{BW,VL} define_split(s), they'll need
to match the UNSPEC_PCMP which are used for avx512 comparisons.
2020-11-26 Jakub Jelinek <jakub@redhat.com>
PR target/96906
* config/i386/sse.md (VI12_AVX2): Remove V64QI/V32HI modes.
(VI12_AVX2_AVX512BW): New mode iterator.
(<sse2_avx2>_<plusminus_insn><mode>3<mask_name>,
uavg<mode>3_ceil, <sse2_avx2>_uavg<mode>3<mask_name>): Use
VI12_AVX2_AVX512BW iterator instead of VI12_AVX2.
(*<sse2_avx2>_<plusminus_insn><mode>3<mask_name>): Likewise.
(*<sse2_avx2>_uavg<mode>3<mask_name>): Likewise.
(*<sse2_avx2>_<plusminus_insn><mode>3<mask_name>): Add a new
define_split after this insn.
* gcc.target/i386/pr96906-1.c: New test.
Martin Uecker [Thu, 26 Nov 2020 07:12:12 +0000 (08:12 +0100)]
C: Do not drop qualifiers in typeof for _Atomic types. [PR65455,PR92935]
2020-11-25 Martin Uecker <muecker@gwdg.de>
gcc/c/
PR c/65455
PR c/92935
* c-parser.c (c_parser_declaration_or_fndef): Remove
redundant code to drop qualifiers of _Atomic types for __auto_type.
(c_parser_typeof_specifier): Do not drop qualifiers of _Atomic
types for __typeof__.
gcc/
PR c/65455
PR c/92935
* ginclude/stdatomic.h: Use comma operator to drop qualifiers.
gcc/testsuite/
PR c/65455
PR c/92935
* gcc.dg/typeof-2.c: Adapt test.
David Edelsohn [Wed, 25 Nov 2020 18:53:37 +0000 (13:53 -0500)]
testsuite: Adjust nextafter and skip profile-info-section on AIX.
nextafter-2.c builds nextafter-1.c with math.h, but nextafter-1.c
provides prototypes for the functions. The prototypes can conflict
with the definitions in math.h. This patch omits the prototypes
when compiling nextafer-2.c.
profile-info-section.c uses the profile-info-section flag that is not
valid on AIX, so skip the test on AIX.
gcc/testsuite/ChangeLog:
* gcc.dg/nextafter-1.c: Omit prototypes if _NEXT_AFTER_2 defined.
* gcc.dg/nextafter-2.c: Define _NEXT_AFTER_2.
* gcc.dg/profile-info-section.c: Skip on AIX.
Vladimir N. Makarov [Wed, 25 Nov 2020 22:06:13 +0000 (17:06 -0500)]
[PR97983] LRA: Use the right emit func for putting insn in the destination BB.
gcc/
2020-11-25 Vladimir Makarov <vmakarov@redhat.com>
PR bootstrap/97983
* lra.c (lra_process_new_insns): Use emit_insn_before_noloc or
emit_insn_after_noloc with the destination BB.
GCC Administrator [Thu, 26 Nov 2020 00:16:41 +0000 (00:16 +0000)]
Daily bump.
Martin Sebor [Wed, 25 Nov 2020 21:05:01 +0000 (14:05 -0700)]
Clean up -Wformat-diag warnings (PR bootstrap/97622, PR bootstrap/94982)
gcc/c-family/ChangeLog:
PR bootstrap/94982
* c-attribs.c (handle_patchable_function_entry_attribute): Avoid
-Wformat-diag.
gcc/cp/ChangeLog:
PR bootstrap/94982
* constraint.cc (debug_argument_list): Avoid -Wformat-diag.
* error.c (function_category): Same.
(print_template_differences): Same.
* logic.cc (debug): Same.
* name-lookup.c (lookup_using_decl): Same.
* parser.c (maybe_add_cast_fixit): Same.
(cp_parser_template_introduction): Same.
* typeck.c (access_failure_info::add_fixit_hint): Same.
gcc/ChangeLog:
PR bootstrap/97622
PR bootstrap/94982
* config/i386/i386-options.c (ix86_valid_target_attribute_inner_p):
Avoid -Wformat-diag.
* digraph.cc (struct test_edge): Same.
* dumpfile.c (dump_loc): Same.
(dump_context::begin_scope): Same.
* edit-context.c (edited_file::print_diff): Same.
(edited_file::print_diff_hunk): Same.
* json.cc (object::print): Same.
* lto-wrapper.c (merge_and_complain): Same.
* reload.c (find_reloads): Same.
* tree-diagnostic-path.cc (print_path_summary_as_text): Same.
* ubsan.c (ubsan_type_descriptor): Same.
gcc/jit/ChangeLog:
PR bootstrap/94982
* jit-recording.c (recording::function::dump_to_dot): Avoid
-Wformat-diag.
(recording::block::dump_to_dot): Same.
gcc/testsuite/ChangeLog:
PR bootstrap/94982
* c-c++-common/patchable_function_entry-error-3.c: Adjust text
of expected warning.
Jan Hubicka [Wed, 25 Nov 2020 19:52:20 +0000 (20:52 +0100)]
New ipa-modref testcases
gcc/testsuite/ChangeLog:
* gcc.dg/lto/modref-3_0.c: New test.
* gcc.dg/lto/modref-3_1.c: New test.
* gcc.dg/lto/modref-4_0.c: New test.
* gcc.dg/lto/modref-4_1.c: New test.
* gcc.dg/tree-ssa/modref-5.c: New test.
Jan Hubicka [Wed, 25 Nov 2020 19:51:26 +0000 (20:51 +0100)]
Add EAF_NODIRECTESCAPE flag
Main limitation of modref is the fact that it does not
track anything in memory. This is intentional - I wanted the initial
implementation to be cheap. However it also makes it very limited when it comes
to detecting noescape especially because it is paranoid about what memory
accesses may be used to copy (bits of) pointers.
This patch adds EAF_NODIRECTSCAPE that is weaker vairant of EAF_NOESCAPE where
we only know that the pointer itself does not escape, but memory pointed to
may. This is a lot more reliable to auto-detect that EAF_NOESCAPE and still
enables additional optimization. With patch we get nodirectscape flag for b
that enables in practice similar optimization as EAF_NOESCAPE for arrays of
integers that points nowhere :)
gcc/ChangeLog:
* gimple.c (gimple_call_arg_flags): Also imply EAF_NODIRECTESCAPE.
* tree-core.h (EAF_NODRECTESCAPE): New flag.
* tree-ssa-structalias.c (make_indirect_escape_constraint): New
function.
(handle_rhs_call): Hanlde EAF_NODIRECTESCAPE.
* ipa-modref.c (dump_eaf_flags): Print EAF_NODIRECTESCAPE.
(deref_flags): Dereference is always EAF_NODIRECTESCAPE.
(modref_lattice::init): Also set EAF_NODIRECTESCAPE.
(analyze_ssa_name_flags): Pure functions do not affect
EAF_NODIRECTESCAPE.
(analyze_params): Likewise.
(ipa_merge_modref_summary_after_inlining): Likewise.
(modref_merge_call_site_flags): Likewise.
Jan Hubicka [Wed, 25 Nov 2020 19:33:00 +0000 (20:33 +0100)]
Copy arg_flags in duplication hoooks in ipa-modref
* ipa-modref.c (modref_summaries::duplicate,
modref_summaries_lto::duplicate): Copy arg_flags.
(remap_arg_flags): Fix remapping of arg_flags.
Harald Anlauf [Wed, 25 Nov 2020 19:20:44 +0000 (20:20 +0100)]
PR fortran/85796 - Floating point exception with implied do
Catch invalid step=0 in implied do loop within data statements.
gcc/fortran/ChangeLog:
PR fortran/85796
* resolve.c (traverse_data_list): Fix copy&paste errors; catch
step=0 in implied do loop.
gcc/testsuite/ChangeLog:
PR fortran/85796
* gfortran.dg/pr85796.f90: New test.
Thomas Schwinge [Wed, 25 Nov 2020 10:41:45 +0000 (11:41 +0100)]
Add 'g++.dg/gomp/map-{1,2}.C'
gcc/testsuite/
* g++.dg/gomp/map-1.C: New.
* g++.dg/gomp/map-2.C: Likewise.
* c-c++-common/gomp/map-1.c: Adjust.
* c-c++-common/gomp/map-2.c: Likewise.
Thomas Schwinge [Wed, 25 Nov 2020 12:03:52 +0000 (13:03 +0100)]
Fix templatized C++ OpenACC 'cache' directive ICEs
This has been broken forever, whoops...
gcc/cp/
* pt.c (tsubst_omp_clauses): Handle 'OMP_CLAUSE__CACHE_'.
(tsubst_expr): Handle 'OACC_CACHE'.
gcc/testsuite/
* c-c++-common/goacc/cache-1.c: Update.
* c-c++-common/goacc/cache-2.c: Likewise.
* g++.dg/goacc/cache-1.C: New.
* g++.dg/goacc/cache-2.C: Likewise.
libgomp/
* testsuite/libgomp.oacc-c++/cache-1.C: New.
* testsuite/libgomp.oacc-c-c++-common/cache-1.c: Update.
Stefan Kanthak [Wed, 25 Nov 2020 18:36:51 +0000 (11:36 -0700)]
Improve abs with overflow implementations
libgcc/
* libgcc2.c (absvSI2): Simplify/improve implementation by using
builtin_add_overflow.
(absvsi2, absvDI2): Likewise.
Jonathan Wakely [Wed, 25 Nov 2020 17:59:44 +0000 (17:59 +0000)]
libstdc++: Remove redundant clock conversions in atomic waits
For the case where a timeout is specified using the system_clock we
perform a conversion to the preferred clock (which is either
steady_clock or system_clock itself), wait using __cond_wait_until_impl,
and then check the time by that clock again to see if it was reached.
This is entirely redundant, as we can just call __cond_wait_until_impl
directly. It will wait using the specified clock, and there's no need to
check the time twice. For the no_timeout case this removes two
unnecessary calls to the clock's now() function, and for the timeout
case it removes three calls.
libstdc++-v3/ChangeLog:
* include/bits/atomic_timed_wait.h (__cond_wait_until): Do not
perform redundant conversions to the same clock.
Jonathan Wakely [Wed, 25 Nov 2020 14:24:21 +0000 (14:24 +0000)]
libstdc++: Encapsulate __gthread_cond_t as std::__condvar
This introduces a new internal utility, std::__condvar, which is a
simplified form of std::condition_variable. It has no dependency on
<chrono> or std::unique_lock, which allows it to be used in
<bits/atomic_wait.h>.
This avoids repeating the #ifdef __GTHREAD_COND_INIT preprocessor
conditions and associated logic for initializing a __gthread_cond_t
correctly. It also encapsulates most of the __gthread_cond_xxx functions
as member functions of __condvar.
libstdc++-v3/ChangeLog:
* include/bits/atomic_timed_wait.h (__cond_wait_until_impl):
Do not define when _GLIBCXX_HAVE_LINUX_FUTEX is defined. Use
__condvar and mutex instead of __gthread_cond_t and
unique_lock<mutex>.
(__cond_wait_until): Likewise. Fix test for return value of
__cond_wait_until_impl.
(__timed_waiters::_M_do_wait_until): Use __condvar instead
of __gthread_cond_t.
* include/bits/atomic_wait.h: Remove <bits/unique_lock.h>
include. Only include <bits/std_mutex.h> if not using futexes.
(__platform_wait_max_value): Remove unused variable.
(__waiters::lock_t): Use lock_guard instead of unique_lock.
(__waiters::_M_cv): Use __condvar instead of __gthread_cond_t.
(__waiters::_M_do_wait(__platform_wait_t)): Likewise.
(__waiters::_M_notify()): Likewise. Use notify_one() if not
asked to notify all.
* include/bits/std_mutex.h (__condvar): New type.
* include/std/condition_variable (condition_variable::_M_cond)
(condition_variable::wait_until): Use __condvar instead of
__gthread_cond_t.
* src/c++11/condition_variable.cc (condition_variable): Define
default constructor and destructor as defaulted.
(condition_variable::wait, condition_variable::notify_one)
(condition_variable::notify_all): Forward to corresponding
member function of __condvar.
Jonathan Wakely [Wed, 25 Nov 2020 14:39:54 +0000 (14:39 +0000)]
libstdc++: Fix testsuite helper functions [PR 97936]
This fixes a race condition in the util/atomic/wait_notify_util.h header
used by several tests, which should make the tests work properly.
libstdc++-v3/ChangeLog:
PR libstdc++/97936
* testsuite/29_atomics/atomic/wait_notify/bool.cc: Re-eneable
test.
* testsuite/29_atomics/atomic/wait_notify/generic.cc: Likewise.
* testsuite/29_atomics/atomic/wait_notify/pointers.cc: Likewise.
* testsuite/29_atomics/atomic_flag/wait_notify/1.cc: Likewise.
* testsuite/29_atomics/atomic_float/wait_notify.cc: Likewise.
* testsuite/29_atomics/atomic_integral/wait_notify.cc: Likewise.
* testsuite/util/atomic/wait_notify_util.h: Fix missed
notifications by making the new thread wait until the parent
thread is waiting on the condition variable.