From 5668843346c74cabf830e46b45fad24db4566fd6 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 22 Apr 2021 09:50:26 +0200 Subject: testsuite/100176 - fix struct-layout-1_generate.c compile With -Werror=return-type we run into compile fails complaining about missing return stmts. 2021-04-21 Richard Biener PR testsuite/100176 * objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c: Add missing return. --- gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'gcc') diff --git a/gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c b/gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c index 824e4ba..ca24200 100644 --- a/gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c +++ b/gcc/testsuite/objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c @@ -690,6 +690,8 @@ subvalues (struct entry *e, char *p, char *letter) if (e[0].len != 0) output_FNB ('B', e); return 1; + default: + return 0; } } -- cgit v1.1 From faf7d413a3f3337be1a3ac5cdf33e0e3b87b426e Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 22 Apr 2021 11:05:17 +0200 Subject: gfortran.dg/pr68078.f90: Avoid increasing RLIMIT_AS pr68078.f90 tests out-of-memory handling and calls set_vm_limit to set the soft limit. However, setrlimit was then called with hard limit RLIM_INFINITY, which failed when the current hard limit was lower. gcc/testsuite/ * gfortran.dg/set_vm_limit.c (set_vm_limit): Call getrlimit, use obtained hard limit, and only call setrlimit if new softlimit is lower. --- gcc/testsuite/gfortran.dg/set_vm_limit.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/testsuite/gfortran.dg/set_vm_limit.c b/gcc/testsuite/gfortran.dg/set_vm_limit.c index 30c4b43..8344f6f 100644 --- a/gcc/testsuite/gfortran.dg/set_vm_limit.c +++ b/gcc/testsuite/gfortran.dg/set_vm_limit.c @@ -8,9 +8,20 @@ void set_vm_limit (int vm_limit) { - struct rlimit rl = { vm_limit, RLIM_INFINITY }; + struct rlimit rl; int r; + r = getrlimit (RLIMIT_AS, &rl); + if (r) + { + perror ("get_vm_limit"); + exit (1); + } + + if (vm_limit >= rl.rlim_cur) + return; + + rl.rlim_cur = vm_limit; r = setrlimit (RLIMIT_AS, &rl); if (r) { -- cgit v1.1 From d44d8ed6b4e6fb2d0cf7566214e2e8281dd44cf0 Mon Sep 17 00:00:00 2001 From: Christophe Lyon Date: Thu, 22 Apr 2021 12:43:25 +0000 Subject: testsuite/aarch64: Run pr99988.c test under lp64 only The new test fails with -mabi=ilp32: sorry, unimplemented: return address signing is only supported for '-mabi=lp64' 2021-04-22 Christophe Lyon gcc/testsuite/ PR target/99988 * gcc.target/aarch64/pr99988.c: Skip if not lp64 target. --- gcc/testsuite/gcc.target/aarch64/pr99988.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/testsuite/gcc.target/aarch64/pr99988.c b/gcc/testsuite/gcc.target/aarch64/pr99988.c index 2d87f41..7cca496 100644 --- a/gcc/testsuite/gcc.target/aarch64/pr99988.c +++ b/gcc/testsuite/gcc.target/aarch64/pr99988.c @@ -1,4 +1,4 @@ -/* { dg-do compile } */ +/* { dg-do compile { target lp64 } } */ /* { dg-options "-O2 -mbranch-protection=standard" } */ /* { dg-final { scan-assembler-times {bti j} 13 } } */ int a; -- cgit v1.1 From 0cda606d08d6196b76524c7b6ad51d87fed0d54b Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Thu, 22 Apr 2021 16:30:38 +0200 Subject: i386: Fix unsigned int -> double conversion on i386 w/ -mfpmath=sse [PR100119] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2021-04-22 Uroš Bizjak gcc/ PR target/100119 * config/i386/i386-expand.c (ix86_expand_convert_uns_sidf_sse): Remove the sign with FE_DOWNWARD, where x - x = -0.0. gcc/testsuite/ PR target/100119 * gcc.target/i386/pr100119.c: New test. --- gcc/config/i386/i386-expand.c | 7 +++++++ gcc/testsuite/gcc.target/i386/pr100119.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr100119.c (limited to 'gcc') diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index 166c23d..516440e 100644 --- a/gcc/config/i386/i386-expand.c +++ b/gcc/config/i386/i386-expand.c @@ -1550,6 +1550,8 @@ ix86_expand_convert_uns_sixf_sse (rtx, rtx) gcc_unreachable (); } +static rtx ix86_expand_sse_fabs (rtx op0, rtx *smask); + /* Convert an unsigned SImode value into a DFmode. Only currently used for SSE, but applicable anywhere. */ @@ -1569,6 +1571,11 @@ ix86_expand_convert_uns_sidf_sse (rtx target, rtx input) x = const_double_from_real_value (TWO31r, DFmode); x = expand_simple_binop (DFmode, PLUS, fp, x, target, 0, OPTAB_DIRECT); + + /* Remove the sign with FE_DOWNWARD, where x - x = -0.0. */ + if (HONOR_SIGNED_ZEROS (DFmode) && flag_rounding_math) + x = ix86_expand_sse_fabs (x, NULL); + if (x != target) emit_move_insn (target, x); } diff --git a/gcc/testsuite/gcc.target/i386/pr100119.c b/gcc/testsuite/gcc.target/i386/pr100119.c new file mode 100644 index 0000000..be9472e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr100119.c @@ -0,0 +1,28 @@ +/* PR target/100119 */ +/* { dg-do run { target sse2_runtime } } */ +/* { dg-require-effective-target fenv } */ +/* { dg-options "-O2 -frounding-math -msse2 -mno-avx512f -mfpmath=sse" } */ + +#include + +double +__attribute__((noinline)) +test (unsigned int x) +{ + return x; +} + +int +main () +{ + double result; + + fesetround (FE_DOWNWARD); + + result = test (0); + + if (__builtin_signbit (result) != 0) + __builtin_abort (); + + return 0; +} -- cgit v1.1 From 3bb6a9c01f1e9b5daf9b37fca57e90804ba90d66 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Thu, 22 Apr 2021 11:32:29 +0200 Subject: Fix various typos. PR testsuite/100159 PR testsuite/100192 gcc/ChangeLog: * builtins.c (expand_builtin): Fix typos and missing comments. * dwarf2out.c (gen_subprogram_die): Likewise. (gen_struct_or_union_type_die): Likewise. gcc/fortran/ChangeLog: * frontend-passes.c (optimize_expr): Fix typos and missing comments. gcc/testsuite/ChangeLog: * g++.dg/template/nontype29.C: Fix typos and missing comments. * gcc.dg/Warray-bounds-64.c: Likewise. * gcc.dg/Warray-parameter.c: Likewise. * gcc.dg/Wstring-compare.c: Likewise. * gcc.dg/format/gcc_diag-11.c: Likewise. * gfortran.dg/array_constructor_3.f90: Likewise. * gfortran.dg/matmul_bounds_9.f90: Likewise. * gfortran.dg/pr78033.f90: Likewise. * gfortran.dg/pr96325.f90: Likewise. --- gcc/builtins.c | 2 +- gcc/dwarf2out.c | 4 ++-- gcc/fortran/frontend-passes.c | 2 +- gcc/testsuite/g++.dg/template/nontype29.C | 4 ++-- gcc/testsuite/gcc.dg/Warray-bounds-64.c | 2 +- gcc/testsuite/gcc.dg/Warray-parameter.c | 2 +- gcc/testsuite/gcc.dg/Wstring-compare.c | 10 +++++----- gcc/testsuite/gcc.dg/format/gcc_diag-11.c | 2 +- gcc/testsuite/gfortran.dg/array_constructor_3.f90 | 2 +- gcc/testsuite/gfortran.dg/matmul_bounds_9.f90 | 2 +- gcc/testsuite/gfortran.dg/pr78033.f90 | 2 +- gcc/testsuite/gfortran.dg/pr96325.f90 | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) (limited to 'gcc') diff --git a/gcc/builtins.c b/gcc/builtins.c index d30c4eb6..8c5324b 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -9986,7 +9986,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, machine_mode mode, break; /* Expand it as BUILT_IN_MEMCMP_EQ first. If not successful, change it - back to a BUILT_IN_STRCMP. Remember to delete the 3rd paramater + back to a BUILT_IN_STRCMP. Remember to delete the 3rd parameter when changing it to a strcmp call. */ case BUILT_IN_STRCMP_EQ: target = expand_builtin_memcmp (exp, target, true); diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index aba1684..c36fd5a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -23542,7 +23542,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) resolve_variable_values (); } - /* Generate child dies for template paramaters. */ + /* Generate child dies for template parameters. */ if (early_dwarf && debug_info_level > DINFO_LEVEL_TERSE) gen_generic_params_dies (decl); @@ -25471,7 +25471,7 @@ gen_struct_or_union_type_die (tree type, dw_die_ref context_die, scope_die = scope_die_for (type, context_die); - /* Generate child dies for template paramaters. */ + /* Generate child dies for template parameters. */ if (!type_die && debug_info_level > DINFO_LEVEL_TERSE) schedule_generic_params_dies_gen (type); diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 7d3eae6..93ac4b4 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -373,7 +373,7 @@ optimize_expr (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED, return 0; } -/* Auxiliary function to handle the arguments to reduction intrnisics. If the +/* Auxiliary function to handle the arguments to reduction intrinsics. If the function is a scalar, just copy it; otherwise returns the new element, the old one can be freed. */ diff --git a/gcc/testsuite/g++.dg/template/nontype29.C b/gcc/testsuite/g++.dg/template/nontype29.C index 18a3058..dd4e20f 100644 --- a/gcc/testsuite/g++.dg/template/nontype29.C +++ b/gcc/testsuite/g++.dg/template/nontype29.C @@ -3,7 +3,7 @@ // { dg-do compile } // { dg-options "-Wall" } -#if __cpluspls >= 201103L +#if __cplusplus >= 201103L // C++ 11 test case from comment #0. namespace comment_0 { @@ -60,7 +60,7 @@ void h () } // comment_2 -#if __cpluspls >= 201103L +#if __cplusplus >= 201103L // C++ 11 test case from comment #5. namespace comment_5 { diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-64.c b/gcc/testsuite/gcc.dg/Warray-bounds-64.c index 88b88de..f5ebc3d 100644 --- a/gcc/testsuite/gcc.dg/Warray-bounds-64.c +++ b/gcc/testsuite/gcc.dg/Warray-bounds-64.c @@ -7,7 +7,7 @@ asks for. { dg-do compile } - { dg-options "-O2 -Wall -Warray-parameter -Wno-vla-paramater" } */ + { dg-options "-O2 -Wall -Warray-parameter -Wno-vla-parameter" } */ #define NOIPA __attribute__ ((noipa)) diff --git a/gcc/testsuite/gcc.dg/Warray-parameter.c b/gcc/testsuite/gcc.dg/Warray-parameter.c index 42be310..6c5195a 100644 --- a/gcc/testsuite/gcc.dg/Warray-parameter.c +++ b/gcc/testsuite/gcc.dg/Warray-parameter.c @@ -5,7 +5,7 @@ Also verify that the array/pointer argument form in a mismatched redeclaration doesn't override the form in the initial declaration. { dg-do compile } - { dg-options "-Wall -Warray-parameter -Wno-vla-paramater" } */ + { dg-options "-Wall -Warray-parameter -Wno-vla-parameter" } */ /* Redclarations with the same or equivalent array form should not be dianosed. T[0] is diagnosed by -Wpedantic for being invalid diff --git a/gcc/testsuite/gcc.dg/Wstring-compare.c b/gcc/testsuite/gcc.dg/Wstring-compare.c index d1534bf..239bbfe 100644 --- a/gcc/testsuite/gcc.dg/Wstring-compare.c +++ b/gcc/testsuite/gcc.dg/Wstring-compare.c @@ -21,7 +21,7 @@ extern char b4[4]; void strcmp_array_lit (void) { if (strcmp (a4, "1234")) // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" } - // { dg-bogus "in this expreession" "unwanted note" { target *-*-* } .-1 } + // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 } sink (0, a4); int cmp; @@ -44,7 +44,7 @@ void strcmp_array_pstr (void) { if (strcmp (a4, s4)) // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" } - // { dg-bogus "in this expreession" "unwanted note" { target *-*-* } .-1 } + // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 } sink (1, a4); else sink (0, a4); @@ -86,7 +86,7 @@ void strcmp_array_copy (void) { strcpy (s, "1234"); if (strcmp (a4, s)) // { dg-warning "'strcmp' of a string of length 4 and an array of size 4 evaluates to nonzero" } - // { dg-bogus "in this expreession" "unwanted note" { target *-*-* } .-1 } + // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 } sink (1, a4); else sink (0, a4); @@ -131,7 +131,7 @@ void strcmp_member_array_lit (const struct S *p) void strncmp_array_lit (void) { if (strncmp (a4, "12345", 5)) // { dg-warning "'strncmp' of a string of length 5, an array of size 4 and bound of 5 evaluates to nonzero" } - // { dg-bogus "in this expreession" "unwanted note" { target *-*-* } .-1 } + // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 } sink (0, a4); int cmp; @@ -161,7 +161,7 @@ void strncmp_strarray_copy (void) char b[6]; strcpy (b, "12345"); if (strncmp (a, b, 5)) // { dg-warning "'strncmp' of strings of length 4 and 5 and bound of 5 evaluates to nonzero" } - // { dg-bogus "in this expreession" "unwanted note" { target *-*-* } .-1 } + // { dg-bogus "in this expression" "unwanted note" { target *-*-* } .-1 } sink (0, a, b); } diff --git a/gcc/testsuite/gcc.dg/format/gcc_diag-11.c b/gcc/testsuite/gcc.dg/format/gcc_diag-11.c index 262e7e5..80d24b6 100644 --- a/gcc/testsuite/gcc.dg/format/gcc_diag-11.c +++ b/gcc/testsuite/gcc.dg/format/gcc_diag-11.c @@ -375,7 +375,7 @@ void test_cdiag_identifier (tree t, gimple *gc) cdiag ("ident z_ with trailing underscore"); /* { dg-warning "unquoted identifier or keyword 'z_'" } */ cdiag ("v_ variable"); /* { dg-warning "unquoted identifier or keyword 'v_'" } */ cdiag ("call foo_bar"); /* { dg-warning "unquoted identifier or keyword 'foo_bar'" } */ - cdiag ("unqoted x_y ident"); /* { dg-warning "unquoted identifier or keyword 'x_y'" } */ + cdiag ("unquoted x_y ident"); /* { dg-warning "unquoted identifier or keyword 'x_y'" } */ cdiag ("size_t type"); /* { dg-warning "unquoted identifier or keyword 'size_t'" } */ cdiag ("bigger than INT_MAX");/* { dg-warning "unquoted identifier or keyword 'INT_MAX'" } */ diff --git a/gcc/testsuite/gfortran.dg/array_constructor_3.f90 b/gcc/testsuite/gfortran.dg/array_constructor_3.f90 index 7ddd1f4..37d40a4 100644 --- a/gcc/testsuite/gfortran.dg/array_constructor_3.f90 +++ b/gcc/testsuite/gfortran.dg/array_constructor_3.f90 @@ -1,5 +1,5 @@ ! { dg-do compile } ! Check that empty array constructors are rejected program hum - print *, (//) { dg-error "Empty array constructor" } + print *, (//) ! { dg-error "Empty array constructor" } end program hum diff --git a/gcc/testsuite/gfortran.dg/matmul_bounds_9.f90 b/gcc/testsuite/gfortran.dg/matmul_bounds_9.f90 index 5552e40..786e3e7 100644 --- a/gcc/testsuite/gfortran.dg/matmul_bounds_9.f90 +++ b/gcc/testsuite/gfortran.dg/matmul_bounds_9.f90 @@ -1,6 +1,6 @@ ! { dg-do run } ! { dg-options "-fbounds-check -ffrontend-optimize" } -! { dg-shouldfail "Fortran runtime error: Incorrect extent in argument B in MATMUL intrnisic for dimension 2: is 1, should be 2" } +! { dg-shouldfail "Fortran runtime error: Incorrect extent in argument B in MATMUL intrinsic for dimension 2: is 1, should be 2" } module x implicit none contains diff --git a/gcc/testsuite/gfortran.dg/pr78033.f90 b/gcc/testsuite/gfortran.dg/pr78033.f90 index ce794b3..9593521 100644 --- a/gcc/testsuite/gfortran.dg/pr78033.f90 +++ b/gcc/testsuite/gfortran.dg/pr78033.f90 @@ -14,7 +14,7 @@ subroutine f(n, x, y) y = [real(x), aimag(x)] y = [real(x(1:n)), aimag(x(1:n))] y = [real(knd) :: 1] - y = [real(kind=42) :: 1] { dg-error "Invalid type-spec" } + y = [real(kind=42) :: 1] ! { dg-error "Invalid type-spec" } y = [real(kind=knd) :: 1] y = [real(kind=knd, a=1.)] y = [real(a=1.)] diff --git a/gcc/testsuite/gfortran.dg/pr96325.f90 b/gcc/testsuite/gfortran.dg/pr96325.f90 index 62f4cfb..b6a86e8 100644 --- a/gcc/testsuite/gfortran.dg/pr96325.f90 +++ b/gcc/testsuite/gfortran.dg/pr96325.f90 @@ -15,7 +15,7 @@ type(t2) :: t integer :: a - a = t%r1%foo(1) { dg-error "is not an inquiry reference" } + a = t%r1%foo(1) ! { dg-error "is not an inquiry reference" } if (a == 42) stop end -- cgit v1.1 From ac456fd981db6b0c2f7ee1ab0d17d36087a74dc2 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 22 Apr 2021 19:14:58 +0200 Subject: testsuite/substr_{9,10}.f90: Move to gfortran.dg/ gcc/testsuite/ * substr_9.f90: Move to ... * gfortran.dg/substr_9.f90: ... here. * substr_10.f90: Move to ... * gfortran.dg/substr_10.f90: ... here. --- gcc/testsuite/gfortran.dg/substr_10.f90 | 11 +++++++++++ gcc/testsuite/gfortran.dg/substr_9.f90 | 28 ++++++++++++++++++++++++++++ gcc/testsuite/substr_10.f90 | 11 ----------- gcc/testsuite/substr_9.f90 | 28 ---------------------------- 4 files changed, 39 insertions(+), 39 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/substr_10.f90 create mode 100644 gcc/testsuite/gfortran.dg/substr_9.f90 delete mode 100644 gcc/testsuite/substr_10.f90 delete mode 100644 gcc/testsuite/substr_9.f90 (limited to 'gcc') diff --git a/gcc/testsuite/gfortran.dg/substr_10.f90 b/gcc/testsuite/gfortran.dg/substr_10.f90 new file mode 100644 index 0000000..918ca8a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/substr_10.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! PR93340 - test error handling of substring simplification + +subroutine p + integer,parameter :: k = len ('a'(:0)) + integer,parameter :: m = len ('a'(0:)) ! { dg-error "Substring start index" } + call foo ('bcd'(-8:-9)) + call foo ('bcd'(-9:-8)) ! { dg-error "Substring start index" } + call foo ('bcd'(:12)) ! { dg-error "Substring end index" } + call foo ('bcd'(-12:)) ! { dg-error "Substring start index" } +end diff --git a/gcc/testsuite/gfortran.dg/substr_9.f90 b/gcc/testsuite/gfortran.dg/substr_9.f90 new file mode 100644 index 0000000..73152d6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/substr_9.f90 @@ -0,0 +1,28 @@ +! { dg-do run } +! { dg-options "-std=gnu -fdump-tree-original" } +! PR93340 - issues with substrings in initializers + +program p + implicit none + integer, parameter :: m = 1 + character b(2) /'a', 'b' (1:1)/ + character c(2) /'a', 'bc' (1:1)/ + character d(2) /'a', 'bxyz'(m:m)/ + character e(2) + character f(2) + data e /'a', 'bxyz'( :1)/ + data f /'a', 'xyzb'(4:4)/ + character :: g(2) = [ 'a', 'b' (1:1) ] + character :: h(2) = [ 'a', 'bc'(1:1) ] + character :: k(2) = [ 'a', 'bc'(m:1) ] + if (b(2) /= "b") stop 1 + if (c(2) /= "b") stop 2 + if (d(2) /= "b") stop 3 + if (e(2) /= "b") stop 4 + if (f(2) /= "b") stop 5 + if (g(2) /= "b") stop 6 + if (h(2) /= "b") stop 7 + if (k(2) /= "b") stop 8 +end + +! { dg-final { scan-tree-dump-times "xyz" 0 "original" } } diff --git a/gcc/testsuite/substr_10.f90 b/gcc/testsuite/substr_10.f90 deleted file mode 100644 index 918ca8a..0000000 --- a/gcc/testsuite/substr_10.f90 +++ /dev/null @@ -1,11 +0,0 @@ -! { dg-do compile } -! PR93340 - test error handling of substring simplification - -subroutine p - integer,parameter :: k = len ('a'(:0)) - integer,parameter :: m = len ('a'(0:)) ! { dg-error "Substring start index" } - call foo ('bcd'(-8:-9)) - call foo ('bcd'(-9:-8)) ! { dg-error "Substring start index" } - call foo ('bcd'(:12)) ! { dg-error "Substring end index" } - call foo ('bcd'(-12:)) ! { dg-error "Substring start index" } -end diff --git a/gcc/testsuite/substr_9.f90 b/gcc/testsuite/substr_9.f90 deleted file mode 100644 index 73152d6..0000000 --- a/gcc/testsuite/substr_9.f90 +++ /dev/null @@ -1,28 +0,0 @@ -! { dg-do run } -! { dg-options "-std=gnu -fdump-tree-original" } -! PR93340 - issues with substrings in initializers - -program p - implicit none - integer, parameter :: m = 1 - character b(2) /'a', 'b' (1:1)/ - character c(2) /'a', 'bc' (1:1)/ - character d(2) /'a', 'bxyz'(m:m)/ - character e(2) - character f(2) - data e /'a', 'bxyz'( :1)/ - data f /'a', 'xyzb'(4:4)/ - character :: g(2) = [ 'a', 'b' (1:1) ] - character :: h(2) = [ 'a', 'bc'(1:1) ] - character :: k(2) = [ 'a', 'bc'(m:1) ] - if (b(2) /= "b") stop 1 - if (c(2) /= "b") stop 2 - if (d(2) /= "b") stop 3 - if (e(2) /= "b") stop 4 - if (f(2) /= "b") stop 5 - if (g(2) /= "b") stop 6 - if (h(2) /= "b") stop 7 - if (k(2) /= "b") stop 8 -end - -! { dg-final { scan-tree-dump-times "xyz" 0 "original" } } -- cgit v1.1 From 330cc29c06306ebf7bd3b2d37704cc69944923ff Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Thu, 22 Apr 2021 13:32:40 -0400 Subject: c++: Add testcase for already fixed PR [PR16617] We correctly diagnose the invalid access since r11-1350. gcc/testsuite/ChangeLog: PR c++/16617 * g++.dg/template/access36.C: New test. --- gcc/testsuite/g++.dg/template/access36.C | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/access36.C (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/template/access36.C b/gcc/testsuite/g++.dg/template/access36.C new file mode 100644 index 0000000..72ca23c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access36.C @@ -0,0 +1,25 @@ +// PR c++/16617 + +class B +{ + protected: + int i; +}; + +template void fr (); + +class D2 : public B +{ + friend void fr (); +}; + +template struct X +{}; + +template void fr () +{ + X<&B::i> x1; // { dg-error "protected" } + X<&D2::i> x2; // { dg-error "protected" } +} + +template void fr(); -- cgit v1.1 From 3275f2e2af24541f55462c23af4c6530ac12c5e2 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Thu, 22 Apr 2021 13:32:44 -0400 Subject: c++: Add testcase for already fixed PR [PR84689] We correctly accept this testcase since r11-1638. gcc/testsuite/ChangeLog: PR c++/84689 * g++.dg/cpp0x/sfinae67.C: New test. --- gcc/testsuite/g++.dg/cpp0x/sfinae67.C | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/sfinae67.C (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae67.C b/gcc/testsuite/g++.dg/cpp0x/sfinae67.C new file mode 100644 index 0000000..cfed92a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae67.C @@ -0,0 +1,20 @@ +// PR c++/84689 +// { dg-do compile { target c++11 } } + +struct base { + void operator()(); +}; + +struct a : base { }; +struct b : base { }; + +struct f : a, b { + using a::operator(); + using b::operator(); +}; + +template auto g(int) -> decltype(T()()); +template auto g(...) -> int; + +using type = decltype(g(0)); +using type = int; -- cgit v1.1 From 244dfb95119106e9267f37583caac565c39eb0ec Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Tue, 20 Apr 2021 20:24:09 -0400 Subject: c++: Prevent bogus -Wtype-limits warning with NTTP [PR100161] Recently, we made sure that we never call value_dependent_expression_p on an expression that isn't potential_constant_expression. That caused this bogus warning with a non-type template parameter, something that users don't want to see. The problem is that in tsubst_copy_and_build/LE_EXPR 't' is "i < n", which, due to 'i', is not p_c_e, therefore we call t_d_e_p. But the type of 'n' isn't dependent, so we think the whole 't' expression is not dependent. It seems we need to test both op0 and op1 separately to suppress this warning. gcc/cp/ChangeLog: PR c++/100161 * pt.c (tsubst_copy_and_build) : Test op0 and op1 separately for value- or type-dependence. gcc/testsuite/ChangeLog: PR c++/100161 * g++.dg/warn/Wtype-limits6.C: New test. --- gcc/cp/pt.c | 24 +++++++++++++++--------- gcc/testsuite/g++.dg/warn/Wtype-limits6.C | 17 +++++++++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wtype-limits6.C (limited to 'gcc') diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 7bcbe6d..8d64fef 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -19906,15 +19906,21 @@ tsubst_copy_and_build (tree t, case MEMBER_REF: case DOTSTAR_EXPR: { - /* If T was type-dependent, suppress warnings that depend on the range - of the types involved. */ - ++processing_template_decl; - const bool was_dep = (potential_constant_expression (t) - ? value_dependent_expression_p (t) - : type_dependent_expression_p (t)); - --processing_template_decl; - tree op0 = RECUR (TREE_OPERAND (t, 0)); - tree op1 = RECUR (TREE_OPERAND (t, 1)); + /* If either OP0 or OP1 was value- or type-dependent, suppress + warnings that depend on the range of the types involved. */ + tree op0 = TREE_OPERAND (t, 0); + tree op1 = TREE_OPERAND (t, 1); + auto dep_p = [](tree t) { + ++processing_template_decl; + bool r = (potential_constant_expression (t) + ? value_dependent_expression_p (t) + : type_dependent_expression_p (t)); + --processing_template_decl; + return r; + }; + const bool was_dep = dep_p (op0) || dep_p (op1); + op0 = RECUR (op0); + op1 = RECUR (op1); warning_sentinel s1(warn_type_limits, was_dep); warning_sentinel s2(warn_div_by_zero, was_dep); diff --git a/gcc/testsuite/g++.dg/warn/Wtype-limits6.C b/gcc/testsuite/g++.dg/warn/Wtype-limits6.C new file mode 100644 index 0000000..9d5886d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wtype-limits6.C @@ -0,0 +1,17 @@ +// PR c++/100161 +// { dg-additional-options "-Wtype-limits" } + +void f(unsigned); + +template +void g() +{ + for (unsigned i = 0; i < n; i++) { // { dg-bogus "always false" } + f(i); + } +} + +void h() +{ + g<0>(); +} -- cgit v1.1 From 92664c058d705fcaf57875f93b4dfc36cf011afd Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Thu, 22 Apr 2021 17:47:00 -0400 Subject: c++: Add testcase for already fixed PR [PR77435] We correctly accept this testcase since r8-1437. gcc/testsuite/ChangeLog: PR c++/77435 * g++.dg/template/partial-specialization9.C: New test. --- gcc/testsuite/g++.dg/template/partial-specialization9.C | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/partial-specialization9.C (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/template/partial-specialization9.C b/gcc/testsuite/g++.dg/template/partial-specialization9.C new file mode 100644 index 0000000..49f3500 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial-specialization9.C @@ -0,0 +1,7 @@ +// PR c++/77435 + +template struct S; +template struct S<0, T, A> {}; +int i; +S<0, int*, &i> r; // OK +S<0, int&, i> s; // error: aggregate 'S<0, int&, i> s' has incomplete type -- cgit v1.1 From 4e1aaf32ddf13cc79fcf146d6b62a6e0feb82be0 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Thu, 22 Apr 2021 17:47:02 -0400 Subject: c++: Add testcase for already fixed PR [PR94508] We correctly accept this testcase since r11-8144. gcc/testsuite/ChangeLog: PR c++/94508 * g++.dg/cpp2a/concepts-uneval3.C: New test. --- gcc/testsuite/g++.dg/cpp2a/concepts-uneval3.C | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-uneval3.C (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-uneval3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-uneval3.C new file mode 100644 index 0000000..7fc4065 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-uneval3.C @@ -0,0 +1,9 @@ +// PR c++/94508 +// { dg-do compile { target c++20 } } + +template +struct A { + void f() requires (this, true) { } +}; + +template struct A; -- cgit v1.1 From 0745b6fa66c69cc1e27547601298843c26f0e144 Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Thu, 22 Apr 2021 17:41:10 -0400 Subject: aix: Remove AIX 6.1 support. AIX 6.1 is past end of life and extended support. This patch removes the configuration option and references to AIX 6.1. contrib/ChangeLog: * config-list.mk: Remove rs6000-ibm-aix6.1. Rename rs6000-ibm-aix7.1 to powerpc-ibm-aix7.1. Add powerpc-ibm-aix7.2. gcc/ChangeLog: * config.gcc (powerpc-ibm-aix6.*): Remove. * config/rs6000/aix61.h: Delete. --- gcc/config.gcc | 9 -- gcc/config/rs6000/aix61.h | 214 ---------------------------------------------- 2 files changed, 223 deletions(-) delete mode 100644 gcc/config/rs6000/aix61.h (limited to 'gcc') diff --git a/gcc/config.gcc b/gcc/config.gcc index a020e08..e49e40f 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -3122,15 +3122,6 @@ pru*-*-*) extra_objs="pru-pragma.o pru-passes.o" use_gcc_stdint=wrap ;; -rs6000-ibm-aix6.* | powerpc-ibm-aix6.*) - tm_file="${tm_file} rs6000/aix.h rs6000/aix61.h rs6000/xcoff.h rs6000/aix-stdint.h" - tmake_file="rs6000/t-aix52 t-slibgcc" - extra_options="${extra_options} rs6000/aix64.opt" - use_collect2=yes - thread_file='aix' - use_gcc_stdint=wrap - default_use_cxa_atexit=yes - ;; rs6000-ibm-aix7.1.* | powerpc-ibm-aix7.1.*) tmake_file="rs6000/t-aix52 t-slibgcc" if test x$cpu_is_64bit = xyes; then diff --git a/gcc/config/rs6000/aix61.h b/gcc/config/rs6000/aix61.h deleted file mode 100644 index 78c179b..0000000 --- a/gcc/config/rs6000/aix61.h +++ /dev/null @@ -1,214 +0,0 @@ -/* Definitions of target machine for GNU compiler, - for IBM RS/6000 POWER running AIX V6.1. - Copyright (C) 2002-2021 Free Software Foundation, Inc. - Contributed by David Edelsohn (edelsohn@gnu.org). - - This file is part of GCC. - - GCC 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. - - GCC 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 GCC; see the file COPYING3. If not see - . */ - -/* The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to - get control in TARGET_OPTION_OVERRIDE. */ - -#define SUBTARGET_OVERRIDE_OPTIONS \ -do { \ - if (TARGET_64BIT && ! TARGET_POWERPC64) \ - { \ - rs6000_isa_flags |= OPTION_MASK_POWERPC64; \ - warning (0, "%<-maix64%> requires PowerPC64 architecture remain enabled"); \ - } \ - if (TARGET_SOFT_FLOAT && TARGET_LONG_DOUBLE_128) \ - { \ - rs6000_long_double_type_size = 64; \ - if (global_options_set.x_rs6000_long_double_type_size) \ - warning (0, "soft-float and long-double-128 are incompatible"); \ - } \ - if (TARGET_POWERPC64 && ! TARGET_64BIT) \ - { \ - error ("%<-maix64%> required: 64-bit computation with 32-bit addressing not yet supported"); \ - } \ - if ((rs6000_isa_flags_explicit \ - & OPTION_MASK_MINIMAL_TOC) != 0) \ - { \ - if (global_options_set.x_rs6000_current_cmodel \ - && rs6000_current_cmodel != CMODEL_SMALL) \ - error ("%<-mcmodel%> incompatible with other toc options"); \ - SET_CMODEL (CMODEL_SMALL); \ - } \ - if (rs6000_current_cmodel != CMODEL_SMALL) \ - { \ - TARGET_NO_FP_IN_TOC = 1; \ - TARGET_NO_SUM_IN_TOC = 1; \ - } \ - if (rs6000_current_cmodel == CMODEL_MEDIUM) \ - { \ - rs6000_current_cmodel = CMODEL_LARGE; \ - } \ -} while (0) - -#undef ASM_SPEC -#define ASM_SPEC "-u %{maix64:-a64 %{!mcpu*:-mppc64}} %(asm_cpu)" - -/* Common ASM definitions used by ASM_SPEC amongst the various targets for - handling -mcpu=xxx switches. There is a parallel list in driver-rs6000.c to - provide the default assembler options if the user uses -mcpu=native, so if - you make changes here, make them there also. */ -#undef ASM_CPU_SPEC -#define ASM_CPU_SPEC \ -"%{!mcpu*: %{!maix64: \ - %{mpowerpc64: -mppc64} \ - %{maltivec: -m970} \ - %{!maltivec: %{!mpowerpc64: %(asm_default)}}}} \ -%{mcpu=native: %(asm_cpu_native)} \ -%{mcpu=power3: -m620} \ -%{mcpu=power4: -mpwr4} \ -%{mcpu=power5: -mpwr5} \ -%{mcpu=power5+: -mpwr5x} \ -%{mcpu=power6: -mpwr6} \ -%{mcpu=power6x: -mpwr6} \ -%{mcpu=power7: -mpwr7} \ -%{mcpu=power8: -mpwr8} \ -%{mcpu=power9: -mpwr9} \ -%{mcpu=powerpc: -mppc} \ -%{mcpu=rs64a: -mppc} \ -%{mcpu=603: -m603} \ -%{mcpu=603e: -m603} \ -%{mcpu=604: -m604} \ -%{mcpu=604e: -m604} \ -%{mcpu=620: -m620} \ -%{mcpu=630: -m620} \ -%{mcpu=970: -m970} \ -%{mcpu=G5: -m970} \ -%{mvsx: %{!mcpu*: -mpwr6}} \ --many" - -#undef ASM_DEFAULT_SPEC -#define ASM_DEFAULT_SPEC "-mpwr4" - -#undef TARGET_OS_CPP_BUILTINS -#define TARGET_OS_CPP_BUILTINS() \ - do \ - { \ - builtin_define ("_AIX43"); \ - builtin_define ("_AIX51"); \ - builtin_define ("_AIX52"); \ - builtin_define ("_AIX53"); \ - builtin_define ("_AIX61"); \ - TARGET_OS_AIX_CPP_BUILTINS (); \ - } \ - while (0) - -#undef CPP_SPEC -#define CPP_SPEC "%{posix: -D_POSIX_SOURCE} \ - %{ansi: -D_ANSI_C_SOURCE} \ - %{maix64: -D__64BIT__} \ - %{mpe: -I%R/usr/lpp/ppe.poe/include} \ - %{pthread: -D_THREAD_SAFE}" - -/* The GNU C++ standard library requires that these macros be - defined. Synchronize with libstdc++ os_defines.h. */ -#undef CPLUSPLUS_CPP_SPEC -#define CPLUSPLUS_CPP_SPEC \ - "-D_ALL_SOURCE -D__COMPATMATH__ \ - %{maix64: -D__64BIT__} \ - %{mpe: -I%R/usr/lpp/ppe.poe/include} \ - %{pthread: -D_THREAD_SAFE}" - -#undef TARGET_DEFAULT -#define TARGET_DEFAULT (MASK_PPC_GPOPT | MASK_PPC_GFXOPT | MASK_MFCRF) - -#undef PROCESSOR_DEFAULT -#define PROCESSOR_DEFAULT PROCESSOR_POWER7 -#undef PROCESSOR_DEFAULT64 -#define PROCESSOR_DEFAULT64 PROCESSOR_POWER7 - -/* AIX 6.1 kernel and assembler have necessary support for Altivec and VSX. */ -#undef OS_MISSING_ALTIVEC - -/* Define this macro as a C expression for the initializer of an - array of string to tell the driver program which options are - defaults for this target and thus do not need to be handled - specially when using `MULTILIB_OPTIONS'. - - Do not define this macro if `MULTILIB_OPTIONS' is not defined in - the target makefile fragment or if none of the options listed in - `MULTILIB_OPTIONS' are set by default. *Note Target Fragment::. */ - -#undef MULTILIB_DEFAULTS - -#undef LIB_SPEC -#define LIB_SPEC "%{pg:-L%R/lib/profiled -L%R/usr/lib/profiled}\ - %{p:-L%R/lib/profiled -L%R/usr/lib/profiled}\ - %{!maix64:%{!shared:%{g*:-lg}}}\ - %{fprofile-arcs|fprofile-generate*|coverage:-lpthreads}\ - %{mpe:-L%R/usr/lpp/ppe.poe/lib -lmpi -lvtd}\ - %{mlong-double-128:-lc128}\ - %{pthread:-lpthreads} -lc" - -#undef LINK_SPEC -#define LINK_SPEC "-bpT:0x10000000 -bpD:0x20000000 %{!r:-btextro}\ - %{static:-bnso %(link_syscalls) } %{shared:-bM:SRE %{!e:-bnoentry}}\ - %{!maix64:%{!shared:%{g*: %(link_libg) }}} %{maix64:-b64}\ - %{mpe:-binitfini:poe_remote_main}" - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC "%{!shared:\ - %{maix64:%{pg:gcrt0_64%O%s}%{!pg:%{p:mcrt0_64%O%s}%{!p:crt0_64%O%s}}}\ - %{!maix64:\ - %{pthread:%{pg:gcrt0_r%O%s}%{!pg:%{p:mcrt0_r%O%s}%{!p:crt0_r%O%s}}}\ - %{!pthread:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}}}\ - %{shared:crtcxa_s%O%s;:crtcxa%O%s} crtdbase%O%s" - -/* AIX V5 typedefs ptrdiff_t as "long" while earlier releases used "int". */ - -#undef PTRDIFF_TYPE -#define PTRDIFF_TYPE "long int" - -/* Type used for wchar_t, as a string used in a declaration. */ -#undef WCHAR_TYPE -#define WCHAR_TYPE (!TARGET_64BIT ? "short unsigned int" : "unsigned int") - -/* Width of wchar_t in bits. */ -#undef WCHAR_TYPE_SIZE -#define WCHAR_TYPE_SIZE (!TARGET_64BIT ? 16 : 32) - -/* AIX 4.2 and above provides initialization and finalization function - support from linker command line. */ -#undef HAS_INIT_SECTION -#define HAS_INIT_SECTION - -#undef LD_INIT_SWITCH -#define LD_INIT_SWITCH "-binitfini" - -#ifndef _AIX52 -extern long long int atoll(const char *); -#endif - -/* This target uses the aix64.opt file. */ -#define TARGET_USES_AIX64_OPT 1 - -/* Large TOC Support */ -#ifdef HAVE_LD_LARGE_TOC -#undef TARGET_CMODEL -#define TARGET_CMODEL rs6000_current_cmodel -#define SET_CMODEL(opt) rs6000_current_cmodel = opt -#else -#define SET_CMODEL(opt) do {} while (0) -#endif - -/* This target defines SUPPORTS_WEAK and TARGET_ASM_NAMED_SECTION, - but does not have crtbegin/end. */ - -#define TARGET_AIX_VERSION 61 -- cgit v1.1 From 6a2f49c6999fa2c7a3a8cb05005d21f8020d674d Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Tue, 14 Jan 2020 13:12:59 -0500 Subject: aix: Switch AIX configurtion to DWARF2 debugging This patch is in preparation for removing stabs debugging support from GCC. The rs6000 configuration files remain somewhat intertwined with the stabs debugging support, but the configuration no longer generates stabs debugging information. This patch means that earlier releases (Technology Levels) of AIX 7.1 and 7.2, prior to DWARF support and fixes, cannot build GCC or support GCC. gcc/ChangeLog: * config/rs6000/aix71.h (PREFERRED_DEBUGGING_TYPE): Change to DWARF2_DEBUG. * config/rs6000/aix72.h (PREFERRED_DEBUGGING_TYPE): Same. --- gcc/config/rs6000/aix71.h | 4 ++-- gcc/config/rs6000/aix72.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'gcc') diff --git a/gcc/config/rs6000/aix71.h b/gcc/config/rs6000/aix71.h index 3612ed2..807e260 100644 --- a/gcc/config/rs6000/aix71.h +++ b/gcc/config/rs6000/aix71.h @@ -272,9 +272,9 @@ extern long long int atoll(const char *); #define TARGET_AIX_VERSION 71 -/* AIX 7.1 supports DWARF3 debugging, but XCOFF remains the default. */ +/* AIX 7.1 supports DWARF3+ debugging. */ #define DWARF2_DEBUGGING_INFO 1 -#define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG +#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG #define DEBUG_INFO_SECTION "0x10000" #define DEBUG_LINE_SECTION "0x20000" #define DEBUG_PUBNAMES_SECTION "0x30000" diff --git a/gcc/config/rs6000/aix72.h b/gcc/config/rs6000/aix72.h index d349092..36c5d99 100644 --- a/gcc/config/rs6000/aix72.h +++ b/gcc/config/rs6000/aix72.h @@ -273,9 +273,9 @@ extern long long int atoll(const char *); #define TARGET_AIX_VERSION 72 -/* AIX 7.2 supports DWARF3 debugging, but XCOFF remains the default. */ +/* AIX 7.2 supports DWARF3+ debugging. */ #define DWARF2_DEBUGGING_INFO 1 -#define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG +#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG #define DEBUG_INFO_SECTION "0x10000" #define DEBUG_LINE_SECTION "0x20000" #define DEBUG_PUBNAMES_SECTION "0x30000" -- cgit v1.1 From e3948473e927a7c3197ce1a63628fe427f15f6c6 Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Fri, 23 Apr 2021 00:16:25 +0000 Subject: Daily bump. --- gcc/ChangeLog | 25 ++++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/cp/ChangeLog | 6 +++++ gcc/fortran/ChangeLog | 14 +++++++++++ gcc/testsuite/ChangeLog | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fb2cecb..ad64a12 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,28 @@ +2021-04-23 David Edelsohn + + * config/rs6000/aix71.h (PREFERRED_DEBUGGING_TYPE): Change to + DWARF2_DEBUG. + * config/rs6000/aix72.h (PREFERRED_DEBUGGING_TYPE): Same. + +2021-04-22 David Edelsohn + + * config.gcc (powerpc-ibm-aix6.*): Remove. + * config/rs6000/aix61.h: Delete. + +2021-04-22 Martin Liska + + PR testsuite/100159 + PR testsuite/100192 + * builtins.c (expand_builtin): Fix typos and missing comments. + * dwarf2out.c (gen_subprogram_die): Likewise. + (gen_struct_or_union_type_die): Likewise. + +2021-04-22 Uroš Bizjak + + PR target/100119 + * config/i386/i386-expand.c (ix86_expand_convert_uns_sidf_sse): + Remove the sign with FE_DOWNWARD, where x - x = -0.0. + 2021-04-21 Iain Sandoe * config/i386/darwin.h (TARGET_64BIT): Remove definition diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 87bf2ff..7e3f420 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210422 +20210423 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 89cb361..7233833 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2021-04-22 Marek Polacek + + PR c++/100161 + * pt.c (tsubst_copy_and_build) : Test op0 and + op1 separately for value- or type-dependence. + 2021-04-21 Marek Polacek PR c++/96380 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index de0de2e..4764f4a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,17 @@ +2021-04-22 Martin Liska + + PR testsuite/100159 + PR testsuite/100192 + * frontend-passes.c (optimize_expr): Fix typos and missing comments. + +2021-04-22 Michael Meissner + + PR fortran/96983 + * trans-intrinsic.c (build_round_expr): If int type is larger than + long long, do the round and convert to the integer type. Do not + try to find a floating point type the exact size of the integer + type. + 2021-04-21 Tobias Burnus * dump-parse-tree.c (show_omp_namelist): Handle depobj + mutexinoutset diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d7e47c1..2988817 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,70 @@ +2021-04-22 Patrick Palka + + PR c++/94508 + * g++.dg/cpp2a/concepts-uneval3.C: New test. + +2021-04-22 Patrick Palka + + PR c++/77435 + * g++.dg/template/partial-specialization9.C: New test. + +2021-04-22 Marek Polacek + + PR c++/100161 + * g++.dg/warn/Wtype-limits6.C: New test. + +2021-04-22 Patrick Palka + + PR c++/84689 + * g++.dg/cpp0x/sfinae67.C: New test. + +2021-04-22 Patrick Palka + + PR c++/16617 + * g++.dg/template/access36.C: New test. + +2021-04-22 Tobias Burnus + + * substr_9.f90: Move to ... + * gfortran.dg/substr_9.f90: ... here. + * substr_10.f90: Move to ... + * gfortran.dg/substr_10.f90: ... here. + +2021-04-22 Martin Liska + + PR testsuite/100159 + PR testsuite/100192 + * g++.dg/template/nontype29.C: Fix typos and missing comments. + * gcc.dg/Warray-bounds-64.c: Likewise. + * gcc.dg/Warray-parameter.c: Likewise. + * gcc.dg/Wstring-compare.c: Likewise. + * gcc.dg/format/gcc_diag-11.c: Likewise. + * gfortran.dg/array_constructor_3.f90: Likewise. + * gfortran.dg/matmul_bounds_9.f90: Likewise. + * gfortran.dg/pr78033.f90: Likewise. + * gfortran.dg/pr96325.f90: Likewise. + +2021-04-22 Uroš Bizjak + + PR target/100119 + * gcc.target/i386/pr100119.c: New test. + +2021-04-22 Christophe Lyon + + PR target/99988 + * gcc.target/aarch64/pr99988.c: Skip if not lp64 target. + +2021-04-22 Tobias Burnus + + * gfortran.dg/set_vm_limit.c (set_vm_limit): Call getrlimit, use + obtained hard limit, and only call setrlimit if new softlimit is lower. + +2021-04-22 Richard Biener + + PR testsuite/100176 + * objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c: Add + missing return. + 2021-04-21 David Edelsohn * gfortran.dg/bind_c_array_params_2.f90: Look for AIX-specific call -- cgit v1.1 From 342de04d993beaa644d0b0087c20bef5dad5bf5f Mon Sep 17 00:00:00 2001 From: liuhongt Date: Fri, 16 Apr 2021 11:29:10 +0800 Subject: MASK_AVX256_SPLIT_UNALIGNED_STORE/LOAD should be cleared in opts->x_target_flags when X86_TUNE_AVX256_UNALIGNED_LOAD/STORE_OPTIMAL is enabled by target attribute. gcc/ChangeLog: PR target/100093 * config/i386/i386-options.c (ix86_option_override_internal): Clear MASK_AVX256_SPLIT_UNALIGNED_LOAD/STORE in x_target_flags when X86_TUNE_AVX256_UNALIGNED_LOAD/STORE_OPTIMAL is enabled by target attribute. gcc/testsuite/ChangeLog: PR target/100093 * gcc.target/i386/pr100093.c: New test. --- gcc/config/i386/i386-options.c | 7 +++++++ gcc/testsuite/gcc.target/i386/pr100093.c | 12 ++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr100093.c (limited to 'gcc') diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c index 2a12228..2f3d40c 100644 --- a/gcc/config/i386/i386-options.c +++ b/gcc/config/i386/i386-options.c @@ -2618,9 +2618,16 @@ ix86_option_override_internal (bool main_args_p, if (!ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL] && !(opts_set->x_target_flags & MASK_AVX256_SPLIT_UNALIGNED_LOAD)) opts->x_target_flags |= MASK_AVX256_SPLIT_UNALIGNED_LOAD; + else if (!main_args_p + && ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL]) + opts->x_target_flags &= ~MASK_AVX256_SPLIT_UNALIGNED_LOAD; + if (!ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_STORE_OPTIMAL] && !(opts_set->x_target_flags & MASK_AVX256_SPLIT_UNALIGNED_STORE)) opts->x_target_flags |= MASK_AVX256_SPLIT_UNALIGNED_STORE; + else if (!main_args_p + && ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_STORE_OPTIMAL]) + opts->x_target_flags &= ~MASK_AVX256_SPLIT_UNALIGNED_STORE; /* Enable 128-bit AVX instruction generation for the auto-vectorizer. */ diff --git a/gcc/testsuite/gcc.target/i386/pr100093.c b/gcc/testsuite/gcc.target/i386/pr100093.c new file mode 100644 index 0000000..f32a4bc --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr100093.c @@ -0,0 +1,12 @@ +/* PR target/100093 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -march=znver1" } */ +/* { dg-final { scan-assembler-not "vextractf128" } } */ + +__attribute__((target("tune=skylake-avx512"))) +void fill_avx2(double *__restrict__ data, int n, double value) +{ + for (int i = 0; i < n * 16; i++) { + data[i] = value; + } +} -- cgit v1.1 From 700e542971251b11623cce877075567815f72965 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 9 Apr 2021 09:35:51 +0200 Subject: tree-optimization/99971 - improve BB vect dependence analysis We can use TBAA even when we have a DR, do so. For the testcase that means fully vectorizing it instead of only vectorizing the first store group resulting in suboptimal code. 2021-04-09 Richard Biener PR tree-optimization/99971 * tree-vect-data-refs.c (vect_slp_analyze_node_dependences): Always use TBAA for loads. * g++.dg/vect/slp-pr99971.cc: New testcase. --- gcc/testsuite/g++.dg/vect/slp-pr99971.cc | 36 ++++++++++++++++++++++++++++++++ gcc/tree-vect-data-refs.c | 18 +++++++++------- 2 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/vect/slp-pr99971.cc (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/vect/slp-pr99971.cc b/gcc/testsuite/g++.dg/vect/slp-pr99971.cc new file mode 100644 index 0000000..bec6418 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/slp-pr99971.cc @@ -0,0 +1,36 @@ +// { dg-do compile } +// { dg-require-effective-target vect_int } + +struct A +{ + unsigned int a, b, c, d; + + A& operator+= (A const& that) + { + a += that.a; + b += that.b; + c += that.c; + d += that.d; + return *this; + } + + A& operator-= (A const& that) + { + a -= that.a; + b -= that.b; + c -= that.c; + d -= that.d; + return *this; + } +}; + +void test(A& x, A const& y1, A const& y2) +{ + x += y1; + x -= y2; +} + +// We want to SLP vectorize a single connected SLP subgraph with two instances +// { dg-final { scan-tree-dump-not "removing SLP instance" "slp2" } } +// { dg-final { scan-tree-dump-times "SLPing BB part" 1 "slp2" } } +// { dg-final { scan-tree-dump-times "Vectorizing SLP" 2 "slp2" } } diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 97c8577..b317df5 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -780,16 +780,20 @@ vect_slp_analyze_node_dependences (vec_info *vinfo, slp_tree node, stmt we have to resort to the alias oracle. */ stmt_vec_info stmt_info = vinfo->lookup_stmt (stmt); data_reference *dr_b = STMT_VINFO_DATA_REF (stmt_info); - if (!dr_b) + + /* We are hoisting a load - this means we can use + TBAA for disambiguation. */ + if (!ref_initialized_p) + ao_ref_init (&ref, DR_REF (dr_a)); + if (stmt_may_clobber_ref_p_1 (stmt, &ref, true)) { - /* We are hoisting a load - this means we can use - TBAA for disambiguation. */ - if (!ref_initialized_p) - ao_ref_init (&ref, DR_REF (dr_a)); - if (stmt_may_clobber_ref_p_1 (stmt, &ref, true)) + if (!dr_b) return false; - continue; + /* Resort to dependence checking below. */ } + else + /* No dependence. */ + continue; bool dependent = false; /* If we run into a store of this same instance (we've just -- cgit v1.1 From cbca62831cb7c1c7c20d67fcf929f156b09923bf Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Fri, 12 Mar 2021 14:32:07 +0100 Subject: c++: Use STATIC_ASSERT for OVL_OP_MAX. gcc/cp/ChangeLog: * cp-tree.h (STATIC_ASSERT): Prefer static assert. * lex.c (init_operators): Remove run-time check. --- gcc/cp/cp-tree.h | 3 +++ gcc/cp/lex.c | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 23a77a2..cb254e0 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5922,6 +5922,9 @@ enum ovl_op_code { OVL_OP_MAX }; +/* Make sure it fits in lang_decl_fn::ovl_op_code. */ +STATIC_ASSERT (OVL_OP_MAX < (1 << 6)); + struct GTY(()) ovl_op_info_t { /* The IDENTIFIER_NODE for the operator. */ tree identifier; diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index 73e14b8..43abd01 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -166,8 +166,6 @@ init_operators (void) if (op_ptr->name) { - /* Make sure it fits in lang_decl_fn::operator_code. */ - gcc_checking_assert (op_ptr->ovl_op_code < (1 << 6)); tree ident = set_operator_ident (op_ptr); if (unsigned index = IDENTIFIER_CP_INDEX (ident)) { -- cgit v1.1 From b26485f1af45423980b7bc1206411cf4b8bb84b6 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 14 Apr 2021 12:48:37 +0200 Subject: Avoid more temporaries in IVOPTs This avoids use of valid_gimple_rhs_p and instead gimplifies to such a RHS, avoiding more SSA copies being generated by IVOPTs. 2021-04-14 Richard Biener * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Avoid valid_gimple_rhs_p by instead gimplifying to one. --- gcc/tree-ssa-loop-ivopts.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'gcc') diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 4012ae3..12a8a49 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -7286,12 +7286,13 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data, } comp = fold_convert (type, comp); - if (!valid_gimple_rhs_p (comp) - || (gimple_code (use->stmt) != GIMPLE_PHI - /* We can't allow re-allocating the stmt as it might be pointed - to still. */ - && (get_gimple_rhs_num_ops (TREE_CODE (comp)) - >= gimple_num_ops (gsi_stmt (bsi))))) + comp = force_gimple_operand (comp, &seq, false, NULL); + gimple_seq_add_seq (&stmt_list, seq); + if (gimple_code (use->stmt) != GIMPLE_PHI + /* We can't allow re-allocating the stmt as it might be pointed + to still. */ + && (get_gimple_rhs_num_ops (TREE_CODE (comp)) + >= gimple_num_ops (gsi_stmt (bsi)))) { comp = force_gimple_operand (comp, &seq, true, NULL); gimple_seq_add_seq (&stmt_list, seq); -- cgit v1.1 From 500305a92ef85e6b87ad428a35221c62f4037b93 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 23 Apr 2021 11:16:52 +0200 Subject: tree-optimization/100222 - remove redundant mark_irreducible_loops calls loop_optimizer_init (LOOPS_NORMAL) already performs this (quite expensive) marking. 2021-04-23 Richard Biener PR tree-optimization/100222 * predict.c (pass_profile::execute): Remove redundant call to mark_irreducible_loops. (report_predictor_hitrates): Likewise. --- gcc/predict.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'gcc') diff --git a/gcc/predict.c b/gcc/predict.c index d0a8e5f8..dc2327d 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -4096,8 +4096,6 @@ pass_profile::execute (function *fun) if (dump_file && (dump_flags & TDF_DETAILS)) flow_loops_dump (dump_file, NULL, 0); - mark_irreducible_loops (); - nb_loops = number_of_loops (fun); if (nb_loops > 1) scev_initialize (); @@ -4320,8 +4318,6 @@ report_predictor_hitrates (void) if (dump_file && (dump_flags & TDF_DETAILS)) flow_loops_dump (dump_file, NULL, 0); - mark_irreducible_loops (); - nb_loops = number_of_loops (cfun); if (nb_loops > 1) scev_initialize (); -- cgit v1.1 From 58ad6b2802592f1448eed48e8ad4e0e87985cecb Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 25 Feb 2021 11:31:37 +0100 Subject: First do add_noreturn_fake_exit_edges in connect_infinite_loops_to_exit Most callers of connect_infinite_loops_to_exit already do this but the few that do not end up with extra exit edges. The following makes that consistent, also matching the post-dominance DFS walk code. 2021-02-25 Richard Biener * cfganal.c (connect_infinite_loops_to_exit): First call add_noreturn_fake_exit_edges. * ipa-sra.c (process_scan_results): Do not call the now redundant add_noreturn_fake_exit_edges. * predict.c (tree_estimate_probability): Likewise. (rebuild_frequencies): Likewise. * store-motion.c (one_store_motion_pass): Likewise. --- gcc/cfganal.c | 10 +++++++--- gcc/ipa-sra.c | 1 - gcc/predict.c | 2 -- gcc/store-motion.c | 1 - 4 files changed, 7 insertions(+), 7 deletions(-) (limited to 'gcc') diff --git a/gcc/cfganal.c b/gcc/cfganal.c index 2627c2f..cec5abe 100644 --- a/gcc/cfganal.c +++ b/gcc/cfganal.c @@ -582,9 +582,9 @@ add_noreturn_fake_exit_edges (void) make_single_succ_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE); } -/* This function adds a fake edge between any infinite loops to the - exit block. Some optimizations require a path from each node to - the exit node. +/* This function adds a fake edge between any noreturn block and + infinite loops to the exit block. Some optimizations require a path + from each node to the exit node. See also Morgan, Figure 3.10, pp. 82-83. @@ -596,6 +596,10 @@ add_noreturn_fake_exit_edges (void) void connect_infinite_loops_to_exit (void) { + /* First add fake exits to noreturn blocks, this is required to + discover only truly infinite loops below. */ + add_noreturn_fake_exit_edges (); + /* Perform depth-first search in the reverse graph to find nodes reachable from the exit block. */ depth_first_search dfs; diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c index 1571921..7a89906 100644 --- a/gcc/ipa-sra.c +++ b/gcc/ipa-sra.c @@ -2394,7 +2394,6 @@ process_scan_results (cgraph_node *node, struct function *fun, if (!pdoms_calculated) { gcc_checking_assert (cfun); - add_noreturn_fake_exit_edges (); connect_infinite_loops_to_exit (); calculate_dominance_info (CDI_POST_DOMINATORS); pdoms_calculated = true; diff --git a/gcc/predict.c b/gcc/predict.c index dc2327d..5d0cae5 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -3106,7 +3106,6 @@ tree_estimate_probability (bool dry_run) { basic_block bb; - add_noreturn_fake_exit_edges (); connect_infinite_loops_to_exit (); /* We use loop_niter_by_eval, which requires that the loops have preheaders. */ @@ -4289,7 +4288,6 @@ rebuild_frequencies (void) if (profile_status_for_fn (cfun) == PROFILE_GUESSED) { loop_optimizer_init (0); - add_noreturn_fake_exit_edges (); mark_irreducible_loops (); connect_infinite_loops_to_exit (); estimate_bb_frequencies (true); diff --git a/gcc/store-motion.c b/gcc/store-motion.c index f0401ca..3f6e003 100644 --- a/gcc/store-motion.c +++ b/gcc/store-motion.c @@ -1152,7 +1152,6 @@ one_store_motion_pass (void) /* Now compute kill & transp vectors. */ build_store_vectors (); - add_noreturn_fake_exit_edges (); connect_infinite_loops_to_exit (); edge_list = pre_edge_rev_lcm (num_stores, st_transp, st_avloc, -- cgit v1.1 From 35b2be219fc1934ae040d045e355680a83d839c4 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 14 Apr 2021 10:53:30 +0200 Subject: VEC_COND_EXPR code cleanup This removes now unnecessary special-casings of VEC_COND_EXPRs after making its first operand a gimple value. 2021-04-14 Richard Biener * genmatch.c (lower_cond): Remove VEC_COND_EXPR special-casing. (capture_info::capture_info): Likewise. (capture_info::walk_match): Likewise. (expr::gen_transform): Likewise. (dt_simplify::gen_1): Likewise. * gimple-match-head.c (maybe_resimplify_conditional_op): Remove VEC_COND_EXPR special-casing. (gimple_simplify): Likewise. * gimple.c (gimple_could_trap_p_1): Adjust. * tree-ssa-pre.c (compute_avail): Allow VEC_COND_EXPR to participate in PRE. --- gcc/genmatch.c | 20 +++++++------------- gcc/gimple-match-head.c | 9 ++++----- gcc/gimple.c | 7 +++++-- gcc/tree-ssa-pre.c | 9 ++++----- 4 files changed, 20 insertions(+), 25 deletions(-) (limited to 'gcc') diff --git a/gcc/genmatch.c b/gcc/genmatch.c index 8311f5d..5db1d96 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -1210,7 +1210,7 @@ lower_opt (simplify *s, vec& simplifiers) } } -/* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a +/* Lower the compare operand of COND_EXPRs to a GENERIC and a GIMPLE variant. */ static vec @@ -1257,8 +1257,7 @@ lower_cond (operand *o) /* If this is a COND with a captured expression or an expression with two operands then also match a GENERIC form on the compare. */ - if ((*e->operation == COND_EXPR - || *e->operation == VEC_COND_EXPR) + if (*e->operation == COND_EXPR && ((is_a (e->ops[0]) && as_a (e->ops[0])->what && is_a (as_a (e->ops[0])->what) @@ -1296,7 +1295,7 @@ lower_cond (operand *o) return ro; } -/* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a +/* Lower the compare operand of COND_EXPRs to a GENERIC and a GIMPLE variant. */ static void @@ -2132,9 +2131,7 @@ capture_info::capture_info (simplify *s, operand *result, bool gimple_) (i != 0 && *e->operation == COND_EXPR) || *e->operation == TRUTH_ANDIF_EXPR || *e->operation == TRUTH_ORIF_EXPR, - i == 0 - && (*e->operation == COND_EXPR - || *e->operation == VEC_COND_EXPR)); + i == 0 && *e->operation == COND_EXPR); walk_result (s->result, false, result); } @@ -2197,8 +2194,7 @@ capture_info::walk_match (operand *o, unsigned toplevel_arg, || *e->operation == TRUTH_ORIF_EXPR) cond_p = true; if (i == 0 - && (*e->operation == COND_EXPR - || *e->operation == VEC_COND_EXPR)) + && *e->operation == COND_EXPR) expr_cond_p = true; walk_match (e->ops[i], toplevel_arg, cond_p, expr_cond_p); } @@ -2494,8 +2490,7 @@ expr::gen_transform (FILE *f, int indent, const char *dest, bool gimple, i == 0 ? NULL : op0type); ops[i]->gen_transform (f, indent, dest1, gimple, depth + 1, optype1, cinfo, indexes, - (*opr == COND_EXPR - || *opr == VEC_COND_EXPR) && i == 0 ? 1 : 2); + *opr == COND_EXPR && i == 0 ? 1 : 2); } const char *opr_name; @@ -3417,8 +3412,7 @@ dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result) into COND_EXPRs. */ int cond_handling = 0; if (!is_predicate) - cond_handling = ((*opr == COND_EXPR - || *opr == VEC_COND_EXPR) && j == 0) ? 1 : 2; + cond_handling = (*opr == COND_EXPR && j == 0) ? 1 : 2; e->ops[j]->gen_transform (f, indent, dest, true, 1, optype, &cinfo, indexes, cond_handling); } diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c index d941b8b..84fbaef 100644 --- a/gcc/gimple-match-head.c +++ b/gcc/gimple-match-head.c @@ -147,10 +147,10 @@ maybe_resimplify_conditional_op (gimple_seq *seq, gimple_match_op *res_op, tree_code op_code = (tree_code) res_op->code; bool op_could_trap; - /* COND_EXPR and VEC_COND_EXPR will trap if, and only if, the condition + /* COND_EXPR will trap if, and only if, the condition traps and hence we have to check this. For all other operations, we don't need to consider the operands. */ - if (op_code == COND_EXPR || op_code == VEC_COND_EXPR) + if (op_code == COND_EXPR) op_could_trap = generic_expr_could_trap_p (res_op->ops[0]); else op_could_trap = operation_could_trap_p ((tree_code) res_op->code, @@ -961,10 +961,9 @@ gimple_simplify (gimple *stmt, gimple_match_op *res_op, gimple_seq *seq, { bool valueized = false; tree rhs1 = gimple_assign_rhs1 (stmt); - /* If this is a [VEC_]COND_EXPR first try to simplify an + /* If this is a COND_EXPR first try to simplify an embedded GENERIC condition. */ - if (code == COND_EXPR - || code == VEC_COND_EXPR) + if (code == COND_EXPR) { if (COMPARISON_CLASS_P (rhs1)) { diff --git a/gcc/gimple.c b/gcc/gimple.c index 87864f3..d067656 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -2158,9 +2158,12 @@ gimple_could_trap_p_1 (gimple *s, bool include_mem, bool include_stores) case GIMPLE_ASSIGN: op = gimple_assign_rhs_code (s); - /* For COND_EXPR and VEC_COND_EXPR only the condition may trap. */ - if (op == COND_EXPR || op == VEC_COND_EXPR) + /* For COND_EXPR only the condition may trap. */ + if (op == COND_EXPR) return tree_could_trap_p (gimple_assign_rhs1 (s)); + /* A VEC_COND_EXPR cannot trap. */ + else if (op == VEC_COND_EXPR) + return false; /* For comparisons we need to check rhs operand types instead of rhs type (which is BOOLEAN_TYPE). */ diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 91dd492..2803b58 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -4038,11 +4038,10 @@ compute_avail (void) enum tree_code code = gimple_assign_rhs_code (stmt); vn_nary_op_t nary; - /* COND_EXPR and VEC_COND_EXPR are awkward in - that they contain an embedded complex expression. - Don't even try to shove those through PRE. */ - if (code == COND_EXPR - || code == VEC_COND_EXPR) + /* COND_EXPR is awkward in that it contains an + embedded complex expression. + Don't even try to shove it through PRE. */ + if (code == COND_EXPR) continue; vn_nary_op_lookup_stmt (stmt, &nary); -- cgit v1.1 From 5f8aed72e76970d2c6fa06fb23fdaa47660555b0 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 23 Apr 2021 08:28:58 -0400 Subject: c++: Refine enum direct-list-initialization [CWG2374] This implements the wording changes of CWG2374, which clarifies the wording of P0138 to forbid e.g. direct-list-initialization of a scoped enumeration from a different scoped enumeration. gcc/cp/ChangeLog: DR 2374 * decl.c (is_direct_enum_init): Check the implicit convertibility requirement added by CWG 2374. gcc/testsuite/ChangeLog: DR 2374 * g++.dg/cpp1z/direct-enum-init2.C: New test. --- gcc/cp/decl.c | 8 +++++++- gcc/testsuite/g++.dg/cpp1z/direct-enum-init2.C | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/direct-enum-init2.C (limited to 'gcc') diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index b81de8e..60dc2bf 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6191,7 +6191,13 @@ is_direct_enum_init (tree type, tree init) && ENUM_FIXED_UNDERLYING_TYPE_P (type) && TREE_CODE (init) == CONSTRUCTOR && CONSTRUCTOR_IS_DIRECT_INIT (init) - && CONSTRUCTOR_NELTS (init) == 1) + && CONSTRUCTOR_NELTS (init) == 1 + /* DR 2374: The single element needs to be implicitly + convertible to the underlying type of the enum. */ + && can_convert_arg (ENUM_UNDERLYING_TYPE (type), + TREE_TYPE (CONSTRUCTOR_ELT (init, 0)->value), + CONSTRUCTOR_ELT (init, 0)->value, + LOOKUP_IMPLICIT, tf_none)) return true; return false; } diff --git a/gcc/testsuite/g++.dg/cpp1z/direct-enum-init2.C b/gcc/testsuite/g++.dg/cpp1z/direct-enum-init2.C new file mode 100644 index 0000000..5b94a8d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/direct-enum-init2.C @@ -0,0 +1,8 @@ +// DR 2374 +// { dg-do compile { target c++17 } } + +enum class Orange; +enum class Apple; + +extern Orange o; +Apple a{o}; // { dg-error "cannot convert" } -- cgit v1.1 From 87fc34a461cf362947a430d8a241f653fd83bc7b Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 23 Apr 2021 08:47:02 -0400 Subject: c++: Fix pretty printing pointer to function type [PR98767] When pretty printing a pointer to function type, pp_cxx_parameter_declaration_clause ends up always outputting an empty function parameter list because the loop that outputs the list iterates over 'args' instead of 'types', and 'args' is empty when a FUNCTION_TYPE is passed to this routine (as opposed to a FUNCTION_DECL). This patch fixes this by making the loop iterate over 'types' instead. This patch also moves the retrofitted chain-of-PARM_DECLs printing from here to pp_cxx_requires_expr, the only caller that uses it. Doing so lets us easily output the trailing '...' in the parameter list of a variadic function, which this patch also implements. gcc/cp/ChangeLog: PR c++/98767 * cxx-pretty-print.c (pp_cxx_parameter_declaration_clause): Adjust parameter list loop to iterate over 'types' instead of 'args'. Output the trailing '...' for a variadic function. Remove PARM_DECL support. (pp_cxx_requires_expr): Pretty print the parameter list directly instead of going through pp_cxx_parameter_declaration_clause. gcc/testsuite/ChangeLog: PR c++/98767 * g++.dg/concepts/diagnostic17.C: New test. --- gcc/cp/cxx-pretty-print.c | 47 +++++++++++++++++----------- gcc/testsuite/g++.dg/concepts/diagnostic17.C | 17 ++++++++++ 2 files changed, 45 insertions(+), 19 deletions(-) create mode 100644 gcc/testsuite/g++.dg/concepts/diagnostic17.C (limited to 'gcc') diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index a22eea5..3709d0f 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -1537,38 +1537,36 @@ pp_cxx_parameter_declaration (cxx_pretty_printer *pp, tree t) static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t) { - tree args; - tree types; - bool abstract; - - // For a requires clause or the explicit printing of a parameter list - // we expect T to be a chain of PARM_DECLs. Otherwise, the list of - // args and types are taken from the function decl T. - if (TREE_CODE (t) == PARM_DECL) + gcc_assert (FUNC_OR_METHOD_TYPE_P (t) || TREE_CODE (t) == FUNCTION_DECL); + tree types, args; + if (TYPE_P (t)) { - args = t; - types = t; - abstract = false; + types = TYPE_ARG_TYPES (t); + args = NULL_TREE; } else { - bool type_p = TYPE_P (t); - args = type_p ? NULL : FUNCTION_FIRST_USER_PARM (t); - types = type_p ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t); - abstract = args == NULL || pp->flags & pp_c_flag_abstract; + types = FUNCTION_FIRST_USER_PARMTYPE (t); + args = FUNCTION_FIRST_USER_PARM (t); } - bool first = true; + bool abstract = !args || (pp->flags & pp_c_flag_abstract); /* Skip artificial parameter for non-static member functions. */ if (TREE_CODE (t) == METHOD_TYPE) types = TREE_CHAIN (types); + bool first = true; pp_cxx_left_paren (pp); - for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types)) + for (; types != void_list_node; types = TREE_CHAIN (types)) { if (!first) pp_cxx_separate_with (pp, ','); first = false; + if (!types) + { + pp_cxx_ws_string (pp, "..."); + break; + } pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args); if (!abstract && pp->flags & pp_cxx_flag_default_argument) { @@ -1577,6 +1575,8 @@ pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t) pp_cxx_whitespace (pp); pp->assignment_expression (TREE_PURPOSE (types)); } + if (!abstract) + args = TREE_CHAIN (args); } pp_cxx_right_paren (pp); } @@ -2775,9 +2775,18 @@ void pp_cxx_requires_expr (cxx_pretty_printer *pp, tree t) { pp_string (pp, "requires"); - if (tree parms = TREE_OPERAND (t, 0)) + if (tree parms = REQUIRES_EXPR_PARMS (t)) { - pp_cxx_parameter_declaration_clause (pp, parms); + bool first = true; + pp_cxx_left_paren (pp); + for (; parms; parms = TREE_CHAIN (parms)) + { + if (!first) + pp_cxx_separate_with (pp, ',' ); + first = false; + pp_cxx_parameter_declaration (pp, parms); + } + pp_cxx_right_paren (pp); pp_cxx_whitespace (pp); } pp_cxx_requirement_body (pp, TREE_OPERAND (t, 1)); diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic17.C b/gcc/testsuite/g++.dg/concepts/diagnostic17.C new file mode 100644 index 0000000..49d5733 --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/diagnostic17.C @@ -0,0 +1,17 @@ +// PR c++/98767 +// { dg-do compile { target c++20 } } + +template +concept Callable = requires(Function func, Args... args) { func(args...); }; + +static_assert(Callable); // { dg-error "failed" } +// { dg-message {Function = int \(\*\)\(\)} "" { target *-*-* } 5 } + +static_assert(Callable); // { dg-error "failed" } +// { dg-message {Function = char \(\*\)\(int\*\)} "" { target *-*-* } 5 } + +static_assert(Callable); // { dg-error "failed" } +// { dg-message {Function = short int \(\*\)\(int\*, int\)} "" { target *-*-* } 5 } + +static_assert(Callable); // { dg-error "failed" } +// { dg-message {Function = long int \(\*\)\(int\*, int, \.\.\.\)} "" { target *-*-* } 5 } -- cgit v1.1 From 5d87c2251c441f056e0a44f928ffcb8a8a679b6b Mon Sep 17 00:00:00 2001 From: Alex Coplan Date: Fri, 23 Apr 2021 14:09:15 +0100 Subject: early-remat.c: Fix new/delete mismatch [PR100230] This simple patch fixes a mistmatched operator new/delete in early-remat.c which triggers ASan errors on (at least) AArch64 when compiling SVE code. gcc/ChangeLog: PR rtl-optimization/100230 * early-remat.c (early_remat::sort_candidates): Use delete[] instead of delete for array allocated with new[]. --- gcc/early-remat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/early-remat.c b/gcc/early-remat.c index c8d4fee..92077d0 100644 --- a/gcc/early-remat.c +++ b/gcc/early-remat.c @@ -1059,7 +1059,7 @@ early_remat::sort_candidates (void) m_candidates.qsort (compare_candidates); - delete postorder_index; + delete[] postorder_index; } /* Commit to the current candidate indices and initialize cross-references. */ -- cgit v1.1 From d2324a5ab3ff097864ae6828cb1db4dd013c70d1 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Fri, 23 Apr 2021 17:29:29 +0200 Subject: i386: Fix atomic FP peepholes [PR100182] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 64bit loads to/stores from x87 and SSE registers are atomic also on 32-bit targets, so there is no need for additional atomic moves to a temporary register. Introduced load peephole2 patterns assume that there won't be any additional loads from the load location outside the peepholed sequence and wrongly removed the source location initialization. OTOH, introduced store peephole2 patterns assume there won't be any additional loads from the stored location outside the peepholed sequence and wrongly removed the destination location initialization. Note that we can't use plain x87 FST instruction to initialize destination location because FST converts the value to the double-precision format, changing bits during move. The patch restores removed initializations in load and store patterns. Additionally, plain x87 FST in store peephole2 patterns is prevented by limiting the store operand source to SSE registers. 2021-04-23 Uroš Bizjak gcc/ PR target/100182 * config/i386/sync.md (FILD_ATOMIC/FIST_ATOMIC FP load peephole2): Copy operand 3 to operand 4. Use sse_reg_operand as operand 3 predicate. (FILD_ATOMIC/FIST_ATOMIC FP load peephole2 with mem blockage): Ditto. (LDX_ATOMIC/STX_ATOMIC FP load peephole2): Ditto. (LDX_ATOMIC/LDX_ATOMIC FP load peephole2 with mem blockage): Ditto. (FILD_ATOMIC/FIST_ATOMIC FP store peephole2): Copy operand 1 to operand 0. (FILD_ATOMIC/FIST_ATOMIC FP store peephole2 with mem blockage): Ditto. (LDX_ATOMIC/STX_ATOMIC FP store peephole2): Ditto. (LDX_ATOMIC/LDX_ATOMIC FP store peephole2 with mem blockage): Ditto. gcc/testsuite/ PR target/100182 * gcc.target/i386/pr100182.c: New test. * gcc.target/i386/pr71245-1.c (dg-final): Xfail scan-assembler-not. * gcc.target/i386/pr71245-2.c (dg-final): Ditto. --- gcc/config/i386/sync.md | 24 ++++++++++++++++-------- gcc/testsuite/gcc.target/i386/pr100182.c | 30 ++++++++++++++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr71245-1.c | 2 +- gcc/testsuite/gcc.target/i386/pr71245-2.c | 2 +- 4 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr100182.c (limited to 'gcc') diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md index c7c508c..7913b91 100644 --- a/gcc/config/i386/sync.md +++ b/gcc/config/i386/sync.md @@ -226,12 +226,13 @@ (set (match_operand:DI 2 "memory_operand") (unspec:DI [(match_dup 0)] UNSPEC_FIST_ATOMIC)) - (set (match_operand:DF 3 "any_fp_register_operand") + (set (match_operand:DF 3 "sse_reg_operand") (match_operand:DF 4 "memory_operand"))] "!TARGET_64BIT && peep2_reg_dead_p (2, operands[0]) && rtx_equal_p (XEXP (operands[4], 0), XEXP (operands[2], 0))" - [(set (match_dup 3) (match_dup 5))] + [(set (match_dup 3) (match_dup 5)) + (set (match_dup 4) (match_dup 3))] "operands[5] = gen_lowpart (DFmode, operands[1]);") (define_peephole2 @@ -243,7 +244,7 @@ UNSPEC_FIST_ATOMIC)) (set (mem:BLK (scratch:SI)) (unspec:BLK [(mem:BLK (scratch:SI))] UNSPEC_MEMORY_BLOCKAGE)) - (set (match_operand:DF 3 "any_fp_register_operand") + (set (match_operand:DF 3 "sse_reg_operand") (match_operand:DF 4 "memory_operand"))] "!TARGET_64BIT && peep2_reg_dead_p (2, operands[0]) @@ -251,6 +252,7 @@ [(const_int 0)] { emit_move_insn (operands[3], gen_lowpart (DFmode, operands[1])); + emit_move_insn (operands[4], operands[3]); emit_insn (gen_memory_blockage ()); DONE; }) @@ -262,12 +264,13 @@ (set (match_operand:DI 2 "memory_operand") (unspec:DI [(match_dup 0)] UNSPEC_STX_ATOMIC)) - (set (match_operand:DF 3 "any_fp_register_operand") + (set (match_operand:DF 3 "sse_reg_operand") (match_operand:DF 4 "memory_operand"))] "!TARGET_64BIT && peep2_reg_dead_p (2, operands[0]) && rtx_equal_p (XEXP (operands[4], 0), XEXP (operands[2], 0))" - [(set (match_dup 3) (match_dup 5))] + [(set (match_dup 3) (match_dup 5)) + (set (match_dup 4) (match_dup 3))] "operands[5] = gen_lowpart (DFmode, operands[1]);") (define_peephole2 @@ -279,7 +282,7 @@ UNSPEC_STX_ATOMIC)) (set (mem:BLK (scratch:SI)) (unspec:BLK [(mem:BLK (scratch:SI))] UNSPEC_MEMORY_BLOCKAGE)) - (set (match_operand:DF 3 "any_fp_register_operand") + (set (match_operand:DF 3 "sse_reg_operand") (match_operand:DF 4 "memory_operand"))] "!TARGET_64BIT && peep2_reg_dead_p (2, operands[0]) @@ -287,6 +290,7 @@ [(const_int 0)] { emit_move_insn (operands[3], gen_lowpart (DFmode, operands[1])); + emit_move_insn (operands[4], operands[3]); emit_insn (gen_memory_blockage ()); DONE; }) @@ -392,7 +396,8 @@ "!TARGET_64BIT && peep2_reg_dead_p (3, operands[2]) && rtx_equal_p (XEXP (operands[0], 0), XEXP (operands[3], 0))" - [(set (match_dup 5) (match_dup 1))] + [(set (match_dup 0) (match_dup 1)) + (set (match_dup 5) (match_dup 1))] "operands[5] = gen_lowpart (DFmode, operands[4]);") (define_peephole2 @@ -411,6 +416,7 @@ && rtx_equal_p (XEXP (operands[0], 0), XEXP (operands[3], 0))" [(const_int 0)] { + emit_move_insn (operands[0], operands[1]); emit_insn (gen_memory_blockage ()); emit_move_insn (gen_lowpart (DFmode, operands[4]), operands[1]); DONE; @@ -428,7 +434,8 @@ "!TARGET_64BIT && peep2_reg_dead_p (3, operands[2]) && rtx_equal_p (XEXP (operands[0], 0), XEXP (operands[3], 0))" - [(set (match_dup 5) (match_dup 1))] + [(set (match_dup 0) (match_dup 1)) + (set (match_dup 5) (match_dup 1))] "operands[5] = gen_lowpart (DFmode, operands[4]);") (define_peephole2 @@ -447,6 +454,7 @@ && rtx_equal_p (XEXP (operands[0], 0), XEXP (operands[3], 0))" [(const_int 0)] { + emit_move_insn (operands[0], operands[1]); emit_insn (gen_memory_blockage ()); emit_move_insn (gen_lowpart (DFmode, operands[4]), operands[1]); DONE; diff --git a/gcc/testsuite/gcc.target/i386/pr100182.c b/gcc/testsuite/gcc.target/i386/pr100182.c new file mode 100644 index 0000000..2f92a04 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr100182.c @@ -0,0 +1,30 @@ +/* { dg-do run { target ia32 } } */ +/* { dg-options "-O2 -march=i686" } */ + +struct S { double _M_fp; }; +union U { double d; unsigned long long int l; }; + +void +__attribute__((noipa)) +foo (void) +{ + struct S a0, a1; + union U u; + double d0, d1; + a0._M_fp = 0.0; + a1._M_fp = 1.0; + __atomic_store_8 (&a0._M_fp, __atomic_load_8 (&a1._M_fp, __ATOMIC_SEQ_CST), __ATOMIC_SEQ_CST); + u.l = __atomic_load_8 (&a0._M_fp, __ATOMIC_SEQ_CST); + d0 = u.d; + u.l = __atomic_load_8 (&a1._M_fp, __ATOMIC_SEQ_CST); + d1 = u.d; + if (d0 != d1) + __builtin_abort (); +} + +int +main () +{ + foo (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/i386/pr71245-1.c b/gcc/testsuite/gcc.target/i386/pr71245-1.c index be0b760..02c0dcb 100644 --- a/gcc/testsuite/gcc.target/i386/pr71245-1.c +++ b/gcc/testsuite/gcc.target/i386/pr71245-1.c @@ -19,4 +19,4 @@ void foo_d (void) __atomic_store_n (&d.ll, tmp.ll, __ATOMIC_SEQ_CST); } -/* { dg-final { scan-assembler-not "(fistp|fild)" } } */ +/* { dg-final { scan-assembler-not "(fistp|fild)" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.target/i386/pr71245-2.c b/gcc/testsuite/gcc.target/i386/pr71245-2.c index 65c1398..bf37a8c 100644 --- a/gcc/testsuite/gcc.target/i386/pr71245-2.c +++ b/gcc/testsuite/gcc.target/i386/pr71245-2.c @@ -19,4 +19,4 @@ void foo_d (void) __atomic_store_n (&d.ll, tmp.ll, __ATOMIC_SEQ_CST); } -/* { dg-final { scan-assembler-not "movlps" } } */ +/* { dg-final { scan-assembler-not "movlps" { xfail *-*-* } } } */ -- cgit v1.1 From d54693f806a53666eae7411581fc3bd6709807c6 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Thu, 22 Apr 2021 09:14:28 +0200 Subject: Remove not feasible FIXME gcc/ChangeLog: * lto-wrapper.c: Remove FIXME about usage of hardware_concurrency. The function is not on par with what we have now. --- gcc/lto-wrapper.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'gcc') diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index 0b626d7c..49894e4 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -1304,8 +1304,6 @@ init_num_threads (void) #endif } -/* FIXME: once using -std=c++11, we can use std::thread::hardware_concurrency. */ - /* Test and return reason why a jobserver cannot be detected. */ static const char * -- cgit v1.1 From 716bb02b40ecef5564abb5ba45a594323123a104 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Fri, 23 Apr 2021 18:45:14 +0200 Subject: i386: Reject -m96bit-long-double for 64bit targets [PR100041] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 64bit targets default to 128bit long double, so -m96bit-long-double should not be used. Together with -m128bit-long-double, this option was intended to be an optimization for 32bit targets only. Error out when -m96bit-long-double is used with 64bit targets. 2021-04-23 Uroš Bizjak gcc/ PR target/100041 * config/i386/i386-options.c (ix86_option_override_internal): Error out when -m96bit-long-double is used with 64bit targets. * config/i386/i386.md (*pushxf_rounded): Remove pattern. gcc/testsuite/ PR target/100041 * gcc.target/i386/pr79514.c (dg-error): Expect error for 64bit targets. --- gcc/config/i386/i386-options.c | 3 +++ gcc/config/i386/i386.md | 30 ------------------------------ gcc/testsuite/gcc.target/i386/pr79514.c | 1 + 3 files changed, 4 insertions(+), 30 deletions(-) (limited to 'gcc') diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c index 2f3d40c..cc7b617 100644 --- a/gcc/config/i386/i386-options.c +++ b/gcc/config/i386/i386-options.c @@ -2312,6 +2312,9 @@ ix86_option_override_internal (bool main_args_p, opts->x_ix86_isa_flags |= TARGET_SUBTARGET64_ISA_DEFAULT & ~opts->x_ix86_isa_flags_explicit; + if (!TARGET_128BIT_LONG_DOUBLE_P (opts->x_target_flags)) + error ("%<-m96bit-long-double%> is not compatible with this target"); + if (TARGET_RTD_P (opts->x_target_flags)) warning (0, main_args_p diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 7eb7176..27f100c 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -3044,36 +3044,6 @@ operands[0] = replace_equiv_address (operands[0], stack_pointer_rtx); }) -(define_insn_and_split "*pushxf_rounded" - [(set (mem:XF - (pre_modify:P - (reg:P SP_REG) - (plus:P (reg:P SP_REG) (const_int -16)))) - (match_operand:XF 0 "nonmemory_no_elim_operand" "f,r,*r,C"))] - "TARGET_64BIT" - "#" - "&& 1" - [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (const_int -16))) - (set (match_dup 1) (match_dup 0))] -{ - rtx pat = PATTERN (curr_insn); - operands[1] = SET_DEST (pat); - - /* Preserve memory attributes. */ - operands[1] = replace_equiv_address (operands[1], stack_pointer_rtx); -} - [(set_attr "type" "multi") - (set_attr "unit" "i387,*,*,*") - (set (attr "mode") - (cond [(eq_attr "alternative" "1,2,3") - (const_string "DI") - ] - (const_string "XF"))) - (set (attr "preferred_for_size") - (cond [(eq_attr "alternative" "1") - (symbol_ref "false")] - (symbol_ref "true")))]) - (define_insn "*pushxf" [(set (match_operand:XF 0 "push_operand" "=<,<,<,<,<") (match_operand:XF 1 "general_no_elim_operand" "f,r,*r,oF,oC"))] diff --git a/gcc/testsuite/gcc.target/i386/pr79514.c b/gcc/testsuite/gcc.target/i386/pr79514.c index c5b7bf8..8235da6 100644 --- a/gcc/testsuite/gcc.target/i386/pr79514.c +++ b/gcc/testsuite/gcc.target/i386/pr79514.c @@ -1,6 +1,7 @@ /* PR target/79514 */ /* { dg-do compile } */ /* { dg-options "-m96bit-long-double" } */ +/* { dg-error "'-m96bit-long-double' is not compatible" "" { target { ! ia32 } } 0 } */ extern void bar (long double); -- cgit v1.1 From 0a662e103e911af935aa5c601051c135986ce3de Mon Sep 17 00:00:00 2001 From: YiFei Zhu Date: Thu, 22 Apr 2021 05:05:56 -0500 Subject: bpf: align function entry point to 64 bits Libbpf does not treat paddings after functions well. If function symbols does not cover a whole text section, it will emit error similar to: libbpf: sec '.text': failed to find program symbol at offset 56 Each instruction in BPF is a multiple of 8 bytes, so align the functions to 8 bytes, similar to how clang does it. 2021-04-22 YiFei Zhu gcc/ * config/bpf/bpf.h (FUNCTION_BOUNDARY): Set to 64. --- gcc/config/bpf/bpf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h index 9e2f526..6a3907f 100644 --- a/gcc/config/bpf/bpf.h +++ b/gcc/config/bpf/bpf.h @@ -57,8 +57,8 @@ 64-bit at any time. */ #define STACK_BOUNDARY 64 -/* Function entry points are aligned to 128 bits. */ -#define FUNCTION_BOUNDARY 128 +/* Function entry points are aligned to 64 bits. */ +#define FUNCTION_BOUNDARY 64 /* Maximum alignment required by data of any type. */ #define BIGGEST_ALIGNMENT 64 -- cgit v1.1 From 886b6c1e8af502b69e3f318b9830b73b88215878 Mon Sep 17 00:00:00 2001 From: YiFei Zhu Date: Thu, 22 Apr 2021 05:05:57 -0500 Subject: bpf: allow BSS symbols to be global symbols Prior to this, a BSS declaration such as: int foo; static int bar; Generates: .global foo .local foo .comm foo,4,4 .local bar .comm bar,4,4 Creating symbols: 0000000000000000 b foo 0000000000000004 b bar Both symbols are local. However, libbpf bpf_object__variable_offset rquires symbols to be STB_GLOBAL & STT_OBJECT for data section lookup. This patch makes the same declaration generate: .global foo .type foo, @object .lcomm foo,4,4 .local bar .comm bar,4,4 Creating symbols: 0000000000000000 B foo 0000000000000004 b bar And libbpf will be okay with looking up the global symbol "foo". 2021-04-22 YiFei Zhu gcc/ * config/bpf/bpf.h (ASM_OUTPUT_ALIGNED_BSS): Use .type and .lcomm. --- gcc/config/bpf/bpf.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'gcc') diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h index 6a3907f..4c5b19e 100644 --- a/gcc/config/bpf/bpf.h +++ b/gcc/config/bpf/bpf.h @@ -422,9 +422,15 @@ enum reg_class Try to use asm_output_aligned_bss to implement this macro. */ #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ - do { \ - ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN); \ - } while (0) + do \ + { \ + ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ + fprintf ((FILE), "%s", "\t.lcomm\t"); \ + assemble_name ((FILE), (NAME)); \ + fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", \ + (SIZE), (ALIGN) / BITS_PER_UNIT); \ + } \ + while (0) /*** Output and Generation of Labels. */ -- cgit v1.1 From 9a30a3f06b908e4e781324c2e813cd1db87119df Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Fri, 23 Apr 2021 18:16:03 -0400 Subject: Fix logic error in 32-bit trampolines. The test in the PowerPC 32-bit trampoline support is backwards. It aborts if the trampoline size is greater than the expected size. It should abort when the trampoline size is less than the expected size. I fixed the test so the operands are reversed. I then folded the load immediate into the compare instruction. I verified this by creating a 32-bit trampoline program and manually changing the size of the trampoline to be 48 instead of 40. The program aborted with the larger size. I updated this code and ran the test again and it passed. I added a test case that runs on PowerPC 32-bit Linux systems and it calls the __trampoline_setup function with a larger buffer size than the compiler uses. The test is not run on 64-bit systems, since the function __trampoline_setup is not called. I also limited the test to just Linux systems, in case trampolines are handled differently in other systems. libgcc/ 2021-04-23 Michael Meissner PR target/98952 * config/rs6000/tramp.S (__trampoline_setup, elfv1 #ifdef): Fix trampoline size comparison in 32-bit by reversing test and combining load immediate with compare. (__trampoline_setup, elfv2 #ifdef): Fix trampoline size comparison in 32-bit by reversing test and combining load immediate with compare. gcc/testsuite/ 2021-04-23 Michael Meissner PR target/98952 * gcc.target/powerpc/pr98952.c: New test. --- gcc/testsuite/gcc.target/powerpc/pr98952.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr98952.c (limited to 'gcc') diff --git a/gcc/testsuite/gcc.target/powerpc/pr98952.c b/gcc/testsuite/gcc.target/powerpc/pr98952.c new file mode 100644 index 0000000..c487fbc --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr98952.c @@ -0,0 +1,28 @@ +/* { dg-do run { target { powerpc*-*-linux* && ilp32 } } } */ +/* { dg-options "-O2" } */ + +/* PR 96983 reported that the test in libgcc's tramp.S was backwards and it + would abort if the trampoline size passed to the function was greater than + the size the runtime was expecting (40). It should abort if the size is less + than 40, not greater than 40. This test creates a call to __trampoline_setup + with a much larger buffer to make sure the function does not abort. + + We do not run this test on 64-bit since __trampoline_setup is not present in + 64-bit systems. + + We only run the test under Linux in case the other systems have some + different variant for __trampoline_setup. */ + +#ifndef SIZE +#define SIZE 100 +#endif + +extern void __trampoline_setup (int *, unsigned, void *, void *); + +int main (void) +{ + int tramp[SIZE / sizeof (int)]; + + __trampoline_setup (tramp, SIZE, 0, 0); + return 0; +} -- cgit v1.1 From 05ec629f05646837301820b89354a64673185224 Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Sat, 24 Apr 2021 00:16:37 +0000 Subject: Daily bump. --- gcc/ChangeLog | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/cp/ChangeLog | 21 +++++++++++ gcc/testsuite/ChangeLog | 38 ++++++++++++++++++++ 4 files changed, 152 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ad64a12..93a196b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,95 @@ +2021-04-23 YiFei Zhu + + * config/bpf/bpf.h (ASM_OUTPUT_ALIGNED_BSS): Use .type and .lcomm. + +2021-04-23 YiFei Zhu + + * config/bpf/bpf.h (FUNCTION_BOUNDARY): Set to 64. + +2021-04-23 Uroš Bizjak + + PR target/100041 + * config/i386/i386-options.c (ix86_option_override_internal): + Error out when -m96bit-long-double is used with 64bit targets. + * config/i386/i386.md (*pushxf_rounded): Remove pattern. + +2021-04-23 Martin Liska + + * lto-wrapper.c: Remove FIXME about usage of + hardware_concurrency. The function is not on par with + what we have now. + +2021-04-23 Uroš Bizjak + + PR target/100182 + * config/i386/sync.md (FILD_ATOMIC/FIST_ATOMIC FP load peephole2): + Copy operand 3 to operand 4. Use sse_reg_operand + as operand 3 predicate. + (FILD_ATOMIC/FIST_ATOMIC FP load peephole2 with mem blockage): Ditto. + (LDX_ATOMIC/STX_ATOMIC FP load peephole2): Ditto. + (LDX_ATOMIC/LDX_ATOMIC FP load peephole2 with mem blockage): Ditto. + (FILD_ATOMIC/FIST_ATOMIC FP store peephole2): + Copy operand 1 to operand 0. + (FILD_ATOMIC/FIST_ATOMIC FP store peephole2 with mem blockage): Ditto. + (LDX_ATOMIC/STX_ATOMIC FP store peephole2): Ditto. + (LDX_ATOMIC/LDX_ATOMIC FP store peephole2 with mem blockage): Ditto. + +2021-04-23 Alex Coplan + + PR rtl-optimization/100230 + * early-remat.c (early_remat::sort_candidates): Use delete[] + instead of delete for array allocated with new[]. + +2021-04-23 Richard Biener + + * genmatch.c (lower_cond): Remove VEC_COND_EXPR special-casing. + (capture_info::capture_info): Likewise. + (capture_info::walk_match): Likewise. + (expr::gen_transform): Likewise. + (dt_simplify::gen_1): Likewise. + * gimple-match-head.c (maybe_resimplify_conditional_op): + Remove VEC_COND_EXPR special-casing. + (gimple_simplify): Likewise. + * gimple.c (gimple_could_trap_p_1): Adjust. + * tree-ssa-pre.c (compute_avail): Allow VEC_COND_EXPR + to participate in PRE. + +2021-04-23 Richard Biener + + * cfganal.c (connect_infinite_loops_to_exit): First call + add_noreturn_fake_exit_edges. + * ipa-sra.c (process_scan_results): Do not call the now redundant + add_noreturn_fake_exit_edges. + * predict.c (tree_estimate_probability): Likewise. + (rebuild_frequencies): Likewise. + * store-motion.c (one_store_motion_pass): Likewise. + +2021-04-23 Richard Biener + + PR tree-optimization/100222 + * predict.c (pass_profile::execute): Remove redundant call to + mark_irreducible_loops. + (report_predictor_hitrates): Likewise. + +2021-04-23 Richard Biener + + * tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Avoid + valid_gimple_rhs_p by instead gimplifying to one. + +2021-04-23 Richard Biener + + PR tree-optimization/99971 + * tree-vect-data-refs.c (vect_slp_analyze_node_dependences): + Always use TBAA for loads. + +2021-04-23 liuhongt + + PR target/100093 + * config/i386/i386-options.c (ix86_option_override_internal): + Clear MASK_AVX256_SPLIT_UNALIGNED_LOAD/STORE in x_target_flags + when X86_TUNE_AVX256_UNALIGNED_LOAD/STORE_OPTIMAL is enabled + by target attribute. + 2021-04-23 David Edelsohn * config/rs6000/aix71.h (PREFERRED_DEBUGGING_TYPE): Change to diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 7e3f420..26da51d 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210423 +20210424 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7233833..d64cdce 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,24 @@ +2021-04-23 Patrick Palka + + PR c++/98767 + * cxx-pretty-print.c (pp_cxx_parameter_declaration_clause): + Adjust parameter list loop to iterate over 'types' instead of + 'args'. Output the trailing '...' for a variadic function. + Remove PARM_DECL support. + (pp_cxx_requires_expr): Pretty print the parameter list directly + instead of going through pp_cxx_parameter_declaration_clause. + +2021-04-23 Patrick Palka + + DR 2374 + * decl.c (is_direct_enum_init): Check the implicit + convertibility requirement added by CWG 2374. + +2021-04-23 Martin Liska + + * cp-tree.h (STATIC_ASSERT): Prefer static assert. + * lex.c (init_operators): Remove run-time check. + 2021-04-22 Marek Polacek PR c++/100161 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2988817..905cd01 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,41 @@ +2021-04-23 Michael Meissner + + PR target/98952 + * gcc.target/powerpc/pr98952.c: New test. + +2021-04-23 Uroš Bizjak + + PR target/100041 + * gcc.target/i386/pr79514.c (dg-error): + Expect error for 64bit targets. + +2021-04-23 Uroš Bizjak + + PR target/100182 + * gcc.target/i386/pr100182.c: New test. + * gcc.target/i386/pr71245-1.c (dg-final): Xfail scan-assembler-not. + * gcc.target/i386/pr71245-2.c (dg-final): Ditto. + +2021-04-23 Patrick Palka + + PR c++/98767 + * g++.dg/concepts/diagnostic17.C: New test. + +2021-04-23 Patrick Palka + + DR 2374 + * g++.dg/cpp1z/direct-enum-init2.C: New test. + +2021-04-23 Richard Biener + + PR tree-optimization/99971 + * g++.dg/vect/slp-pr99971.cc: New testcase. + +2021-04-23 liuhongt + + PR target/100093 + * gcc.target/i386/pr100093.c: New test. + 2021-04-22 Patrick Palka PR c++/94508 -- cgit v1.1 From 5f1a2cb9c2dc09eed53da5d5787d14bec700b10b Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Sat, 24 Apr 2021 00:01:42 -0400 Subject: c++: Hard error with tentative parse and CTAD [PR87709] When parsing e.g. the operand of sizeof, where both types and expressions are accepted, if during the tentative type parse we encounter an unexpected template placeholder, we must simulate an error rather than issue a real error because the expression parse can still succeed. gcc/cp/ChangeLog: PR c++/87709 * parser.c (cp_parser_type_id_1): If we see a template placeholder, first try simulating an error before issuing a real error. gcc/testsuite/ChangeLog: PR c++/87709 * g++.dg/cpp1z/class-deduction86.C: New test. --- gcc/cp/parser.c | 11 +++++++---- gcc/testsuite/g++.dg/cpp1z/class-deduction86.C | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/class-deduction86.C (limited to 'gcc') diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index fba516e..e1b1617 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -23270,10 +23270,13 @@ cp_parser_type_id_1 (cp_parser *parser, cp_parser_flags flags, location_t loc = type_specifier_seq.locations[ds_type_spec]; if (tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node)) { - error_at (loc, "missing template arguments after %qT", - auto_node); - inform (DECL_SOURCE_LOCATION (tmpl), "%qD declared here", - tmpl); + if (!cp_parser_simulate_error (parser)) + { + error_at (loc, "missing template arguments after %qT", + auto_node); + inform (DECL_SOURCE_LOCATION (tmpl), "%qD declared here", + tmpl); + } } else if (parser->in_template_argument_list_p) error_at (loc, "%qT not permitted in template argument", diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction86.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction86.C new file mode 100644 index 0000000..a198ed2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction86.C @@ -0,0 +1,16 @@ +// PR c++/87709 +// { dg-do compile { target c++17 } } + +template +struct lit { + lit(T) { } +}; + +template +int operator+(lit, lit) { + return 0; +} + +auto r2 = (lit(0)) + lit(0); + +static_assert(sizeof(lit(0))); -- cgit v1.1 From bcd77b7b9f35bd5b559ed593c3b3e346c1e6f364 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Sat, 24 Apr 2021 00:14:29 -0400 Subject: c++: do_class_deduction and dependent init [PR93383] Here we're crashing during CTAD with a dependent initializer (performed from convert_template_argument) because one of the initializer's elements has an empty TREE_TYPE, which ends up making resolve_args unhappy. Besides the case where we're initializing one template placeholder from another, which is already specifically handled earlier in do_class_deduction, it seems we can't in general correctly resolve a template placeholder using a dependent initializer, so this patch makes the function just punt until instantiation time instead. gcc/cp/ChangeLog: PR c++/89565 PR c++/93383 PR c++/95291 PR c++/99200 PR c++/99683 * pt.c (do_class_deduction): Punt if the initializer is type-dependent. gcc/testsuite/ChangeLog: PR c++/89565 PR c++/93383 PR c++/95291 PR c++/99200 PR c++/99683 * g++.dg/cpp2a/nontype-class39.C: Remove dg-ice directive. * g++.dg/cpp2a/nontype-class45.C: New test. * g++.dg/cpp2a/nontype-class46.C: New test. * g++.dg/cpp2a/nontype-class47.C: New test. * g++.dg/cpp2a/nontype-class48.C: New test. --- gcc/cp/pt.c | 4 ++++ gcc/testsuite/g++.dg/cpp2a/nontype-class39.C | 2 -- gcc/testsuite/g++.dg/cpp2a/nontype-class45.C | 32 +++++++++++++++++++++++++ gcc/testsuite/g++.dg/cpp2a/nontype-class46.C | 11 +++++++++ gcc/testsuite/g++.dg/cpp2a/nontype-class47.C | 11 +++++++++ gcc/testsuite/g++.dg/cpp2a/nontype-class48.C | 36 ++++++++++++++++++++++++++++ 6 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/nontype-class45.C create mode 100644 gcc/testsuite/g++.dg/cpp2a/nontype-class46.C create mode 100644 gcc/testsuite/g++.dg/cpp2a/nontype-class47.C create mode 100644 gcc/testsuite/g++.dg/cpp2a/nontype-class48.C (limited to 'gcc') diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8d64fef..8c3c814 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -29368,6 +29368,10 @@ do_class_deduction (tree ptype, tree tmpl, tree init, return error_mark_node; } + /* Wait until the initializer is non-dependent. */ + if (type_dependent_expression_p (init)) + return ptype; + tree type = TREE_TYPE (tmpl); bool try_list_ctor = false; diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class39.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class39.C index 512afad..9b4da4f 100644 --- a/gcc/testsuite/g++.dg/cpp2a/nontype-class39.C +++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class39.C @@ -1,7 +1,5 @@ // PR c++/89565 // { dg-do compile { target c++20 } } -// { dg-additional-options "-fchecking" } -// { dg-ice "resolve_args" } template struct N{}; diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class45.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class45.C new file mode 100644 index 0000000..e7addf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class45.C @@ -0,0 +1,32 @@ +// PR c++/99200 +// { dg-do compile { target c++20 } } + +template +struct A +{ + constexpr A (const char (&s)[N]) { for (int i = 0; i < N; i++) v[i] = s[i]; v[N] = 0; } + char v[N + 1]; +}; + +template +struct B +{ + constexpr operator const char *() { return s.v; } +}; + +template +const char * +foo () +{ + return B<__PRETTY_FUNCTION__>{}; +} + +template +const char * +bar () +{ + return B<__FUNCTION__>{}; +} + +auto a = foo (); +auto b = bar (); diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class46.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class46.C new file mode 100644 index 0000000..d91e800 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class46.C @@ -0,0 +1,11 @@ +// PR c++/93383 +// { dg-do compile { target c++20 } } + +template struct A {}; + +template struct B { + void foo(B<+a>); + void bar(B); + template using type = B; + template static inline auto y = A{0}; // { dg-error "deduction|no match" } +}; diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class47.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class47.C new file mode 100644 index 0000000..1f31b9b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class47.C @@ -0,0 +1,11 @@ +// PR c++/95291 +// { dg-do compile { target c++20 } } + +template +class xy { }; + +template +struct window_root { }; + +template +struct flip_horizontally : window_root { }; diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class48.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class48.C new file mode 100644 index 0000000..9024436 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class48.C @@ -0,0 +1,36 @@ +// PR c++/99683 +// { dg-do compile { target c++20 } } + +template +struct nttp_tag {}; + +template +struct type_tag {}; + + +/************************************************/ +template +struct use_ctad +{ + template requires (!is_type) + constexpr use_ctad(nttp_tag) {} +}; + +template +use_ctad(nttp_tag) -> use_ctad; + +/**********************************************/ +template +struct wrapper +{ + template + wrapper(Tag); +}; + +template +wrapper(Tag) -> wrapper; + +int main() +{ + wrapper t{nttp_tag<42>{}}; +} -- cgit v1.1 From 0d923657c2fefac8aeb8eb317fe5c7e7c55880c9 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sat, 24 Apr 2021 09:35:16 +0100 Subject: Add dg-final option-based target selectors This patch adds target selectors of the form: { any-opts "opt1" ... "optn" } { no-opts "opt1" ... "optn" } for skipping or xfailing tests based on compiler options. It only works for dg-final selectors. The patch then uses no-opts to exclude -O0 and (sometimes) -Og from some guality.exp xfails. AFAICT (based on gcc-testresults) these tests pass for those options for all targets. gcc/ * doc/sourcebuild.texi: Document no-opts and any-opts target selectors. gcc/testsuite/ * lib/target-supports-dg.exp (selector_expression): Handle any-opts and no-opts. * gcc.dg/guality/pr41353-1.c: Exclude -O0 from xfail. * gcc.dg/guality/pr59776.c: Likewise. * gcc.dg/guality/pr54970.c: Likewise -O0 and -Og. --- gcc/doc/sourcebuild.texi | 90 ++++++++++++++++++++++++++++++-- gcc/testsuite/gcc.dg/guality/pr41353-1.c | 2 +- gcc/testsuite/gcc.dg/guality/pr54970.c | 16 +++--- gcc/testsuite/gcc.dg/guality/pr59776.c | 4 +- gcc/testsuite/lib/target-supports-dg.exp | 10 +++- 5 files changed, 107 insertions(+), 15 deletions(-) (limited to 'gcc') diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index b000124..d3200a4 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -1301,6 +1301,8 @@ A selector is: @item one or more target triplets, possibly including wildcard characters; use @samp{*-*-*} to match any target @item a single effective-target keyword (@pxref{Effective-Target Keywords}) +@item a list of compiler options that should be included or excluded +(as described in more detail below) @item a logical expression @end itemize @@ -1313,14 +1315,96 @@ test to fail for targets that match @var{selector2}. A selector expression appears within curly braces and uses a single logical operator: one of @samp{!}, @samp{&&}, or @samp{||}. An -operand is another selector expression, an effective-target keyword, -a single target triplet, or a list of target triplets within quotes or -curly braces. For example: +operand is one of the following: + +@itemize @bullet +@item +another selector expression, in curly braces + +@item +an effective-target keyword, such as @code{lp64} + +@item +a single target triplet + +@item +a list of target triplets within quotes or curly braces + +@item +one of the following: + +@table @samp +@item @{ any-opts @var{opt1} @dots{} @var{optn} @} +Each of @var{opt1} to @var{optn} is a space-separated list of option globs. +The selector expression evaluates to true if, for one of these strings, +every glob in the string matches an option that was passed to the compiler. +For example: + +@smallexample +@{ any-opts "-O3 -flto" "-O[2g]" @} +@end smallexample + +is true if any of the following are true: + +@itemize @bullet +@item +@option{-O2} was passed to the compiler + +@item +@option{-Og} was passed to the compiler + +@item +both @option{-O3} and @option{-flto} were passed to the compiler +@end itemize + +This kind of selector can only be used within @code{dg-final} directives. +Use @code{dg-skip-if}, @code{dg-xfail-if} or @code{dg-xfail-run-if} to +skip whole tests based on options, or to mark them as expected to fail +with certain options. + +@item @{ no-opts @var{opt1} @dots{} @var{optn} @} +As for @code{any-opts} above, each of @var{opt1} to @var{optn} is a +space-separated list of option globs. The selector expression +evaluates to true if, for all of these strings, there is at least +one glob that does not match an option that was passed to the compiler. +It is shorthand for: + +@smallexample +@{ ! @{ any-opts @var{opt1} @dots{} @var{optn} @} @} +@end smallexample + +For example: + +@smallexample +@{ no-opts "-O3 -flto" "-O[2g]" @} +@end smallexample + +is true if all of the following are true: + +@itemize @bullet +@item +@option{-O2} was not passed to the compiler + +@item +@option{-Og} was not passed to the compiler + +@item +at least one of @option{-O3} or @option{-flto} was not passed to the compiler +@end itemize + +Like @code{any-opts}, this kind of selector can only be used within +@code{dg-final} directives. + +@end table +@end itemize + +Here are some examples of full target selectors: @smallexample @{ target @{ ! "hppa*-*-* ia64*-*-*" @} @} @{ target @{ powerpc*-*-* && lp64 @} @} @{ xfail @{ lp64 || vect_no_align @} @} +@{ xfail @{ aarch64*-*-* && @{ any-opts "-O2" @} @} @} @end smallexample @node Effective-Target Keywords diff --git a/gcc/testsuite/gcc.dg/guality/pr41353-1.c b/gcc/testsuite/gcc.dg/guality/pr41353-1.c index cd30632..6639a52 100644 --- a/gcc/testsuite/gcc.dg/guality/pr41353-1.c +++ b/gcc/testsuite/gcc.dg/guality/pr41353-1.c @@ -22,7 +22,7 @@ f2 (int i, int j) { j += i; /* { dg-final { gdb-test .+4 "i" "37" } } */ - /* { dg-final { gdb-test .+3 "j" "28 + 37" { xfail *-*-* } } } */ + /* { dg-final { gdb-test .+3 "j" "28 + 37" { xfail { no-opts "-O0" } } } } */ int i1 = 2 * i; /* { dg-final { gdb-test .+2 "i1" "2 * 37" } } */ int i2 = 3 * i; /* { dg-final { gdb-test .+1 "i2" "3 * 37" } } */ return j; diff --git a/gcc/testsuite/gcc.dg/guality/pr54970.c b/gcc/testsuite/gcc.dg/guality/pr54970.c index 2e0bc57..e60cc04 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54970.c +++ b/gcc/testsuite/gcc.dg/guality/pr54970.c @@ -8,39 +8,39 @@ int main () { - int a[] = { 1, 2, 3 }; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { xfail { *-*-* } } } } */ + int a[] = { 1, 2, 3 }; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { xfail { no-opts "-O0" "-Og" } } } } */ int *p = a + 2; /* { dg-final { gdb-test .+3 "a\[1\]" "2" } } */ int *q = a + 1; /* { dg-final { gdb-test .+2 "a\[2\]" "3" } } */ /* { dg-final { gdb-test .+1 "*p" "3" } } */ asm volatile (NOP); /* { dg-final { gdb-test . "*q" "2" } } */ - *p += 10; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { xfail { *-*-* } } } } */ + *p += 10; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { xfail { no-opts "-O0" "-Og" } } } } */ /* { dg-final { gdb-test .+3 "a\[1\]" "2" } } */ /* { dg-final { gdb-test .+2 "a\[2\]" "13" } } */ /* { dg-final { gdb-test .+1 "*p" "13" } } */ asm volatile (NOP); /* { dg-final { gdb-test . "*q" "2" } } */ - *q += 10; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { xfail { *-*-* } } } } */ + *q += 10; /* { dg-final { gdb-test .+4 "a\[0\]" "1" { xfail { no-opts "-O0" "-Og" } } } } */ /* { dg-final { gdb-test .+3 "a\[1\]" "12" } } */ /* { dg-final { gdb-test .+2 "a\[2\]" "13" } } */ /* { dg-final { gdb-test .+1 "*p" "13" } } */ asm volatile (NOP); /* { dg-final { gdb-test . "*q" "12" } } */ __builtin_memcpy (&a, (int [3]) { 4, 5, 6 }, sizeof (a)); - /* { dg-final { gdb-test .+4 "a\[0\]" "4" { xfail { *-*-* } } } } */ + /* { dg-final { gdb-test .+4 "a\[0\]" "4" { xfail { no-opts "-O0" "-Og" } } } } */ /* { dg-final { gdb-test .+3 "a\[1\]" "5" } } */ /* { dg-final { gdb-test .+2 "a\[2\]" "6" } } */ /* { dg-final { gdb-test .+1 "*p" "6" } } */ asm volatile (NOP); /* { dg-final { gdb-test . "*q" "5" } } */ - *p += 20; /* { dg-final { gdb-test .+4 "a\[0\]" "4" { xfail { *-*-* } } } } */ + *p += 20; /* { dg-final { gdb-test .+4 "a\[0\]" "4" { xfail { no-opts "-O0" "-Og" } } } } */ /* { dg-final { gdb-test .+3 "a\[1\]" "5" } } */ /* { dg-final { gdb-test .+2 "a\[2\]" "26" } } */ /* { dg-final { gdb-test .+1 "*p" "26" } } */ asm volatile (NOP); /* { dg-final { gdb-test . "*q" "5" } } */ - *q += 20; /* { dg-final { gdb-test .+8 "a\[0\]" "4" { xfail { *-*-* } } } } */ + *q += 20; /* { dg-final { gdb-test .+8 "a\[0\]" "4" { xfail { no-opts "-O0" "-Og" } } } } */ /* { dg-final { gdb-test .+7 "a\[1\]" "25" } } */ /* { dg-final { gdb-test .+6 "a\[2\]" "26" } } */ /* { dg-final { gdb-test .+5 "*p" "26" } } */ /* { dg-final { gdb-test .+4 "p\[-1\]" "25" } } */ - /* { dg-final { gdb-test .+3 "p\[-2\]" "4" { xfail { *-*-* } } } } */ - /* { dg-final { gdb-test .+2 "q\[-1\]" "4" { xfail { *-*-* } } } } */ + /* { dg-final { gdb-test .+3 "p\[-2\]" "4" { xfail { no-opts "-O0" "-Og" } } } } */ + /* { dg-final { gdb-test .+2 "q\[-1\]" "4" { xfail { no-opts "-O0" "-Og" } } } } */ /* { dg-final { gdb-test .+1 "q\[1\]" "26" } } */ asm volatile (NOP); /* { dg-final { gdb-test . "*q" "25" } } */ return 0; diff --git a/gcc/testsuite/gcc.dg/guality/pr59776.c b/gcc/testsuite/gcc.dg/guality/pr59776.c index 7c95a9f..9777f62 100644 --- a/gcc/testsuite/gcc.dg/guality/pr59776.c +++ b/gcc/testsuite/gcc.dg/guality/pr59776.c @@ -12,11 +12,11 @@ foo (struct S *p) struct S s1, s2; /* { dg-final { gdb-test pr59776.c:17 "s1.f" "5.0" } } */ s1 = *p; /* { dg-final { gdb-test pr59776.c:17 "s1.g" "6.0" } } */ s2 = s1; /* { dg-final { gdb-test pr59776.c:17 "s2.f" "0.0" } } */ - *(int *) &s2.f = 0; /* { dg-final { gdb-test pr59776.c:17 "s2.g" "6.0" { xfail *-*-* } } } */ + *(int *) &s2.f = 0; /* { dg-final { gdb-test pr59776.c:17 "s2.g" "6.0" { xfail { no-opts "-O0" } } } } */ asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s1.f" "5.0" } } */ asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s1.g" "6.0" } } */ s2 = s1; /* { dg-final { gdb-test pr59776.c:20 "s2.f" "5.0" } } */ - asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s2.g" "6.0" { xfail *-*-* } } } */ + asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s2.g" "6.0" { xfail { no-opts "-O0" } } } } */ asm volatile (NOP : : : "memory"); } diff --git a/gcc/testsuite/lib/target-supports-dg.exp b/gcc/testsuite/lib/target-supports-dg.exp index c014abc..94ba79e 100644 --- a/gcc/testsuite/lib/target-supports-dg.exp +++ b/gcc/testsuite/lib/target-supports-dg.exp @@ -570,7 +570,15 @@ if { [info procs saved-dg-process-target] == [list] } { # Evaluate a selector expression. proc selector_expression { exp } { - if { [llength $exp] == 2 } { + if { [llength $exp] >= 2 + && [string match "any-opts" [lindex $exp 0]] } { + set args [list "" { *-*-* } [lrange $exp 1 end] ""] + set answer [check_conditional_xfail $args] + } elseif { [llength $exp] >= 2 + && [string match "no-opts" [lindex $exp 0]] } { + set args [list "" { *-*-* } "*" [lrange $exp 1 end]] + set answer [check_conditional_xfail $args] + } elseif { [llength $exp] == 2 } { if [string match "!" [lindex $exp 0]] { set op1 [lindex $exp 1] set answer [expr { ! [selector_opd $op1] }] -- cgit v1.1 From f31ddad8ac8f11b8b11ab0c39f2e0740fd40ba8e Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sat, 24 Apr 2021 09:35:16 +0100 Subject: Adjust guality xfails for aarch64*-*-* MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch gives clean guality.exp test results for aarch64-linux-gnu with modern (top-of-tree) gdb. For people using older gdbs, it will trade one set of noisy results for another set. I still think it's better to have the xfails based on one “clean” and “modern” run rather than have FAILs and XPASSes for all runs. It's hard to tell which of these results are aarch64-specific and which aren't. If other target maintainers want to do something similar, and are prepared to assume the same gdb version, then it should become clearer over time which ones are target-specific and which aren't. There are no new skips here, so changes in test results will still show up as XPASSes. I've not analysed the failures or filed PRs for them. In some ways the guality directory itself seems like the best place to start looking for xfails, if someone's interested in working in this area. gcc/testsuite/ * gcc.dg/guality/example.c: Update aarch64*-*-* xfails. * gcc.dg/guality/guality.c: Likewise. * gcc.dg/guality/inline-params.c: Likewise. * gcc.dg/guality/loop-1.c: Likewise. * gcc.dg/guality/pr36728-1.c: Likewise. * gcc.dg/guality/pr36728-2.c: Likewise. * gcc.dg/guality/pr36728-3.c: Likewise. * gcc.dg/guality/pr41447-1.c: Likewise. * gcc.dg/guality/pr54200.c: Likewise. * gcc.dg/guality/pr54519-1.c: Likewise. * gcc.dg/guality/pr54519-2.c: Likewise. * gcc.dg/guality/pr54519-3.c: Likewise. * gcc.dg/guality/pr54519-4.c: Likewise. * gcc.dg/guality/pr54519-5.c: Likewise. * gcc.dg/guality/pr54519-6.c: Likewise. * gcc.dg/guality/pr54693-2.c: Likewise. * gcc.dg/guality/pr56154-1.c: Likewise. * gcc.dg/guality/pr59776.c: Likewise. * gcc.dg/guality/pr68860-1.c: Likewise. * gcc.dg/guality/pr68860-2.c: Likewise. * gcc.dg/guality/pr90074.c: Likewise. * gcc.dg/guality/pr90716.c: Likewise. * gcc.dg/guality/sra-1.c: Likewise. --- gcc/testsuite/gcc.dg/guality/example.c | 3 ++- gcc/testsuite/gcc.dg/guality/guality.c | 2 +- gcc/testsuite/gcc.dg/guality/inline-params.c | 2 +- gcc/testsuite/gcc.dg/guality/loop-1.c | 2 +- gcc/testsuite/gcc.dg/guality/pr36728-1.c | 2 +- gcc/testsuite/gcc.dg/guality/pr36728-2.c | 30 ++++++++++++++-------------- gcc/testsuite/gcc.dg/guality/pr36728-3.c | 2 +- gcc/testsuite/gcc.dg/guality/pr41447-1.c | 1 + gcc/testsuite/gcc.dg/guality/pr54200.c | 2 +- gcc/testsuite/gcc.dg/guality/pr54519-1.c | 8 ++++---- gcc/testsuite/gcc.dg/guality/pr54519-2.c | 2 +- gcc/testsuite/gcc.dg/guality/pr54519-3.c | 8 ++++---- gcc/testsuite/gcc.dg/guality/pr54519-4.c | 2 +- gcc/testsuite/gcc.dg/guality/pr54519-5.c | 2 +- gcc/testsuite/gcc.dg/guality/pr54519-6.c | 2 +- gcc/testsuite/gcc.dg/guality/pr54693-2.c | 2 +- gcc/testsuite/gcc.dg/guality/pr56154-1.c | 2 +- gcc/testsuite/gcc.dg/guality/pr59776.c | 12 +++++------ gcc/testsuite/gcc.dg/guality/pr68860-1.c | 2 +- gcc/testsuite/gcc.dg/guality/pr68860-2.c | 2 +- gcc/testsuite/gcc.dg/guality/pr90074.c | 4 ++-- gcc/testsuite/gcc.dg/guality/pr90716.c | 2 +- gcc/testsuite/gcc.dg/guality/sra-1.c | 8 ++++---- 23 files changed, 53 insertions(+), 51 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/guality/example.c b/gcc/testsuite/gcc.dg/guality/example.c index 26d25c2..6f1c017 100644 --- a/gcc/testsuite/gcc.dg/guality/example.c +++ b/gcc/testsuite/gcc.dg/guality/example.c @@ -1,5 +1,6 @@ -/* { dg-do run { xfail *-*-* } } */ +/* { dg-do run { xfail { ! aarch64*-*-* } } } */ /* { dg-options "-g" } */ +/* { dg-xfail-run-if "" aarch64*-*-* "*" { "-O[01g]" } } */ #define GUALITY_DONT_FORCE_LIVE_AFTER -1 diff --git a/gcc/testsuite/gcc.dg/guality/guality.c b/gcc/testsuite/gcc.dg/guality/guality.c index db015e6..a4de564 100644 --- a/gcc/testsuite/gcc.dg/guality/guality.c +++ b/gcc/testsuite/gcc.dg/guality/guality.c @@ -1,4 +1,4 @@ -/* { dg-do run { xfail *-*-* } } */ +/* { dg-do run { xfail { ! aarch64*-*-* } } } */ /* { dg-options "-g" } */ /* { dg-require-effective-target alloca } */ diff --git a/gcc/testsuite/gcc.dg/guality/inline-params.c b/gcc/testsuite/gcc.dg/guality/inline-params.c index f4c5f15..6be240a 100644 --- a/gcc/testsuite/gcc.dg/guality/inline-params.c +++ b/gcc/testsuite/gcc.dg/guality/inline-params.c @@ -3,7 +3,7 @@ inlining inlines the functions too early to test the real IPA passes (such as IPA-CP). */ /* { dg-options "-g -fno-early-inlining -fno-ipa-sra" } */ -/* { dg-xfail-run-if "" { "*-*-*" } { "-O2" "-O3" "-Os" } } */ +/* { dg-xfail-run-if "" { ! aarch64*-*-* } { "-O2" "-O3" "-Os" } } */ #define GUALITY_DONT_FORCE_LIVE_AFTER -1 diff --git a/gcc/testsuite/gcc.dg/guality/loop-1.c b/gcc/testsuite/gcc.dg/guality/loop-1.c index 8da447d..1b1f6d3 100644 --- a/gcc/testsuite/gcc.dg/guality/loop-1.c +++ b/gcc/testsuite/gcc.dg/guality/loop-1.c @@ -17,6 +17,6 @@ foo (int n) /* The following works only with final value replacement or with the NOP but not without (which means -Og). Vectorization breaks it, so disable that. At -O3 it currently fails, PR89983. */ - __asm__ volatile (NOP : : "g" (i) : "memory"); /* { dg-final { gdb-test . "i" "1" } } */ + __asm__ volatile (NOP : : "g" (i) : "memory"); /* { dg-final { gdb-test . "i" "1" { xfail { aarch64*-*-* && { any-opts "-ftracer" } } } } } */ } int main() { foo(1); } diff --git a/gcc/testsuite/gcc.dg/guality/pr36728-1.c b/gcc/testsuite/gcc.dg/guality/pr36728-1.c index 0ab475a..5864c2a 100644 --- a/gcc/testsuite/gcc.dg/guality/pr36728-1.c +++ b/gcc/testsuite/gcc.dg/guality/pr36728-1.c @@ -32,7 +32,7 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) /* { dg-final { gdb-test 16 "arg5" "5" } } */ /* { dg-final { gdb-test 16 "arg6" "6" } } */ /* { dg-final { gdb-test 16 "arg7" "30" } } */ -/* { dg-final { gdb-test 16 "y" "2" } } */ +/* { dg-final { gdb-test 16 "y" "2" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */ /* { dg-final { gdb-test 18 "arg1" "1" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 18 "arg2" "2" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 18 "arg3" "3" } } */ diff --git a/gcc/testsuite/gcc.dg/guality/pr36728-2.c b/gcc/testsuite/gcc.dg/guality/pr36728-2.c index 7ba8663..6e8d775 100644 --- a/gcc/testsuite/gcc.dg/guality/pr36728-2.c +++ b/gcc/testsuite/gcc.dg/guality/pr36728-2.c @@ -25,21 +25,21 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) and arg2. So it is expected that these values are unavailable in some of these tests. */ -/* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */ -/* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */ -/* { dg-final { gdb-test 16 "arg3" "3" } } */ -/* { dg-final { gdb-test 16 "arg4" "4" } } */ -/* { dg-final { gdb-test 16 "arg5" "5" } } */ -/* { dg-final { gdb-test 16 "arg6" "6" } } */ -/* { dg-final { gdb-test 16 "arg7" "30" } } */ -/* { dg-final { gdb-test 16 "y" "2" } } */ -/* { dg-final { gdb-test 18 "arg1" "1" { target { ! "s390*-*-*" } } } } */ -/* { dg-final { gdb-test 18 "arg2" "2" { target { ! "s390*-*-*" } } } } */ -/* { dg-final { gdb-test 18 "arg3" "3" } } */ -/* { dg-final { gdb-test 18 "arg4" "4" } } */ -/* { dg-final { gdb-test 18 "arg5" "5" } } */ -/* { dg-final { gdb-test 18 "arg6" "6" } } */ -/* { dg-final { gdb-test 18 "arg7" "30" } } */ +/* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 16 "arg3" "3" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 16 "arg4" "4" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 16 "arg5" "5" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 16 "arg6" "6" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 16 "arg7" "30" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 16 "y" "2" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */ +/* { dg-final { gdb-test 18 "arg1" "1" { target { ! "s390*-*-*" } xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 18 "arg2" "2" { target { ! "s390*-*-*" } xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 18 "arg3" "3" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 18 "arg4" "4" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 18 "arg5" "5" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 18 "arg6" "6" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ +/* { dg-final { gdb-test 18 "arg7" "30" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-O3" } } } } } */ /* { dg-final { gdb-test 18 "*x" "(char) 25" } } */ /* { dg-final { gdb-test 18 "y" "2" } } */ diff --git a/gcc/testsuite/gcc.dg/guality/pr36728-3.c b/gcc/testsuite/gcc.dg/guality/pr36728-3.c index 4700d50..589009b 100644 --- a/gcc/testsuite/gcc.dg/guality/pr36728-3.c +++ b/gcc/testsuite/gcc.dg/guality/pr36728-3.c @@ -30,7 +30,7 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7) /* { dg-final { gdb-test 14 "arg5" "5" } } */ /* { dg-final { gdb-test 14 "arg6" "6" } } */ /* { dg-final { gdb-test 14 "arg7" "30" } } */ -/* { dg-final { gdb-test 14 "y" "2" } } */ +/* { dg-final { gdb-test 14 "y" "2" { xfail { aarch64*-*-* && { any-opts "-O3" } } } } } */ /* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 16 "arg3" "3" } } */ diff --git a/gcc/testsuite/gcc.dg/guality/pr41447-1.c b/gcc/testsuite/gcc.dg/guality/pr41447-1.c index 308ef94..9fde33e 100644 --- a/gcc/testsuite/gcc.dg/guality/pr41447-1.c +++ b/gcc/testsuite/gcc.dg/guality/pr41447-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-g" } */ +/* { dg-xfail-run-if "" { aarch64*-*-* } { "-O2" "-O3" "-Os" } { "-fno-fat-lto-objects" } } */ #include "guality.h" diff --git a/gcc/testsuite/gcc.dg/guality/pr54200.c b/gcc/testsuite/gcc.dg/guality/pr54200.c index e873d1b..ba14221 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54200.c +++ b/gcc/testsuite/gcc.dg/guality/pr54200.c @@ -17,7 +17,7 @@ foo (int z, int x, int b) else { int a = (x + z) + b; - return a; /* { dg-final { gdb-test . "z" "3" } } */ + return a; /* { dg-final { gdb-test . "z" "3" { xfail { aarch64*-*-* && { no-opts "-O0" "-Og" } } } } } */ } } diff --git a/gcc/testsuite/gcc.dg/guality/pr54519-1.c b/gcc/testsuite/gcc.dg/guality/pr54519-1.c index a4105ab..81703eb 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54519-1.c +++ b/gcc/testsuite/gcc.dg/guality/pr54519-1.c @@ -16,11 +16,11 @@ fn2 (int x, int y, int z) { fn1 (x); fn1 (x); /* { dg-final { gdb-test .+2 "x" "36" } } */ - if (x == 36) /* { dg-final { gdb-test .+1 "y" "25" } } */ - fn1 (x); /* { dg-final { gdb-test . "z" "6" } } */ + if (x == 36) /* { dg-final { gdb-test .+1 "y" "25" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ + fn1 (x); /* { dg-final { gdb-test . "z" "6" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ fn1 (x); /* { dg-final { gdb-test .+2 "x" "98" } } */ - if (x == 98) /* { dg-final { gdb-test .+1 "y" "117" } } */ - fn1 (x); /* { dg-final { gdb-test . "z" "8" } } */ + if (x == 98) /* { dg-final { gdb-test .+1 "y" "117" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ + fn1 (x); /* { dg-final { gdb-test . "z" "8" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ fn1 (x); fn1 (x + a); } diff --git a/gcc/testsuite/gcc.dg/guality/pr54519-2.c b/gcc/testsuite/gcc.dg/guality/pr54519-2.c index 6bc1683..e1368bf 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54519-2.c +++ b/gcc/testsuite/gcc.dg/guality/pr54519-2.c @@ -14,7 +14,7 @@ fn2 (int x, int y) if (y) { fn1 (x); /* { dg-final { gdb-test .+1 "x" "6" } } */ - fn1 (x); /* { dg-final { gdb-test . "y" "25" } } */ + fn1 (x); /* { dg-final { gdb-test . "y" "25" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ fn1 (x); fn1 (x); y = -2 + x; diff --git a/gcc/testsuite/gcc.dg/guality/pr54519-3.c b/gcc/testsuite/gcc.dg/guality/pr54519-3.c index da18247..fabab96 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54519-3.c +++ b/gcc/testsuite/gcc.dg/guality/pr54519-3.c @@ -16,11 +16,11 @@ fn2 (int x, int y, int z) { fn1 (x); fn1 (x); /* { dg-final { gdb-test .+2 "x" "36" } } */ - if (x == 36) /* { dg-final { gdb-test .+1 "y" "25" } } */ - fn1 (x); /* { dg-final { gdb-test . "z" "6" } } */ + if (x == 36) /* { dg-final { gdb-test .+1 "y" "25" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ + fn1 (x); /* { dg-final { gdb-test . "z" "6" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ fn1 (x); /* { dg-final { gdb-test .+2 "x" "98" } } */ - if (x == 98) /* { dg-final { gdb-test .+1 "y" "117" } } */ - fn1 (x); /* { dg-final { gdb-test . "z" "8" } } */ + if (x == 98) /* { dg-final { gdb-test .+1 "y" "117" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ + fn1 (x); /* { dg-final { gdb-test . "z" "8" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ fn1 (x); fn1 (x + a); } diff --git a/gcc/testsuite/gcc.dg/guality/pr54519-4.c b/gcc/testsuite/gcc.dg/guality/pr54519-4.c index c82de58..fd8465f 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54519-4.c +++ b/gcc/testsuite/gcc.dg/guality/pr54519-4.c @@ -14,7 +14,7 @@ fn2 (int x, int y) if (y) { fn1 (x); /* { dg-final { gdb-test .+1 "x" "6" } } */ - fn1 (x); /* { dg-final { gdb-test . "y" "25" } } */ + fn1 (x); /* { dg-final { gdb-test . "y" "25" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ fn1 (x); fn1 (x); y = -2 + x; diff --git a/gcc/testsuite/gcc.dg/guality/pr54519-5.c b/gcc/testsuite/gcc.dg/guality/pr54519-5.c index 0903fbf..76fa1e3 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54519-5.c +++ b/gcc/testsuite/gcc.dg/guality/pr54519-5.c @@ -14,7 +14,7 @@ fn2 (int x, int y) if (y) { fn1 (x); /* { dg-final { gdb-test .+1 "x" "6" } } */ - fn1 (x); /* { dg-final { gdb-test . "y" "25" } } */ + fn1 (x); /* { dg-final { gdb-test . "y" "25" { xfail { aarch64*-*-* && { any-opts "-flto" } } } } } */ fn1 (x); fn1 (x); y = -2 + x; diff --git a/gcc/testsuite/gcc.dg/guality/pr54519-6.c b/gcc/testsuite/gcc.dg/guality/pr54519-6.c index bb3fb5f..732c268 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54519-6.c +++ b/gcc/testsuite/gcc.dg/guality/pr54519-6.c @@ -7,7 +7,7 @@ static inline void f1 (int x, int y) { - asm volatile (NOP); /* { dg-final { gdb-test .+1 "x" "2" } } */ + asm volatile (NOP); /* { dg-final { gdb-test .+1 "x" "2" { xfail { aarch64*-*-* && { any-opts "-Os" } } } } } */ asm volatile (NOP); /* { dg-final { gdb-test . "y" "0" } } */ } diff --git a/gcc/testsuite/gcc.dg/guality/pr54693-2.c b/gcc/testsuite/gcc.dg/guality/pr54693-2.c index 1741a38..68aa6c6 100644 --- a/gcc/testsuite/gcc.dg/guality/pr54693-2.c +++ b/gcc/testsuite/gcc.dg/guality/pr54693-2.c @@ -19,7 +19,7 @@ foo (int x, int y, int z) { /* { dg-final { gdb-test .+2 "i" "v + 1" } } */ /* { dg-final { gdb-test .+1 "x" "10 - i" } } */ bar (i); /* { dg-final { gdb-test . "y" "20 - 2 * i" } } */ - /* { dg-final { gdb-test .-1 "z" "30 - 3 * i" } } */ + /* { dg-final { gdb-test .-1 "z" "30 - 3 * i" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" "-Os" } } } } } */ i++, x--, y -= 2, z -= 3; } } diff --git a/gcc/testsuite/gcc.dg/guality/pr56154-1.c b/gcc/testsuite/gcc.dg/guality/pr56154-1.c index 4f02bc9..d6da4a7 100644 --- a/gcc/testsuite/gcc.dg/guality/pr56154-1.c +++ b/gcc/testsuite/gcc.dg/guality/pr56154-1.c @@ -17,7 +17,7 @@ foo (int fd, union U x) asm (NOP : : : "memory"); /* { dg-final { gdb-test pr56154-1.c:17 "x.a" "4" } } */ z = x.a; x.a = 6; - asm (NOP : : : "memory"); /* { dg-final { gdb-test pr56154-1.c:20 "x.a" "6" } } */ + asm (NOP : : : "memory"); /* { dg-final { gdb-test pr56154-1.c:20 "x.a" "6" { xfail { aarch64*-*-* && { any-opts "-Og" } } } } } */ return result; } diff --git a/gcc/testsuite/gcc.dg/guality/pr59776.c b/gcc/testsuite/gcc.dg/guality/pr59776.c index 9777f62..0e48559 100644 --- a/gcc/testsuite/gcc.dg/guality/pr59776.c +++ b/gcc/testsuite/gcc.dg/guality/pr59776.c @@ -9,13 +9,13 @@ struct S { float f, g; }; __attribute__((noipa)) void foo (struct S *p) { - struct S s1, s2; /* { dg-final { gdb-test pr59776.c:17 "s1.f" "5.0" } } */ - s1 = *p; /* { dg-final { gdb-test pr59776.c:17 "s1.g" "6.0" } } */ - s2 = s1; /* { dg-final { gdb-test pr59776.c:17 "s2.f" "0.0" } } */ + struct S s1, s2; /* { dg-final { gdb-test pr59776.c:17 "s1.f" "5.0" { xfail { aarch64*-*-* && { any-opts "-Og" } } } } } */ + s1 = *p; /* { dg-final { gdb-test pr59776.c:17 "s1.g" "6.0" { xfail { aarch64*-*-* && { any-opts "-Og" } } } } } */ + s2 = s1; /* { dg-final { gdb-test pr59776.c:17 "s2.f" "0.0" { xfail { aarch64*-*-* && { any-opts "-Og" } } } } } */ *(int *) &s2.f = 0; /* { dg-final { gdb-test pr59776.c:17 "s2.g" "6.0" { xfail { no-opts "-O0" } } } } */ - asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s1.f" "5.0" } } */ - asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s1.g" "6.0" } } */ - s2 = s1; /* { dg-final { gdb-test pr59776.c:20 "s2.f" "5.0" } } */ + asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s1.f" "5.0" { xfail { aarch64*-*-* && { any-opts "-Og" } } } } } */ + asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s1.g" "6.0" { xfail { aarch64*-*-* && { any-opts "-Og" } } } } } */ + s2 = s1; /* { dg-final { gdb-test pr59776.c:20 "s2.f" "5.0" { xfail { aarch64*-*-* && { any-opts "-Og" } } } } } */ asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test pr59776.c:20 "s2.g" "6.0" { xfail { no-opts "-O0" } } } } */ asm volatile (NOP : : : "memory"); } diff --git a/gcc/testsuite/gcc.dg/guality/pr68860-1.c b/gcc/testsuite/gcc.dg/guality/pr68860-1.c index 8c8d835..bbd9d6e 100644 --- a/gcc/testsuite/gcc.dg/guality/pr68860-1.c +++ b/gcc/testsuite/gcc.dg/guality/pr68860-1.c @@ -31,7 +31,7 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int a /* { dg-final { gdb-test 14 "arg6" "6" } } */ /* { dg-final { gdb-test 14 "arg7" "30" } } */ /* { dg-final { gdb-test 14 "arg8" "7" } } */ -/* { dg-final { gdb-test 14 "y" "2" } } */ +/* { dg-final { gdb-test 14 "y" "2" { xfail { aarch64*-*-* && { { any-opts "-O2" "-O3" } && { no-opts "-flto" } } } } } } */ /* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 16 "arg3" "3" } } */ diff --git a/gcc/testsuite/gcc.dg/guality/pr68860-2.c b/gcc/testsuite/gcc.dg/guality/pr68860-2.c index 070efbc..a18a04e 100644 --- a/gcc/testsuite/gcc.dg/guality/pr68860-2.c +++ b/gcc/testsuite/gcc.dg/guality/pr68860-2.c @@ -31,7 +31,7 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int a /* { dg-final { gdb-test 14 "arg6" "6" } } */ /* { dg-final { gdb-test 14 "arg7" "30" } } */ /* { dg-final { gdb-test 14 "arg8" "7" } } */ -/* { dg-final { gdb-test 14 "y" "2" } } */ +/* { dg-final { gdb-test 14 "y" "2" { xfail { aarch64*-*-* && { any-opts "-O3" } } } } } */ /* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */ /* { dg-final { gdb-test 16 "arg3" "3" } } */ diff --git a/gcc/testsuite/gcc.dg/guality/pr90074.c b/gcc/testsuite/gcc.dg/guality/pr90074.c index 1294928..2fd8842 100644 --- a/gcc/testsuite/gcc.dg/guality/pr90074.c +++ b/gcc/testsuite/gcc.dg/guality/pr90074.c @@ -25,7 +25,7 @@ int main() debug stmt for the final value of the loop during loop distribution which would fix the UNSUPPORTED cases. c is optimized out at -Og for no obvious reason. */ - optimize_me_not(); /* { dg-final { gdb-test . "i + 1" "8" } } */ - /* { dg-final { gdb-test .-1 "c + 1" "2" } } */ + optimize_me_not(); /* { dg-final { gdb-test . "i + 1" "8" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */ + /* { dg-final { gdb-test .-1 "c + 1" "2" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */ return 0; } diff --git a/gcc/testsuite/gcc.dg/guality/pr90716.c b/gcc/testsuite/gcc.dg/guality/pr90716.c index b2f5c9d..fe7e556 100644 --- a/gcc/testsuite/gcc.dg/guality/pr90716.c +++ b/gcc/testsuite/gcc.dg/guality/pr90716.c @@ -20,6 +20,6 @@ int main() Instead test j + 1 which will make the test UNSUPPORTED if i is optimized out. Since the test previously had wrong debug with j == 0 this is acceptable. */ - optimize_me_not(); /* { dg-final { gdb-test . "j + 1" "9" } } */ + optimize_me_not(); /* { dg-final { gdb-test . "j + 1" "9" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */ return 0; } diff --git a/gcc/testsuite/gcc.dg/guality/sra-1.c b/gcc/testsuite/gcc.dg/guality/sra-1.c index 8ad57cf..e9b920e 100644 --- a/gcc/testsuite/gcc.dg/guality/sra-1.c +++ b/gcc/testsuite/gcc.dg/guality/sra-1.c @@ -18,7 +18,7 @@ f1 (int k) asm ("" : "+r" (a.i)); a.j++; bar (a.i); /* { dg-final { gdb-test .+1 "a.i" "4" } } */ - bar (a.j); /* { dg-final { gdb-test . "a.j" "14" } } */ + bar (a.j); /* { dg-final { gdb-test . "a.j" "14" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */ return a.i + a.j; } @@ -29,7 +29,7 @@ f2 (int k) asm ("" : "+r" (a[0])); a[1]++; bar (a[0]); /* { dg-final { gdb-test .+1 "a\[0\]" "4" } } */ - bar (a[1]); /* { dg-final { gdb-test . "a\[1\]" "14" } } */ + bar (a[1]); /* { dg-final { gdb-test . "a\[1\]" "14" { xfail { aarch64*-*-* && { any-opts "-fno-fat-lto-objects" } } } } } */ return a[0] + a[1]; } @@ -39,8 +39,8 @@ f3 (int k) struct B a = { 4, k + 6 }; asm ("" : "+r" (a.i)); a.j++; - bar (a.i); /* { dg-final { gdb-test .+1 "a.i" "4" } } */ - bar (a.j); /* { dg-final { gdb-test . "a.j" "14" } } */ + bar (a.i); /* { dg-final { gdb-test .+1 "a.i" "4" { xfail { aarch64*-*-* && { any-opts "-Og" } } } } } */ + bar (a.j); /* { dg-final { gdb-test . "a.j" "14" { xfail { aarch64*-*-* && { any-opts "-Og" "-fno-fat-lto-objects" } } } } } */ return a.i + a.j; } -- cgit v1.1 From b6600392bf71c4a9785f8f49948b611425896830 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Sat, 24 Apr 2021 13:34:49 +0100 Subject: Darwin : Adjust darwin_binds_local_p for PIC code [PR100152]. Darwin's dynamic linker supports interposition and lazy symbol binding. If we are generating PIC code and a symbol is public, then it could potentially be indirected via a lazy-resolver stub; we cannot tell at compile-time if this will be done (since the indirection can be the result of adding a -flat-namespace option at link-time). Here we are conservative and assume that any such symbol cannot bind locally. The default implementation for binds_local_p handles undefined, weak and common symbols which are always indirected (for mdynamic-no-pic also). gcc/ChangeLog: PR target/100152 * config/darwin.c (darwin_binds_local_p): Assume that any public symbol might be interposed for PIC code. Update function header comment to reflect current Darwin capability. --- gcc/config/darwin.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'gcc') diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 5d17391..36b460a 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -3134,16 +3134,25 @@ darwin_file_end (void) /* TODO: Add a language hook for identifying if a decl is a vtable. */ #define DARWIN_VTABLE_P(DECL) 0 -/* Cross-module name binding. Darwin does not support overriding - functions at dynamic-link time, except for vtables in kexts. */ +/* Cross-module name binding. + Darwin's dynamic linker supports interposition and lazy symbol binding. + If we are generating PIC code and a symbol is public, then it could + potentially be indirected via a lazy-resolver stub; we cannot tell at + compile-time if this will be done (since the indirection can be the + result of adding a -flat-namespace option at link-time). Here we are + conservative and assume that any such symbol cannot bind locally. + The default implementation for binds_local_p handles undefined, weak and + common symbols which are always indirected. */ bool darwin_binds_local_p (const_tree decl) { /* We use the "shlib" input to indicate that a symbol should be - considered overridable; only relevant for vtables in kernel modules - on earlier system versions, and with a TODO to complete. */ + considered overridable. Older versions of the kernel also support + interposition for extensions (although this code is a place-holder + until there is an implementation for DARWIN_VTABLE_P). */ bool force_overridable = TARGET_KEXTABI && DARWIN_VTABLE_P (decl); + force_overridable |= MACHOPIC_PURE; return default_binds_local_p_3 (decl, force_overridable /* shlib */, false /* weak dominate */, false /* extern_protected_data */, -- cgit v1.1 From a1765b421eb3d01ecc88fb0cdec9f06bfdaab8e2 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Sat, 24 Apr 2021 19:28:25 +0100 Subject: Revert "Darwin : Adjust darwin_binds_local_p for PIC code [PR100152]." Unfortunately, although this is required to fix the PR, and is notionally correct, it regresses some of the sanitizer and IPA tests. Reverting until this can be analysed. This reverts commit b6600392bf71c4a9785f8f49948b611425896830. --- gcc/config/darwin.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'gcc') diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 36b460a..5d17391 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -3134,25 +3134,16 @@ darwin_file_end (void) /* TODO: Add a language hook for identifying if a decl is a vtable. */ #define DARWIN_VTABLE_P(DECL) 0 -/* Cross-module name binding. - Darwin's dynamic linker supports interposition and lazy symbol binding. - If we are generating PIC code and a symbol is public, then it could - potentially be indirected via a lazy-resolver stub; we cannot tell at - compile-time if this will be done (since the indirection can be the - result of adding a -flat-namespace option at link-time). Here we are - conservative and assume that any such symbol cannot bind locally. - The default implementation for binds_local_p handles undefined, weak and - common symbols which are always indirected. */ +/* Cross-module name binding. Darwin does not support overriding + functions at dynamic-link time, except for vtables in kexts. */ bool darwin_binds_local_p (const_tree decl) { /* We use the "shlib" input to indicate that a symbol should be - considered overridable. Older versions of the kernel also support - interposition for extensions (although this code is a place-holder - until there is an implementation for DARWIN_VTABLE_P). */ + considered overridable; only relevant for vtables in kernel modules + on earlier system versions, and with a TODO to complete. */ bool force_overridable = TARGET_KEXTABI && DARWIN_VTABLE_P (decl); - force_overridable |= MACHOPIC_PURE; return default_binds_local_p_3 (decl, force_overridable /* shlib */, false /* weak dominate */, false /* extern_protected_data */, -- cgit v1.1 From 32c4d970ea3a9fc330d6aa8fd83f9dae0b9afc64 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Sat, 24 Apr 2021 20:38:06 +0200 Subject: Fortran - allow target of pointer from evaluation of function-reference Fortran allows the target of a pointer from the evaluation of a function-reference in a variable definition context (e.g. F2018:R902). gcc/fortran/ChangeLog: PR fortran/100218 * expr.c (gfc_check_vardef_context): Extend check to allow pointer from a function reference. gcc/testsuite/ChangeLog: PR fortran/100218 * gfortran.dg/ptr-func-4.f90: New test. --- gcc/fortran/expr.c | 4 +++- gcc/testsuite/gfortran.dg/ptr-func-4.f90 | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/ptr-func-4.f90 (limited to 'gcc') diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 92a6700..956003e 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -6121,7 +6121,9 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj, } if (!pointer && sym->attr.flavor != FL_VARIABLE && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result) - && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer)) + && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer) + && !(sym->attr.flavor == FL_PROCEDURE + && sym->attr.function && sym->attr.pointer)) { if (context) gfc_error ("%qs in variable definition context (%s) at %L is not" diff --git a/gcc/testsuite/gfortran.dg/ptr-func-4.f90 b/gcc/testsuite/gfortran.dg/ptr-func-4.f90 new file mode 100644 index 0000000..62b18f6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/ptr-func-4.f90 @@ -0,0 +1,19 @@ +! { dg-do run } +! { dg-options "-O2 -std=f2008" } +! PR fortran/100218 - target of pointer from evaluation of function-reference + +program p + implicit none + integer, target :: z = 0 + call g (f ()) + if (z /= 1) stop 1 +contains + function f () result (r) + integer, pointer :: r + r => z + end function f + subroutine g (x) + integer, intent(out) :: x + x = 1 + end subroutine g +end program p -- cgit v1.1 From d0e7833b94953ba6b4a915150666969ad9fc66af Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Sat, 24 Apr 2021 20:51:41 +0200 Subject: PR fortran/100154 - ICE in gfc_conv_procedure_call, at fortran/trans-expr.c:6131 Add appropriate static checks for the character and status arguments to the GNU Fortran intrinsic extensions fget[c], fput[c]. Extend variable check to allow a function reference having a data pointer result. gcc/fortran/ChangeLog: PR fortran/100154 * check.c (variable_check): Allow function reference having a data pointer result. (arg_strlen_is_zero): New function. (gfc_check_fgetputc_sub): Add static check of character and status arguments. (gfc_check_fgetput_sub): Likewise. * intrinsic.c (add_subroutines): Fix argument name for the character argument to intrinsic subroutines fget[c], fput[c]. gcc/testsuite/ChangeLog: PR fortran/100154 * gfortran.dg/pr100154.f90: New test. --- gcc/fortran/check.c | 36 ++++++++++++++++++++++++++++++++-- gcc/fortran/intrinsic.c | 10 +++++----- gcc/testsuite/gfortran.dg/pr100154.f90 | 26 ++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr100154.f90 (limited to 'gcc') diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 82db8e4..27bf3a7 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -1055,6 +1055,13 @@ variable_check (gfc_expr *e, int n, bool allow_proc) return true; } + /* F2018:R902: function reference having a data pointer result. */ + if (e->expr_type == EXPR_FUNCTION + && e->symtree->n.sym->attr.flavor == FL_PROCEDURE + && e->symtree->n.sym->attr.function + && e->symtree->n.sym->attr.pointer) + return true; + gfc_error ("%qs argument of %qs intrinsic at %L must be a variable", gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic, &e->where); @@ -5690,6 +5697,19 @@ gfc_check_spread (gfc_expr *source, gfc_expr *dim, gfc_expr *ncopies) functions). */ bool +arg_strlen_is_zero (gfc_expr *c, int n) +{ + if (gfc_var_strlen (c) == 0) + { + gfc_error ("%qs argument of %qs intrinsic at %L must have " + "length at least 1", gfc_current_intrinsic_arg[n]->name, + gfc_current_intrinsic, &c->where); + return true; + } + return false; +} + +bool gfc_check_fgetputc_sub (gfc_expr *unit, gfc_expr *c, gfc_expr *status) { if (!type_check (unit, 0, BT_INTEGER)) @@ -5702,13 +5722,19 @@ gfc_check_fgetputc_sub (gfc_expr *unit, gfc_expr *c, gfc_expr *status) return false; if (!kind_value_check (c, 1, gfc_default_character_kind)) return false; + if (strcmp (gfc_current_intrinsic, "fgetc") == 0 + && !variable_check (c, 1, false)) + return false; + if (arg_strlen_is_zero (c, 1)) + return false; if (status == NULL) return true; if (!type_check (status, 2, BT_INTEGER) || !kind_value_check (status, 2, gfc_default_integer_kind) - || !scalar_check (status, 2)) + || !scalar_check (status, 2) + || !variable_check (status, 2, false)) return false; return true; @@ -5729,13 +5755,19 @@ gfc_check_fgetput_sub (gfc_expr *c, gfc_expr *status) return false; if (!kind_value_check (c, 0, gfc_default_character_kind)) return false; + if (strcmp (gfc_current_intrinsic, "fget") == 0 + && !variable_check (c, 0, false)) + return false; + if (arg_strlen_is_zero (c, 0)) + return false; if (status == NULL) return true; if (!type_check (status, 1, BT_INTEGER) || !kind_value_check (status, 1, gfc_default_integer_kind) - || !scalar_check (status, 1)) + || !scalar_check (status, 1) + || !variable_check (status, 1, false)) return false; return true; diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index 17fd92e..219f04f 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -3460,7 +3460,7 @@ add_subroutines (void) /* Argument names. These are used as argument keywords and so need to match the documentation. Please keep this list in sorted order. */ static const char - *a = "a", *c = "count", *cm = "count_max", *com = "command", + *a = "a", *c_ = "c", *c = "count", *cm = "count_max", *com = "command", *cr = "count_rate", *dt = "date", *errmsg = "errmsg", *f = "from", *fp = "frompos", *gt = "get", *h = "harvest", *han = "handler", *length = "length", *ln = "len", *md = "mode", *msk = "mask", @@ -3840,12 +3840,12 @@ add_subroutines (void) add_sym_3s ("fgetc", GFC_ISYM_FGETC, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_fgetputc_sub, NULL, gfc_resolve_fgetc_sub, ut, BT_INTEGER, di, REQUIRED, INTENT_IN, - c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT, + c_, BT_CHARACTER, dc, REQUIRED, INTENT_OUT, st, BT_INTEGER, di, OPTIONAL, INTENT_OUT); add_sym_2s ("fget", GFC_ISYM_FGET, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_fgetput_sub, NULL, gfc_resolve_fget_sub, - c, BT_CHARACTER, dc, REQUIRED, INTENT_OUT, + c_, BT_CHARACTER, dc, REQUIRED, INTENT_OUT, st, BT_INTEGER, di, OPTIONAL, INTENT_OUT); add_sym_1s ("flush", GFC_ISYM_FLUSH, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU, @@ -3855,12 +3855,12 @@ add_subroutines (void) add_sym_3s ("fputc", GFC_ISYM_FPUTC, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_fgetputc_sub, NULL, gfc_resolve_fputc_sub, ut, BT_INTEGER, di, REQUIRED, INTENT_IN, - c, BT_CHARACTER, dc, REQUIRED, INTENT_IN, + c_, BT_CHARACTER, dc, REQUIRED, INTENT_IN, st, BT_INTEGER, di, OPTIONAL, INTENT_OUT); add_sym_2s ("fput", GFC_ISYM_FPUT, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU, gfc_check_fgetput_sub, NULL, gfc_resolve_fput_sub, - c, BT_CHARACTER, dc, REQUIRED, INTENT_IN, + c_, BT_CHARACTER, dc, REQUIRED, INTENT_IN, st, BT_INTEGER, di, OPTIONAL, INTENT_OUT); add_sym_1s ("free", GFC_ISYM_FREE, CLASS_IMPURE, BT_UNKNOWN, 0, GFC_STD_GNU, diff --git a/gcc/testsuite/gfortran.dg/pr100154.f90 b/gcc/testsuite/gfortran.dg/pr100154.f90 new file mode 100644 index 0000000..3a1489a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr100154.f90 @@ -0,0 +1,26 @@ +! { dg-do compile } +! { dg-options "-std=gnu" } +! PR100154 - ICE in gfc_conv_procedure_call, at fortran/trans-expr.c:6131 + +program p + implicit none + integer :: n + character, target :: c + character(len=0) :: c0 + character(len=:), allocatable :: cc + n = fget(cc) + n = fget('a') ! { dg-error "must be a variable" } + n = fget(c0) ! { dg-error "must have length at least 1" } + call fget('x') ! { dg-error "must be a variable" } + n = fgetc(5,'a') ! { dg-error "must be a variable" } + call fgetc(5,c0) ! { dg-error "must have length at least 1" } + call fgetc(5,c,1) ! { dg-error "must be a variable" } + call fputc(5,'x',1) ! { dg-error "must be a variable" } + n = fget (ptr_returning_func()) + print *, c +contains + function ptr_returning_func () result (res) + character, pointer :: res + res => c + end +end -- cgit v1.1 From 61bfff562e3b6091d5a0a412a7d496bd523868a8 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Sat, 24 Apr 2021 19:49:31 -0400 Subject: analyzer: fix ICE on NULL change.m_expr [PR100244] PR analyzer/100244 reports an ICE on a -Wanalyzer-free-of-non-heap due to a case where free_of_non_heap::describe_state_change can be passed a NULL change.m_expr for a suitably complicated symbolic value. Bulletproof it by checking for change.m_expr being NULL before dereferencing it. gcc/analyzer/ChangeLog: PR analyzer/100244 * sm-malloc.cc (free_of_non_heap::describe_state_change): Bulletproof against change.m_expr being NULL. gcc/testsuite/ChangeLog: PR analyzer/100244 * g++.dg/analyzer/pr100244.C: New test. --- gcc/analyzer/sm-malloc.cc | 2 +- gcc/testsuite/g++.dg/analyzer/pr100244.C | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/analyzer/pr100244.C (limited to 'gcc') diff --git a/gcc/analyzer/sm-malloc.cc b/gcc/analyzer/sm-malloc.cc index 1d5b860..f02b73a 100644 --- a/gcc/analyzer/sm-malloc.cc +++ b/gcc/analyzer/sm-malloc.cc @@ -1303,7 +1303,7 @@ public: { /* Attempt to reconstruct what kind of pointer it is. (It seems neater for this to be a part of the state, though). */ - if (TREE_CODE (change.m_expr) == SSA_NAME) + if (change.m_expr && TREE_CODE (change.m_expr) == SSA_NAME) { gimple *def_stmt = SSA_NAME_DEF_STMT (change.m_expr); if (gcall *call = dyn_cast (def_stmt)) diff --git a/gcc/testsuite/g++.dg/analyzer/pr100244.C b/gcc/testsuite/g++.dg/analyzer/pr100244.C new file mode 100644 index 0000000..261b3cf --- /dev/null +++ b/gcc/testsuite/g++.dg/analyzer/pr100244.C @@ -0,0 +1,22 @@ +// { dg-additional-options "-O1 -Wno-free-nonheap-object" } + +inline void *operator new (__SIZE_TYPE__, void *__p) { return __p; } + +struct __aligned_buffer { + int _M_storage; + int *_M_addr() { return &_M_storage; } +}; + +struct _Hashtable_alloc { + int _M_single_bucket; + int *_M_buckets; + _Hashtable_alloc () { _M_buckets = &_M_single_bucket; } + ~_Hashtable_alloc () { delete _M_buckets; } // { dg-warning "not on the heap" } +}; + +void +test01 (__aligned_buffer buf) +{ + _Hashtable_alloc *tmp = new (buf._M_addr ()) _Hashtable_alloc; + tmp->~_Hashtable_alloc (); +} -- cgit v1.1 From 502ef97c4f442777e5f61c506d17f8776a69b207 Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Sun, 25 Apr 2021 00:16:26 +0000 Subject: Daily bump. --- gcc/ChangeLog | 22 ++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/analyzer/ChangeLog | 6 +++++ gcc/cp/ChangeLog | 17 +++++++++++++ gcc/fortran/ChangeLog | 18 +++++++++++++ gcc/testsuite/ChangeLog | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 131 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 93a196b..c53b0cf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2021-04-24 Iain Sandoe + + Revert: + 2021-04-24 Iain Sandoe + + PR target/100152 + * config/darwin.c (darwin_binds_local_p): Assume that any + public symbol might be interposed for PIC code. Update function + header comment to reflect current Darwin capability. + +2021-04-24 Iain Sandoe + + PR target/100152 + * config/darwin.c (darwin_binds_local_p): Assume that any + public symbol might be interposed for PIC code. Update function + header comment to reflect current Darwin capability. + +2021-04-24 Richard Sandiford + + * doc/sourcebuild.texi: Document no-opts and any-opts target + selectors. + 2021-04-23 YiFei Zhu * config/bpf/bpf.h (ASM_OUTPUT_ALIGNED_BSS): Use .type and .lcomm. diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 26da51d..9c0494e 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210424 +20210425 diff --git a/gcc/analyzer/ChangeLog b/gcc/analyzer/ChangeLog index 85dd462..182bf78 100644 --- a/gcc/analyzer/ChangeLog +++ b/gcc/analyzer/ChangeLog @@ -1,3 +1,9 @@ +2021-04-24 David Malcolm + + PR analyzer/100244 + * sm-malloc.cc (free_of_non_heap::describe_state_change): + Bulletproof against change.m_expr being NULL. + 2021-04-13 David Malcolm PR analyzer/98599 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d64cdce..b213029 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,20 @@ +2021-04-24 Patrick Palka + + PR c++/89565 + PR c++/93383 + PR c++/95291 + PR c++/99200 + PR c++/99683 + * pt.c (do_class_deduction): Punt if the initializer is + type-dependent. + +2021-04-24 Patrick Palka + + PR c++/87709 + * parser.c (cp_parser_type_id_1): If we see a template + placeholder, first try simulating an error before issuing + a real error. + 2021-04-23 Patrick Palka PR c++/98767 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4764f4a..ad66161 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,21 @@ +2021-04-24 Harald Anlauf + + PR fortran/100154 + * check.c (variable_check): Allow function reference having a data + pointer result. + (arg_strlen_is_zero): New function. + (gfc_check_fgetputc_sub): Add static check of character and status + arguments. + (gfc_check_fgetput_sub): Likewise. + * intrinsic.c (add_subroutines): Fix argument name for the + character argument to intrinsic subroutines fget[c], fput[c]. + +2021-04-24 Harald Anlauf + + PR fortran/100218 + * expr.c (gfc_check_vardef_context): Extend check to allow pointer + from a function reference. + 2021-04-22 Martin Liska PR testsuite/100159 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 905cd01..732f442 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,70 @@ +2021-04-24 David Malcolm + + PR analyzer/100244 + * g++.dg/analyzer/pr100244.C: New test. + +2021-04-24 Harald Anlauf + + PR fortran/100154 + * gfortran.dg/pr100154.f90: New test. + +2021-04-24 Harald Anlauf + + PR fortran/100218 + * gfortran.dg/ptr-func-4.f90: New test. + +2021-04-24 Richard Sandiford + + * gcc.dg/guality/example.c: Update aarch64*-*-* xfails. + * gcc.dg/guality/guality.c: Likewise. + * gcc.dg/guality/inline-params.c: Likewise. + * gcc.dg/guality/loop-1.c: Likewise. + * gcc.dg/guality/pr36728-1.c: Likewise. + * gcc.dg/guality/pr36728-2.c: Likewise. + * gcc.dg/guality/pr36728-3.c: Likewise. + * gcc.dg/guality/pr41447-1.c: Likewise. + * gcc.dg/guality/pr54200.c: Likewise. + * gcc.dg/guality/pr54519-1.c: Likewise. + * gcc.dg/guality/pr54519-2.c: Likewise. + * gcc.dg/guality/pr54519-3.c: Likewise. + * gcc.dg/guality/pr54519-4.c: Likewise. + * gcc.dg/guality/pr54519-5.c: Likewise. + * gcc.dg/guality/pr54519-6.c: Likewise. + * gcc.dg/guality/pr54693-2.c: Likewise. + * gcc.dg/guality/pr56154-1.c: Likewise. + * gcc.dg/guality/pr59776.c: Likewise. + * gcc.dg/guality/pr68860-1.c: Likewise. + * gcc.dg/guality/pr68860-2.c: Likewise. + * gcc.dg/guality/pr90074.c: Likewise. + * gcc.dg/guality/pr90716.c: Likewise. + * gcc.dg/guality/sra-1.c: Likewise. + +2021-04-24 Richard Sandiford + + * lib/target-supports-dg.exp (selector_expression): Handle any-opts + and no-opts. + * gcc.dg/guality/pr41353-1.c: Exclude -O0 from xfail. + * gcc.dg/guality/pr59776.c: Likewise. + * gcc.dg/guality/pr54970.c: Likewise -O0 and -Og. + +2021-04-24 Patrick Palka + + PR c++/89565 + PR c++/93383 + PR c++/95291 + PR c++/99200 + PR c++/99683 + * g++.dg/cpp2a/nontype-class39.C: Remove dg-ice directive. + * g++.dg/cpp2a/nontype-class45.C: New test. + * g++.dg/cpp2a/nontype-class46.C: New test. + * g++.dg/cpp2a/nontype-class47.C: New test. + * g++.dg/cpp2a/nontype-class48.C: New test. + +2021-04-24 Patrick Palka + + PR c++/87709 + * g++.dg/cpp1z/class-deduction86.C: New test. + 2021-04-23 Michael Meissner PR target/98952 -- cgit v1.1 From c54a9f7259fce1a221270f21d8076c960c7d0163 Mon Sep 17 00:00:00 2001 From: liuhongt Date: Tue, 23 Feb 2021 11:17:40 +0800 Subject: Add folding and remove expanders for x86 *pcmp{et,gt}* builtins [PR target/98911] gcc/ChangeLog: PR target/98911 * config/i386/i386-builtin.def (BDESC): Change the icode of the following builtins to CODE_FOR_nothing. * config/i386/i386.c (ix86_gimple_fold_builtin): Fold IX86_BUILTIN_PCMPEQB128, IX86_BUILTIN_PCMPEQW128, IX86_BUILTIN_PCMPEQD128, IX86_BUILTIN_PCMPEQQ, IX86_BUILTIN_PCMPEQB256, IX86_BUILTIN_PCMPEQW256, IX86_BUILTIN_PCMPEQD256, IX86_BUILTIN_PCMPEQQ256, IX86_BUILTIN_PCMPGTB128, IX86_BUILTIN_PCMPGTW128, IX86_BUILTIN_PCMPGTD128, IX86_BUILTIN_PCMPGTQ, IX86_BUILTIN_PCMPGTB256, IX86_BUILTIN_PCMPGTW256, IX86_BUILTIN_PCMPGTD256, IX86_BUILTIN_PCMPGTQ256. * config/i386/sse.md (avx2_eq3): Deleted. (sse2_eq3): Ditto. (sse4_1_eqv2di3): Ditto. (sse2_gt3): Rename to .. (*sse2_gt3): .. this. gcc/testsuite/ChangeLog: PR target/98911 * gcc.target/i386/pr98911.c: New test. * gcc.target/i386/funcspec-8.c: Replace __builtin_ia32_pcmpgtq with __builtin_ia32_pcmpistrm128 since it has been folded. --- gcc/config/i386/i386-builtin.def | 32 ++++---- gcc/config/i386/i386.c | 44 +++++++++++ gcc/config/i386/sse.md | 26 +------ gcc/testsuite/gcc.target/i386/funcspec-8.c | 17 +++-- gcc/testsuite/gcc.target/i386/pr98911.c | 116 +++++++++++++++++++++++++++++ 5 files changed, 186 insertions(+), 49 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr98911.c (limited to 'gcc') diff --git a/gcc/config/i386/i386-builtin.def b/gcc/config/i386/i386-builtin.def index e3ed4e1..4dbd4f2 100644 --- a/gcc/config/i386/i386-builtin.def +++ b/gcc/config/i386/i386-builtin.def @@ -773,12 +773,12 @@ BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_xorv2di3, "__builtin_ia32_pxor128", IX8 BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_sse2_uavgv16qi3, "__builtin_ia32_pavgb128", IX86_BUILTIN_PAVGB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI) BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_sse2_uavgv8hi3, "__builtin_ia32_pavgw128", IX86_BUILTIN_PAVGW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI) -BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_sse2_eqv16qi3, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI) -BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_sse2_eqv8hi3, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI) -BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_sse2_eqv4si3, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI ) -BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_sse2_gtv16qi3, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI) -BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_sse2_gtv8hi3, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI) -BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_sse2_gtv4si3, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI ) +BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpeqb128", IX86_BUILTIN_PCMPEQB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI) +BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpeqw128", IX86_BUILTIN_PCMPEQW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI) +BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpeqd128", IX86_BUILTIN_PCMPEQD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI ) +BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpgtb128", IX86_BUILTIN_PCMPGTB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI) +BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpgtw128", IX86_BUILTIN_PCMPGTW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI) +BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpgtd128", IX86_BUILTIN_PCMPGTD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI ) BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_umaxv16qi3, "__builtin_ia32_pmaxub128", IX86_BUILTIN_PMAXUB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI) BDESC (OPTION_MASK_ISA_SSE2, 0, CODE_FOR_smaxv8hi3, "__builtin_ia32_pmaxsw128", IX86_BUILTIN_PMAXSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI) @@ -919,7 +919,7 @@ BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_sse4_1_zero_extendv2siv2di2, "__built BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_sse4_1_phminposuw, "__builtin_ia32_phminposuw128", IX86_BUILTIN_PHMINPOSUW128, UNKNOWN, (int) V8HI_FTYPE_V8HI) BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_sse4_1_packusdw, "__builtin_ia32_packusdw128", IX86_BUILTIN_PACKUSDW128, UNKNOWN, (int) V8HI_FTYPE_V4SI_V4SI) -BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_sse4_1_eqv2di3, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI) +BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpeqq", IX86_BUILTIN_PCMPEQQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI) BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_smaxv16qi3, "__builtin_ia32_pmaxsb128", IX86_BUILTIN_PMAXSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI_V16QI) BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_smaxv4si3, "__builtin_ia32_pmaxsd128", IX86_BUILTIN_PMAXSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI) BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_umaxv4si3, "__builtin_ia32_pmaxud128", IX86_BUILTIN_PMAXUD128, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI) @@ -962,7 +962,7 @@ BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_sse4_1_ptestv2di, "__builtin_ia32_pte BDESC (OPTION_MASK_ISA_SSE4_1, 0, CODE_FOR_sse4_1_ptestv2di, "__builtin_ia32_ptestnzc128", IX86_BUILTIN_PTESTNZC, GTU, (int) INT_FTYPE_V2DI_V2DI_PTEST) /* SSE4.2 */ -BDESC (OPTION_MASK_ISA_SSE4_2, 0, CODE_FOR_sse4_2_gtv2di3, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI) +BDESC (OPTION_MASK_ISA_SSE4_2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpgtq", IX86_BUILTIN_PCMPGTQ, UNKNOWN, (int) V2DI_FTYPE_V2DI_V2DI) BDESC (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, 0, CODE_FOR_sse4_2_crc32qi, "__builtin_ia32_crc32qi", IX86_BUILTIN_CRC32QI, UNKNOWN, (int) UINT_FTYPE_UINT_UCHAR) BDESC (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, 0, CODE_FOR_sse4_2_crc32hi, "__builtin_ia32_crc32hi", IX86_BUILTIN_CRC32HI, UNKNOWN, (int) UINT_FTYPE_UINT_USHORT) BDESC (OPTION_MASK_ISA_SSE4_2 | OPTION_MASK_ISA_CRC32, 0, CODE_FOR_sse4_2_crc32si, "__builtin_ia32_crc32si", IX86_BUILTIN_CRC32SI, UNKNOWN, (int) UINT_FTYPE_UINT_UINT) @@ -1149,14 +1149,14 @@ BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_uavgv32qi3, "__builtin_ia32_pavgb2 BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_uavgv16hi3, "__builtin_ia32_pavgw256", IX86_BUILTIN_PAVGW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI) BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_pblendvb, "__builtin_ia32_pblendvb256", IX86_BUILTIN_PBLENDVB256, UNKNOWN, (int) V32QI_FTYPE_V32QI_V32QI_V32QI) BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_pblendw, "__builtin_ia32_pblendw256", IX86_BUILTIN_PBLENDVW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI_INT) -BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_eqv32qi3, "__builtin_ia32_pcmpeqb256", IX86_BUILTIN_PCMPEQB256, UNKNOWN, (int) V32QI_FTYPE_V32QI_V32QI) -BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_eqv16hi3, "__builtin_ia32_pcmpeqw256", IX86_BUILTIN_PCMPEQW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI) -BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_eqv8si3, "__builtin_ia32_pcmpeqd256", IX86_BUILTIN_PCMPEQD256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI ) -BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_eqv4di3, "__builtin_ia32_pcmpeqq256", IX86_BUILTIN_PCMPEQQ256, UNKNOWN, (int) V4DI_FTYPE_V4DI_V4DI ) -BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_gtv32qi3, "__builtin_ia32_pcmpgtb256", IX86_BUILTIN_PCMPGTB256, UNKNOWN, (int) V32QI_FTYPE_V32QI_V32QI) -BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_gtv16hi3, "__builtin_ia32_pcmpgtw256", IX86_BUILTIN_PCMPGTW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI) -BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_gtv8si3, "__builtin_ia32_pcmpgtd256", IX86_BUILTIN_PCMPGTD256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI ) -BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_gtv4di3, "__builtin_ia32_pcmpgtq256", IX86_BUILTIN_PCMPGTQ256, UNKNOWN, (int) V4DI_FTYPE_V4DI_V4DI ) +BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpeqb256", IX86_BUILTIN_PCMPEQB256, UNKNOWN, (int) V32QI_FTYPE_V32QI_V32QI) +BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpeqw256", IX86_BUILTIN_PCMPEQW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI) +BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpeqd256", IX86_BUILTIN_PCMPEQD256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI ) +BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpeqq256", IX86_BUILTIN_PCMPEQQ256, UNKNOWN, (int) V4DI_FTYPE_V4DI_V4DI ) +BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpgtb256", IX86_BUILTIN_PCMPGTB256, UNKNOWN, (int) V32QI_FTYPE_V32QI_V32QI) +BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpgtw256", IX86_BUILTIN_PCMPGTW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI) +BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpgtd256", IX86_BUILTIN_PCMPGTD256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI ) +BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_nothing, "__builtin_ia32_pcmpgtq256", IX86_BUILTIN_PCMPGTQ256, UNKNOWN, (int) V4DI_FTYPE_V4DI_V4DI ) BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_phaddwv16hi3, "__builtin_ia32_phaddw256", IX86_BUILTIN_PHADDW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI) BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_phadddv8si3, "__builtin_ia32_phaddd256", IX86_BUILTIN_PHADDD256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI) BDESC (OPTION_MASK_ISA_AVX2, 0, CODE_FOR_avx2_phaddswv16hi3, "__builtin_ia32_phaddsw256", IX86_BUILTIN_PHADDSW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI) diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d3c09bf..adcef1e 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -67,6 +67,7 @@ along with GCC; see the file COPYING3. If not see #include "pass_manager.h" #include "target-globals.h" #include "gimple-iterator.h" +#include "gimple-fold.h" #include "tree-vectorizer.h" #include "shrink-wrap.h" #include "builtins.h" @@ -17865,6 +17866,7 @@ ix86_gimple_fold_builtin (gimple_stmt_iterator *gsi) tree decl = NULL_TREE; tree arg0, arg1, arg2; enum rtx_code rcode; + enum tree_code tcode; unsigned HOST_WIDE_INT count; bool is_vshift; @@ -17946,6 +17948,48 @@ ix86_gimple_fold_builtin (gimple_stmt_iterator *gsi) } break; + case IX86_BUILTIN_PCMPEQB128: + case IX86_BUILTIN_PCMPEQW128: + case IX86_BUILTIN_PCMPEQD128: + case IX86_BUILTIN_PCMPEQQ: + case IX86_BUILTIN_PCMPEQB256: + case IX86_BUILTIN_PCMPEQW256: + case IX86_BUILTIN_PCMPEQD256: + case IX86_BUILTIN_PCMPEQQ256: + tcode = EQ_EXPR; + goto do_cmp; + + case IX86_BUILTIN_PCMPGTB128: + case IX86_BUILTIN_PCMPGTW128: + case IX86_BUILTIN_PCMPGTD128: + case IX86_BUILTIN_PCMPGTQ: + case IX86_BUILTIN_PCMPGTB256: + case IX86_BUILTIN_PCMPGTW256: + case IX86_BUILTIN_PCMPGTD256: + case IX86_BUILTIN_PCMPGTQ256: + tcode = GT_EXPR; + + do_cmp: + gcc_assert (n_args == 2); + arg0 = gimple_call_arg (stmt, 0); + arg1 = gimple_call_arg (stmt, 1); + { + location_t loc = gimple_location (stmt); + tree type = TREE_TYPE (arg0); + tree zero_vec = build_zero_cst (type); + tree minus_one_vec = build_minus_one_cst (type); + tree cmp_type = truth_type_for (type); + gimple_seq stmts = NULL; + tree cmp = gimple_build (&stmts, tcode, cmp_type, arg0, arg1); + gsi_insert_before (gsi, stmts, GSI_SAME_STMT); + gimple *g = gimple_build_assign (gimple_call_lhs (stmt), + VEC_COND_EXPR, cmp, + minus_one_vec, zero_vec); + gimple_set_location (g, loc); + gsi_replace (gsi, g, false); + } + return true; + case IX86_BUILTIN_PSLLD: case IX86_BUILTIN_PSLLD128: case IX86_BUILTIN_PSLLD128_MASK: diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 319099d..897cf3e 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -12875,14 +12875,6 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define_expand "avx2_eq3" - [(set (match_operand:VI_256 0 "register_operand") - (eq:VI_256 - (match_operand:VI_256 1 "nonimmediate_operand") - (match_operand:VI_256 2 "nonimmediate_operand")))] - "TARGET_AVX2" - "ix86_fixup_binary_operands_no_copy (EQ, mode, operands);") - (define_insn "*avx2_eq3" [(set (match_operand:VI_256 0 "register_operand" "=x") (eq:VI_256 @@ -13058,22 +13050,6 @@ (set_attr "prefix" "orig,vex") (set_attr "mode" "TI")]) -(define_expand "sse2_eq3" - [(set (match_operand:VI124_128 0 "register_operand") - (eq:VI124_128 - (match_operand:VI124_128 1 "vector_operand") - (match_operand:VI124_128 2 "vector_operand")))] - "TARGET_SSE2 && !TARGET_XOP " - "ix86_fixup_binary_operands_no_copy (EQ, mode, operands);") - -(define_expand "sse4_1_eqv2di3" - [(set (match_operand:V2DI 0 "register_operand") - (eq:V2DI - (match_operand:V2DI 1 "vector_operand") - (match_operand:V2DI 2 "vector_operand")))] - "TARGET_SSE4_1" - "ix86_fixup_binary_operands_no_copy (EQ, V2DImode, operands);") - (define_insn "sse4_2_gtv2di3" [(set (match_operand:V2DI 0 "register_operand" "=Yr,*x,x") (gt:V2DI @@ -13144,7 +13120,7 @@ (set_attr "prefix" "evex") (set_attr "mode" "")]) -(define_insn "sse2_gt3" +(define_insn "*sse2_gt3" [(set (match_operand:VI124_128 0 "register_operand" "=x,x") (gt:VI124_128 (match_operand:VI124_128 1 "register_operand" "0,x") diff --git a/gcc/testsuite/gcc.target/i386/funcspec-8.c b/gcc/testsuite/gcc.target/i386/funcspec-8.c index 8bd95fc..0a6c709 100644 --- a/gcc/testsuite/gcc.target/i386/funcspec-8.c +++ b/gcc/testsuite/gcc.target/i386/funcspec-8.c @@ -8,6 +8,7 @@ typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__)); typedef int __m128w __attribute__ ((__vector_size__ (16), __may_alias__)); typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); +typedef char __m128qi __attribute__ ((__vector_size__ (16), __may_alias__)); #ifdef __SSE3__ #error "-msse3 should not be set for this test" @@ -70,19 +71,19 @@ generic_blendvpd (__m128d a, __m128d b, __m128d c) #error "-msse4.2 should not be set for this test" #endif -__m128i sse4_2_pcmpgtq (__m128i a, __m128i b) __attribute__((__target__("sse4.2"))); -__m128i generic_pcmpgtq (__m128i ab, __m128i b); +__m128qi sse4_2_cmpistrm (__m128qi a, __m128qi b) __attribute__((__target__("sse4.2"))); +__m128qi generic_cmpistrm (__m128qi a, __m128qi b); -__m128i -sse4_2_pcmpgtq (__m128i a, __m128i b) +__m128qi +sse4_2_cmpistrm (__m128qi a, __m128qi b) { - return __builtin_ia32_pcmpgtq (a, b); + return __builtin_ia32_pcmpistrm128 (a, b, 0); } -__m128i -generic_pcmpgtq (__m128i a, __m128i b) +__m128qi +generic_comistrm (__m128qi a, __m128qi b) { - return __builtin_ia32_pcmpgtq (a, b); /* { dg-error "needs isa option" } */ + return __builtin_ia32_pcmpistrm128 (a, b, 0); /* { dg-error "needs isa option" } */ } #ifdef __SSE4A__ diff --git a/gcc/testsuite/gcc.target/i386/pr98911.c b/gcc/testsuite/gcc.target/i386/pr98911.c new file mode 100644 index 0000000..f08cea0 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr98911.c @@ -0,0 +1,116 @@ +/* PR target/98911 */ +/* { dg-do compile } */ +/* { dg-options "-O -mavx2" } */ +/* { dg-final { scan-assembler-times "pcmpeqb" 2 } } */ +/* { dg-final { scan-assembler-times "pcmpeqw" 2 } } */ +/* { dg-final { scan-assembler-times "pcmpeqd" 2 } } */ +/* { dg-final { scan-assembler-times "pcmpeqq" 2 } } */ +/* { dg-final { scan-assembler-times "pcmpgtb" 2 } } */ +/* { dg-final { scan-assembler-times "pcmpgtw" 2 } } */ +/* { dg-final { scan-assembler-times "pcmpgtd" 2 } } */ +/* { dg-final { scan-assembler-times "pcmpgtq" 2 } } */ + +typedef char v16qi __attribute__ ((vector_size (16))); +typedef char v32qi __attribute__ ((vector_size (32))); +typedef short v8hi __attribute__ ((vector_size (16))); +typedef short v16hi __attribute__ ((vector_size (32))); +typedef int v4si __attribute__ ((vector_size (16))); +typedef int v8si __attribute__ ((vector_size (32))); +typedef long long v2di __attribute__ ((vector_size (16))); +typedef long long v4di __attribute__ ((vector_size (32))); + +v16qi +f1 (v16qi a, v16qi b) +{ + return __builtin_ia32_pcmpeqb128 (a, b); +} + +v8hi +f2 (v8hi a, v8hi b) +{ + return __builtin_ia32_pcmpeqw128 (a, b); +} + +v4si +f3 (v4si a, v4si b) +{ + return __builtin_ia32_pcmpeqd128 (a, b); +} + +v2di +f4 (v2di a, v2di b) +{ + return __builtin_ia32_pcmpeqq (a, b); +} + +v16qi +f5 (v16qi a, v16qi b) +{ + return __builtin_ia32_pcmpgtb128 (a, b); +} + +v8hi +f6 (v8hi a, v8hi b) +{ + return __builtin_ia32_pcmpgtw128 (a, b); +} + +v4si +f7 (v4si a, v4si b) +{ + return __builtin_ia32_pcmpgtd128 (a, b); +} + +v2di +f8 (v2di a, v2di b) +{ + return __builtin_ia32_pcmpgtq (a, b); +} + +v32qi +f9 (v32qi a, v32qi b) +{ + return __builtin_ia32_pcmpeqb256 (a, b); +} + +v16hi +f10 (v16hi a, v16hi b) +{ + return __builtin_ia32_pcmpeqw256 (a, b); +} + +v8si +f11 (v8si a, v8si b) +{ + return __builtin_ia32_pcmpeqd256 (a, b); +} + +v4di +f12 (v4di a, v4di b) +{ + return __builtin_ia32_pcmpeqq256 (a, b); +} + +v32qi +f13 (v32qi a, v32qi b) +{ + return __builtin_ia32_pcmpgtb256 (a, b); +} + +v16hi +f14 (v16hi a, v16hi b) +{ + return __builtin_ia32_pcmpgtw256 (a, b); +} + +v8si +f15 (v8si a, v8si b) +{ + return __builtin_ia32_pcmpgtd256 (a, b); +} + +v4di +f16 (v4di a, v4di b) +{ + return __builtin_ia32_pcmpgtq256 (a, b); +} -- cgit v1.1 From 3971aee9dd8d6323c377d1b241173f7d2b51a835 Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Mon, 26 Apr 2021 00:16:26 +0000 Subject: Daily bump. --- gcc/ChangeLog | 20 ++++++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/testsuite/ChangeLog | 7 +++++++ 3 files changed, 28 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c53b0cf..a8510be 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,23 @@ +2021-04-25 liuhongt + + PR target/98911 + * config/i386/i386-builtin.def (BDESC): Change the icode of + the following builtins to CODE_FOR_nothing. + * config/i386/i386.c (ix86_gimple_fold_builtin): Fold + IX86_BUILTIN_PCMPEQB128, IX86_BUILTIN_PCMPEQW128, + IX86_BUILTIN_PCMPEQD128, IX86_BUILTIN_PCMPEQQ, + IX86_BUILTIN_PCMPEQB256, IX86_BUILTIN_PCMPEQW256, + IX86_BUILTIN_PCMPEQD256, IX86_BUILTIN_PCMPEQQ256, + IX86_BUILTIN_PCMPGTB128, IX86_BUILTIN_PCMPGTW128, + IX86_BUILTIN_PCMPGTD128, IX86_BUILTIN_PCMPGTQ, + IX86_BUILTIN_PCMPGTB256, IX86_BUILTIN_PCMPGTW256, + IX86_BUILTIN_PCMPGTD256, IX86_BUILTIN_PCMPGTQ256. + * config/i386/sse.md (avx2_eq3): Deleted. + (sse2_eq3): Ditto. + (sse4_1_eqv2di3): Ditto. + (sse2_gt3): Rename to .. + (*sse2_gt3): .. this. + 2021-04-24 Iain Sandoe Revert: diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 9c0494e..7f03bd1 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210425 +20210426 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 732f442..c79adfd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2021-04-25 liuhongt + + PR target/98911 + * gcc.target/i386/pr98911.c: New test. + * gcc.target/i386/funcspec-8.c: Replace __builtin_ia32_pcmpgtq + with __builtin_ia32_pcmpistrm128 since it has been folded. + 2021-04-24 David Malcolm PR analyzer/100244 -- cgit v1.1 From 297bfacdb448c0d29b8dfac2818350b90902bc75 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 26 Apr 2021 09:59:15 +0200 Subject: vmsdbgout: Remove useless register keywords register keyword was removed in C++17, and in vmsdbgout.c it served no useful purpose. 2021-04-26 Jakub Jelinek PR debug/100255 * vmsdbgout.c (ASM_OUTPUT_DEBUG_STRING, vmsdbgout_begin_block, vmsdbgout_end_block, lookup_filename, vmsdbgout_source_line): Remove register keywords. --- gcc/vmsdbgout.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'gcc') diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c index a764000..c226bc6 100644 --- a/gcc/vmsdbgout.c +++ b/gcc/vmsdbgout.c @@ -365,13 +365,13 @@ static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES]; #define ASM_OUTPUT_DEBUG_STRING(FILE,P) \ do \ { \ - register int slen = strlen (P); \ - register const char *p = (P); \ - register int i; \ + int slen = strlen (P); \ + const char *p = (P); \ + int i; \ fprintf (FILE, "\t.ascii \""); \ for (i = 0; i < slen; i++) \ { \ - register int c = p[i]; \ + int c = p[i]; \ if (c == '\"' || c == '\\') \ putc ('\\', FILE); \ if (c >= ' ' && c < 0177) \ @@ -1229,7 +1229,7 @@ vmsdbgout_end_epilogue (unsigned int line, const char *file) a lexical block. */ static void -vmsdbgout_begin_block (register unsigned line, register unsigned blocknum) +vmsdbgout_begin_block (unsigned line, unsigned blocknum) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.begin_block) (line, blocknum); @@ -1242,7 +1242,7 @@ vmsdbgout_begin_block (register unsigned line, register unsigned blocknum) lexical block. */ static void -vmsdbgout_end_block (register unsigned line, register unsigned blocknum) +vmsdbgout_end_block (unsigned line, unsigned blocknum) { if (write_symbols == VMS_AND_DWARF2_DEBUG) (*dwarf2_debug_hooks.end_block) (line, blocknum); @@ -1315,8 +1315,8 @@ static unsigned int lookup_filename (const char *file_name) { static unsigned int last_file_lookup_index = 0; - register char *fn; - register unsigned i; + char *fn; + unsigned i; const char *fnam; long long cdt = 0; long ebk = 0; @@ -1405,8 +1405,8 @@ vmsdbgout_write_source_line (unsigned line, const char *filename, } static void -vmsdbgout_source_line (register unsigned line, unsigned int column, - register const char *filename, +vmsdbgout_source_line (unsigned line, unsigned int column, + const char *filename, int discriminator, bool is_stmt) { if (write_symbols == VMS_AND_DWARF2_DEBUG) -- cgit v1.1 From 52a5515ed6619739eb122f05ce26057dd8b06fb6 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 14 Apr 2021 13:40:58 +0200 Subject: Simplify {gimplify_and_,}update_call_from_tree API This removes update_call_from_tree in favor of gimplify_and_update_call_from_tree, removing some code duplication and simplifying the API use. Some users of update_call_from_tree have been transitioned to replace_call_with_value and the API and its dependences have been moved to gimple-fold.h. This shaves off another user of valid_gimple_rhs_p which is now only used from within gimple-fold.c and thus moved and made private. 2021-04-14 Richard Biener * tree-ssa-propagate.h (valid_gimple_rhs_p): Remove. (update_gimple_call): Likewise. (update_call_from_tree): Likewise. * tree-ssa-propagate.c (valid_gimple_rhs_p): Remove. (valid_gimple_call_p): Likewise. (move_ssa_defining_stmt_for_defs): Likewise. (finish_update_gimple_call): Likewise. (update_gimple_call): Likewise. (update_call_from_tree): Likewise. (propagate_tree_value_into_stmt): Use replace_call_with_value. * gimple-fold.h (update_gimple_call): Declare. * gimple-fold.c (valid_gimple_rhs_p): Move here from tree-ssa-propagate.c. (update_gimple_call): Likewise. (valid_gimple_call_p): Likewise. (finish_update_gimple_call): Likewise, and simplify. (gimplify_and_update_call_from_tree): Implement update_call_from_tree functionality, avoid excessive push/pop_gimplify_context. (gimple_fold_builtin): Use only gimplify_and_update_call_from_tree. (gimple_fold_call): Likewise. * gimple-ssa-sprintf.c (try_substitute_return_value): Likewise. * tree-ssa-ccp.c (ccp_folder::fold_stmt): Likewise. (pass_fold_builtins::execute): Likewise. (optimize_stack_restore): Use replace_call_with_value. * tree-cfg.c (fold_loop_internal_call): Likewise. * tree-ssa-dce.c (maybe_optimize_arith_overflow): Use only gimplify_and_update_call_from_tree. * tree-ssa-strlen.c (handle_builtin_strlen): Likewise. (handle_builtin_strchr): Likewise. * tsan.c: Include gimple-fold.h instead of tree-ssa-propagate.h. * config/rs6000/rs6000-call.c (rs6000_gimple_fold_builtin): Use replace_call_with_value. --- gcc/config/rs6000/rs6000-call.c | 2 +- gcc/gimple-fold.c | 219 +++++++++++++++++++++++++++-- gcc/gimple-fold.h | 1 + gcc/gimple-ssa-sprintf.c | 3 +- gcc/tree-cfg.c | 2 +- gcc/tree-ssa-ccp.c | 15 +- gcc/tree-ssa-dce.c | 3 +- gcc/tree-ssa-propagate.c | 300 +--------------------------------------- gcc/tree-ssa-propagate.h | 3 - gcc/tree-ssa-strlen.c | 9 +- gcc/tsan.c | 2 +- 11 files changed, 226 insertions(+), 333 deletions(-) (limited to 'gcc') diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c index f567625..6f6dc47 100644 --- a/gcc/config/rs6000/rs6000-call.c +++ b/gcc/config/rs6000/rs6000-call.c @@ -12369,7 +12369,7 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) /* Convert result back to the lhs type. */ res = gimple_build (&stmts, VIEW_CONVERT_EXPR, TREE_TYPE (lhs), res); gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); - update_call_from_tree (gsi, res); + replace_call_with_value (gsi, res); return true; } /* Vector loads. */ diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 7602018..aa33779 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -335,6 +335,123 @@ maybe_fold_reference (tree expr) return NULL_TREE; } +/* Return true if EXPR is an acceptable right-hand-side for a + GIMPLE assignment. We validate the entire tree, not just + the root node, thus catching expressions that embed complex + operands that are not permitted in GIMPLE. This function + is needed because the folding routines in fold-const.c + may return such expressions in some cases, e.g., an array + access with an embedded index addition. It may make more + sense to have folding routines that are sensitive to the + constraints on GIMPLE operands, rather than abandoning any + any attempt to fold if the usual folding turns out to be too + aggressive. */ + +bool +valid_gimple_rhs_p (tree expr) +{ + enum tree_code code = TREE_CODE (expr); + + switch (TREE_CODE_CLASS (code)) + { + case tcc_declaration: + if (!is_gimple_variable (expr)) + return false; + break; + + case tcc_constant: + /* All constants are ok. */ + break; + + case tcc_comparison: + /* GENERIC allows comparisons with non-boolean types, reject + those for GIMPLE. Let vector-typed comparisons pass - rules + for GENERIC and GIMPLE are the same here. */ + if (!(INTEGRAL_TYPE_P (TREE_TYPE (expr)) + && (TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE + || TYPE_PRECISION (TREE_TYPE (expr)) == 1)) + && ! VECTOR_TYPE_P (TREE_TYPE (expr))) + return false; + + /* Fallthru. */ + case tcc_binary: + if (!is_gimple_val (TREE_OPERAND (expr, 0)) + || !is_gimple_val (TREE_OPERAND (expr, 1))) + return false; + break; + + case tcc_unary: + if (!is_gimple_val (TREE_OPERAND (expr, 0))) + return false; + break; + + case tcc_expression: + switch (code) + { + case ADDR_EXPR: + { + tree t; + if (is_gimple_min_invariant (expr)) + return true; + t = TREE_OPERAND (expr, 0); + while (handled_component_p (t)) + { + /* ??? More checks needed, see the GIMPLE verifier. */ + if ((TREE_CODE (t) == ARRAY_REF + || TREE_CODE (t) == ARRAY_RANGE_REF) + && !is_gimple_val (TREE_OPERAND (t, 1))) + return false; + t = TREE_OPERAND (t, 0); + } + if (!is_gimple_id (t)) + return false; + } + break; + + default: + if (get_gimple_rhs_class (code) == GIMPLE_TERNARY_RHS) + { + if ((code == COND_EXPR + ? !is_gimple_condexpr (TREE_OPERAND (expr, 0)) + : !is_gimple_val (TREE_OPERAND (expr, 0))) + || !is_gimple_val (TREE_OPERAND (expr, 1)) + || !is_gimple_val (TREE_OPERAND (expr, 2))) + return false; + break; + } + return false; + } + break; + + case tcc_vl_exp: + return false; + + case tcc_exceptional: + if (code == CONSTRUCTOR) + { + unsigned i; + tree elt; + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (expr), i, elt) + if (!is_gimple_val (elt)) + return false; + return true; + } + if (code != SSA_NAME) + return false; + break; + + case tcc_reference: + if (code == BIT_FIELD_REF) + return is_gimple_val (TREE_OPERAND (expr, 0)); + return false; + + default: + return false; + } + + return true; +} + /* Attempt to fold an assignment statement pointed-to by SI. Returns a replacement rhs for the statement or NULL_TREE if no simplification @@ -534,6 +651,72 @@ gsi_replace_with_seq_vops (gimple_stmt_iterator *si_p, gimple_seq stmts) gsi_replace_with_seq (si_p, stmts, false); } +/* Helper function for update_gimple_call and + gimplify_and_update_call_from_tree. A GIMPLE_CALL STMT is being replaced + with GIMPLE_CALL NEW_STMT. */ + +static void +finish_update_gimple_call (gimple_stmt_iterator *si_p, gimple *new_stmt, + gimple *stmt) +{ + tree lhs = gimple_call_lhs (stmt); + gimple_call_set_lhs (new_stmt, lhs); + if (lhs && TREE_CODE (lhs) == SSA_NAME) + SSA_NAME_DEF_STMT (lhs) = new_stmt; + gimple_move_vops (new_stmt, stmt); + gimple_set_location (new_stmt, gimple_location (stmt)); + if (gimple_block (new_stmt) == NULL_TREE) + gimple_set_block (new_stmt, gimple_block (stmt)); + gsi_replace (si_p, new_stmt, false); +} + +/* Update a GIMPLE_CALL statement at iterator *SI_P to call to FN + with number of arguments NARGS, where the arguments in GIMPLE form + follow NARGS argument. */ + +bool +update_gimple_call (gimple_stmt_iterator *si_p, tree fn, int nargs, ...) +{ + va_list ap; + gcall *new_stmt, *stmt = as_a (gsi_stmt (*si_p)); + + gcc_assert (is_gimple_call (stmt)); + va_start (ap, nargs); + new_stmt = gimple_build_call_valist (fn, nargs, ap); + finish_update_gimple_call (si_p, new_stmt, stmt); + va_end (ap); + return true; +} + +/* Return true if EXPR is a CALL_EXPR suitable for representation + as a single GIMPLE_CALL statement. If the arguments require + further gimplification, return false. */ + +static bool +valid_gimple_call_p (tree expr) +{ + unsigned i, nargs; + + if (TREE_CODE (expr) != CALL_EXPR) + return false; + + nargs = call_expr_nargs (expr); + for (i = 0; i < nargs; i++) + { + tree arg = CALL_EXPR_ARG (expr, i); + if (is_gimple_reg_type (TREE_TYPE (arg))) + { + if (!is_gimple_val (arg)) + return false; + } + else + if (!is_gimple_lvalue (arg)) + return false; + } + + return true; +} + /* Convert EXPR into a GIMPLE value suitable for substitution on the RHS of an assignment. Insert the necessary statements before iterator *SI_P. The statement at *SI_P, which must be a GIMPLE_CALL @@ -556,17 +739,41 @@ gimplify_and_update_call_from_tree (gimple_stmt_iterator *si_p, tree expr) gcc_assert (is_gimple_call (stmt)); - push_gimplify_context (gimple_in_ssa_p (cfun)); + if (valid_gimple_call_p (expr)) + { + /* The call has simplified to another call. */ + tree fn = CALL_EXPR_FN (expr); + unsigned i; + unsigned nargs = call_expr_nargs (expr); + vec args = vNULL; + gcall *new_stmt; + + if (nargs > 0) + { + args.create (nargs); + args.safe_grow_cleared (nargs, true); + + for (i = 0; i < nargs; i++) + args[i] = CALL_EXPR_ARG (expr, i); + } + + new_stmt = gimple_build_call_vec (fn, args); + finish_update_gimple_call (si_p, new_stmt, stmt); + args.release (); + return; + } lhs = gimple_call_lhs (stmt); if (lhs == NULL_TREE) { + push_gimplify_context (gimple_in_ssa_p (cfun)); gimplify_and_add (expr, &stmts); + pop_gimplify_context (NULL); + /* We can end up with folding a memcpy of an empty class assignment which gets optimized away by C++ gimplification. */ if (gimple_seq_empty_p (stmts)) { - pop_gimplify_context (NULL); if (gimple_in_ssa_p (cfun)) { unlink_stmt_vdef (stmt); @@ -585,8 +792,6 @@ gimplify_and_update_call_from_tree (gimple_stmt_iterator *si_p, tree expr) GSI_CONTINUE_LINKING); } - pop_gimplify_context (NULL); - gsi_replace_with_seq_vops (si_p, stmts); } @@ -4955,8 +5160,7 @@ gimple_fold_builtin (gimple_stmt_iterator *gsi) STRIP_NOPS (result); else result = fold_convert (gimple_call_return_type (stmt), result); - if (!update_call_from_tree (gsi, result)) - gimplify_and_update_call_from_tree (gsi, result); + gimplify_and_update_call_from_tree (gsi, result); return true; } @@ -5552,8 +5756,7 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace) result = build2_loc (gimple_location (stmt), COMPLEX_EXPR, ctype, result, overflow); } - if (!update_call_from_tree (gsi, result)) - gimplify_and_update_call_from_tree (gsi, result); + gimplify_and_update_call_from_tree (gsi, result); changed = true; } } diff --git a/gcc/gimple-fold.h b/gcc/gimple-fold.h index f495dac..2401646 100644 --- a/gcc/gimple-fold.h +++ b/gcc/gimple-fold.h @@ -28,6 +28,7 @@ extern tree get_symbol_constant_value (tree); struct c_strlen_data; extern bool get_range_strlen (tree, c_strlen_data *, unsigned eltsize); extern void gimplify_and_update_call_from_tree (gimple_stmt_iterator *, tree); +extern bool update_gimple_call (gimple_stmt_iterator *, tree, int, ...); extern bool fold_stmt (gimple_stmt_iterator *); extern bool fold_stmt (gimple_stmt_iterator *, tree (*) (tree)); extern bool fold_stmt_inplace (gimple_stmt_iterator *); diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c index fed4fe7..fc74466 100644 --- a/gcc/gimple-ssa-sprintf.c +++ b/gcc/gimple-ssa-sprintf.c @@ -4149,8 +4149,7 @@ try_substitute_return_value (gimple_stmt_iterator *gsi, /* Replace the call to the bounded function with a zero size (e.g., snprintf(0, 0, "%i", 123) with the constant result of the function. */ - if (!update_call_from_tree (gsi, cst)) - gimplify_and_update_call_from_tree (gsi, cst); + gimplify_and_update_call_from_tree (gsi, cst); gimple *callstmt = gsi_stmt (*gsi); update_stmt (callstmt); } diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index f985867..316aa83 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -7530,7 +7530,7 @@ fold_loop_internal_call (gimple *g, tree value) gimple *use_stmt; gimple_stmt_iterator gsi = gsi_for_stmt (g); - update_call_from_tree (&gsi, value); + replace_call_with_value (&gsi, value); FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs) { FOR_EACH_IMM_USE_ON_STMT (use_p, iter) diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 3bfd4a6..bf31f03 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -2332,12 +2332,10 @@ ccp_folder::fold_stmt (gimple_stmt_iterator *gsi) && (flags & ECF_LOOPING_CONST_OR_PURE) == 0) { tree new_rhs = unshare_expr (val); - bool res; if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (new_rhs))) new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs); - res = update_call_from_tree (gsi, new_rhs); - gcc_assert (res); + gimplify_and_update_call_from_tree (gsi, new_rhs); return true; } @@ -2355,9 +2353,8 @@ ccp_folder::fold_stmt (gimple_stmt_iterator *gsi) tree new_rhs = fold_builtin_alloca_with_align (stmt); if (new_rhs) { - bool res = update_call_from_tree (gsi, new_rhs); + gimplify_and_update_call_from_tree (gsi, new_rhs); tree var = TREE_OPERAND (TREE_OPERAND (new_rhs, 0),0); - gcc_assert (res); insert_clobbers_for_var (*gsi, var); return true; } @@ -2382,8 +2379,7 @@ ccp_folder::fold_stmt (gimple_stmt_iterator *gsi) && ((TREE_INT_CST_LOW (ptrval.value) & (align - 1)) == (TREE_INT_CST_LOW (val.value) & (align - 1)))) { - bool res = update_call_from_tree (gsi, ptr); - gcc_assert (res); + replace_call_with_value (gsi, ptr); return true; } } @@ -2710,7 +2706,7 @@ optimize_stack_restore (gimple_stmt_iterator i) stack_save_gsi = gsi_for_stmt (stack_save); rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0); - update_call_from_tree (&stack_save_gsi, rhs); + replace_call_with_value (&stack_save_gsi, rhs); } } } @@ -3434,8 +3430,7 @@ pass_fold_builtins::execute (function *fun) continue; } - if (!update_call_from_tree (&i, result)) - gimplify_and_update_call_from_tree (&i, result); + gimplify_and_update_call_from_tree (&i, result); } todoflags |= TODO_update_address_taken; diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index c027230..096cfc8 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -1274,8 +1274,7 @@ maybe_optimize_arith_overflow (gimple_stmt_iterator *gsi, fprintf (dump_file, "\n"); } - if (!update_call_from_tree (gsi, result)) - gimplify_and_update_call_from_tree (gsi, result); + gimplify_and_update_call_from_tree (gsi, result); } /* Eliminate unnecessary statements. Any instruction not marked as necessary diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 17dd1ef..b3dcd43 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -439,302 +439,6 @@ ssa_prop_fini (void) } -/* Return true if EXPR is an acceptable right-hand-side for a - GIMPLE assignment. We validate the entire tree, not just - the root node, thus catching expressions that embed complex - operands that are not permitted in GIMPLE. This function - is needed because the folding routines in fold-const.c - may return such expressions in some cases, e.g., an array - access with an embedded index addition. It may make more - sense to have folding routines that are sensitive to the - constraints on GIMPLE operands, rather than abandoning any - any attempt to fold if the usual folding turns out to be too - aggressive. */ - -bool -valid_gimple_rhs_p (tree expr) -{ - enum tree_code code = TREE_CODE (expr); - - switch (TREE_CODE_CLASS (code)) - { - case tcc_declaration: - if (!is_gimple_variable (expr)) - return false; - break; - - case tcc_constant: - /* All constants are ok. */ - break; - - case tcc_comparison: - /* GENERIC allows comparisons with non-boolean types, reject - those for GIMPLE. Let vector-typed comparisons pass - rules - for GENERIC and GIMPLE are the same here. */ - if (!(INTEGRAL_TYPE_P (TREE_TYPE (expr)) - && (TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE - || TYPE_PRECISION (TREE_TYPE (expr)) == 1)) - && ! VECTOR_TYPE_P (TREE_TYPE (expr))) - return false; - - /* Fallthru. */ - case tcc_binary: - if (!is_gimple_val (TREE_OPERAND (expr, 0)) - || !is_gimple_val (TREE_OPERAND (expr, 1))) - return false; - break; - - case tcc_unary: - if (!is_gimple_val (TREE_OPERAND (expr, 0))) - return false; - break; - - case tcc_expression: - switch (code) - { - case ADDR_EXPR: - { - tree t; - if (is_gimple_min_invariant (expr)) - return true; - t = TREE_OPERAND (expr, 0); - while (handled_component_p (t)) - { - /* ??? More checks needed, see the GIMPLE verifier. */ - if ((TREE_CODE (t) == ARRAY_REF - || TREE_CODE (t) == ARRAY_RANGE_REF) - && !is_gimple_val (TREE_OPERAND (t, 1))) - return false; - t = TREE_OPERAND (t, 0); - } - if (!is_gimple_id (t)) - return false; - } - break; - - default: - if (get_gimple_rhs_class (code) == GIMPLE_TERNARY_RHS) - { - if ((code == COND_EXPR - ? !is_gimple_condexpr (TREE_OPERAND (expr, 0)) - : !is_gimple_val (TREE_OPERAND (expr, 0))) - || !is_gimple_val (TREE_OPERAND (expr, 1)) - || !is_gimple_val (TREE_OPERAND (expr, 2))) - return false; - break; - } - return false; - } - break; - - case tcc_vl_exp: - return false; - - case tcc_exceptional: - if (code == CONSTRUCTOR) - { - unsigned i; - tree elt; - FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (expr), i, elt) - if (!is_gimple_val (elt)) - return false; - return true; - } - if (code != SSA_NAME) - return false; - break; - - case tcc_reference: - if (code == BIT_FIELD_REF) - return is_gimple_val (TREE_OPERAND (expr, 0)); - return false; - - default: - return false; - } - - return true; -} - - -/* Return true if EXPR is a CALL_EXPR suitable for representation - as a single GIMPLE_CALL statement. If the arguments require - further gimplification, return false. */ - -static bool -valid_gimple_call_p (tree expr) -{ - unsigned i, nargs; - - if (TREE_CODE (expr) != CALL_EXPR) - return false; - - nargs = call_expr_nargs (expr); - for (i = 0; i < nargs; i++) - { - tree arg = CALL_EXPR_ARG (expr, i); - if (is_gimple_reg_type (TREE_TYPE (arg))) - { - if (!is_gimple_val (arg)) - return false; - } - else - if (!is_gimple_lvalue (arg)) - return false; - } - - return true; -} - - -/* Make SSA names defined by OLD_STMT point to NEW_STMT - as their defining statement. */ - -void -move_ssa_defining_stmt_for_defs (gimple *new_stmt, gimple *old_stmt) -{ - tree var; - ssa_op_iter iter; - - if (gimple_in_ssa_p (cfun)) - { - /* Make defined SSA_NAMEs point to the new - statement as their definition. */ - FOR_EACH_SSA_TREE_OPERAND (var, old_stmt, iter, SSA_OP_ALL_DEFS) - { - if (TREE_CODE (var) == SSA_NAME) - SSA_NAME_DEF_STMT (var) = new_stmt; - } - } -} - -/* Helper function for update_gimple_call and update_call_from_tree. - A GIMPLE_CALL STMT is being replaced with GIMPLE_CALL NEW_STMT. */ - -static void -finish_update_gimple_call (gimple_stmt_iterator *si_p, gimple *new_stmt, - gimple *stmt) -{ - gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt)); - move_ssa_defining_stmt_for_defs (new_stmt, stmt); - gimple_move_vops (new_stmt, stmt); - gimple_set_location (new_stmt, gimple_location (stmt)); - if (gimple_block (new_stmt) == NULL_TREE) - gimple_set_block (new_stmt, gimple_block (stmt)); - gsi_replace (si_p, new_stmt, false); -} - -/* Update a GIMPLE_CALL statement at iterator *SI_P to call to FN - with number of arguments NARGS, where the arguments in GIMPLE form - follow NARGS argument. */ - -bool -update_gimple_call (gimple_stmt_iterator *si_p, tree fn, int nargs, ...) -{ - va_list ap; - gcall *new_stmt, *stmt = as_a (gsi_stmt (*si_p)); - - gcc_assert (is_gimple_call (stmt)); - va_start (ap, nargs); - new_stmt = gimple_build_call_valist (fn, nargs, ap); - finish_update_gimple_call (si_p, new_stmt, stmt); - va_end (ap); - return true; -} - -/* Update a GIMPLE_CALL statement at iterator *SI_P to reflect the - value of EXPR, which is expected to be the result of folding the - call. This can only be done if EXPR is a CALL_EXPR with valid - GIMPLE operands as arguments, or if it is a suitable RHS expression - for a GIMPLE_ASSIGN. More complex expressions will require - gimplification, which will introduce additional statements. In this - event, no update is performed, and the function returns false. - Note that we cannot mutate a GIMPLE_CALL in-place, so we always - replace the statement at *SI_P with an entirely new statement. - The new statement need not be a call, e.g., if the original call - folded to a constant. */ - -bool -update_call_from_tree (gimple_stmt_iterator *si_p, tree expr) -{ - gimple *stmt = gsi_stmt (*si_p); - - if (valid_gimple_call_p (expr)) - { - /* The call has simplified to another call. */ - tree fn = CALL_EXPR_FN (expr); - unsigned i; - unsigned nargs = call_expr_nargs (expr); - vec args = vNULL; - gcall *new_stmt; - - if (nargs > 0) - { - args.create (nargs); - args.safe_grow_cleared (nargs, true); - - for (i = 0; i < nargs; i++) - args[i] = CALL_EXPR_ARG (expr, i); - } - - new_stmt = gimple_build_call_vec (fn, args); - finish_update_gimple_call (si_p, new_stmt, stmt); - args.release (); - - return true; - } - else if (valid_gimple_rhs_p (expr)) - { - tree lhs = gimple_call_lhs (stmt); - gimple *new_stmt; - - /* The call has simplified to an expression - that cannot be represented as a GIMPLE_CALL. */ - if (lhs) - { - /* A value is expected. - Introduce a new GIMPLE_ASSIGN statement. */ - STRIP_USELESS_TYPE_CONVERSION (expr); - new_stmt = gimple_build_assign (lhs, expr); - move_ssa_defining_stmt_for_defs (new_stmt, stmt); - gimple_move_vops (new_stmt, stmt); - } - else if (!TREE_SIDE_EFFECTS (expr)) - { - /* No value is expected, and EXPR has no effect. - Replace it with an empty statement. */ - new_stmt = gimple_build_nop (); - if (gimple_in_ssa_p (cfun)) - { - unlink_stmt_vdef (stmt); - release_defs (stmt); - } - } - else - { - /* No value is expected, but EXPR has an effect, - e.g., it could be a reference to a volatile - variable. Create an assignment statement - with a dummy (unused) lhs variable. */ - STRIP_USELESS_TYPE_CONVERSION (expr); - if (gimple_in_ssa_p (cfun)) - lhs = make_ssa_name (TREE_TYPE (expr)); - else - lhs = create_tmp_var (TREE_TYPE (expr)); - new_stmt = gimple_build_assign (lhs, expr); - gimple_move_vops (new_stmt, stmt); - move_ssa_defining_stmt_for_defs (new_stmt, stmt); - } - gimple_set_location (new_stmt, gimple_location (stmt)); - gsi_replace (si_p, new_stmt, false); - return true; - } - else - /* The call simplified to an expression that is - not a valid GIMPLE RHS. */ - return false; -} - /* Entry point to the propagation engine. The VISIT_STMT virtual function is called for every statement @@ -1539,10 +1243,8 @@ propagate_tree_value_into_stmt (gimple_stmt_iterator *gsi, tree val) && gimple_call_lhs (stmt) != NULL_TREE) { tree expr = NULL_TREE; - bool res; propagate_tree_value (&expr, val); - res = update_call_from_tree (gsi, expr); - gcc_assert (res); + replace_call_with_value (gsi, expr); } else if (gswitch *swtch_stmt = dyn_cast (stmt)) propagate_tree_value (gimple_switch_index_ptr (swtch_stmt), val); diff --git a/gcc/tree-ssa-propagate.h b/gcc/tree-ssa-propagate.h index 60e2f68..5257fbb 100644 --- a/gcc/tree-ssa-propagate.h +++ b/gcc/tree-ssa-propagate.h @@ -63,10 +63,7 @@ enum ssa_prop_result { }; -extern bool valid_gimple_rhs_p (tree); extern void move_ssa_defining_stmt_for_defs (gimple *, gimple *); -extern bool update_gimple_call (gimple_stmt_iterator *, tree, int, ...); -extern bool update_call_from_tree (gimple_stmt_iterator *, tree); extern bool stmt_makes_single_store (gimple *); extern bool may_propagate_copy (tree, tree); extern bool may_propagate_copy_into_stmt (gimple *, tree); diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index cccd4a0..c7b5e2c 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -2158,8 +2158,7 @@ handle_builtin_strlen (gimple_stmt_iterator *gsi) if (bound) rhs = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (rhs), rhs, bound); - if (!update_call_from_tree (gsi, rhs)) - gimplify_and_update_call_from_tree (gsi, rhs); + gimplify_and_update_call_from_tree (gsi, rhs); stmt = gsi_stmt (*gsi); update_stmt (stmt); if (dump_file && (dump_flags & TDF_DETAILS) != 0) @@ -2258,8 +2257,7 @@ handle_builtin_strlen (gimple_stmt_iterator *gsi) } if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (ret))) ret = fold_convert_loc (loc, TREE_TYPE (lhs), ret); - if (!update_call_from_tree (gsi, ret)) - gimplify_and_update_call_from_tree (gsi, ret); + gimplify_and_update_call_from_tree (gsi, ret); stmt = gsi_stmt (*gsi); update_stmt (stmt); if (dump_file && (dump_flags & TDF_DETAILS) != 0) @@ -2337,8 +2335,7 @@ handle_builtin_strchr (gimple_stmt_iterator *gsi) TREE_TYPE (rhs))) rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs); } - if (!update_call_from_tree (gsi, rhs)) - gimplify_and_update_call_from_tree (gsi, rhs); + gimplify_and_update_call_from_tree (gsi, rhs); stmt = gsi_stmt (*gsi); update_stmt (stmt); if (dump_file && (dump_flags & TDF_DETAILS) != 0) diff --git a/gcc/tsan.c b/gcc/tsan.c index 7db157e..a1868b6 100644 --- a/gcc/tsan.c +++ b/gcc/tsan.c @@ -36,7 +36,7 @@ along with GCC; see the file COPYING3. If not see #include "gimplify-me.h" #include "tree-cfg.h" #include "tree-iterator.h" -#include "tree-ssa-propagate.h" +#include "gimple-fold.h" #include "tree-ssa-loop-ivopts.h" #include "tree-eh.h" #include "tsan.h" -- cgit v1.1 From 577d05fc914338cd7ddc254f3bee4532331f5c13 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 9 Mar 2021 09:29:29 +0100 Subject: tree-optimization/99473 - more cselim This fixes the pre-condition on cselim to include all references and decls when they end up as auto-var. Bootstrapped/tested on x86_64-linux 2021-03-09 Richard Biener PR tree-optimization/99473 * tree-ssa-phiopt.c (cond_store_replacement): Handle all stores. * gcc.dg/tree-ssa/pr99473-1.c: New testcase. --- gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c | 14 ++++++++++++++ gcc/tree-ssa-phiopt.c | 5 ++--- 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c new file mode 100644 index 0000000..a9fd542 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fallow-store-data-races -fdump-tree-cselim-details" } */ + +void f (int*); + +void g3 (int i) +{ + int x = 0; + if (i) + x = i; + f (&x); +} + +/* { dg-final { scan-tree-dump "Conditional store replacement happened" "cselim" } } */ diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index aa48f44..13e5c497 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -2490,9 +2490,8 @@ cond_store_replacement (basic_block middle_bb, basic_block join_bb, locus = gimple_location (assign); lhs = gimple_assign_lhs (assign); rhs = gimple_assign_rhs1 (assign); - if ((TREE_CODE (lhs) != MEM_REF - && TREE_CODE (lhs) != ARRAY_REF - && TREE_CODE (lhs) != COMPONENT_REF) + if ((!REFERENCE_CLASS_P (lhs) + && !DECL_P (lhs)) || !is_gimple_reg_type (TREE_TYPE (lhs))) return false; -- cgit v1.1 From 76da5b8e65aacdfcca73e0e6e0477c8a4ca7d773 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 15 Apr 2021 11:06:09 +0200 Subject: Remove gimplify_buildN API use from phiopt This removes use of the legacy gimplify_buildN API from phiopt. 2021-04-15 Richard Biener * tree-ssa-phiopt.c (two_value_replacement): Remove use of legacy gimplify_buildN API. --- gcc/tree-ssa-phiopt.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'gcc') diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index 13e5c497..35ce51e 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -752,16 +752,16 @@ two_value_replacement (basic_block cond_bb, basic_block middle_bb, } tree arg = wide_int_to_tree (type, a); - gimple_stmt_iterator gsi = gsi_for_stmt (stmt); - if (!useless_type_conversion_p (type, TREE_TYPE (lhs))) - lhs = gimplify_build1 (&gsi, NOP_EXPR, type, lhs); + gimple_seq stmts = NULL; + lhs = gimple_convert (&stmts, type, lhs); tree new_rhs; if (code == PLUS_EXPR) - new_rhs = gimplify_build2 (&gsi, PLUS_EXPR, type, lhs, arg); + new_rhs = gimple_build (&stmts, PLUS_EXPR, type, lhs, arg); else - new_rhs = gimplify_build2 (&gsi, MINUS_EXPR, type, arg, lhs); - if (!useless_type_conversion_p (TREE_TYPE (arg0), type)) - new_rhs = gimplify_build1 (&gsi, NOP_EXPR, TREE_TYPE (arg0), new_rhs); + new_rhs = gimple_build (&stmts, MINUS_EXPR, type, arg, lhs); + new_rhs = gimple_convert (&stmts, TREE_TYPE (arg0), new_rhs); + gimple_stmt_iterator gsi = gsi_for_stmt (stmt); + gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT); replace_phi_edge_with_variable (cond_bb, e1, phi, new_rhs); -- cgit v1.1 From 152334cfb7a17bb3f1356f31a2e808d3ee459605 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 15 Apr 2021 11:52:16 +0200 Subject: Remove gimplify_buildN API use from complex lowering This removes the legacy gimplify_buildN API use from complex lowering. 2021-04-15 Richard Biener * tree-complex.c: Include gimple-fold.h. (expand_complex_addition): Use gimple_build. (expand_complex_multiplication_components): Likewise. (expand_complex_multiplication): Likewise. (expand_complex_div_straight): Likewise. (expand_complex_div_wide): Likewise. (expand_complex_division): Likewise. (expand_complex_conjugate): Likewise. (expand_complex_comparison): Likewise. --- gcc/tree-complex.c | 232 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 132 insertions(+), 100 deletions(-) (limited to 'gcc') diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c index b11da01..d7d9917 100644 --- a/gcc/tree-complex.c +++ b/gcc/tree-complex.c @@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-hasher.h" #include "cfgloop.h" #include "cfganal.h" +#include "gimple-fold.h" /* For each complex ssa name, a lattice value. We're interested in finding @@ -916,25 +917,27 @@ expand_complex_addition (gimple_stmt_iterator *gsi, tree inner_type, complex_lattice_t al, complex_lattice_t bl) { tree rr, ri; + gimple_seq stmts = NULL; + location_t loc = gimple_location (gsi_stmt (*gsi)); switch (PAIR (al, bl)) { case PAIR (ONLY_REAL, ONLY_REAL): - rr = gimplify_build2 (gsi, code, inner_type, ar, br); + rr = gimple_build (&stmts, loc, code, inner_type, ar, br); ri = ai; break; case PAIR (ONLY_REAL, ONLY_IMAG): rr = ar; if (code == MINUS_EXPR) - ri = gimplify_build2 (gsi, MINUS_EXPR, inner_type, ai, bi); + ri = gimple_build (&stmts, loc, MINUS_EXPR, inner_type, ai, bi); else ri = bi; break; case PAIR (ONLY_IMAG, ONLY_REAL): if (code == MINUS_EXPR) - rr = gimplify_build2 (gsi, MINUS_EXPR, inner_type, ar, br); + rr = gimple_build (&stmts, loc, MINUS_EXPR, inner_type, ar, br); else rr = br; ri = ai; @@ -942,23 +945,23 @@ expand_complex_addition (gimple_stmt_iterator *gsi, tree inner_type, case PAIR (ONLY_IMAG, ONLY_IMAG): rr = ar; - ri = gimplify_build2 (gsi, code, inner_type, ai, bi); + ri = gimple_build (&stmts, loc, code, inner_type, ai, bi); break; case PAIR (VARYING, ONLY_REAL): - rr = gimplify_build2 (gsi, code, inner_type, ar, br); + rr = gimple_build (&stmts, loc, code, inner_type, ar, br); ri = ai; break; case PAIR (VARYING, ONLY_IMAG): rr = ar; - ri = gimplify_build2 (gsi, code, inner_type, ai, bi); + ri = gimple_build (&stmts, loc, code, inner_type, ai, bi); break; case PAIR (ONLY_REAL, VARYING): if (code == MINUS_EXPR) goto general; - rr = gimplify_build2 (gsi, code, inner_type, ar, br); + rr = gimple_build (&stmts, loc, code, inner_type, ar, br); ri = bi; break; @@ -966,19 +969,20 @@ expand_complex_addition (gimple_stmt_iterator *gsi, tree inner_type, if (code == MINUS_EXPR) goto general; rr = br; - ri = gimplify_build2 (gsi, code, inner_type, ai, bi); + ri = gimple_build (&stmts, loc, code, inner_type, ai, bi); break; case PAIR (VARYING, VARYING): general: - rr = gimplify_build2 (gsi, code, inner_type, ar, br); - ri = gimplify_build2 (gsi, code, inner_type, ai, bi); + rr = gimple_build (&stmts, loc, code, inner_type, ar, br); + ri = gimple_build (&stmts, loc, code, inner_type, ai, bi); break; default: gcc_unreachable (); } + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); update_complex_assignment (gsi, rr, ri); } @@ -1059,26 +1063,26 @@ expand_complex_libcall (gimple_stmt_iterator *gsi, tree type, tree ar, tree ai, components of the result into RR and RI. */ static void -expand_complex_multiplication_components (gimple_stmt_iterator *gsi, - tree type, tree ar, tree ai, - tree br, tree bi, - tree *rr, tree *ri) +expand_complex_multiplication_components (gimple_seq *stmts, location_t loc, + tree type, tree ar, tree ai, + tree br, tree bi, + tree *rr, tree *ri) { tree t1, t2, t3, t4; - t1 = gimplify_build2 (gsi, MULT_EXPR, type, ar, br); - t2 = gimplify_build2 (gsi, MULT_EXPR, type, ai, bi); - t3 = gimplify_build2 (gsi, MULT_EXPR, type, ar, bi); + t1 = gimple_build (stmts, loc, MULT_EXPR, type, ar, br); + t2 = gimple_build (stmts, loc, MULT_EXPR, type, ai, bi); + t3 = gimple_build (stmts, loc, MULT_EXPR, type, ar, bi); /* Avoid expanding redundant multiplication for the common case of squaring a complex number. */ if (ar == br && ai == bi) t4 = t3; else - t4 = gimplify_build2 (gsi, MULT_EXPR, type, ai, br); + t4 = gimple_build (stmts, loc, MULT_EXPR, type, ai, br); - *rr = gimplify_build2 (gsi, MINUS_EXPR, type, t1, t2); - *ri = gimplify_build2 (gsi, PLUS_EXPR, type, t3, t4); + *rr = gimple_build (stmts, loc, MINUS_EXPR, type, t1, t2); + *ri = gimple_build (stmts, loc, PLUS_EXPR, type, t3, t4); } /* Expand complex multiplication to scalars: @@ -1092,6 +1096,8 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree type, { tree rr, ri; tree inner_type = TREE_TYPE (type); + location_t loc = gimple_location (gsi_stmt (*gsi)); + gimple_seq stmts = NULL; if (al < bl) { @@ -1104,7 +1110,7 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree type, switch (PAIR (al, bl)) { case PAIR (ONLY_REAL, ONLY_REAL): - rr = gimplify_build2 (gsi, MULT_EXPR, inner_type, ar, br); + rr = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ar, br); ri = ai; break; @@ -1114,24 +1120,24 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree type, && real_identical (&TREE_REAL_CST (ai), &dconst1)) ri = br; else - ri = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, br); + ri = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ai, br); break; case PAIR (ONLY_IMAG, ONLY_IMAG): - rr = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, bi); - rr = gimplify_build1 (gsi, NEGATE_EXPR, inner_type, rr); + rr = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ai, bi); + rr = gimple_build (&stmts, loc, NEGATE_EXPR, inner_type, rr); ri = ar; break; case PAIR (VARYING, ONLY_REAL): - rr = gimplify_build2 (gsi, MULT_EXPR, inner_type, ar, br); - ri = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, br); + rr = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ar, br); + ri = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ai, br); break; case PAIR (VARYING, ONLY_IMAG): - rr = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, bi); - rr = gimplify_build1 (gsi, NEGATE_EXPR, inner_type, rr); - ri = gimplify_build2 (gsi, MULT_EXPR, inner_type, ar, bi); + rr = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ai, bi); + rr = gimple_build (&stmts, loc, NEGATE_EXPR, inner_type, rr); + ri = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ar, bi); break; case PAIR (VARYING, VARYING): @@ -1152,7 +1158,7 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree type, { /* If we are not worrying about NaNs expand to (ar*br - ai*bi) + i(ar*bi + br*ai) directly. */ - expand_complex_multiplication_components (gsi, inner_type, + expand_complex_multiplication_components (&stmts, loc, inner_type, ar, ai, br, bi, &rr, &ri); break; @@ -1164,8 +1170,11 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree type, x = __muldc3 (a, b); */ tree tmpr, tmpi; - expand_complex_multiplication_components (gsi, inner_type, ar, ai, + expand_complex_multiplication_components (&stmts, loc, + inner_type, ar, ai, br, bi, &tmpr, &tmpi); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + stmts = NULL; gimple *check = gimple_build_cond (UNORDERED_EXPR, tmpr, tmpi, @@ -1187,10 +1196,12 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree type, tree libcall_res = expand_complex_libcall (&cond_bb_gsi, type, ar, ai, br, bi, MULT_EXPR, false); - tree cond_real = gimplify_build1 (&cond_bb_gsi, REALPART_EXPR, - inner_type, libcall_res); - tree cond_imag = gimplify_build1 (&cond_bb_gsi, IMAGPART_EXPR, - inner_type, libcall_res); + gimple_seq stmts2 = NULL; + tree cond_real = gimple_build (&stmts2, loc, REALPART_EXPR, + inner_type, libcall_res); + tree cond_imag = gimple_build (&stmts2, loc, IMAGPART_EXPR, + inner_type, libcall_res); + gsi_insert_seq_before (&cond_bb_gsi, stmts2, GSI_SAME_STMT); basic_block join_bb = single_succ_edge (cond_bb)->dest; *gsi = gsi_start_nondebug_after_labels_bb (join_bb); @@ -1213,7 +1224,8 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree type, else /* If we are not worrying about NaNs expand to (ar*br - ai*bi) + i(ar*bi + br*ai) directly. */ - expand_complex_multiplication_components (gsi, inner_type, ar, ai, + expand_complex_multiplication_components (&stmts, loc, + inner_type, ar, ai, br, bi, &rr, &ri); break; @@ -1221,6 +1233,7 @@ expand_complex_multiplication (gimple_stmt_iterator *gsi, tree type, gcc_unreachable (); } + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); update_complex_assignment (gsi, rr, ri); } @@ -1236,22 +1249,25 @@ expand_complex_div_straight (gimple_stmt_iterator *gsi, tree inner_type, tree ar, tree ai, tree br, tree bi, enum tree_code code) { + gimple_seq stmts = NULL; + location_t loc = gimple_location (gsi_stmt (*gsi)); tree rr, ri, div, t1, t2, t3; - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, br, br); - t2 = gimplify_build2 (gsi, MULT_EXPR, inner_type, bi, bi); - div = gimplify_build2 (gsi, PLUS_EXPR, inner_type, t1, t2); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, br, br); + t2 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, bi, bi); + div = gimple_build (&stmts, loc, PLUS_EXPR, inner_type, t1, t2); - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, ar, br); - t2 = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, bi); - t3 = gimplify_build2 (gsi, PLUS_EXPR, inner_type, t1, t2); - rr = gimplify_build2 (gsi, code, inner_type, t3, div); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ar, br); + t2 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ai, bi); + t3 = gimple_build (&stmts, loc, PLUS_EXPR, inner_type, t1, t2); + rr = gimple_build (&stmts, loc, code, inner_type, t3, div); - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, br); - t2 = gimplify_build2 (gsi, MULT_EXPR, inner_type, ar, bi); - t3 = gimplify_build2 (gsi, MINUS_EXPR, inner_type, t1, t2); - ri = gimplify_build2 (gsi, code, inner_type, t3, div); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ai, br); + t2 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ar, bi); + t3 = gimple_build (&stmts, loc, MINUS_EXPR, inner_type, t1, t2); + ri = gimple_build (&stmts, loc, code, inner_type, t3, div); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); update_complex_assignment (gsi, rr, ri); } @@ -1268,13 +1284,14 @@ expand_complex_div_wide (gimple_stmt_iterator *gsi, tree inner_type, tree rr, ri, ratio, div, t1, t2, tr, ti, compare; basic_block bb_cond, bb_true, bb_false, bb_join; gimple *stmt; + gimple_seq stmts = NULL; + location_t loc = gimple_location (gsi_stmt (*gsi)); /* Examine |br| < |bi|, and branch. */ - t1 = gimplify_build1 (gsi, ABS_EXPR, inner_type, br); - t2 = gimplify_build1 (gsi, ABS_EXPR, inner_type, bi); - compare = fold_build2_loc (gimple_location (gsi_stmt (*gsi)), - LT_EXPR, boolean_type_node, t1, t2); - STRIP_NOPS (compare); + t1 = gimple_build (&stmts, loc, ABS_EXPR, inner_type, br); + t2 = gimple_build (&stmts, loc, ABS_EXPR, inner_type, bi); + compare = gimple_build (&stmts, loc, + LT_EXPR, boolean_type_node, t1, t2); bb_cond = bb_true = bb_false = bb_join = NULL; rr = ri = tr = ti = NULL; @@ -1282,15 +1299,11 @@ expand_complex_div_wide (gimple_stmt_iterator *gsi, tree inner_type, { edge e; gimple *stmt; - tree cond, tmp; - tmp = make_ssa_name (boolean_type_node); - stmt = gimple_build_assign (tmp, compare); - gsi_insert_before (gsi, stmt, GSI_SAME_STMT); - - cond = fold_build2_loc (gimple_location (stmt), - EQ_EXPR, boolean_type_node, tmp, boolean_true_node); - stmt = gimple_build_cond_from_tree (cond, NULL_TREE, NULL_TREE); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + stmts = NULL; + stmt = gimple_build_cond (NE_EXPR, compare, boolean_false_node, + NULL_TREE, NULL_TREE); gsi_insert_before (gsi, stmt, GSI_SAME_STMT); /* Split the original block, and create the TRUE and FALSE blocks. */ @@ -1326,6 +1339,11 @@ expand_complex_div_wide (gimple_stmt_iterator *gsi, tree inner_type, rr = create_tmp_reg (inner_type); ri = create_tmp_reg (inner_type); } + else + { + gimple_seq_discard (stmts); + stmts = NULL; + } /* In the TRUE branch, we compute ratio = br/bi; @@ -1342,19 +1360,21 @@ expand_complex_div_wide (gimple_stmt_iterator *gsi, tree inner_type, gsi_insert_after (gsi, gimple_build_nop (), GSI_NEW_STMT); } - ratio = gimplify_build2 (gsi, code, inner_type, br, bi); + ratio = gimple_build (&stmts, loc, code, inner_type, br, bi); - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, br, ratio); - div = gimplify_build2 (gsi, PLUS_EXPR, inner_type, t1, bi); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, br, ratio); + div = gimple_build (&stmts, loc, PLUS_EXPR, inner_type, t1, bi); - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, ar, ratio); - tr = gimplify_build2 (gsi, PLUS_EXPR, inner_type, t1, ai); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ar, ratio); + tr = gimple_build (&stmts, loc, PLUS_EXPR, inner_type, t1, ai); - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, ratio); - ti = gimplify_build2 (gsi, MINUS_EXPR, inner_type, t1, ar); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ai, ratio); + ti = gimple_build (&stmts, loc, MINUS_EXPR, inner_type, t1, ar); - tr = gimplify_build2 (gsi, code, inner_type, tr, div); - ti = gimplify_build2 (gsi, code, inner_type, ti, div); + tr = gimple_build (&stmts, loc, code, inner_type, tr, div); + ti = gimple_build (&stmts, loc, code, inner_type, ti, div); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + stmts = NULL; if (bb_true) { @@ -1381,19 +1401,21 @@ expand_complex_div_wide (gimple_stmt_iterator *gsi, tree inner_type, gsi_insert_after (gsi, gimple_build_nop (), GSI_NEW_STMT); } - ratio = gimplify_build2 (gsi, code, inner_type, bi, br); + ratio = gimple_build (&stmts, loc, code, inner_type, bi, br); - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, bi, ratio); - div = gimplify_build2 (gsi, PLUS_EXPR, inner_type, t1, br); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, bi, ratio); + div = gimple_build (&stmts, loc, PLUS_EXPR, inner_type, t1, br); - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, ai, ratio); - tr = gimplify_build2 (gsi, PLUS_EXPR, inner_type, t1, ar); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ai, ratio); + tr = gimple_build (&stmts, loc, PLUS_EXPR, inner_type, t1, ar); - t1 = gimplify_build2 (gsi, MULT_EXPR, inner_type, ar, ratio); - ti = gimplify_build2 (gsi, MINUS_EXPR, inner_type, ai, t1); + t1 = gimple_build (&stmts, loc, MULT_EXPR, inner_type, ar, ratio); + ti = gimple_build (&stmts, loc, MINUS_EXPR, inner_type, ai, t1); - tr = gimplify_build2 (gsi, code, inner_type, tr, div); - ti = gimplify_build2 (gsi, code, inner_type, ti, div); + tr = gimple_build (&stmts, loc, code, inner_type, tr, div); + ti = gimple_build (&stmts, loc, code, inner_type, ti, div); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + stmts = NULL; if (bb_false) { @@ -1422,40 +1444,42 @@ expand_complex_division (gimple_stmt_iterator *gsi, tree type, complex_lattice_t al, complex_lattice_t bl) { tree rr, ri; + gimple_seq stmts = NULL; + location_t loc = gimple_location (gsi_stmt (*gsi)); tree inner_type = TREE_TYPE (type); switch (PAIR (al, bl)) { case PAIR (ONLY_REAL, ONLY_REAL): - rr = gimplify_build2 (gsi, code, inner_type, ar, br); + rr = gimple_build (&stmts, loc, code, inner_type, ar, br); ri = ai; break; case PAIR (ONLY_REAL, ONLY_IMAG): rr = ai; - ri = gimplify_build2 (gsi, code, inner_type, ar, bi); - ri = gimplify_build1 (gsi, NEGATE_EXPR, inner_type, ri); + ri = gimple_build (&stmts, loc, code, inner_type, ar, bi); + ri = gimple_build (&stmts, loc, NEGATE_EXPR, inner_type, ri); break; case PAIR (ONLY_IMAG, ONLY_REAL): rr = ar; - ri = gimplify_build2 (gsi, code, inner_type, ai, br); + ri = gimple_build (&stmts, loc, code, inner_type, ai, br); break; case PAIR (ONLY_IMAG, ONLY_IMAG): - rr = gimplify_build2 (gsi, code, inner_type, ai, bi); + rr = gimple_build (&stmts, loc, code, inner_type, ai, bi); ri = ar; break; case PAIR (VARYING, ONLY_REAL): - rr = gimplify_build2 (gsi, code, inner_type, ar, br); - ri = gimplify_build2 (gsi, code, inner_type, ai, br); + rr = gimple_build (&stmts, loc, code, inner_type, ar, br); + ri = gimple_build (&stmts, loc, code, inner_type, ai, br); break; case PAIR (VARYING, ONLY_IMAG): - rr = gimplify_build2 (gsi, code, inner_type, ai, bi); - ri = gimplify_build2 (gsi, code, inner_type, ar, bi); - ri = gimplify_build1 (gsi, NEGATE_EXPR, inner_type, ri); + rr = gimple_build (&stmts, loc, code, inner_type, ai, bi); + ri = gimple_build (&stmts, loc, code, inner_type, ar, bi); + ri = gimple_build (&stmts, loc, NEGATE_EXPR, inner_type, ri); break; case PAIR (ONLY_REAL, VARYING): @@ -1490,6 +1514,7 @@ expand_complex_division (gimple_stmt_iterator *gsi, tree type, gcc_unreachable (); } + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); update_complex_assignment (gsi, rr, ri); } @@ -1502,10 +1527,13 @@ expand_complex_negation (gimple_stmt_iterator *gsi, tree inner_type, tree ar, tree ai) { tree rr, ri; + gimple_seq stmts = NULL; + location_t loc = gimple_location (gsi_stmt (*gsi)); - rr = gimplify_build1 (gsi, NEGATE_EXPR, inner_type, ar); - ri = gimplify_build1 (gsi, NEGATE_EXPR, inner_type, ai); + rr = gimple_build (&stmts, loc, NEGATE_EXPR, inner_type, ar); + ri = gimple_build (&stmts, loc, NEGATE_EXPR, inner_type, ai); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); update_complex_assignment (gsi, rr, ri); } @@ -1518,9 +1546,12 @@ expand_complex_conjugate (gimple_stmt_iterator *gsi, tree inner_type, tree ar, tree ai) { tree ri; + gimple_seq stmts = NULL; + location_t loc = gimple_location (gsi_stmt (*gsi)); - ri = gimplify_build1 (gsi, NEGATE_EXPR, inner_type, ai); + ri = gimple_build (&stmts, loc, NEGATE_EXPR, inner_type, ai); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); update_complex_assignment (gsi, ar, ri); } @@ -1531,15 +1562,16 @@ expand_complex_comparison (gimple_stmt_iterator *gsi, tree ar, tree ai, tree br, tree bi, enum tree_code code) { tree cr, ci, cc, type; - gimple *stmt; - - cr = gimplify_build2 (gsi, code, boolean_type_node, ar, br); - ci = gimplify_build2 (gsi, code, boolean_type_node, ai, bi); - cc = gimplify_build2 (gsi, - (code == EQ_EXPR ? TRUTH_AND_EXPR : TRUTH_OR_EXPR), - boolean_type_node, cr, ci); - - stmt = gsi_stmt (*gsi); + gimple *stmt = gsi_stmt (*gsi); + gimple_seq stmts = NULL; + location_t loc = gimple_location (stmt); + + cr = gimple_build (&stmts, loc, code, boolean_type_node, ar, br); + ci = gimple_build (&stmts, loc, code, boolean_type_node, ai, bi); + cc = gimple_build (&stmts, loc, + (code == EQ_EXPR ? BIT_AND_EXPR : BIT_IOR_EXPR), + boolean_type_node, cr, ci); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); switch (gimple_code (stmt)) { -- cgit v1.1 From b972e036f40c12b106f9070c3e8adea0eb8a45fa Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 15 Apr 2021 13:03:21 +0200 Subject: Move gimplify_buildN API local to only remaining user This moves the legacy gimplify_buildN API to tree-vect-generic.c, its only user and elides the gimplification step, making it a wrapper around gimple_build, adjusting tree_vec_extract for this. I've noticed that vector CTOR expansion doesn't deal with unfolded {} and thus this makes it more resilent. I've also adjusted the match.pd vector CTOR extraction code to make sure it doesn't produce a CTOR when folding would make it a vector constant. 2021-04-15 Richard Biener * tree-cfg.h (gimplify_build1): Remove. (gimplify_build2): Likewise. (gimplify_build3): Likewise. * tree-cfg.c (gimplify_build1): Move to tree-vect-generic.c. (gimplify_build2): Likewise. (gimplify_build3): Likewise. * tree-vect-generic.c (gimplify_build1): Move from tree-cfg.c. Modernize. (gimplify_build2): Likewise. (gimplify_build3): Likewise. (tree_vec_extract): Use resimplify with following SSA edges. (expand_vector_parallel): Avoid passing NULL size/bitpos to tree_vec_extract. * expr.c (store_constructor): Deal with zero-element CTORs. * match.pd (bit_field_ref ): Make sure to produce vector constants when possible. --- gcc/expr.c | 4 ++- gcc/match.pd | 29 ++++++++++++------- gcc/tree-cfg.c | 43 ---------------------------- gcc/tree-cfg.h | 6 ---- gcc/tree-vect-generic.c | 76 ++++++++++++++++++++++++++++++++++++++++--------- 5 files changed, 84 insertions(+), 74 deletions(-) (limited to 'gcc') diff --git a/gcc/expr.c b/gcc/expr.c index a0e1946..5ed716c 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -7019,7 +7019,9 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, /* Compute the size of the elements in the CTOR. It differs from the size of the vector type elements only when the CTOR elements are vectors themselves. */ - tree val_type = TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value); + tree val_type = (CONSTRUCTOR_NELTS (exp) != 0 + ? TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value) + : elttype); if (VECTOR_TYPE_P (val_type)) bitsize = tree_to_uhwi (TYPE_SIZE (val_type)); else diff --git a/gcc/match.pd b/gcc/match.pd index 3ffd9a6..66788ba 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -6203,7 +6203,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* We keep an exact subset of the constructor elements. */ (if (multiple_p (idx, k, &elt) && multiple_p (n, k, &count)) (if (CONSTRUCTOR_NELTS (ctor) == 0) - { build_constructor (type, NULL); } + { build_zero_cst (type); } (if (count == 1) (if (elt < CONSTRUCTOR_NELTS (ctor)) (view_convert { CONSTRUCTOR_ELT (ctor, elt)->value; }) @@ -6212,15 +6212,24 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) ??? Eventually allow this if the CTOR ends up constant or uniform. */ (if (single_use (@0)) - { - vec *vals; - vec_alloc (vals, count); - for (unsigned i = 0; - i < count && elt + i < CONSTRUCTOR_NELTS (ctor); ++i) - CONSTRUCTOR_APPEND_ELT (vals, NULL_TREE, - CONSTRUCTOR_ELT (ctor, elt + i)->value); - build_constructor (type, vals); - })))) + (with + { + vec *vals; + vec_alloc (vals, count); + bool constant_p = true; + tree res; + for (unsigned i = 0; + i < count && elt + i < CONSTRUCTOR_NELTS (ctor); ++i) + { + tree e = CONSTRUCTOR_ELT (ctor, elt + i)->value; + CONSTRUCTOR_APPEND_ELT (vals, NULL_TREE, e); + if (!CONSTANT_CLASS_P (e)) + constant_p = false; + } + res = (constant_p ? build_vector_from_ctor (type, vals) + : build_constructor (type, vals)); + } + { res; }))))) /* The bitfield references a single constructor element. */ (if (k.is_constant (&const_k) && idx + n <= (idx / const_k + 1) * const_k) diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 316aa83..f8d15ff 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -9198,49 +9198,6 @@ insert_cond_bb (basic_block bb, gimple *stmt, gimple *cond, return new_bb; } -/* Build a ternary operation and gimplify it. Emit code before GSI. - Return the gimple_val holding the result. */ - -tree -gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code, - tree type, tree a, tree b, tree c) -{ - tree ret; - location_t loc = gimple_location (gsi_stmt (*gsi)); - - ret = fold_build3_loc (loc, code, type, a, b, c); - return force_gimple_operand_gsi (gsi, ret, true, NULL, true, - GSI_SAME_STMT); -} - -/* Build a binary operation and gimplify it. Emit code before GSI. - Return the gimple_val holding the result. */ - -tree -gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code, - tree type, tree a, tree b) -{ - tree ret; - - ret = fold_build2_loc (gimple_location (gsi_stmt (*gsi)), code, type, a, b); - return force_gimple_operand_gsi (gsi, ret, true, NULL, true, - GSI_SAME_STMT); -} - -/* Build a unary operation and gimplify it. Emit code before GSI. - Return the gimple_val holding the result. */ - -tree -gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type, - tree a) -{ - tree ret; - - ret = fold_build1_loc (gimple_location (gsi_stmt (*gsi)), code, type, a); - return force_gimple_operand_gsi (gsi, ret, true, NULL, true, - GSI_SAME_STMT); -} - /* Given a basic block B which ends with a conditional and has diff --git a/gcc/tree-cfg.h b/gcc/tree-cfg.h index 6ed63ec..5d16aac 100644 --- a/gcc/tree-cfg.h +++ b/gcc/tree-cfg.h @@ -95,12 +95,6 @@ extern bool gimple_purge_dead_eh_edges (basic_block); extern bool gimple_purge_all_dead_eh_edges (const_bitmap); extern bool gimple_purge_dead_abnormal_call_edges (basic_block); extern bool gimple_purge_all_dead_abnormal_call_edges (const_bitmap); -extern tree gimplify_build3 (gimple_stmt_iterator *, enum tree_code, - tree, tree, tree, tree); -extern tree gimplify_build2 (gimple_stmt_iterator *, enum tree_code, - tree, tree, tree); -extern tree gimplify_build1 (gimple_stmt_iterator *, enum tree_code, - tree, tree); extern void extract_true_false_edges_from_block (basic_block, edge *, edge *); extern tree find_case_label_for_value (const gswitch *switch_stmt, tree val); extern edge find_taken_edge_switch_expr (const gswitch *switch_stmt, tree val); diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index c8d8493..751f181 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -41,9 +41,54 @@ along with GCC; see the file COPYING3. If not see #include "vec-perm-indices.h" #include "insn-config.h" #include "tree-ssa-dce.h" +#include "gimple-fold.h" +#include "gimple-match.h" #include "recog.h" /* FIXME: for insn_data */ +/* Build a ternary operation and gimplify it. Emit code before GSI. + Return the gimple_val holding the result. */ + +static tree +gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code, + tree type, tree a, tree b, tree c) +{ + location_t loc = gimple_location (gsi_stmt (*gsi)); + gimple_seq stmts = NULL; + tree ret = gimple_build (&stmts, loc, code, type, a, b, c); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + return ret; +} + +/* Build a binary operation and gimplify it. Emit code before GSI. + Return the gimple_val holding the result. */ + +static tree +gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code, + tree type, tree a, tree b) +{ + location_t loc = gimple_location (gsi_stmt (*gsi)); + gimple_seq stmts = NULL; + tree ret = gimple_build (&stmts, loc, code, type, a, b); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + return ret; +} + +/* Build a unary operation and gimplify it. Emit code before GSI. + Return the gimple_val holding the result. */ + +static tree +gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type, + tree a) +{ + location_t loc = gimple_location (gsi_stmt (*gsi)); + gimple_seq stmts = NULL; + tree ret = gimple_build (&stmts, loc, code, type, a); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + return ret; +} + + static void expand_vector_operations_1 (gimple_stmt_iterator *, bitmap); /* Return the number of elements in a vector type TYPE that we have @@ -122,23 +167,25 @@ typedef tree (*elem_op_func) (gimple_stmt_iterator *, tree, tree, tree, tree, tree, enum tree_code, tree); +/* Extract the vector element of type TYPE at BITPOS with BITSIZE from T + and return it. */ + tree tree_vec_extract (gimple_stmt_iterator *gsi, tree type, tree t, tree bitsize, tree bitpos) { - if (TREE_CODE (t) == SSA_NAME) - { - gimple *def_stmt = SSA_NAME_DEF_STMT (t); - if (is_gimple_assign (def_stmt) - && (gimple_assign_rhs_code (def_stmt) == VECTOR_CST - || (bitpos - && gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR))) - t = gimple_assign_rhs1 (def_stmt); - } - if (bitpos) - return gimplify_build3 (gsi, BIT_FIELD_REF, type, t, bitsize, bitpos); - else - return gimplify_build1 (gsi, VIEW_CONVERT_EXPR, type, t); + /* We're using the resimplify API and maybe_push_res_to_seq to + simplify the BIT_FIELD_REF but restrict the simplification to + a single stmt while at the same time following SSA edges for + simplification with already emitted CTORs. */ + gimple_match_op opr; + opr.set_op (BIT_FIELD_REF, type, t, bitsize, bitpos); + opr.resimplify (NULL, follow_all_ssa_edges); + gimple_seq stmts = NULL; + tree res = maybe_push_res_to_seq (&opr, &stmts); + gcc_assert (res); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + return res; } static tree @@ -327,7 +374,8 @@ expand_vector_parallel (gimple_stmt_iterator *gsi, elem_op_func f, tree type, scalar_int_mode mode = int_mode_for_size (tree_to_uhwi (TYPE_SIZE (type)), 0).require (); compute_type = lang_hooks.types.type_for_mode (mode, 1); - result = f (gsi, compute_type, a, b, NULL_TREE, NULL_TREE, code, type); + result = f (gsi, compute_type, a, b, bitsize_zero_node, + TYPE_SIZE (compute_type), code, type); warning_at (loc, OPT_Wvector_operation_performance, "vector operation will be expanded with a " "single scalar operation"); -- cgit v1.1 From 22cff118f7526bec195ed6e41452980820fdf3a8 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Fri, 23 Apr 2021 12:23:51 +0200 Subject: Add '-Wopenacc-parallelism' ... to diagnose potentially suboptimal choices regarding OpenACC parallelism. Not enabled by default: too noisy ("*potentially* suboptimal choices"); see XFAILed 'dg-bogus'es. gcc/c-family/ * c.opt (Wopenacc-parallelism): New. gcc/fortran/ * lang.opt (Wopenacc-parallelism): New. gcc/ * omp-offload.c (oacc_validate_dims): Implement '-Wopenacc-parallelism'. * doc/invoke.texi (-Wopenacc-parallelism): Document. gcc/testsuite/ * c-c++-common/goacc/diag-parallelism-1.c: New. * c-c++-common/goacc/acc-icf.c: Specify '-Wopenacc-parallelism', and match diagnostics, as appropriate. * c-c++-common/goacc/classify-kernels-unparallelized.c: Likewise. * c-c++-common/goacc/classify-kernels.c: Likewise. * c-c++-common/goacc/classify-parallel.c: Likewise. * c-c++-common/goacc/classify-routine.c: Likewise. * c-c++-common/goacc/classify-serial.c: Likewise. * c-c++-common/goacc/kernels-decompose-1.c: Likewise. * c-c++-common/goacc/kernels-decompose-2.c: Likewise. * c-c++-common/goacc/parallel-dims-1.c: Likewise. * c-c++-common/goacc/parallel-reduction.c: Likewise. * c-c++-common/goacc/pr70688.c: Likewise. * c-c++-common/goacc/routine-1.c: Likewise. * c-c++-common/goacc/routine-level-of-parallelism-2.c: Likewise. * c-c++-common/goacc/uninit-dim-clause.c: Likewise. * gfortran.dg/goacc/classify-kernels-unparallelized.f95: Likewise. * gfortran.dg/goacc/classify-kernels.f95: Likewise. * gfortran.dg/goacc/classify-parallel.f95: Likewise. * gfortran.dg/goacc/classify-routine.f95: Likewise. * gfortran.dg/goacc/classify-serial.f95: Likewise. * gfortran.dg/goacc/kernels-decompose-1.f95: Likewise. * gfortran.dg/goacc/kernels-decompose-2.f95: Likewise. * gfortran.dg/goacc/parallel-tree.f95: Likewise. * gfortran.dg/goacc/routine-4.f90: Likewise. * gfortran.dg/goacc/routine-level-of-parallelism-1.f90: Likewise. * gfortran.dg/goacc/routine-module-mod-1.f90: Likewise. * gfortran.dg/goacc/routine-multiple-directives-1.f90: Likewise. * gfortran.dg/goacc/uninit-dim-clause.f95: Likewise. libgomp/ * testsuite/libgomp.oacc-c-c++-common/firstprivate-1.c: Specify '-Wopenacc-parallelism', and match diagnostics, as appropriate. * testsuite/libgomp.oacc-c-c++-common/loop-auto-1.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/loop-red-w-1.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/loop-red-w-2.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/loop-w-1.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/mode-transitions.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/par-reduction-1.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/par-reduction-2.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/parallel-dims.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/parallel-reduction.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/pr85381-3.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/private-variables.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/reduction-5.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/reduction-7.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/routine-g-1.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/routine-w-1.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/routine-wv-2.c: Likewise. * testsuite/libgomp.oacc-c-c++-common/static-variable-1.c: Likewise. * testsuite/libgomp.oacc-fortran/optional-private.f90: Likewise. * testsuite/libgomp.oacc-fortran/par-reduction-2-1.f: Likewise. * testsuite/libgomp.oacc-fortran/par-reduction-2-2.f: Likewise. * testsuite/libgomp.oacc-fortran/parallel-dims.f90: Likewise. * testsuite/libgomp.oacc-fortran/parallel-reduction.f90: Likewise. * testsuite/libgomp.oacc-fortran/pr84028.f90: Likewise. * testsuite/libgomp.oacc-fortran/private-variables.f90: Likewise. * testsuite/libgomp.oacc-fortran/reduction-1.f90: Likewise. * testsuite/libgomp.oacc-fortran/reduction-5.f90: Likewise. * testsuite/libgomp.oacc-fortran/reduction-6.f90: Likewise. * testsuite/libgomp.oacc-fortran/routine-7.f90: Likewise. Co-Authored-By: Nathan Sidwell Co-Authored-By: Tom de Vries Co-Authored-By: Julian Brown Co-Authored-By: Kwok Cheung Yeung --- gcc/c-family/c.opt | 4 + gcc/doc/invoke.texi | 10 +- gcc/fortran/lang.opt | 4 + gcc/omp-offload.c | 29 +++++ gcc/testsuite/c-c++-common/goacc/acc-icf.c | 7 ++ .../goacc/classify-kernels-unparallelized.c | 3 + .../c-c++-common/goacc/classify-kernels.c | 3 + .../c-c++-common/goacc/classify-parallel.c | 3 + .../c-c++-common/goacc/classify-routine.c | 3 + gcc/testsuite/c-c++-common/goacc/classify-serial.c | 8 ++ .../c-c++-common/goacc/diag-parallelism-1.c | 124 +++++++++++++++++++++ .../c-c++-common/goacc/kernels-decompose-1.c | 3 + .../c-c++-common/goacc/kernels-decompose-2.c | 4 + gcc/testsuite/c-c++-common/goacc/parallel-dims-1.c | 7 ++ .../c-c++-common/goacc/parallel-reduction.c | 4 + gcc/testsuite/c-c++-common/goacc/pr70688.c | 6 + gcc/testsuite/c-c++-common/goacc/routine-1.c | 8 ++ .../goacc/routine-level-of-parallelism-2.c | 6 + .../c-c++-common/goacc/uninit-dim-clause.c | 6 + .../goacc/classify-kernels-unparallelized.f95 | 3 + .../gfortran.dg/goacc/classify-kernels.f95 | 3 + .../gfortran.dg/goacc/classify-parallel.f95 | 3 + .../gfortran.dg/goacc/classify-routine.f95 | 3 + .../gfortran.dg/goacc/classify-serial.f95 | 6 + .../gfortran.dg/goacc/kernels-decompose-1.f95 | 3 + .../gfortran.dg/goacc/kernels-decompose-2.f95 | 4 + gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 | 6 + gcc/testsuite/gfortran.dg/goacc/routine-4.f90 | 9 ++ .../goacc/routine-level-of-parallelism-1.f90 | 6 + .../gfortran.dg/goacc/routine-module-mod-1.f90 | 4 + .../goacc/routine-multiple-directives-1.f90 | 5 + .../gfortran.dg/goacc/uninit-dim-clause.f95 | 6 + 32 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/c-c++-common/goacc/diag-parallelism-1.c (limited to 'gcc') diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 3f8b72c..f1b4c3f 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -1037,6 +1037,10 @@ Wold-style-definition C ObjC Var(warn_old_style_definition) Init(-1) Warning Warn if an old-style parameter definition is used. +Wopenacc-parallelism +C C++ Var(warn_openacc_parallelism) Warning +Warn about potentially suboptimal choices related to OpenACC parallelism. + Wopenmp-simd C C++ Var(warn_openmp_simd) Warning LangEnabledBy(C C++,Wall) Warn if a simd directive is overridden by the vectorizer cost model. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index e98b096..40cacc6 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -364,7 +364,9 @@ Objective-C and Objective-C++ Dialects}. -Wmissing-include-dirs -Wmissing-noreturn -Wno-missing-profile @gol -Wno-multichar -Wmultistatement-macros -Wnonnull -Wnonnull-compare @gol -Wnormalized=@r{[}none@r{|}id@r{|}nfc@r{|}nfkc@r{]} @gol --Wnull-dereference -Wno-odr -Wopenmp-simd @gol +-Wnull-dereference -Wno-odr @gol +-Wopenacc-parallelism @gol +-Wopenmp-simd @gol -Wno-overflow -Woverlength-strings -Wno-override-init-side-effects @gol -Wpacked -Wno-packed-bitfield-compat -Wpacked-not-aligned -Wpadded @gol -Wparentheses -Wno-pedantic-ms-format @gol @@ -8749,6 +8751,12 @@ Do not warn about compile-time overflow in constant expressions. Warn about One Definition Rule violations during link-time optimization. Enabled by default. +@item -Wopenacc-parallelism +@opindex Wopenacc-parallelism +@opindex Wno-openacc-parallelism +@cindex OpenACC accelerator programming +Warn about potentially suboptimal choices related to OpenACC parallelism. + @item -Wopenmp-simd @opindex Wopenmp-simd @opindex Wno-openmp-simd diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt index 388ef8c..6db01c7 100644 --- a/gcc/fortran/lang.opt +++ b/gcc/fortran/lang.opt @@ -285,6 +285,10 @@ Wuse-without-only Fortran Var(warn_use_without_only) Warning Warn about USE statements that have no ONLY qualifier. +Wopenacc-parallelism +Fortran +; Documented in C + Wopenmp-simd Fortran ; Documented in C diff --git a/gcc/omp-offload.c b/gcc/omp-offload.c index ba0937f..1612461 100644 --- a/gcc/omp-offload.c +++ b/gcc/omp-offload.c @@ -928,6 +928,35 @@ oacc_validate_dims (tree fn, tree attrs, int *dims, int level, unsigned used) pos = TREE_CHAIN (pos); } + bool check = true; +#ifdef ACCEL_COMPILER + check = false; +#endif + if (check + && warn_openacc_parallelism + && !lookup_attribute ("oacc kernels", DECL_ATTRIBUTES (fn))) + { + static char const *const axes[] = + /* Must be kept in sync with GOMP_DIM enumeration. */ + { "gang", "worker", "vector" }; + for (ix = level >= 0 ? level : 0; ix != GOMP_DIM_MAX; ix++) + if (dims[ix] < 0) + ; /* Defaulting axis. */ + else if ((used & GOMP_DIM_MASK (ix)) && dims[ix] == 1) + /* There is partitioned execution, but the user requested a + dimension size of 1. They're probably confused. */ + warning_at (DECL_SOURCE_LOCATION (fn), OPT_Wopenacc_parallelism, + "region contains %s partitioned code but" + " is not %s partitioned", axes[ix], axes[ix]); + else if (!(used & GOMP_DIM_MASK (ix)) && dims[ix] != 1) + /* The dimension is explicitly partitioned to non-unity, but + no use is made within the region. */ + warning_at (DECL_SOURCE_LOCATION (fn), OPT_Wopenacc_parallelism, + "region is %s partitioned but" + " does not contain %s partitioned code", + axes[ix], axes[ix]); + } + bool changed = targetm.goacc.validate_dims (fn, dims, level, used); /* Default anything left to 1 or a partitioned default. */ diff --git a/gcc/testsuite/c-c++-common/goacc/acc-icf.c b/gcc/testsuite/c-c++-common/goacc/acc-icf.c index 98b536c..9cf119b 100644 --- a/gcc/testsuite/c-c++-common/goacc/acc-icf.c +++ b/gcc/testsuite/c-c++-common/goacc/acc-icf.c @@ -2,7 +2,12 @@ /* { dg-additional-options "-fopenacc -O2 -fdump-ipa-icf" } */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + #pragma acc routine gang +/* { dg-bogus "warning: region is worker partitioned but does not contain worker partitioned code" "TODO default 'gang' 'vector'" { xfail *-*-* } .+3 } + TODO It's the compiler's own decision to not use 'worker' parallelism here, so it doesn't make sense to bother the user about it. */ int routine1 (int n) { @@ -16,6 +21,8 @@ routine1 (int n) } #pragma acc routine gang +/* { dg-bogus "warning: region is worker partitioned but does not contain worker partitioned code" "TODO default 'gang' 'vector'" { xfail *-*-* } .+3 } + TODO It's the compiler's own decision to not use 'worker' parallelism here, so it doesn't make sense to bother the user about it. */ int routine2 (int n) { diff --git a/gcc/testsuite/c-c++-common/goacc/classify-kernels-unparallelized.c b/gcc/testsuite/c-c++-common/goacc/classify-kernels-unparallelized.c index d4c4b2c..218f624 100644 --- a/gcc/testsuite/c-c++-common/goacc/classify-kernels-unparallelized.c +++ b/gcc/testsuite/c-c++-common/goacc/classify-kernels-unparallelized.c @@ -7,6 +7,9 @@ { dg-additional-options "-fdump-tree-parloops1-all" } { dg-additional-options "-fdump-tree-oaccdevlow" } */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + #define N 1024 extern unsigned int *__restrict a; diff --git a/gcc/testsuite/c-c++-common/goacc/classify-kernels.c b/gcc/testsuite/c-c++-common/goacc/classify-kernels.c index 16e9b9e..95a150c 100644 --- a/gcc/testsuite/c-c++-common/goacc/classify-kernels.c +++ b/gcc/testsuite/c-c++-common/goacc/classify-kernels.c @@ -7,6 +7,9 @@ { dg-additional-options "-fdump-tree-parloops1-all" } { dg-additional-options "-fdump-tree-oaccdevlow" } */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + #define N 1024 extern unsigned int *__restrict a; diff --git a/gcc/testsuite/c-c++-common/goacc/classify-parallel.c b/gcc/testsuite/c-c++-common/goacc/classify-parallel.c index 933d766..230e70c 100644 --- a/gcc/testsuite/c-c++-common/goacc/classify-parallel.c +++ b/gcc/testsuite/c-c++-common/goacc/classify-parallel.c @@ -6,6 +6,9 @@ { dg-additional-options "-fdump-tree-ompexp" } { dg-additional-options "-fdump-tree-oaccdevlow" } */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + #define N 1024 extern unsigned int *__restrict a; diff --git a/gcc/testsuite/c-c++-common/goacc/classify-routine.c b/gcc/testsuite/c-c++-common/goacc/classify-routine.c index 0b9ba6e..81fe369 100644 --- a/gcc/testsuite/c-c++-common/goacc/classify-routine.c +++ b/gcc/testsuite/c-c++-common/goacc/classify-routine.c @@ -6,6 +6,9 @@ { dg-additional-options "-fdump-tree-ompexp" } { dg-additional-options "-fdump-tree-oaccdevlow" } */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + #define N 1024 extern unsigned int *__restrict a; diff --git a/gcc/testsuite/c-c++-common/goacc/classify-serial.c b/gcc/testsuite/c-c++-common/goacc/classify-serial.c index 94ace1b..ae052ae 100644 --- a/gcc/testsuite/c-c++-common/goacc/classify-serial.c +++ b/gcc/testsuite/c-c++-common/goacc/classify-serial.c @@ -6,6 +6,9 @@ { dg-additional-options "-fdump-tree-ompexp" } { dg-additional-options "-fdump-tree-oaccdevlow" } */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + #define N 1024 extern unsigned int *__restrict a; @@ -15,6 +18,11 @@ extern unsigned int *__restrict c; void SERIAL () { #pragma acc serial loop copyin (a[0:N], b[0:N]) copyout (c[0:N]) /* { dg-message "optimized: assigned OpenACC gang vector loop parallelism" } */ + /* { dg-bogus "warning: region contains gang partitioned code but is not gang partitioned" "TODO 'serial'" { xfail *-*-* } .-1 } + { dg-bogus "warning: region contains worker partitioned code but is not worker partitioned" "" { target *-*-* } .-2 } + { dg-bogus "warning: region contains vector partitioned code but is not vector partitioned" "TODO 'serial'" { xfail *-*-* } .-3 } + TODO Should we really diagnose this if the user explicitly requested 'serial'? + TODO Should we instead diagnose ('-Wextra' category?) that the user may enable use of parallelism if replacing 'serial' with 'parallel', if applicable? */ for (unsigned int i = 0; i < N; i++) c[i] = a[i] + b[i]; } diff --git a/gcc/testsuite/c-c++-common/goacc/diag-parallelism-1.c b/gcc/testsuite/c-c++-common/goacc/diag-parallelism-1.c new file mode 100644 index 0000000..6ee7bd0 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/diag-parallelism-1.c @@ -0,0 +1,124 @@ +/* Diagnostics about potentially suboptimal choices related to OpenACC + parallelism. + + { dg-additional-options "-Wopenacc-parallelism" } +*/ + + +//TODO 'kernels' + +//TODO 'serial' + +//TODO 'routine' + +//TODO Fortran + + +static void f1 () +{ + int ary[10]; + + +#pragma acc parallel num_gangs (1) + /* { dg-warning "region contains gang partitioned code but is not gang partitioned" "" { target *-*-* } .-1 } */ + { + #pragma acc loop gang + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel num_workers (1) + /* { dg-warning "region contains worker partitioned code but is not worker partitioned" "" { target *-*-* } .-1 } */ + { + #pragma acc loop worker + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel vector_length (1) + /* { dg-warning "region contains vector partitioned code but is not vector partitioned" "" { target *-*-* } .-1 } */ + { + #pragma acc loop vector + for (int i = 0; i < 10; i++) + ary[i] = i; + } +} + + +static void f2 () +{ + int ary[10]; + + +#pragma acc parallel num_gangs (8) + /* { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop worker + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel num_gangs (8) + /* { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop vector + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel num_gangs (8) + /* { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop worker vector + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel num_workers (8) + /* { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop gang + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel num_workers (8) + /* { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop vector + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel num_workers (8) + /* { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop gang vector + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel vector_length (8) + /* { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop gang + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel vector_length (8) + /* { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop worker + for (int i = 0; i < 10; i++) + ary[i] = i; + } + +#pragma acc parallel vector_length (8) + /* { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 } */ + { + #pragma acc loop gang worker + for (int i = 0; i < 10; i++) + ary[i] = i; + } +} diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-1.c b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-1.c index 87219c8..f549cba 100644 --- a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-1.c +++ b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-1.c @@ -5,6 +5,9 @@ /* { dg-additional-options "--param=openacc-kernels=decompose" } { dg-additional-options "-fdump-tree-omp_oacc_kernels_decompose" } */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + /* See also '../../gfortran.dg/goacc/kernels-decompose-1.f95'. */ /* It's only with Tcl 8.5 (released in 2007) that "the variable 'varName' diff --git a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-2.c b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-2.c index 3781e75..cdf85d4 100644 --- a/gcc/testsuite/c-c++-common/goacc/kernels-decompose-2.c +++ b/gcc/testsuite/c-c++-common/goacc/kernels-decompose-2.c @@ -4,6 +4,9 @@ /* { dg-additional-options "--param=openacc-kernels=decompose" } /* { dg-additional-options "-O2" } for 'parloops'. */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + /* See also '../../gfortran.dg/goacc/kernels-decompose-2.f95'. */ /* It's only with Tcl 8.5 (released in 2007) that "the variable 'varName' @@ -116,6 +119,7 @@ main () } #pragma acc kernels + /* { dg-bogus "warning: region contains gang partitioned code but is not gang partitioned" "TODO 'kernels'" { xfail *-*-* } .-1 } */ { y = f_g (a[5]); /* { dg-line l_part[incr c_part] } */ /*TODO If such a construct is placed in its own part (like it is, here), can't this actually use gang paralelism, instead of "gang-single"? diff --git a/gcc/testsuite/c-c++-common/goacc/parallel-dims-1.c b/gcc/testsuite/c-c++-common/goacc/parallel-dims-1.c index 57f682f..2a8d35d 100644 --- a/gcc/testsuite/c-c++-common/goacc/parallel-dims-1.c +++ b/gcc/testsuite/c-c++-common/goacc/parallel-dims-1.c @@ -1,11 +1,18 @@ /* Valid use of OpenACC parallelism dimensions clauses: num_gangs, num_workers, vector_length. */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + void f(int i) { #pragma acc kernels num_gangs(i) num_workers(i) vector_length(i) ; #pragma acc parallel num_gangs(i) num_workers(i) vector_length(i) + /* { dg-bogus "warning: region is gang partitioned but does not contain gang partitioned code" "TODO runtime" { xfail *-*-* } .-1 } + { dg-bogus "warning: region is worker partitioned but does not contain worker partitioned code" "TODO runtime" { xfail *-*-* } .-2 } + { dg-bogus "warning: region is vector partitioned but does not contain vector partitioned code" "TODO runtime" { xfail *-*-* } .-3 } + TODO 'region is [...] partitioned' isn't correct for 'i == 1'. */ ; } diff --git a/gcc/testsuite/c-c++-common/goacc/parallel-reduction.c b/gcc/testsuite/c-c++-common/goacc/parallel-reduction.c index d7cc947..c5c0edc 100644 --- a/gcc/testsuite/c-c++-common/goacc/parallel-reduction.c +++ b/gcc/testsuite/c-c++-common/goacc/parallel-reduction.c @@ -1,3 +1,6 @@ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + int main () { @@ -7,6 +10,7 @@ main () #pragma acc data copy (dummy) { #pragma acc parallel num_gangs (10) copy (sum) reduction (+:sum) + /* { dg-bogus "warning: region is gang partitioned but does not contain gang partitioned code" "TODO 'reduction'" { xfail *-*-* } .-1 } */ { int v = 5; sum += 10 + v; diff --git a/gcc/testsuite/c-c++-common/goacc/pr70688.c b/gcc/testsuite/c-c++-common/goacc/pr70688.c index 5a23665..e96a853 100644 --- a/gcc/testsuite/c-c++-common/goacc/pr70688.c +++ b/gcc/testsuite/c-c++-common/goacc/pr70688.c @@ -1,3 +1,6 @@ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + const int n = 100; int @@ -22,6 +25,7 @@ parallel_reduction () #pragma acc data copy (dummy) { #pragma acc parallel num_gangs (10) copy (sum) reduction (+:sum) + /* { dg-bogus "warning: region is gang partitioned but does not contain gang partitioned code" "TODO 'reduction'" { xfail *-*-* } .-1 } */ { int v = 5; sum += 10 + v; @@ -37,10 +41,12 @@ main () int i, s = 0; #pragma acc parallel num_gangs (10) copy (s) reduction (+:s) + /* { dg-bogus "warning: region is gang partitioned but does not contain gang partitioned code" "TODO 'reduction'" { xfail *-*-* } .-1 } */ for (i = 0; i < n; i++) s += i+1; #pragma acc parallel num_gangs (10) reduction (+:s) copy (s) + /* { dg-bogus "warning: region is gang partitioned but does not contain gang partitioned code" "TODO 'reduction'" { xfail *-*-* } .-1 } */ for (i = 0; i < n; i++) s += i+1; diff --git a/gcc/testsuite/c-c++-common/goacc/routine-1.c b/gcc/testsuite/c-c++-common/goacc/routine-1.c index a756922..051f793 100644 --- a/gcc/testsuite/c-c++-common/goacc/routine-1.c +++ b/gcc/testsuite/c-c++-common/goacc/routine-1.c @@ -1,15 +1,23 @@ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ #pragma acc routine gang +/* { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .+3 } + { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .+2 } + { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .+1 } */ void gang (void) { } #pragma acc routine worker +/* { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .+2 } + { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .+1 } */ void worker (void) { } #pragma acc routine vector +/* { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .+1 } */ void vector (void) { } diff --git a/gcc/testsuite/c-c++-common/goacc/routine-level-of-parallelism-2.c b/gcc/testsuite/c-c++-common/goacc/routine-level-of-parallelism-2.c index a066f2b..33678fe 100644 --- a/gcc/testsuite/c-c++-common/goacc/routine-level-of-parallelism-2.c +++ b/gcc/testsuite/c-c++-common/goacc/routine-level-of-parallelism-2.c @@ -2,7 +2,13 @@ with the OpenACC 'routine' directive. The Fortran counterpart is '../../gfortran.dg/goacc/routine-level-of-parallelism-1.f90'. */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + #pragma acc routine gang +/* { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .+3 } + { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .+2 } + { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .+1 } */ void g_1 (void) { } diff --git a/gcc/testsuite/c-c++-common/goacc/uninit-dim-clause.c b/gcc/testsuite/c-c++-common/goacc/uninit-dim-clause.c index 827dac7..d9b143b 100644 --- a/gcc/testsuite/c-c++-common/goacc/uninit-dim-clause.c +++ b/gcc/testsuite/c-c++-common/goacc/uninit-dim-clause.c @@ -1,16 +1,22 @@ /* { dg-additional-options "-Wuninitialized" } */ +/* { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting + aspects of that functionality. */ + void acc_parallel() { int i, j, k; #pragma acc parallel num_gangs(i) /* { dg-warning "is used uninitialized" } */ + /* { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .-1 } */ ; #pragma acc parallel num_workers(j) /* { dg-warning "is used uninitialized" } */ + /* { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 } */ ; #pragma acc parallel vector_length(k) /* { dg-warning "is used uninitialized" } */ + /* { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 } */ ; } diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95 index 6cca3d6..cb5251a 100644 --- a/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/classify-kernels-unparallelized.f95 @@ -7,6 +7,9 @@ ! { dg-additional-options "-fdump-tree-parloops1-all" } ! { dg-additional-options "-fdump-tree-oaccdevlow" } +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + program main implicit none integer, parameter :: n = 1024 diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95 index 715a983..07aaf06 100644 --- a/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/classify-kernels.f95 @@ -7,6 +7,9 @@ ! { dg-additional-options "-fdump-tree-parloops1-all" } ! { dg-additional-options "-fdump-tree-oaccdevlow" } +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + program main implicit none integer, parameter :: n = 1024 diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-parallel.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-parallel.f95 index 01f06bb..a41e0e6 100644 --- a/gcc/testsuite/gfortran.dg/goacc/classify-parallel.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/classify-parallel.f95 @@ -6,6 +6,9 @@ ! { dg-additional-options "-fdump-tree-ompexp" } ! { dg-additional-options "-fdump-tree-oaccdevlow" } +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + program main implicit none integer, parameter :: n = 1024 diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-routine.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-routine.f95 index 401d527..52cc870 100644 --- a/gcc/testsuite/gfortran.dg/goacc/classify-routine.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/classify-routine.f95 @@ -6,6 +6,9 @@ ! { dg-additional-options "-fdump-tree-ompexp" } ! { dg-additional-options "-fdump-tree-oaccdevlow" } +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + subroutine ROUTINE !$acc routine worker integer, parameter :: n = 1024 diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 index 51061af..6d402e6 100644 --- a/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 @@ -6,6 +6,9 @@ ! { dg-additional-options "-fdump-tree-ompexp" } ! { dg-additional-options "-fdump-tree-oaccdevlow" } +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + program main implicit none integer, parameter :: n = 1024 @@ -15,6 +18,9 @@ program main call setup(a, b) !$acc serial loop copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1)) ! { dg-message "optimized: assigned OpenACC gang vector loop parallelism" } + ! { dg-bogus "warning: region contains gang partitioned code but is not gang partitioned" "TODO 'serial'" { xfail *-*-* } .-1 } + ! { dg-bogus "warning: region contains worker partitioned code but is not worker partitioned" "" { target *-*-* } .-2 } + ! { dg-bogus "warning: region contains vector partitioned code but is not vector partitioned" "TODO 'serial'" { xfail *-*-* } .-3 } do i = 0, n - 1 c(i) = a(i) + b(i) end do diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-1.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-1.f95 index e252350..ddaf7f8 100644 --- a/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-1.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-1.f95 @@ -5,6 +5,9 @@ ! { dg-additional-options "--param=openacc-kernels=decompose" } ! { dg-additional-options "-fdump-tree-omp_oacc_kernels_decompose" } +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + ! See also '../../c-c++-common/goacc/kernels-decompose-1.c'. ! It's only with Tcl 8.5 (released in 2007) that "the variable 'varName' diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 index cc12b77..a3cec83 100644 --- a/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 @@ -4,6 +4,9 @@ ! { dg-additional-options "--param=openacc-kernels=decompose" } ! { dg-additional-options "-O2" } for 'parloops'. +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + ! See also '../../c-c++-common/goacc/kernels-decompose-2.c'. ! It's only with Tcl 8.5 (released in 2007) that "the variable 'varName' @@ -119,6 +122,7 @@ program main !$acc end kernels !$acc kernels + ! { dg-bogus "warning: region contains gang partitioned code but is not gang partitioned" "TODO 'kernels'" { xfail *-*-* } .-1 } y = f_g (a(5)) ! { dg-line l_part[incr c_part] } !TODO If such a construct is placed in its own part (like it is, here), can't this actually use gang paralelism, instead of "gang-single"? ! { dg-message "note: beginning 'gang-single' part in OpenACC 'kernels' region" "" { target *-*-* } l_part$c_part } diff --git a/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 b/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 index e33653b..c51cb2a 100644 --- a/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 @@ -2,6 +2,9 @@ ! test for tree-dump-original and spaces-commas +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + program test implicit none integer :: q, i, j, k, m, n, o, p, r, s, t, u, v, w @@ -12,6 +15,9 @@ program test !$acc no_create(n) & !$acc present(o), pcopy(p), pcopyin(r), pcopyout(s), pcreate(t) & !$acc deviceptr(u), private(v), firstprivate(w) + ! { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .-1 } + ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-2 } + ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-3 } !$acc end parallel end program test diff --git a/gcc/testsuite/gfortran.dg/goacc/routine-4.f90 b/gcc/testsuite/gfortran.dg/goacc/routine-4.f90 index 6714c7b..53b1fbe 100644 --- a/gcc/testsuite/gfortran.dg/goacc/routine-4.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/routine-4.f90 @@ -1,5 +1,8 @@ ! Test invalid calls to routines. +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + module param integer, parameter :: N = 32 end module param @@ -120,6 +123,9 @@ contains subroutine gang (a) ! { dg-message "declared here" 3 } !$acc routine gang + ! { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .-2 } + ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-3 } + ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-4 } integer, intent (inout) :: a(N) integer :: i @@ -130,6 +136,8 @@ contains subroutine worker (a) ! { dg-message "declared here" 2 } !$acc routine worker + ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-2 } + ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-3 } integer, intent (inout) :: a(N) integer :: i @@ -140,6 +148,7 @@ contains subroutine vector (a) ! { dg-message "declared here" } !$acc routine vector + ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-2 } integer, intent (inout) :: a(N) integer :: i diff --git a/gcc/testsuite/gfortran.dg/goacc/routine-level-of-parallelism-1.f90 b/gcc/testsuite/gfortran.dg/goacc/routine-level-of-parallelism-1.f90 index 83b8c24..99929f1 100644 --- a/gcc/testsuite/gfortran.dg/goacc/routine-level-of-parallelism-1.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/routine-level-of-parallelism-1.f90 @@ -2,8 +2,14 @@ ! with the OpenACC routine directive. The C/C++ counterpart is ! '../../c-c++-common/goacc/routine-level-of-parallelism-2.c'. +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + subroutine g_1 !$acc routine gang + ! { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .-2 } + ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-3 } + ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-4 } end subroutine g_1 subroutine s_1_2a diff --git a/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 b/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 index 23c673f..2210650 100644 --- a/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 @@ -2,6 +2,9 @@ ! { dg-additional-options "-fopt-info-optimized-omp" } +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + module routine_module_mod_1 contains subroutine s_1 @@ -53,6 +56,7 @@ contains subroutine g_1 implicit none !$acc routine gang + ! { dg-bogus "warning: region is worker partitioned but does not contain worker partitioned code" "TODO default 'gang' 'vector'" { xfail *-*-* } .-3 } integer :: i diff --git a/gcc/testsuite/gfortran.dg/goacc/routine-multiple-directives-1.f90 b/gcc/testsuite/gfortran.dg/goacc/routine-multiple-directives-1.f90 index 6e12ee9..622a9d9 100644 --- a/gcc/testsuite/gfortran.dg/goacc/routine-multiple-directives-1.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/routine-multiple-directives-1.f90 @@ -1,5 +1,8 @@ ! Check for valid cases of multiple OpenACC 'routine' directives. +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + SUBROUTINE s_1 !$ACC ROUTINE(s_1) !$ACC ROUTINE(s_1) SEQ @@ -17,12 +20,14 @@ !$ACC ROUTINE VECTOR !$ACC ROUTINE(v_1) VECTOR !$ACC ROUTINE VECTOR +! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-5 } END SUBROUTINE v_1 SUBROUTINE v_2 !$ACC ROUTINE(v_2) VECTOR !$ACC ROUTINE VECTOR !$ACC ROUTINE(v_2) VECTOR +! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-4 } END SUBROUTINE v_2 SUBROUTINE sub_1 diff --git a/gcc/testsuite/gfortran.dg/goacc/uninit-dim-clause.f95 b/gcc/testsuite/gfortran.dg/goacc/uninit-dim-clause.f95 index c77d47a..59e923f 100644 --- a/gcc/testsuite/gfortran.dg/goacc/uninit-dim-clause.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/uninit-dim-clause.f95 @@ -1,16 +1,22 @@ ! { dg-additional-options "-Wuninitialized" } +! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting +! aspects of that functionality. + subroutine acc_parallel implicit none integer :: i, j, k !$acc parallel num_gangs(i) ! { dg-warning "is used uninitialized" } + ! { dg-warning "region is gang partitioned but does not contain gang partitioned code" "" { target *-*-* } .-1 } !$acc end parallel !$acc parallel num_workers(j) ! { dg-warning "is used uninitialized" } + ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 } !$acc end parallel !$acc parallel vector_length(k) ! { dg-warning "is used uninitialized" } + ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 } !$acc end parallel end subroutine acc_parallel -- cgit v1.1 From bf3040836f41f0d719e6ec53820a692c443469d5 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 26 Apr 2021 12:55:24 +0200 Subject: Add XFAIL for gcc.dg/pr84877.c on the SPARC The maximum supported alignment is 64-bit on 32-bit mode. gcc/testsuite/ * gcc.dg/pr84877.c: XFAIL on SPARC as well. --- gcc/testsuite/gcc.dg/pr84877.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/pr84877.c b/gcc/testsuite/gcc.dg/pr84877.c index 8551d27..234fcd2 100644 --- a/gcc/testsuite/gcc.dg/pr84877.c +++ b/gcc/testsuite/gcc.dg/pr84877.c @@ -1,4 +1,4 @@ -/* { dg-do run { xfail { cris-*-* } } } */ +/* { dg-do run { xfail { cris-*-* sparc*-*-* } } } */ /* { dg-options "-O2" } */ #include -- cgit v1.1 From 5320d4e4af76120a402d0c5adef0d1bc92d66e40 Mon Sep 17 00:00:00 2001 From: Kyrylo Tkachov Date: Mon, 26 Apr 2021 12:01:33 +0100 Subject: aarch64: Handle V4BF V8BF modes in vwcore attribute While playing with other unrelated changes I hit an assemble-failure bug where a pattern (one of the get_lane ones) that was using V4BF, V8BF as part of a mode iterator and outputting registers with the vwcore attribute, but there is no vwcore mapping for V4BF and V8BF. This patch fixes that in the obvious way by adding the missing mappings Bootstrapped and tested on aarch64-none-linux-gnu. gcc/ChangeLog: * config/aarch64/iterators.md (vwcore): Handle V4BF, V8BF. --- gcc/config/aarch64/iterators.md | 1 + 1 file changed, 1 insertion(+) (limited to 'gcc') diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index cac33ae..a3d895a 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -1364,6 +1364,7 @@ (V2SI "w") (V4SI "w") (DI "x") (V2DI "x") (V4HF "w") (V8HF "w") + (V4BF "w") (V8BF "w") (V2SF "w") (V4SF "w") (V2DF "x") (VNx16QI "w") (VNx8QI "w") (VNx4QI "w") (VNx2QI "w") -- cgit v1.1 From e9046be4ffa0a941b15315317a90b437f2c1ac28 Mon Sep 17 00:00:00 2001 From: Christophe Lyon Date: Mon, 26 Apr 2021 11:23:41 +0000 Subject: testsuite/arm: Add arm_cmse_hw effective target Some of the CMSE tests have 'dg-do run', but qemu-arm does not support the privileged instructions involved; one has to use qemu-system-arm for this, which in turn requires modifications to the default newlib/libgloss startup code to enable the FPU as the FP status registers need to be saved when using CMSE code. This patch introduces arm_cmse_hw, similar to arm_neon_hw, to detect whether the execution engine supports the CMSE instructions. If not, we set dg-do-what-default to assemble instead of run. We thus remove all the 'dg-do run' directives from CMSE tests, to rely on dg-do-what-default instead. Note that cmse-16.c used to pass with dg-do run under qemu-arm, because the property being tested is not available (qemu-arm does not model secure vs non-secure memory). The patch removes dg-do from it too, since it is relevant only with an adequate simulator. Before the patch, bitfield-[123].c and struct-1.c fail at execution under qemu-arm. With the patch, execution is skipped. The same tests pass under qemu-system-arm both with and without the patch. This avoids failures when testing with -mthumb/-mfloat-abi=hard/-march=armv8-m.main+fp+dsp under qemu-arm for cortex-m33. I'm also running tests with qemu-system-arm for cortex-m33, but I run only cmse.exp with a patched newlib in this case: I use qemu-arm for all combinations except that one because it's faster and supports semihosting. I do not have a setup to check this with actual hardware or another simulator. 2021-04-26 Christophe Lyon gcc/ * doc/sourcebuild.texi (arm_cmse_hw): Document. gcc/testsuite/ * gcc.target/arm/cmse/bitfield-1.c: Remove dg-do. * gcc.target/arm/cmse/bitfield-2.c: Likewise. * gcc.target/arm/cmse/bitfield-3.c: Likewise. * gcc.target/arm/cmse/cmse-16.c: Likewise. * gcc.target/arm/cmse/struct-1.c: Likewise. * gcc.target/arm/cmse/cmse.exp: Set dg-do-what-default depending on arm_cmse_hw. * lib/target-supports.exp (check_effective_target_arm_cmse_hw): New. --- gcc/doc/sourcebuild.texi | 3 +++ gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c | 2 +- gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c | 2 +- gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c | 2 +- gcc/testsuite/gcc.target/arm/cmse/cmse-16.c | 6 +++++- gcc/testsuite/gcc.target/arm/cmse/cmse.exp | 7 ++++++- gcc/testsuite/gcc.target/arm/cmse/struct-1.c | 2 +- gcc/testsuite/lib/target-supports.exp | 15 +++++++++++++++ 8 files changed, 33 insertions(+), 6 deletions(-) (limited to 'gcc') diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index d3200a4..3a1d653 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -2096,6 +2096,9 @@ div instruction. ARM target supports ARMv8-M Security Extensions, enabled by the @code{-mcmse} option. +@item arm_cmse_hw +Test system supports executing CMSE instructions. + @item arm_coproc1_ok @anchor{arm_coproc1_ok} ARM target supports the following coprocessor instructions: @code{CDP}, diff --git a/gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c b/gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c index cae2f06..5685f74 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c +++ b/gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c @@ -1,4 +1,4 @@ -/* { dg-do run } */ +/* This test is executed only if the execution engine supports CMSE instructions. */ /* { dg-options "--save-temps -mcmse -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ typedef struct diff --git a/gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c b/gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c index 21a53cd..7a794d4 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c +++ b/gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c @@ -1,4 +1,4 @@ -/* { dg-do run } */ +/* This test is executed only if the execution engine supports CMSE instructions. */ /* { dg-options "--save-temps -mcmse -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ typedef struct diff --git a/gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c b/gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c index e8f973e..5875f8df 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c +++ b/gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c @@ -1,4 +1,4 @@ -/* { dg-do run } */ +/* This test is executed only if the execution engine supports CMSE instructions. */ /* { dg-options "--save-temps -mcmse -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ typedef struct diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c b/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c index 3fb0380..6a243d5 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c @@ -1,4 +1,8 @@ -/* { dg-do run } */ +/* This test is executed only if the execution engine supports CMSE instructions. */ +/* Note that it "passes" on qemu-arm while it shouldn't because that simulator + does not model secure memory: it's better to skip it in this case, and rely + on do-what-default as set in cmse.exp. (It works as expected with + qemu-system-mode). */ /* { dg-options "-Os -mcmse" } */ #include diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse.exp b/gcc/testsuite/gcc.target/arm/cmse/cmse.exp index 6ce99fe..4da1a46 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/cmse.exp +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse.exp @@ -34,7 +34,12 @@ if ![info exists DEFAULT_CFLAGS] then { dg-init set saved-dg-do-what-default ${dg-do-what-default} -set dg-do-what-default "assemble" + +if {[is-effective-target arm_cmse_hw]} then { + set dg-do-what-default run +} else { + set dg-do-what-default assemble +} set saved-lto_torture_options ${LTO_TORTURE_OPTIONS} set LTO_TORTURE_OPTIONS "" diff --git a/gcc/testsuite/gcc.target/arm/cmse/struct-1.c b/gcc/testsuite/gcc.target/arm/cmse/struct-1.c index 7555643..75a99f4 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/struct-1.c +++ b/gcc/testsuite/gcc.target/arm/cmse/struct-1.c @@ -1,4 +1,4 @@ -/* { dg-do run } */ +/* This test is executed only if the execution engine supports CMSE instructions. */ /* { dg-options "--save-temps -mcmse -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ typedef struct diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index ad32310..a522da3 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -4861,6 +4861,21 @@ proc check_effective_target_arm_cmse_ok {} { } "-mcmse"]; } +# Return 1 if the target supports executing CMSE instructions, 0 +# otherwise. Cache the result. + +proc check_effective_target_arm_cmse_hw { } { + return [check_runtime arm_cmse_hw_available { + int __attribute__ ((cmse_nonsecure_entry)) ns_func(void) + { + return 0; + } + int main (void) + { + return ns_func(); + } + } "-mcmse -Wl,--section-start,.gnu.sgstubs=0x00400000"] +} # Return 1 if the target supports executing MVE instructions, 0 # otherwise. -- cgit v1.1 From 6ff66d1ea48960fe96bb51a750c01135e65fe452 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 7 Apr 2021 14:53:40 +0200 Subject: tree-optimization/99956 - improve loop interchange When we apply store motion and DSE manually to the bwaves kernel in gfortran.dg/pr81303.f loop interchange no longer happens because the perfect nest considered covers outer loops we cannot analyze strides for. The following compensates for this by shrinking the nest in this analysis which was already possible but on a too coarse granularity. It shares the shrinked nest with the rest of the DRs so the complexity overhead should be negligible. 2021-04-07 Richard Biener PR tree-optimization/99956 * gimple-loop-interchange.cc (compute_access_stride): Try instantiating the access in a shallower loop nest if instantiating failed. (compute_access_strides): Pass adjustable loop_nest to compute_access_stride. * gfortran.dg/pr99956.f: New testcase. --- gcc/gimple-loop-interchange.cc | 68 ++++++++++++++++++++++--------------- gcc/testsuite/gfortran.dg/pr99956.f | 45 ++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 28 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr99956.f (limited to 'gcc') diff --git a/gcc/gimple-loop-interchange.cc b/gcc/gimple-loop-interchange.cc index f45b936..80f749b 100644 --- a/gcc/gimple-loop-interchange.cc +++ b/gcc/gimple-loop-interchange.cc @@ -1280,12 +1280,15 @@ tree_loop_interchange::move_code_to_inner_loop (class loop *outer, arr[i][j - 1][k] = 0; */ static void -compute_access_stride (class loop *loop_nest, class loop *loop, +compute_access_stride (class loop *&loop_nest, class loop *loop, data_reference_p dr) { vec *strides = new vec (); - basic_block bb = gimple_bb (DR_STMT (dr)); + dr->aux = strides; + basic_block bb = gimple_bb (DR_STMT (dr)); + if (!flow_bb_inside_loop_p (loop_nest, bb)) + return; while (!flow_bb_inside_loop_p (loop, bb)) { strides->safe_push (build_int_cst (sizetype, 0)); @@ -1313,39 +1316,47 @@ compute_access_stride (class loop *loop_nest, class loop *loop, } /* Otherwise punt. */ else - { - dr->aux = strides; - return; - } + return; } tree scev_base = build_fold_addr_expr (ref); tree scev = analyze_scalar_evolution (loop, scev_base); - scev = instantiate_scev (loop_preheader_edge (loop_nest), loop, scev); - if (! chrec_contains_undetermined (scev)) + if (chrec_contains_undetermined (scev)) + return; + + tree orig_scev = scev; + do + { + scev = instantiate_scev (loop_preheader_edge (loop_nest), + loop, orig_scev); + if (! chrec_contains_undetermined (scev)) + break; + + /* If we couldn't instantiate for the desired nest, shrink it. */ + if (loop_nest == loop) + return; + loop_nest = loop_nest->inner; + } while (1); + + tree sl = scev; + class loop *expected = loop; + while (TREE_CODE (sl) == POLYNOMIAL_CHREC) { - tree sl = scev; - class loop *expected = loop; - while (TREE_CODE (sl) == POLYNOMIAL_CHREC) + class loop *sl_loop = get_chrec_loop (sl); + while (sl_loop != expected) { - class loop *sl_loop = get_chrec_loop (sl); - while (sl_loop != expected) - { - strides->safe_push (size_int (0)); - expected = loop_outer (expected); - } - strides->safe_push (CHREC_RIGHT (sl)); - sl = CHREC_LEFT (sl); + strides->safe_push (size_int (0)); expected = loop_outer (expected); } - if (! tree_contains_chrecs (sl, NULL)) - while (expected != loop_outer (loop_nest)) - { - strides->safe_push (size_int (0)); - expected = loop_outer (expected); - } + strides->safe_push (CHREC_RIGHT (sl)); + sl = CHREC_LEFT (sl); + expected = loop_outer (expected); } - - dr->aux = strides; + if (! tree_contains_chrecs (sl, NULL)) + while (expected != loop_outer (loop_nest)) + { + strides->safe_push (size_int (0)); + expected = loop_outer (expected); + } } /* Given loop nest LOOP_NEST with innermost LOOP, the function computes @@ -1363,9 +1374,10 @@ compute_access_strides (class loop *loop_nest, class loop *loop, data_reference_p dr; vec *stride; + class loop *interesting_loop_nest = loop_nest; for (i = 0; datarefs.iterate (i, &dr); ++i) { - compute_access_stride (loop_nest, loop, dr); + compute_access_stride (interesting_loop_nest, loop, dr); stride = DR_ACCESS_STRIDE (dr); if (stride->length () < num_loops) { diff --git a/gcc/testsuite/gfortran.dg/pr99956.f b/gcc/testsuite/gfortran.dg/pr99956.f new file mode 100644 index 0000000..b5c0be3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr99956.f @@ -0,0 +1,45 @@ +! { dg-do compile } +! { dg-options "-O3 -ffast-math -floop-interchange -fdump-tree-linterchange-details" } + + subroutine mat_times_vec(y,x,a,axp,ayp,azp,axm,aym,azm, + $ nb,nx,ny,nz) + implicit none + integer nb,nx,ny,nz,i,j,k,m,l,kit,im1,ip1,jm1,jp1,km1,kp1 + + real*8 y(nb,nx,ny,nz),x(nb,nx,ny,nz),tem + + real*8 a(nb,nb,nx,ny,nz), + 1 axp(nb,nb,nx,ny,nz),ayp(nb,nb,nx,ny,nz),azp(nb,nb,nx,ny,nz), + 2 axm(nb,nb,nx,ny,nz),aym(nb,nb,nx,ny,nz),azm(nb,nb,nx,ny,nz) + + + do k=1,nz + km1=mod(k+nz-2,nz)+1 + kp1=mod(k,nz)+1 + do j=1,ny + jm1=mod(j+ny-2,ny)+1 + jp1=mod(j,ny)+1 + do i=1,nx + im1=mod(i+nx-2,nx)+1 + ip1=mod(i,nx)+1 + do l=1,nb + tem=0.0 + do m=1,nb + tem=tem+ + 1 a(l,m,i,j,k)*x(m,i,j,k)+ + 2 axp(l,m,i,j,k)*x(m,ip1,j,k)+ + 3 ayp(l,m,i,j,k)*x(m,i,jp1,k)+ + 4 azp(l,m,i,j,k)*x(m,i,j,kp1)+ + 5 axm(l,m,i,j,k)*x(m,im1,j,k)+ + 6 aym(l,m,i,j,k)*x(m,i,jm1,k)+ + 7 azm(l,m,i,j,k)*x(m,i,j,km1) + enddo + y(l,i,j,k)=tem + enddo + enddo + enddo + enddo + return + end + +! { dg-final { scan-tree-dump-times "is interchanged" 1 "linterchange" } } -- cgit v1.1 From 778032166d960d97541e652c59684d1187d0233c Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Sat, 17 Apr 2021 14:24:15 +0200 Subject: Replace !irange::undefined_p checks with num_ranges > 0 for readability. A few of the undefined_p checks in the irange code are really checking if there are sub-ranges. It just so happens that undefined_p is implemented with num_ranges > 0, so it was a shorthand used throughout. This shorthand was making the code unreadable. gcc/ChangeLog: * value-range.cc (irange::legacy_lower_bound): Replace !undefined_p check with num_ranges > 0. (irange::legacy_upper_bound): Same. * value-range.h (irange::type): Same. (irange::lower_bound): Same. (irange::upper_bound): Same. --- gcc/value-range.cc | 4 ++-- gcc/value-range.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'gcc') diff --git a/gcc/value-range.cc b/gcc/value-range.cc index cd21f75..d466623 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -441,7 +441,7 @@ irange::legacy_lower_bound (unsigned pair) const numeric_range.normalize_symbolics (); return numeric_range.legacy_lower_bound (pair); } - gcc_checking_assert (!undefined_p ()); + gcc_checking_assert (m_num_ranges > 0); gcc_checking_assert (pair + 1 <= num_pairs ()); if (m_kind == VR_ANTI_RANGE) { @@ -468,7 +468,7 @@ irange::legacy_upper_bound (unsigned pair) const numeric_range.normalize_symbolics (); return numeric_range.legacy_upper_bound (pair); } - gcc_checking_assert (!undefined_p ()); + gcc_checking_assert (m_num_ranges > 0); gcc_checking_assert (pair + 1 <= num_pairs ()); if (m_kind == VR_ANTI_RANGE) { diff --git a/gcc/value-range.h b/gcc/value-range.h index bfc54a24..bb27e70 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -224,7 +224,7 @@ irange::num_pairs () const inline tree irange::type () const { - gcc_checking_assert (!undefined_p ()); + gcc_checking_assert (m_num_ranges > 0); return TREE_TYPE (m_base[0]); } @@ -501,7 +501,7 @@ irange::lower_bound (unsigned pair) const { if (legacy_mode_p ()) return legacy_lower_bound (pair); - gcc_checking_assert (!undefined_p ()); + gcc_checking_assert (m_num_ranges > 0); gcc_checking_assert (pair + 1 <= num_pairs ()); return wi::to_wide (tree_lower_bound (pair)); } @@ -514,7 +514,7 @@ irange::upper_bound (unsigned pair) const { if (legacy_mode_p ()) return legacy_upper_bound (pair); - gcc_checking_assert (!undefined_p ()); + gcc_checking_assert (m_num_ranges > 0); gcc_checking_assert (pair + 1 <= num_pairs ()); return wi::to_wide (tree_upper_bound (pair)); } -- cgit v1.1 From 694c956b6b877e48323cf86c90c09237b7b0e8c8 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Sat, 17 Apr 2021 14:26:33 +0200 Subject: Remove irange::varying_p checks from symbolic_p and constant_p. As of a few releases ago, varying_p() ranges are also constant_p. Consequently, there is no need to check varying_p from either symbolic_p or constant_p. I have adjusted a few users of constant_p that were depending on constant_p returning false for varying_p. In these cases, I have placed the varying_p check before the constant_p check to avoid the more expensive constant_p check when possible. gcc/ChangeLog: * gimple-ssa-evrp-analyze.c (evrp_range_analyzer::set_ssa_range_info): Adjust for constant_p including varying_p. * tree-vrp.c (vrp_prop::finalize): Same. (determine_value_range): Same. * vr-values.c (vr_values::range_of_expr): Same. * value-range.cc (irange::symbolic_p): Do not check varying_p. (irange::constant_p): Same. --- gcc/gimple-ssa-evrp-analyze.c | 2 +- gcc/tree-vrp.c | 4 ++-- gcc/value-range.cc | 11 +++-------- gcc/vr-values.c | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) (limited to 'gcc') diff --git a/gcc/gimple-ssa-evrp-analyze.c b/gcc/gimple-ssa-evrp-analyze.c index 4c474cd..d78b6f8 100644 --- a/gcc/gimple-ssa-evrp-analyze.c +++ b/gcc/gimple-ssa-evrp-analyze.c @@ -109,7 +109,7 @@ evrp_range_analyzer::set_ssa_range_info (tree lhs, value_range_equiv *vr) /* Set the SSA with the value range. */ if (INTEGRAL_TYPE_P (TREE_TYPE (lhs))) { - if (vr->constant_p ()) + if (!vr->varying_p () && vr->constant_p ()) set_range_info (lhs, vr->kind (), wi::to_wide (vr->min ()), wi::to_wide (vr->max ())); diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 62b9007..d968ef2 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -4059,7 +4059,7 @@ vrp_prop::finalize () continue; const value_range_equiv *vr = m_vr_values->get_value_range (name); - if (!name || !vr->constant_p ()) + if (!name || vr->varying_p () || !vr->constant_p ()) continue; if (POINTER_TYPE_P (TREE_TYPE (name)) @@ -4679,7 +4679,7 @@ determine_value_range (tree expr, wide_int *min, wide_int *max) { value_range vr; determine_value_range_1 (&vr, expr); - if (vr.constant_p ()) + if (!vr.varying_p () && vr.constant_p ()) { *min = wi::to_wide (vr.min ()); *max = wi::to_wide (vr.max ()); diff --git a/gcc/value-range.cc b/gcc/value-range.cc index d466623..f5ef480 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -534,22 +534,17 @@ irange::equal_p (const irange &other) const bool irange::symbolic_p () const { - return (!varying_p () - && !undefined_p () + return (m_num_ranges > 0 && (!is_gimple_min_invariant (min ()) || !is_gimple_min_invariant (max ()))); } -/* NOTE: This is not the inverse of symbolic_p because the range - could also be varying or undefined. Ideally they should be inverse - of each other, with varying only applying to symbolics. Varying of - constants would be represented as [-MIN, +MAX]. */ +/* Return TRUE if this is a constant range. */ bool irange::constant_p () const { - return (!varying_p () - && !undefined_p () + return (m_num_ranges > 0 && TREE_CODE (min ()) == INTEGER_CST && TREE_CODE (max ()) == INTEGER_CST); } diff --git a/gcc/vr-values.c b/gcc/vr-values.c index e117f66..08b237b 100644 --- a/gcc/vr-values.c +++ b/gcc/vr-values.c @@ -182,7 +182,7 @@ vr_values::range_of_expr (irange &r, tree expr, gimple *stmt) if (const value_range *vr = get_value_range (expr, stmt)) { - if (vr->undefined_p () || vr->varying_p () || vr->constant_p ()) + if (vr->undefined_p () || vr->constant_p ()) r = *vr; else { -- cgit v1.1 From dc80d5e887ea4fa0e1e950db5f6bdd765c960c22 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Fri, 16 Apr 2021 18:40:44 +0200 Subject: Keep VR_UNDEFINED and VR_VARYING in sync (speeds up evrp by 8.47%). Currently multi-ranges calculate the undefined and varying bits on the fly, whereas legacy uses the m_kind field. Since we will always have space in the irange class for a kind field, might as well keep it in sync as ranges are created, thus speeding up lookups. This patch, along with an upcoming ones for num_pairs(), speeds up EVRP by 8.47%, VRP proper by 1.84% and overall compilation by 0.24%. FWIW, since evrp is such a fast pass, and is hard to measure clock-wise, we've been using callgrind to estimate improvements. This has coincided more or less with -ftime-report numbers (albeit having to run -ftime-report half a dozen times and use the average). gcc/ChangeLog: * value-range.cc (irange::operator=): Set m_kind. (irange::copy_to_legacy): Handle varying and undefined sources as a legacy copy since they can be easily copied. (irange::irange_set): Set m_kind. (irange::irange_set_anti_range): Same. (irange::set): Rename normalize_min_max to normalize_kind. (irange::verify_range): Adjust for multi-ranges having the m_kind field set. (irange::irange_union): Set m_kind. (irange::irange_intersect): Same. (irange::invert): Same. * value-range.h (irange::kind): Always return m_kind. (irange::varying_p): Rename to... (irange::varying_comptaible_p): ...this. (irange::undefined_p): Only look at m_kind. (irange::irange): Always set VR_UNDEFINED if applicable. (irange::set_undefined): Always set VR_UNDEFINED. (irange::set_varying): Always set m_kind to VR_VARYING. (irange::normalize_min_max): Rename to... (irange::normalize_kind): ...this. --- gcc/value-range.cc | 69 +++++++++++++++++++++++++++++++----------------------- gcc/value-range.h | 66 ++++++++++++++++++--------------------------------- 2 files changed, 63 insertions(+), 72 deletions(-) (limited to 'gcc') diff --git a/gcc/value-range.cc b/gcc/value-range.cc index f5ef480..297dd60 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -59,6 +59,7 @@ irange::operator= (const irange &src) m_base[x - 1] = src.m_base[src.m_num_ranges * 2 - 1]; m_num_ranges = lim; + m_kind = src.m_kind; return *this; } @@ -106,8 +107,8 @@ void irange::copy_to_legacy (const irange &src) { gcc_checking_assert (legacy_mode_p ()); - // Copy legacy to legacy. - if (src.legacy_mode_p ()) + // Handle legacy to legacy and other things that are easy to copy. + if (src.legacy_mode_p () || src.varying_p () || src.undefined_p ()) { m_num_ranges = src.m_num_ranges; m_base[0] = src.m_base[0]; @@ -116,11 +117,7 @@ irange::copy_to_legacy (const irange &src) return; } // Copy multi-range to legacy. - if (src.undefined_p ()) - set_undefined (); - else if (src.varying_p ()) - set_varying (src.type ()); - else if (src.maybe_anti_range ()) + if (src.maybe_anti_range ()) { int_range<3> r (src); r.invert (); @@ -180,6 +177,9 @@ irange::irange_set (tree min, tree max) m_base[0] = min; m_base[1] = max; m_num_ranges = 1; + m_kind = VR_RANGE; + normalize_kind (); + if (flag_checking) verify_range (); } @@ -247,6 +247,10 @@ irange::irange_set_anti_range (tree min, tree max) m_base[m_num_ranges * 2 + 1] = type_range.tree_upper_bound (0); ++m_num_ranges; } + + m_kind = VR_RANGE; + normalize_kind (); + if (flag_checking) verify_range (); } @@ -353,7 +357,7 @@ irange::set (tree min, tree max, value_range_kind kind) m_base[0] = min; m_base[1] = max; m_num_ranges = 1; - normalize_min_max (); + normalize_kind (); if (flag_checking) verify_range (); } @@ -363,9 +367,22 @@ irange::set (tree min, tree max, value_range_kind kind) void irange::verify_range () { + if (m_kind == VR_UNDEFINED) + { + gcc_assert (m_num_ranges == 0); + return; + } + gcc_assert (m_num_ranges != 0); + + if (m_kind == VR_VARYING) + { + gcc_checking_assert (m_num_ranges == 1); + gcc_checking_assert (varying_compatible_p ()); + return; + } if (!legacy_mode_p ()) { - gcc_checking_assert (m_kind == VR_RANGE); + gcc_checking_assert (!varying_compatible_p ()); for (unsigned i = 0; i < m_num_ranges; ++i) { tree lb = tree_lower_bound (i); @@ -375,28 +392,11 @@ irange::verify_range () } return; } - - switch (m_kind) + if (m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE) { - case VR_UNDEFINED: - gcc_assert (m_num_ranges == 0); - break; - - case VR_VARYING: gcc_assert (m_num_ranges == 1); - break; - - case VR_ANTI_RANGE: - case VR_RANGE: - { - gcc_assert (m_num_ranges == 1); - int cmp = compare_values (tree_lower_bound (0), tree_upper_bound (0)); - gcc_assert (cmp == 0 || cmp == -1 || cmp == -2); - return; - } - - default: - gcc_unreachable (); + int cmp = compare_values (tree_lower_bound (0), tree_upper_bound (0)); + gcc_assert (cmp == 0 || cmp == -1 || cmp == -2); } } @@ -1667,6 +1667,9 @@ irange::irange_union (const irange &r) m_base[j] = res [j]; m_num_ranges = i / 2; + m_kind = VR_RANGE; + normalize_kind (); + if (flag_checking) verify_range (); } @@ -1758,6 +1761,10 @@ irange::irange_intersect (const irange &r) // At the exit of this loop, it is one of 2 things: // ran out of r1, or r2, but either means we are done. m_num_ranges = bld_pair; + + m_kind = VR_RANGE; + normalize_kind (); + if (flag_checking) verify_range (); } @@ -1890,6 +1897,10 @@ irange::invert () } m_num_ranges = nitems / 2; + // We disallow undefined or varying coming in, so the result can + // only be a VR_RANGE. + gcc_checking_assert (m_kind == VR_RANGE); + if (flag_checking) verify_range (); } diff --git a/gcc/value-range.h b/gcc/value-range.h index bb27e70..e000432 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -111,7 +111,7 @@ protected: void irange_set (tree, tree); void irange_set_anti_range (tree, tree); - void normalize_min_max (); + void normalize_kind (); bool legacy_mode_p () const; bool legacy_equal_p (const irange &) const; @@ -128,6 +128,7 @@ protected: private: void irange_set_1bit_anti_range (tree, tree); + bool varying_compatible_p () const; unsigned char m_num_ranges; unsigned char m_max_ranges; @@ -198,16 +199,7 @@ extern bool vrp_operand_equal_p (const_tree, const_tree); inline value_range_kind irange::kind () const { - if (legacy_mode_p ()) - return m_kind; - - if (undefined_p ()) - return VR_UNDEFINED; - - if (varying_p ()) - return VR_VARYING; - - return VR_RANGE; + return m_kind; } // Number of sub-ranges in a range. @@ -271,17 +263,18 @@ irange::max () const } inline bool -irange::varying_p () const +irange::varying_compatible_p () const { - if (legacy_mode_p ()) - return m_kind == VR_VARYING; - if (m_num_ranges != 1) return false; tree l = m_base[0]; tree u = m_base[1]; tree t = TREE_TYPE (l); + + if (m_kind == VR_VARYING && t == error_mark_node) + return true; + unsigned prec = TYPE_PRECISION (t); signop sign = TYPE_SIGN (t); if (INTEGRAL_TYPE_P (t)) @@ -291,22 +284,17 @@ irange::varying_p () const return (wi::to_wide (l) == 0 && wi::to_wide (u) == wi::max_value (prec, sign)); return true; +} +inline bool +irange::varying_p () const +{ + return m_kind == VR_VARYING; } inline bool irange::undefined_p () const { - if (!legacy_mode_p ()) - return m_num_ranges == 0; - - if (CHECKING_P && legacy_mode_p ()) - { - if (m_kind == VR_UNDEFINED) - gcc_checking_assert (m_num_ranges == 0); - else - gcc_checking_assert (m_num_ranges != 0); - } return m_kind == VR_UNDEFINED; } @@ -389,10 +377,7 @@ irange::irange (tree *base, unsigned nranges) m_base = base; m_num_ranges = 0; m_max_ranges = nranges; - if (legacy_mode_p ()) - m_kind = VR_UNDEFINED; - else - m_kind = VR_RANGE; + m_kind = VR_UNDEFINED; } // Constructors for int_range<>. @@ -459,18 +444,16 @@ irange::set (tree val) inline void irange::set_undefined () { + m_kind = VR_UNDEFINED; m_num_ranges = 0; - if (legacy_mode_p ()) - m_kind = VR_UNDEFINED; } inline void irange::set_varying (tree type) { - if (legacy_mode_p ()) - m_kind = VR_VARYING; - + m_kind = VR_VARYING; m_num_ranges = 1; + if (INTEGRAL_TYPE_P (type)) { wide_int min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type)); @@ -574,17 +557,14 @@ irange::set_zero (tree type) // Normalize a range to VARYING or UNDEFINED if possible. inline void -irange::normalize_min_max () -{ - gcc_checking_assert (legacy_mode_p ()); - gcc_checking_assert (!undefined_p ()); - unsigned prec = TYPE_PRECISION (type ()); - signop sign = TYPE_SIGN (type ()); - if (wi::eq_p (wi::to_wide (min ()), wi::min_value (prec, sign)) - && wi::eq_p (wi::to_wide (max ()), wi::max_value (prec, sign))) +irange::normalize_kind () +{ + if (m_num_ranges == 0) + m_kind = VR_UNDEFINED; + else if (varying_compatible_p ()) { if (m_kind == VR_RANGE) - set_varying (type ()); + m_kind = VR_VARYING; else if (m_kind == VR_ANTI_RANGE) set_undefined (); else -- cgit v1.1 From db3581c4ae4d44edea2b64347095d14363721668 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Sat, 17 Apr 2021 17:44:37 +0200 Subject: Cache irange::num_pairs() for non-legacy code. This does for num_pairs() what my previous patch did for VR_UNDEFINED and VR_VARYING. Note that VR_ANTI_RANGE for legacy is always set to 2 ranges. There is only one way of representing a range, so a range that can be represented as a VR_RANGE will never have a kind of VR_ANTI_RANGE. Also legacy symbolics can also use VR_ANTI_RANGE, but no one will ever ask for the bounds of such range, so m_num_ranges is irrelevant. gcc/ChangeLog: * value-range.cc (irange::legacy_num_pairs): Remove. (irange::invert): Change gcc_assert to gcc_checking_assert. * value-range.h (irange::num_pairs): Adjust for a cached num_pairs(). Also, rename all gcc_assert's to gcc_checking_assert's. --- gcc/value-range.cc | 41 ++++++----------------------------------- gcc/value-range.h | 7 +++---- 2 files changed, 9 insertions(+), 39 deletions(-) (limited to 'gcc') diff --git a/gcc/value-range.cc b/gcc/value-range.cc index 297dd60..dc76ed7 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -369,11 +369,9 @@ irange::verify_range () { if (m_kind == VR_UNDEFINED) { - gcc_assert (m_num_ranges == 0); + gcc_checking_assert (m_num_ranges == 0); return; } - gcc_assert (m_num_ranges != 0); - if (m_kind == VR_VARYING) { gcc_checking_assert (m_num_ranges == 1); @@ -382,50 +380,23 @@ irange::verify_range () } if (!legacy_mode_p ()) { + gcc_checking_assert (m_num_ranges != 0); gcc_checking_assert (!varying_compatible_p ()); for (unsigned i = 0; i < m_num_ranges; ++i) { tree lb = tree_lower_bound (i); tree ub = tree_upper_bound (i); int c = compare_values (lb, ub); - gcc_assert (c == 0 || c == -1); + gcc_checking_assert (c == 0 || c == -1); } return; } if (m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE) { - gcc_assert (m_num_ranges == 1); + gcc_checking_assert (m_num_ranges == 1); int cmp = compare_values (tree_lower_bound (0), tree_upper_bound (0)); - gcc_assert (cmp == 0 || cmp == -1 || cmp == -2); - } -} - -unsigned -irange::legacy_num_pairs () const -{ - gcc_checking_assert (legacy_mode_p ()); - - if (undefined_p ()) - return 0; - if (varying_p ()) - return 1; - // Inlined symbolic_p for performance: - if (!is_gimple_min_invariant (min ()) || !is_gimple_min_invariant (max ())) - { - value_range numeric_range (*this); - numeric_range.normalize_symbolics (); - return numeric_range.num_pairs (); - } - if (m_kind == VR_ANTI_RANGE) - { - // ~[MIN, X] has one sub-range of [X+1, MAX], and - // ~[X, MAX] has one sub-range of [MIN, X-1]. - if (vrp_val_is_min (min ()) || vrp_val_is_max (max ())) - return 1; - return 2; + gcc_checking_assert (cmp == 0 || cmp == -1 || cmp == -2); } - gcc_checking_assert (m_num_ranges == 1); - return 1; } // Return the lower bound for a sub-range. PAIR is the sub-range in @@ -1810,7 +1781,7 @@ irange::invert () return; } - gcc_assert (!undefined_p () && !varying_p ()); + gcc_checking_assert (!undefined_p () && !varying_p ()); // We always need one more set of bounds to represent an inverse, so // if we're at the limit, we can't properly represent things. diff --git a/gcc/value-range.h b/gcc/value-range.h index e000432..7e36e21 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -118,7 +118,6 @@ protected: void legacy_union (irange *, const irange *); void legacy_intersect (irange *, const irange *); void verify_range (); - unsigned legacy_num_pairs () const; wide_int legacy_lower_bound (unsigned = 0) const; wide_int legacy_upper_bound (unsigned) const; int value_inside_range (tree) const; @@ -207,10 +206,10 @@ irange::kind () const inline unsigned irange::num_pairs () const { - if (!legacy_mode_p ()) - return m_num_ranges; + if (m_kind == VR_ANTI_RANGE) + return constant_p () ? 2 : 1; else - return legacy_num_pairs (); + return m_num_ranges; } inline tree -- cgit v1.1 From 5a26ba75de623f75fb44cddc2a9c982d31c96213 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Mon, 26 Apr 2021 21:57:31 +0200 Subject: OpenACC: Fix pattern in dg-bogus in Fortran testcases libgomp/ChangeLog: * testsuite/libgomp.oacc-fortran/par-reduction-2-1.f: Correct spelling in dg-bogus to match -Wopenacc-parallelism. * testsuite/libgomp.oacc-fortran/par-reduction-2-2.f: Likewise. * testsuite/libgomp.oacc-fortran/parallel-dims.f90: Likewise. * testsuite/libgomp.oacc-fortran/parallel-reduction.f90: Likewise. gcc/testsuite/ChangeLog: * gfortran.dg/goacc/classify-serial.f95: Correct spelling in dg-bogus to match -Wopenacc-parallelism. * gfortran.dg/goacc/kernels-decompose-2.f95: Likewise. * gfortran.dg/goacc/routine-module-mod-1.f90: Likewise. --- gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 | 6 +++--- gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 | 2 +- gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 index 6d402e6..386b95e 100644 --- a/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 @@ -18,9 +18,9 @@ program main call setup(a, b) !$acc serial loop copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1)) ! { dg-message "optimized: assigned OpenACC gang vector loop parallelism" } - ! { dg-bogus "warning: region contains gang partitioned code but is not gang partitioned" "TODO 'serial'" { xfail *-*-* } .-1 } - ! { dg-bogus "warning: region contains worker partitioned code but is not worker partitioned" "" { target *-*-* } .-2 } - ! { dg-bogus "warning: region contains vector partitioned code but is not vector partitioned" "TODO 'serial'" { xfail *-*-* } .-3 } + ! { dg-bogus "Warning: region contains gang partitioned code but is not gang partitioned" "TODO 'serial'" { xfail *-*-* } .-1 } + ! { dg-bogus "Warning: region contains worker partitioned code but is not worker partitioned" "" { target *-*-* } .-2 } + ! { dg-bogus "Warning: region contains vector partitioned code but is not vector partitioned" "TODO 'serial'" { xfail *-*-* } .-3 } do i = 0, n - 1 c(i) = a(i) + b(i) end do diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 index a3cec83..1277ad9 100644 --- a/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 @@ -122,7 +122,7 @@ program main !$acc end kernels !$acc kernels - ! { dg-bogus "warning: region contains gang partitioned code but is not gang partitioned" "TODO 'kernels'" { xfail *-*-* } .-1 } + ! { dg-bogus "Warning: region contains gang partitioned code but is not gang partitioned" "TODO 'kernels'" { xfail *-*-* } .-1 } y = f_g (a(5)) ! { dg-line l_part[incr c_part] } !TODO If such a construct is placed in its own part (like it is, here), can't this actually use gang paralelism, instead of "gang-single"? ! { dg-message "note: beginning 'gang-single' part in OpenACC 'kernels' region" "" { target *-*-* } l_part$c_part } diff --git a/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 b/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 index 2210650..198ae01 100644 --- a/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 @@ -56,7 +56,7 @@ contains subroutine g_1 implicit none !$acc routine gang - ! { dg-bogus "warning: region is worker partitioned but does not contain worker partitioned code" "TODO default 'gang' 'vector'" { xfail *-*-* } .-3 } + ! { dg-bogus "Warning: region is worker partitioned but does not contain worker partitioned code" "TODO default 'gang' 'vector'" { xfail *-*-* } .-3 } integer :: i -- cgit v1.1 From e6455a099ec74071ba9c011cc314a48cadbe2bfe Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Mon, 26 Apr 2021 19:24:09 +0200 Subject: Handle anti-ranges of MIN,MAX uniformly. The -fstrict-enums comment in the VR_ANTI_RANGE handling code is out of date, as out-of-range ranges have already been handled by this time. I've removed it. Furthermore, optimizing ~[MIN,MAX] as VARYING instead of UNDEFINED is an old idiom. I've been wanting to change it for a while, but have only remembered late in the release cycle when it was too risky. What I've chosen to do in this case is fall through to the code that normalizes the range. This will correctly turn ~[MIN,MAX] into UNDEFINED, yet leaving things alone in the case of -fstrict-enums where [MIN,MAX] may not necessarily include the entire range of the underlying precision. For example, if the domain of a strict enum is [3,5] setting a VR_ANTI_RANGE of ~[3,5] should not cause neither VR_UNDEFINED nor VR_VARYING, but just plain ~[3,5]. This is similar to what we do for -fstrict-enums when we set a range of [3,5]. We leave it as a VR_RANGE, instead of upgrading it to VR_VARYING. gcc/ChangeLog: * value-range.cc (irange::irange_set_1bit_anti_range): Add assert. (irange::set): Call irange_set_1bit_anti_range for handling all 1-bit ranges. Fall through on ~[MIN,MAX]. --- gcc/value-range.cc | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) (limited to 'gcc') diff --git a/gcc/value-range.cc b/gcc/value-range.cc index dc76ed7..2decd08 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -203,6 +203,8 @@ irange::irange_set_1bit_anti_range (tree min, tree max) else { // The only alternative is [MIN,MAX], which is the empty range. + gcc_checking_assert (vrp_val_is_min (min)); + gcc_checking_assert (vrp_val_is_max (max)); set_undefined (); } if (flag_checking) @@ -313,29 +315,21 @@ irange::set (tree min, tree max, value_range_kind kind) // Anti-ranges that can be represented as ranges should be so. if (kind == VR_ANTI_RANGE) { - /* For -fstrict-enums we may receive out-of-range ranges so consider - values < -INF and values > INF as -INF/INF as well. */ bool is_min = vrp_val_is_min (min); bool is_max = vrp_val_is_max (max); - tree type = TREE_TYPE (min); if (is_min && is_max) { - /* We cannot deal with empty ranges, drop to varying. - ??? This could be VR_UNDEFINED instead. */ - set_varying (type); - return; + // Fall through. This will either be normalized as + // VR_UNDEFINED if the anti-range spans the entire + // precision, or it will remain an VR_ANTI_RANGE in the case + // of an -fstrict-enum where [MIN,MAX] is less than the span + // of underlying precision. } - else if (TYPE_PRECISION (TREE_TYPE (min)) == 1 - && (is_min || is_max)) + else if (TYPE_PRECISION (TREE_TYPE (min)) == 1) { - /* Non-empty boolean ranges can always be represented - as a singleton range. */ - if (is_min) - min = max = vrp_val_max (TREE_TYPE (min)); - else - min = max = vrp_val_min (TREE_TYPE (min)); - kind = VR_RANGE; + irange_set_1bit_anti_range (min, max); + return; } else if (is_min) { -- cgit v1.1 From bd7ebe9da745a62184052dd1b15f4dd10fbdc9f4 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Mon, 26 Apr 2021 22:59:21 +0200 Subject: OpenACC: Fix pattern in dg-bogus in Fortran testcases again It turned out that a compiler built without offloading support and one with can produce slightly different diagnostic. Offloading support implies ENABLE_OFFLOAD which implies that g->have_offload is set when offloading is actually needed. In cgraphunit.c, the latter causes flag_generate_offload = 1, which in turn affects tree.c's free_lang_data. The result is that the front-end specific diagnostic gets reset ('tree_diagnostics_defaults (global_dc)'), which affects in this case 'Warning' vs. 'warning' via the Fortran frontend. Result: 'Warning:' vs. 'warning:'. Side note: Other FE also override the diagnostic, leading to similar differences, e.g. the C++ FE outputs mangled function names differently, cf. patch thread. libgomp/ChangeLog: * testsuite/libgomp.oacc-fortran/par-reduction-2-1.f: Use [Ww]arning in dg-bogus as FE diagnostic and default diagnostic differ and the result depends on ENABLE_OFFLOAD. * testsuite/libgomp.oacc-fortran/par-reduction-2-2.f: Likewise. * testsuite/libgomp.oacc-fortran/parallel-dims.f90: Likewise. * testsuite/libgomp.oacc-fortran/parallel-reduction.f90: Likewise. gcc/testsuite/ChangeLog: * gfortran.dg/goacc/classify-serial.f95: Use [Ww]arning in dg-bogus as FE diagnostic and default diagnostic differ and the result depends on ENABLE_OFFLOAD. * gfortran.dg/goacc/kernels-decompose-2.f95: Likewise. * gfortran.dg/goacc/routine-module-mod-1.f90: Likewise. --- gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 | 6 +++--- gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 | 2 +- gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 b/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 index 386b95e..6dcb1b1 100644 --- a/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/classify-serial.f95 @@ -18,9 +18,9 @@ program main call setup(a, b) !$acc serial loop copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1)) ! { dg-message "optimized: assigned OpenACC gang vector loop parallelism" } - ! { dg-bogus "Warning: region contains gang partitioned code but is not gang partitioned" "TODO 'serial'" { xfail *-*-* } .-1 } - ! { dg-bogus "Warning: region contains worker partitioned code but is not worker partitioned" "" { target *-*-* } .-2 } - ! { dg-bogus "Warning: region contains vector partitioned code but is not vector partitioned" "TODO 'serial'" { xfail *-*-* } .-3 } + ! { dg-bogus "\[Ww\]arning: region contains gang partitioned code but is not gang partitioned" "TODO 'serial'" { xfail *-*-* } .-1 } + ! { dg-bogus "\[Ww\]arning: region contains worker partitioned code but is not worker partitioned" "" { target *-*-* } .-2 } + ! { dg-bogus "\[Ww\]arning: region contains vector partitioned code but is not vector partitioned" "TODO 'serial'" { xfail *-*-* } .-3 } do i = 0, n - 1 c(i) = a(i) + b(i) end do diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 index 1277ad9..238482b 100644 --- a/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/kernels-decompose-2.f95 @@ -122,7 +122,7 @@ program main !$acc end kernels !$acc kernels - ! { dg-bogus "Warning: region contains gang partitioned code but is not gang partitioned" "TODO 'kernels'" { xfail *-*-* } .-1 } + ! { dg-bogus "\[Ww\]arning: region contains gang partitioned code but is not gang partitioned" "TODO 'kernels'" { xfail *-*-* } .-1 } y = f_g (a(5)) ! { dg-line l_part[incr c_part] } !TODO If such a construct is placed in its own part (like it is, here), can't this actually use gang paralelism, instead of "gang-single"? ! { dg-message "note: beginning 'gang-single' part in OpenACC 'kernels' region" "" { target *-*-* } l_part$c_part } diff --git a/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 b/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 index 198ae01..835619c 100644 --- a/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/routine-module-mod-1.f90 @@ -56,7 +56,7 @@ contains subroutine g_1 implicit none !$acc routine gang - ! { dg-bogus "Warning: region is worker partitioned but does not contain worker partitioned code" "TODO default 'gang' 'vector'" { xfail *-*-* } .-3 } + ! { dg-bogus "\[Ww\]arning: region is worker partitioned but does not contain worker partitioned code" "TODO default 'gang' 'vector'" { xfail *-*-* } .-3 } integer :: i -- cgit v1.1 From 0120cd9382728fdc99d4cfdcb72cd0f55aca2ce3 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Mon, 26 Apr 2021 17:30:39 -0400 Subject: c++: constexpr pointer indirection with negative offset [PR100209] During constexpr evaluation, a base-to-derived conversion may yield an expression like (Derived*)(&D.2217.D.2106 p+ -4) where D.2217 is the derived object and D.2106 is the base. But cxx_fold_indirect_ref doesn't know how to resolve an INDIRECT_REF thereof to just D.2217, because it doesn't handle POINTER_PLUS_EXPR of a COMPONENT_REF with negative offset well: when the offset N is positive, it knows that '&x p+ N' is equivalent to '&x.f p+ (N - bytepos(f))', but it doesn't know about the reverse transformation, that '&x.f p+ N' is equivalent to '&x p+ (N + bytepos(f))' when N is negative, which is important for resolving such base-to-derived conversions and for accessing subobjects backwards. This patch teaches cxx_fold_indirect_ref this reverse transformation. gcc/cp/ChangeLog: PR c++/100209 * constexpr.c (cxx_fold_indirect_ref): Try to canonicalize the object/offset pair for a POINTER_PLUS_EXPR of a COMPONENT_REF with a negative offset into one whose offset is nonnegative before calling cxx_fold_indirect_ref_1. gcc/testsuite/ChangeLog: PR c++/100209 * g++.dg/cpp1y/constexpr-base1.C: New test. * g++.dg/cpp1y/constexpr-ptrsub1.C: New test. --- gcc/cp/constexpr.c | 20 +++++++++++++++--- gcc/testsuite/g++.dg/cpp1y/constexpr-base1.C | 28 ++++++++++++++++++++++++++ gcc/testsuite/g++.dg/cpp1y/constexpr-ptrsub1.C | 23 +++++++++++++++++++++ 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-base1.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-ptrsub1.C (limited to 'gcc') diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 0fb0ab4..fa7eaed 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -4894,12 +4894,26 @@ cxx_fold_indirect_ref (const constexpr_ctx *ctx, location_t loc, tree type, && tree_fits_uhwi_p (TREE_OPERAND (sub, 1))) { tree op00 = TREE_OPERAND (sub, 0); - tree op01 = TREE_OPERAND (sub, 1); + tree off = TREE_OPERAND (sub, 1); STRIP_NOPS (op00); if (TREE_CODE (op00) == ADDR_EXPR) - return cxx_fold_indirect_ref_1 (ctx, loc, type, TREE_OPERAND (op00, 0), - tree_to_uhwi (op01), empty_base); + { + tree obj = TREE_OPERAND (op00, 0); + while (TREE_CODE (obj) == COMPONENT_REF + && tree_int_cst_sign_bit (off)) + { + /* Canonicalize this object/offset pair by iteratively absorbing + the innermost component into the offset until the offset is + nonnegative, so that cxx_fold_indirect_ref_1 can identify + more folding opportunities. */ + tree field = TREE_OPERAND (obj, 1); + off = int_const_binop (PLUS_EXPR, off, byte_position (field)); + obj = TREE_OPERAND (obj, 0); + } + return cxx_fold_indirect_ref_1 (ctx, loc, type, obj, + tree_to_uhwi (off), empty_base); + } } /* *(foo *)fooarrptr => (*fooarrptr)[0] */ else if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-base1.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-base1.C new file mode 100644 index 0000000..3c93aa8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-base1.C @@ -0,0 +1,28 @@ +// PR c++/100209 +// { dg-do compile { target c++14 } } + +template +struct __a_t +{ + unsigned char A = 0; + constexpr Derived & SetA(const unsigned char & value) { + A = value; + return *static_cast(this); + } +}; + +template +struct __b_t +{ + unsigned char B = 0; + constexpr Derived & SetB(const unsigned char & value) { + B = value; + return *static_cast(this); + } +}; + +struct __ab_t : __a_t<__ab_t>, __b_t<__ab_t> { }; + +constexpr auto AB = __ab_t().SetA(100).SetB(10); +static_assert(AB.A == 100, ""); +static_assert(AB.B == 10, ""); diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-ptrsub1.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-ptrsub1.C new file mode 100644 index 0000000..d6cb6ad --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-ptrsub1.C @@ -0,0 +1,23 @@ +// PR c++/100209 +// { dg-do compile { target c++14 } } + +struct A { + int x = 1; +}; + +struct B : A { + int y = 2; + int z = 3; + int w = 4; +}; + +constexpr bool f() { + B b; + if (&b.w - &b.x != 3) + /* Effectively disable this test if the layout of B isn't + what we expect. */ + return true; + const int* w = &b.w; + return *w-- == 4 && *w-- == 3 && *w-- == 2 && *w-- == 1; +} +static_assert(f(), ""); -- cgit v1.1 From c0fa3f2fb365144b3a059920aeaf6ff37db1177d Mon Sep 17 00:00:00 2001 From: GCC Administrator Date: Tue, 27 Apr 2021 00:16:30 +0000 Subject: Daily bump. --- gcc/ChangeLog | 171 ++++++++++++++++++++++++++++++++++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/c-family/ChangeLog | 8 +++ gcc/cp/ChangeLog | 8 +++ gcc/fortran/ChangeLog | 8 +++ gcc/testsuite/ChangeLog | 83 +++++++++++++++++++++++ 6 files changed, 279 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a8510be..2c93637 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,174 @@ +2021-04-26 Aldy Hernandez + + * value-range.cc (irange::irange_set_1bit_anti_range): Add assert. + (irange::set): Call irange_set_1bit_anti_range for handling all + 1-bit ranges. Fall through on ~[MIN,MAX]. + +2021-04-26 Aldy Hernandez + + * value-range.cc (irange::legacy_num_pairs): Remove. + (irange::invert): Change gcc_assert to gcc_checking_assert. + * value-range.h (irange::num_pairs): Adjust for a cached + num_pairs(). Also, rename all gcc_assert's to + gcc_checking_assert's. + +2021-04-26 Aldy Hernandez + + * value-range.cc (irange::operator=): Set m_kind. + (irange::copy_to_legacy): Handle varying and undefined sources + as a legacy copy since they can be easily copied. + (irange::irange_set): Set m_kind. + (irange::irange_set_anti_range): Same. + (irange::set): Rename normalize_min_max to normalize_kind. + (irange::verify_range): Adjust for multi-ranges having the + m_kind field set. + (irange::irange_union): Set m_kind. + (irange::irange_intersect): Same. + (irange::invert): Same. + * value-range.h (irange::kind): Always return m_kind. + (irange::varying_p): Rename to... + (irange::varying_comptaible_p): ...this. + (irange::undefined_p): Only look at m_kind. + (irange::irange): Always set VR_UNDEFINED if applicable. + (irange::set_undefined): Always set VR_UNDEFINED. + (irange::set_varying): Always set m_kind to VR_VARYING. + (irange::normalize_min_max): Rename to... + (irange::normalize_kind): ...this. + +2021-04-26 Aldy Hernandez + + * gimple-ssa-evrp-analyze.c (evrp_range_analyzer::set_ssa_range_info): + Adjust for constant_p including varying_p. + * tree-vrp.c (vrp_prop::finalize): Same. + (determine_value_range): Same. + * vr-values.c (vr_values::range_of_expr): Same. + * value-range.cc (irange::symbolic_p): Do not check varying_p. + (irange::constant_p): Same. + +2021-04-26 Aldy Hernandez + + * value-range.cc (irange::legacy_lower_bound): Replace + !undefined_p check with num_ranges > 0. + (irange::legacy_upper_bound): Same. + * value-range.h (irange::type): Same. + (irange::lower_bound): Same. + (irange::upper_bound): Same. + +2021-04-26 Richard Biener + + PR tree-optimization/99956 + * gimple-loop-interchange.cc (compute_access_stride): + Try instantiating the access in a shallower loop nest + if instantiating failed. + (compute_access_strides): Pass adjustable loop_nest + to compute_access_stride. + +2021-04-26 Christophe Lyon + + * doc/sourcebuild.texi (arm_cmse_hw): Document. + +2021-04-26 Kyrylo Tkachov + + * config/aarch64/iterators.md (vwcore): Handle V4BF, V8BF. + +2021-04-26 Thomas Schwinge + Nathan Sidwell + Tom de Vries + Julian Brown + Kwok Cheung Yeung + + * omp-offload.c (oacc_validate_dims): Implement + '-Wopenacc-parallelism'. + * doc/invoke.texi (-Wopenacc-parallelism): Document. + +2021-04-26 Richard Biener + + * tree-cfg.h (gimplify_build1): Remove. + (gimplify_build2): Likewise. + (gimplify_build3): Likewise. + * tree-cfg.c (gimplify_build1): Move to tree-vect-generic.c. + (gimplify_build2): Likewise. + (gimplify_build3): Likewise. + * tree-vect-generic.c (gimplify_build1): Move from tree-cfg.c. + Modernize. + (gimplify_build2): Likewise. + (gimplify_build3): Likewise. + (tree_vec_extract): Use resimplify with following SSA edges. + (expand_vector_parallel): Avoid passing NULL size/bitpos + to tree_vec_extract. + * expr.c (store_constructor): Deal with zero-element CTORs. + * match.pd (bit_field_ref ): Make sure to + produce vector constants when possible. + +2021-04-26 Richard Biener + + * tree-complex.c: Include gimple-fold.h. + (expand_complex_addition): Use gimple_build. + (expand_complex_multiplication_components): Likewise. + (expand_complex_multiplication): Likewise. + (expand_complex_div_straight): Likewise. + (expand_complex_div_wide): Likewise. + (expand_complex_division): Likewise. + (expand_complex_conjugate): Likewise. + (expand_complex_comparison): Likewise. + +2021-04-26 Richard Biener + + * tree-ssa-phiopt.c (two_value_replacement): Remove use + of legacy gimplify_buildN API. + +2021-04-26 Richard Biener + + PR tree-optimization/99473 + * tree-ssa-phiopt.c (cond_store_replacement): Handle all + stores. + +2021-04-26 Richard Biener + + * config/rs6000/rs6000-call.c (rs6000_gimple_fold_builtin): + Use replace_call_with_value. + +2021-04-26 Richard Biener + + * tree-ssa-propagate.h (valid_gimple_rhs_p): Remove. + (update_gimple_call): Likewise. + (update_call_from_tree): Likewise. + * tree-ssa-propagate.c (valid_gimple_rhs_p): Remove. + (valid_gimple_call_p): Likewise. + (move_ssa_defining_stmt_for_defs): Likewise. + (finish_update_gimple_call): Likewise. + (update_gimple_call): Likewise. + (update_call_from_tree): Likewise. + (propagate_tree_value_into_stmt): Use replace_call_with_value. + * gimple-fold.h (update_gimple_call): Declare. + * gimple-fold.c (valid_gimple_rhs_p): Move here from + tree-ssa-propagate.c. + (update_gimple_call): Likewise. + (valid_gimple_call_p): Likewise. + (finish_update_gimple_call): Likewise, and simplify. + (gimplify_and_update_call_from_tree): Implement + update_call_from_tree functionality, avoid excessive + push/pop_gimplify_context. + (gimple_fold_builtin): Use only gimplify_and_update_call_from_tree. + (gimple_fold_call): Likewise. + * gimple-ssa-sprintf.c (try_substitute_return_value): Likewise. + * tree-ssa-ccp.c (ccp_folder::fold_stmt): Likewise. + (pass_fold_builtins::execute): Likewise. + (optimize_stack_restore): Use replace_call_with_value. + * tree-cfg.c (fold_loop_internal_call): Likewise. + * tree-ssa-dce.c (maybe_optimize_arith_overflow): Use + only gimplify_and_update_call_from_tree. + * tree-ssa-strlen.c (handle_builtin_strlen): Likewise. + (handle_builtin_strchr): Likewise. + * tsan.c: Include gimple-fold.h instead of tree-ssa-propagate.h. + +2021-04-26 Jakub Jelinek + + PR debug/100255 + * vmsdbgout.c (ASM_OUTPUT_DEBUG_STRING, vmsdbgout_begin_block, + vmsdbgout_end_block, lookup_filename, vmsdbgout_source_line): Remove + register keywords. + 2021-04-25 liuhongt PR target/98911 diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 7f03bd1..f347a06 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210426 +20210427 diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index fb2c4b0..38855e1 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,11 @@ +2021-04-26 Thomas Schwinge + Nathan Sidwell + Tom de Vries + Julian Brown + Kwok Cheung Yeung + + * c.opt (Wopenacc-parallelism): New. + 2021-04-19 Thomas Schwinge * c.opt (fopenacc-kernels=): Remove. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b213029..ec6e1d6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2021-04-26 Patrick Palka + + PR c++/100209 + * constexpr.c (cxx_fold_indirect_ref): Try to canonicalize the + object/offset pair for a POINTER_PLUS_EXPR of a COMPONENT_REF + with a negative offset into one whose offset is nonnegative + before calling cxx_fold_indirect_ref_1. + 2021-04-24 Patrick Palka PR c++/89565 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ad66161..c368926 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2021-04-26 Thomas Schwinge + Nathan Sidwell + Tom de Vries + Julian Brown + Kwok Cheung Yeung + + * lang.opt (Wopenacc-parallelism): New. + 2021-04-24 Harald Anlauf PR fortran/100154 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c79adfd..26c41ac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,86 @@ +2021-04-26 Patrick Palka + + PR c++/100209 + * g++.dg/cpp1y/constexpr-base1.C: New test. + * g++.dg/cpp1y/constexpr-ptrsub1.C: New test. + +2021-04-26 Tobias Burnus + + * gfortran.dg/goacc/classify-serial.f95: + Use [Ww]arning in dg-bogus as FE diagnostic and default + diagnostic differ and the result depends on ENABLE_OFFLOAD. + * gfortran.dg/goacc/kernels-decompose-2.f95: Likewise. + * gfortran.dg/goacc/routine-module-mod-1.f90: Likewise. + +2021-04-26 Tobias Burnus + + * gfortran.dg/goacc/classify-serial.f95: + Correct spelling in dg-bogus to match -Wopenacc-parallelism. + * gfortran.dg/goacc/kernels-decompose-2.f95: Likewise. + * gfortran.dg/goacc/routine-module-mod-1.f90: Likewise. + +2021-04-26 Richard Biener + + PR tree-optimization/99956 + * gfortran.dg/pr99956.f: New testcase. + +2021-04-26 Christophe Lyon + + * gcc.target/arm/cmse/bitfield-1.c: Remove dg-do. + * gcc.target/arm/cmse/bitfield-2.c: Likewise. + * gcc.target/arm/cmse/bitfield-3.c: Likewise. + * gcc.target/arm/cmse/cmse-16.c: Likewise. + * gcc.target/arm/cmse/struct-1.c: Likewise. + * gcc.target/arm/cmse/cmse.exp: Set dg-do-what-default depending + on arm_cmse_hw. + * lib/target-supports.exp (check_effective_target_arm_cmse_hw): + New. + +2021-04-26 Eric Botcazou + + * gcc.dg/pr84877.c: XFAIL on SPARC as well. + +2021-04-26 Thomas Schwinge + Nathan Sidwell + Tom de Vries + Julian Brown + Kwok Cheung Yeung + + * c-c++-common/goacc/diag-parallelism-1.c: New. + * c-c++-common/goacc/acc-icf.c: Specify '-Wopenacc-parallelism', + and match diagnostics, as appropriate. + * c-c++-common/goacc/classify-kernels-unparallelized.c: Likewise. + * c-c++-common/goacc/classify-kernels.c: Likewise. + * c-c++-common/goacc/classify-parallel.c: Likewise. + * c-c++-common/goacc/classify-routine.c: Likewise. + * c-c++-common/goacc/classify-serial.c: Likewise. + * c-c++-common/goacc/kernels-decompose-1.c: Likewise. + * c-c++-common/goacc/kernels-decompose-2.c: Likewise. + * c-c++-common/goacc/parallel-dims-1.c: Likewise. + * c-c++-common/goacc/parallel-reduction.c: Likewise. + * c-c++-common/goacc/pr70688.c: Likewise. + * c-c++-common/goacc/routine-1.c: Likewise. + * c-c++-common/goacc/routine-level-of-parallelism-2.c: Likewise. + * c-c++-common/goacc/uninit-dim-clause.c: Likewise. + * gfortran.dg/goacc/classify-kernels-unparallelized.f95: Likewise. + * gfortran.dg/goacc/classify-kernels.f95: Likewise. + * gfortran.dg/goacc/classify-parallel.f95: Likewise. + * gfortran.dg/goacc/classify-routine.f95: Likewise. + * gfortran.dg/goacc/classify-serial.f95: Likewise. + * gfortran.dg/goacc/kernels-decompose-1.f95: Likewise. + * gfortran.dg/goacc/kernels-decompose-2.f95: Likewise. + * gfortran.dg/goacc/parallel-tree.f95: Likewise. + * gfortran.dg/goacc/routine-4.f90: Likewise. + * gfortran.dg/goacc/routine-level-of-parallelism-1.f90: Likewise. + * gfortran.dg/goacc/routine-module-mod-1.f90: Likewise. + * gfortran.dg/goacc/routine-multiple-directives-1.f90: Likewise. + * gfortran.dg/goacc/uninit-dim-clause.f95: Likewise. + +2021-04-26 Richard Biener + + PR tree-optimization/99473 + * gcc.dg/tree-ssa/pr99473-1.c: New testcase. + 2021-04-25 liuhongt PR target/98911 -- cgit v1.1 From 2cde2d620fc5ff60264ee825fd6eea457d7c51d9 Mon Sep 17 00:00:00 2001 From: "Cui,Lili" Date: Sat, 24 Apr 2021 11:52:17 +0800 Subject: Synchronize Rocket Lake's processor_names and processor_cost_table with processor_type gcc/ChangeLog * common/config/i386/i386-common.c (processor_names): Sync processor_names with processor_type. * config/i386/i386-options.c (processor_cost_table): Sync processor_cost_table with processor_type. --- gcc/common/config/i386/i386-common.c | 2 +- gcc/config/i386/i386-options.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/common/config/i386/i386-common.c b/gcc/common/config/i386/i386-common.c index af3f387..e156cc3 100644 --- a/gcc/common/config/i386/i386-common.c +++ b/gcc/common/config/i386/i386-common.c @@ -1758,13 +1758,13 @@ const char *const processor_names[] = "skylake-avx512", "cannonlake", "icelake-client", - "rocketlake", "icelake-server", "cascadelake", "tigerlake", "cooperlake", "sapphirerapids", "alderlake", + "rocketlake", "intel", "geode", "k6", diff --git a/gcc/config/i386/i386-options.c b/gcc/config/i386/i386-options.c index cc7b617..64c6ef4 100644 --- a/gcc/config/i386/i386-options.c +++ b/gcc/config/i386/i386-options.c @@ -727,12 +727,12 @@ static const struct processor_costs *processor_cost_table[] = &icelake_cost, &icelake_cost, &icelake_cost, - &icelake_cost, &skylake_cost, &icelake_cost, &skylake_cost, &icelake_cost, &icelake_cost, + &icelake_cost, &intel_cost, &geode_cost, &k6_cost, -- cgit v1.1 From 7d6bb80931b429631f63e0fd27bee95f32eb57a9 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 26 Mar 2021 09:50:03 +0100 Subject: tree-optimization/99776 - relax condition on vector ctor element extract This relaxes the condition for the match.pd pattern doing vector ctor element extracts to not require type identity but only size equality. Since we vectorize pointer data as unsigned integer data such mismatches have to be tolerated to optimize scalar code uses of vector results. 2021-03-26 Richard Biener PR tree-optimization/99776 * match.pd (bit_field_ref (ctor)): Relax element extract type compatibility checks. * gcc.dg/tree-ssa/ssa-fre-91.c: New testcase. --- gcc/match.pd | 18 +++++++++++++----- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c (limited to 'gcc') diff --git a/gcc/match.pd b/gcc/match.pd index 66788ba..bb1d623 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -6168,9 +6168,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (simplify (BIT_FIELD_REF CONSTRUCTOR@0 @1 @2) (if (VECTOR_TYPE_P (TREE_TYPE (@0)) - && (types_match (type, TREE_TYPE (TREE_TYPE (@0))) + && tree_fits_uhwi_p (TYPE_SIZE (type)) + && ((tree_to_uhwi (TYPE_SIZE (type)) + == tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (@0))))) || (VECTOR_TYPE_P (type) - && types_match (TREE_TYPE (type), TREE_TYPE (TREE_TYPE (@0)))))) + && (tree_to_uhwi (TYPE_SIZE (TREE_TYPE (type))) + == tree_to_uhwi (TYPE_SIZE (TREE_TYPE (TREE_TYPE (@0)))))))) (with { tree ctor = (TREE_CODE (@0) == SSA_NAME @@ -6226,10 +6229,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) if (!CONSTANT_CLASS_P (e)) constant_p = false; } - res = (constant_p ? build_vector_from_ctor (type, vals) - : build_constructor (type, vals)); + tree evtype = (types_match (TREE_TYPE (type), + TREE_TYPE (TREE_TYPE (ctor))) + ? type + : build_vector_type (TREE_TYPE (TREE_TYPE (ctor)), + count)); + res = (constant_p ? build_vector_from_ctor (evtype, vals) + : build_constructor (evtype, vals)); } - { res; }))))) + (view_convert { res; })))))) /* The bitfield references a single constructor element. */ (if (k.is_constant (&const_k) && idx + n <= (idx / const_k + 1) * const_k) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c new file mode 100644 index 0000000..4999a3b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-91.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-fre4" } */ + +extern void foo(void); + +static int a[2], b, *c[2]; + +int main() { + for (b = 0; b < 2; b++) + c[b] = &a[1]; + if (!c[0]) + foo(); + return 0; +} + +/* Even when vectorizing we should eliminate the call to foo. */ +/* { dg-final { scan-tree-dump-not "foo" "fre4" } } */ -- cgit v1.1 From 71c8aaf29bb122ebe5e67c84903fd23ff05f04ec Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Apr 2021 10:17:45 +0200 Subject: i386: Improve [QH]Imode rotates with masked shift count [PR99405] The following testcase shows that while we nicely optimize away the useless and? of shift count before rotation for [SD]Imode rotates, we don't do that for [QH]Imode. The following patch optimizes that by using the right iterator on those 4 patterns. 2021-04-27 Jakub Jelinek PR target/99405 * config/i386/i386.md (*3_mask, *3_mask_1): For any_rotate define_insn_split and following splitters, use SWI iterator instead of SWI48. * gcc.target/i386/pr99405.c: New test. --- gcc/config/i386/i386.md | 38 ++++++++++++++++----------------- gcc/testsuite/gcc.target/i386/pr99405.c | 23 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 19 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr99405.c (limited to 'gcc') diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 27f100c..eff189f 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -11933,9 +11933,9 @@ ;; Avoid useless masking of count operand. (define_insn_and_split "*3_mask" - [(set (match_operand:SWI48 0 "nonimmediate_operand") - (any_rotate:SWI48 - (match_operand:SWI48 1 "nonimmediate_operand") + [(set (match_operand:SWI 0 "nonimmediate_operand") + (any_rotate:SWI + (match_operand:SWI 1 "nonimmediate_operand") (subreg:QI (and:SI (match_operand:SI 2 "register_operand" "c") @@ -11949,15 +11949,15 @@ "&& 1" [(parallel [(set (match_dup 0) - (any_rotate:SWI48 (match_dup 1) - (match_dup 2))) + (any_rotate:SWI (match_dup 1) + (match_dup 2))) (clobber (reg:CC FLAGS_REG))])] "operands[2] = gen_lowpart (QImode, operands[2]);") (define_split - [(set (match_operand:SWI48 0 "register_operand") - (any_rotate:SWI48 - (match_operand:SWI48 1 "const_int_operand") + [(set (match_operand:SWI 0 "register_operand") + (any_rotate:SWI + (match_operand:SWI 1 "const_int_operand") (subreg:QI (and:SI (match_operand:SI 2 "register_operand") @@ -11966,14 +11966,14 @@ == GET_MODE_BITSIZE (mode) - 1" [(set (match_dup 4) (match_dup 1)) (set (match_dup 0) - (any_rotate:SWI48 (match_dup 4) - (subreg:QI (match_dup 2) 0)))] + (any_rotate:SWI (match_dup 4) + (subreg:QI (match_dup 2) 0)))] "operands[4] = gen_reg_rtx (mode);") (define_insn_and_split "*3_mask_1" - [(set (match_operand:SWI48 0 "nonimmediate_operand") - (any_rotate:SWI48 - (match_operand:SWI48 1 "nonimmediate_operand") + [(set (match_operand:SWI 0 "nonimmediate_operand") + (any_rotate:SWI + (match_operand:SWI 1 "nonimmediate_operand") (and:QI (match_operand:QI 2 "register_operand" "c") (match_operand:QI 3 "const_int_operand")))) @@ -11986,14 +11986,14 @@ "&& 1" [(parallel [(set (match_dup 0) - (any_rotate:SWI48 (match_dup 1) - (match_dup 2))) + (any_rotate:SWI (match_dup 1) + (match_dup 2))) (clobber (reg:CC FLAGS_REG))])]) (define_split - [(set (match_operand:SWI48 0 "register_operand") - (any_rotate:SWI48 - (match_operand:SWI48 1 "const_int_operand") + [(set (match_operand:SWI 0 "register_operand") + (any_rotate:SWI + (match_operand:SWI 1 "const_int_operand") (and:QI (match_operand:QI 2 "register_operand") (match_operand:QI 3 "const_int_operand"))))] @@ -12001,7 +12001,7 @@ == GET_MODE_BITSIZE (mode) - 1" [(set (match_dup 4) (match_dup 1)) (set (match_dup 0) - (any_rotate:SWI48 (match_dup 4) (match_dup 2)))] + (any_rotate:SWI (match_dup 4) (match_dup 2)))] "operands[4] = gen_reg_rtx (mode);") ;; Implement rotation using two double-precision diff --git a/gcc/testsuite/gcc.target/i386/pr99405.c b/gcc/testsuite/gcc.target/i386/pr99405.c new file mode 100644 index 0000000..f3f49e3 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr99405.c @@ -0,0 +1,23 @@ +/* PR target/99405 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mtune=generic -fomit-frame-pointer" } */ +/* { dg-final { scan-assembler-not "\tand\[bl]\t\\\$" } } */ + +unsigned char f1 (unsigned char x, unsigned y) { return (x << (y & 7)) | (x >> (-y & 7)); } +unsigned short f2 (unsigned short x, unsigned y) { return (x << (y & 15)) | (x >> (-y & 15)); } +unsigned int f3 (unsigned int x, unsigned y) { return (x << (y & 31)) | (x >> (-y & 31)); } +unsigned char f4 (unsigned char x, unsigned y) { return (x >> (y & 7)) | (x << (-y & 7)); } +unsigned short f5 (unsigned short x, unsigned y) { return (x >> (y & 15)) | (x << (-y & 15)); } +unsigned int f6 (unsigned int x, unsigned y) { return (x >> (y & 31)) | (x << (-y & 31)); } +unsigned char f7 (unsigned char x, unsigned char y) { unsigned char v = y & 7; unsigned char w = -y & 7; return (x << v) | (x >> w); } +unsigned short f8 (unsigned short x, unsigned char y) { unsigned char v = y & 15; unsigned char w = -y & 15; return (x << v) | (x >> w); } +unsigned int f9 (unsigned int x, unsigned char y) { unsigned char v = y & 31; unsigned char w = -y & 31; return (x << v) | (x >> w); } +unsigned char f10 (unsigned char x, unsigned char y) { unsigned char v = y & 7; unsigned char w = -y & 7; return (x >> v) | (x << w); } +unsigned short f11 (unsigned short x, unsigned char y) { unsigned char v = y & 15; unsigned char w = -y & 15; return (x >> v) | (x << w); } +unsigned int f12 (unsigned int x, unsigned char y) { unsigned char v = y & 31; unsigned char w = -y & 31; return (x >> v) | (x << w); } +#ifdef __x86_64__ +unsigned long long f13 (unsigned long long x, unsigned y) { return (x << (y & 63)) | (x >> (-y & 63)); } +unsigned long long f14 (unsigned long long x, unsigned y) { return (x >> (y & 63)) | (x << (-y & 63)); } +unsigned long long f15 (unsigned long long x, unsigned char y) { unsigned char v = y & 63; unsigned char w = -y & 63; return (x << v) | (x >> w); } +unsigned long long f16 (unsigned long long x, unsigned char y) { unsigned char v = y & 63; unsigned char w = -y & 63; return (x >> v) | (x << w); } +#endif -- cgit v1.1 From acfe5290406cc70485df8899d14982278a9371f8 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 27 Apr 2021 09:41:38 +0200 Subject: tree-optimization/100278 - handle mismatched code in TBAA adjust of PRE PRE has code to adjust TBAA behavior for refs that expects the base operation code to match. The testcase shows a case where we have a VAR_DECL vs. a MEM_REF so add code to give up in such cases. 2021-04-27 Richard Biener PR tree-optimization/100278 * tree-ssa-pre.c (compute_avail): Give up when we cannot adjust TBAA beacuse of mismatching bases. * gcc.dg/tree-ssa/pr100278.c: New testcase. --- gcc/testsuite/gcc.dg/tree-ssa/pr100278.c | 17 +++++++++++++++++ gcc/tree-ssa-pre.c | 10 ++++++++++ 2 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr100278.c (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr100278.c b/gcc/testsuite/gcc.dg/tree-ssa/pr100278.c new file mode 100644 index 0000000..8d70228 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr100278.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void a() +{ +#if defined __s390__ + register int b asm("r5"); +#elif defined __x86_64__ + register int b asm("eax"); +#else + volatile int b; +#endif + if (b) + b = 1; + for (; b;) + ; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 2803b58..2d22535 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -4151,6 +4151,16 @@ compute_avail (void) if (ref->set == set || alias_set_subset_of (set, ref->set)) ; + else if (ref1->opcode != ref2->opcode + || (ref1->opcode != MEM_REF + && ref1->opcode != TARGET_MEM_REF)) + { + /* With mismatching base opcodes or bases + other than MEM_REF or TARGET_MEM_REF we + can't do any easy TBAA adjustment. */ + operands.release (); + continue; + } else if (alias_set_subset_of (ref->set, set)) { ref->set = set; -- cgit v1.1 From 3bc0d418a5d214a8ba57857656ca5c618df1a4bb Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 27 Apr 2021 10:45:32 +0200 Subject: testsuite/100272 - fix some malformed dg directives The bug points out several malformed dg directives, the following fixes the obvious ones where the testcases keep working after the change. 2021-04-27 Richard Biener PR testsuite/100272 * g++.dg/diagnostic/ptrtomem1.C: Fix dg directives. * g++.dg/ipa/pr45572-2.C: Likewise. * g++.dg/template/spec26.C: Likewise. * gcc.dg/pr20126.c: Likewise. * gcc.dg/tree-ssa/pr20739.c: Likewise. --- gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C | 2 +- gcc/testsuite/g++.dg/ipa/pr45572-2.C | 2 +- gcc/testsuite/g++.dg/template/spec26.C | 2 +- gcc/testsuite/gcc.dg/pr20126.c | 4 ++-- gcc/testsuite/gcc.dg/tree-ssa/pr20739.c | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C b/gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C index bb1327f..9f9b77a 100644 --- a/gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C +++ b/gcc/testsuite/g++.dg/diagnostic/ptrtomem1.C @@ -19,7 +19,7 @@ void f2(T) { } template -requires (sizeof(T)==1) // dg-message {\[with T = int \(X::\*\)\[5\]\]} } +requires (sizeof(T)==1) // { dg-message {\[with T = int \(X::\*\)\[5\]\]} } void f3(T) { } diff --git a/gcc/testsuite/g++.dg/ipa/pr45572-2.C b/gcc/testsuite/g++.dg/ipa/pr45572-2.C index 8b583d9..9bf49ac 100644 --- a/gcc/testsuite/g++.dg/ipa/pr45572-2.C +++ b/gcc/testsuite/g++.dg/ipa/pr45572-2.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-finline-small-functions -findirect-inlining -finline-function+ +// { dg-options "-finline-small-functions -findirect-inlining -finline-functions -O" } typedef struct {} __mpf_struct; typedef __mpf_struct mpf_t[1]; diff --git a/gcc/testsuite/g++.dg/template/spec26.C b/gcc/testsuite/g++.dg/template/spec26.C index 3d18707..fad8e3e 100644 --- a/gcc/testsuite/g++.dg/template/spec26.C +++ b/gcc/testsuite/g++.dg/template/spec26.C @@ -1,4 +1,4 @@ -// dg-do run +// { dg-do run } // Copyright (C) 2005 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 16 Sep 2005 diff --git a/gcc/testsuite/gcc.dg/pr20126.c b/gcc/testsuite/gcc.dg/pr20126.c index 257832a..a421ce1 100644 --- a/gcc/testsuite/gcc.dg/pr20126.c +++ b/gcc/testsuite/gcc.dg/pr20126.c @@ -1,5 +1,5 @@ -/* dg-do run */ -/* dg-options "-O2" */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ /* PR target/20126 was not really target-specific, but rather a loop's failure to take into account the possibility that a DEST_ADDR giv diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr20739.c b/gcc/testsuite/gcc.dg/tree-ssa/pr20739.c index c1e7b58..d7fff14 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr20739.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr20739.c @@ -1,7 +1,7 @@ /* PR middle-end/20739 */ -/* dg-do compile */ -/* dg-options "-O" */ +/* { dg-do compile } */ +/* { dg-options "-O" } */ /* We used to fail to compile this because gimplification dropped the conversion that added the const qualifier to the sub-expression -- cgit v1.1 From dfdc02bf29670c1c7f5f2820b6db11c66c258716 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 27 Apr 2021 11:02:03 +0200 Subject: testsuite/100272 - undo PRE disabling for gcc.dg/tree-ssa/predcom-1.c This re-enables PRE and fixes the malformed dg directive pointed out in the PR. It all works as desired and I forgot why I disabled this in the past. 2021-04-27 Richard Biener PR testsuite/100272 * gcc.dg/tree-ssa/predcom-1.c: Re-enable PRE and fix malformed dg directive. --- gcc/testsuite/gcc.dg/tree-ssa/predcom-1.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/tree-ssa/predcom-1.c b/gcc/testsuite/gcc.dg/tree-ssa/predcom-1.c index 4bc2ea5..f68be2b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/predcom-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/predcom-1.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-do run } */ -/* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details -fno-tree-pre" } */ +/* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details" } */ void abort (void); @@ -45,6 +45,5 @@ int main(void) /* Verify that both loops were transformed and unrolled. */ /* { dg-final { scan-tree-dump-times "Unrolling 2 times." 2 "pcom"} } */ -/* Also check that we undid the transformation previously made by PRE. - ??? PRE now does the predictive commoning in count_averages. */ -/* dg-final { scan-tree-dump-times "looparound ref" 1 "pcom" } */ +/* Also check that we undid the transformation previously made by PRE. */ +/* { dg-final { scan-tree-dump-times "looparound ref" 1 "pcom" } } */ -- cgit v1.1 From d1d01a66012a93cc8cb7dafbe1b5ec453ec96b59 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 13 Apr 2021 10:12:03 +0200 Subject: tree-optimization/100051 - disambiguate access size vs decl This adds disambiguation of the access size vs. the decl size in the pointer based vs. decl based disambiguator. We have a TBAA based check like this already but that's fend off when seeing alias-sets of zero or when -fno-strict-aliasing is in effect. Also the perceived dynamic type could be smaller than the actual access. 2021-04-13 Richard Biener PR tree-optimization/100051 * tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Add disambiguator based on access size vs. decl size. * gcc.dg/tree-ssa/ssa-fre-92.c: New testcase. --- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c | 21 +++++++++++++++++++++ gcc/tree-ssa-alias.c | 11 +++++++++++ 2 files changed, 32 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c new file mode 100644 index 0000000..c67fcea --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-92.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-fre1" } */ + +extern void foo(void); +int a, c, *f, **d = &f; +char b; +int main() +{ + if (a) { + b = 0; + int *g = &c; + *g = 0; + f = *d; + *d = f; + if ((2 ^ b) == 0) + foo(); + } + return 0; +} + +/* { dg-final { scan-tree-dump-not "foo" "fre1" } } */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index ebb3f49..6c7d2f1b 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -2034,6 +2034,17 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1, if (TREE_CODE (base1) != TARGET_MEM_REF && !ranges_maybe_overlap_p (offset1 + moff, -1, offset2, max_size2)) return false; + + /* If the pointer based access is bigger than the variable they cannot + alias. This is similar to the check below where we use TBAA to + increase the size of the pointer based access based on the dynamic + type of a containing object we can infer from it. */ + poly_int64 dsize2; + if (known_size_p (size1) + && poly_int_tree_p (DECL_SIZE (base2), &dsize2) + && known_lt (dsize2, size1)) + return false; + /* They also cannot alias if the pointer may not point to the decl. */ if (!ptr_deref_may_alias_decl_p (ptr1, base2)) return false; -- cgit v1.1 From 48d88cde0307aaba46f538359123c38f70052bd2 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 27 Apr 2021 12:18:02 +0100 Subject: aarch64: Add +nosve to two tests Adding +nosve is more robust than checking for command-line arguments, since SVE can be enabled by default or indirectly via other options. gcc/testsuite/ * gcc.target/aarch64/simd/ssra.c: Use +nosve * gcc.target/aarch64/simd/usra.c: Likewise. --- gcc/testsuite/gcc.target/aarch64/simd/ssra.c | 3 ++- gcc/testsuite/gcc.target/aarch64/simd/usra.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/gcc.target/aarch64/simd/ssra.c b/gcc/testsuite/gcc.target/aarch64/simd/ssra.c index e9c2e04..bd6b6bf 100644 --- a/gcc/testsuite/gcc.target/aarch64/simd/ssra.c +++ b/gcc/testsuite/gcc.target/aarch64/simd/ssra.c @@ -1,6 +1,7 @@ /* { dg-do compile { target aarch64*-*-* } } */ /* { dg-options "-O3" } */ -/* { dg-skip-if "" { *-*-* } {"*sve*"} {""} } */ + +#pragma GCC target "+nosve" #include diff --git a/gcc/testsuite/gcc.target/aarch64/simd/usra.c b/gcc/testsuite/gcc.target/aarch64/simd/usra.c index 4e7446d..10712b2 100644 --- a/gcc/testsuite/gcc.target/aarch64/simd/usra.c +++ b/gcc/testsuite/gcc.target/aarch64/simd/usra.c @@ -1,6 +1,7 @@ /* { dg-do compile { target aarch64*-*-* } } */ /* { dg-options "-O3" } */ -/* { dg-skip-if "" { *-*-* } {"*sve*"} {""} } */ + +#pragma GCC target "+nosve" #include -- cgit v1.1 From 4cea5b8cb715e40e10174e6de405f26202fa3d6a Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 27 Apr 2021 12:18:03 +0100 Subject: aarch64: Handle SVE attributes in comp_type_attributes [PR100270] Even though "SVE type" and "SVE sizeless type" are marked as affecting type identity, the middle end doesn't truly believe it unless we also handle them in comp_type_attributes. gcc/ PR target/100270 * config/aarch64/aarch64.c (aarch64_comp_type_attributes): Handle SVE attributes. gcc/testsuite/ PR target/100270 * gcc.target/aarch64/sve/acle/general-c/pr100270_1.c: New test. * gcc.target/aarch64/sve/acle/general-c/sizeless-2.c: Change expected error message when subtracting pointers to different vector types. Expect warnings when mixing them elsewhere. * gcc.target/aarch64/sve/acle/general/attributes_7.c: Remove XFAILs. Tweak error messages for some cases. --- gcc/config/aarch64/aarch64.c | 4 + .../aarch64/sve/acle/general-c/pr100270_1.c | 103 +++++++++++++++++++++ .../aarch64/sve/acle/general-c/sizeless-2.c | 36 +++---- .../aarch64/sve/acle/general/attributes_7.c | 72 +++++++------- 4 files changed, 166 insertions(+), 49 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/pr100270_1.c (limited to 'gcc') diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 12625a4..dbaf6fb 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -25173,6 +25173,10 @@ aarch64_comp_type_attributes (const_tree type1, const_tree type2) return 0; if (!check_attr ("Advanced SIMD type")) return 0; + if (!check_attr ("SVE type")) + return 0; + if (!check_attr ("SVE sizeless type")) + return 0; return 1; } diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/pr100270_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/pr100270_1.c new file mode 100644 index 0000000..05232d7 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/pr100270_1.c @@ -0,0 +1,103 @@ +/* { dg-options "-msve-vector-bits=256" } */ + +#include + +typedef svint32_t vls_svint32_t __attribute__((arm_sve_vector_bits(256))); +typedef svuint32_t vls_svuint32_t __attribute__((arm_sve_vector_bits(256))); + +typedef int32_t gnu_svint32_t __attribute__((vector_size(32))); +typedef uint32_t gnu_svuint32_t __attribute__((vector_size(32))); + +#define X_gnu_svint32_t 1 +#define X_gnu_svuint32_t 2 +#define X_vls_svint32_t 3 +#define X_vls_svuint32_t 4 + +#define CHECK(T) T: X_##T + +#define CHECK_TYPE(EXPR, TYPE) \ + do { \ + int x[_Generic (EXPR, \ + CHECK (gnu_svint32_t), \ + CHECK (gnu_svuint32_t), \ + CHECK (vls_svint32_t), \ + CHECK (vls_svuint32_t), \ + default : 0) == X_##TYPE ? 1 : -1]; \ + } while (0) + +void +f (gnu_svint32_t sg, gnu_svuint32_t ug, vls_svint32_t sn, vls_svuint32_t un, int c) +{ + CHECK_TYPE (sg, gnu_svint32_t); + CHECK_TYPE (ug, gnu_svuint32_t); + CHECK_TYPE (sn, vls_svint32_t); + CHECK_TYPE (un, vls_svuint32_t); + + CHECK_TYPE (sg + 1, gnu_svint32_t); + CHECK_TYPE (ug + 1, gnu_svuint32_t); + CHECK_TYPE (sn + 1, vls_svint32_t); + CHECK_TYPE (un + 1, vls_svuint32_t); + + CHECK_TYPE (1 + sg, gnu_svint32_t); + CHECK_TYPE (1 + ug, gnu_svuint32_t); + CHECK_TYPE (1 + sn, vls_svint32_t); + CHECK_TYPE (1 + un, vls_svuint32_t); + + CHECK_TYPE (sg + sg, gnu_svint32_t); + CHECK_TYPE (ug + ug, gnu_svuint32_t); + CHECK_TYPE (sn + sn, vls_svint32_t); + CHECK_TYPE (un + un, vls_svuint32_t); + + /* Traditional behavior for mixed signs is to pick the signedness of the + first operand. We don't have any Arm-specific reason for preferring that + behavior. */ + CHECK_TYPE (sg + ug, gnu_svint32_t); + CHECK_TYPE (ug + sg, gnu_svuint32_t); + CHECK_TYPE (sn + un, vls_svint32_t); + CHECK_TYPE (un + sn, vls_svuint32_t); + + CHECK_TYPE (c ? sg + sg : sg, gnu_svint32_t); + CHECK_TYPE (c ? ug + ug : ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn + sn : sn, vls_svint32_t); + CHECK_TYPE (c ? un + un : un, vls_svuint32_t); + + CHECK_TYPE (c ? sg + 1 : sg, gnu_svint32_t); + CHECK_TYPE (c ? ug + 1 : ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn + 1 : sn, vls_svint32_t); + CHECK_TYPE (c ? un + 1 : un, vls_svuint32_t); + + CHECK_TYPE (c ? 1 + sg : sg, gnu_svint32_t); + CHECK_TYPE (c ? 1 + ug : ug, gnu_svuint32_t); + CHECK_TYPE (c ? 1 + sn : sn, vls_svint32_t); + CHECK_TYPE (c ? 1 + un : un, vls_svuint32_t); + + CHECK_TYPE (c ? sg : sg + sg, gnu_svint32_t); + CHECK_TYPE (c ? ug : ug + ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn : sn + sn, vls_svint32_t); + CHECK_TYPE (c ? un : un + un, vls_svuint32_t); + + CHECK_TYPE (c ? sg : sg + 1, gnu_svint32_t); + CHECK_TYPE (c ? ug : ug + 1, gnu_svuint32_t); + CHECK_TYPE (c ? sn : sn + 1, vls_svint32_t); + CHECK_TYPE (c ? un : un + 1, vls_svuint32_t); + + CHECK_TYPE (c ? sg : 1 + sg, gnu_svint32_t); + CHECK_TYPE (c ? ug : 1 + ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn : 1 + sn, vls_svint32_t); + CHECK_TYPE (c ? un : 1 + un, vls_svuint32_t); + + CHECK_TYPE (c ? sg + sg : sg + sg, gnu_svint32_t); + CHECK_TYPE (c ? ug + ug : ug + ug, gnu_svuint32_t); + CHECK_TYPE (c ? sn + sn : sn + sn, vls_svint32_t); + CHECK_TYPE (c ? un + un : un + un, vls_svuint32_t); + + CHECK_TYPE (c ? sg + sg : sg + 1, gnu_svint32_t); + CHECK_TYPE (c ? ug + ug : ug + 1, gnu_svuint32_t); + CHECK_TYPE (c ? sn + sn : sn + 1, vls_svint32_t); + CHECK_TYPE (c ? un + un : un + 1, vls_svuint32_t); + + CHECK_TYPE (c ? 1 + sg : sg + sg, gnu_svint32_t); + CHECK_TYPE (c ? 1 + ug : ug + ug, gnu_svuint32_t); + CHECK_TYPE (c ? 1 + sn : sn + sn, vls_svint32_t); + CHECK_TYPE (c ? 1 + un : un + un, vls_svuint32_t); +} diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-2.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-2.c index 3af36de..c575492 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-2.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/sizeless-2.c @@ -106,8 +106,8 @@ statements (int n) /* Pointer assignment. */ - gnu_sc_ptr = sve_sc_ptr; - sve_sc_ptr = gnu_sc_ptr; + gnu_sc_ptr = sve_sc_ptr; /* { dg-warning {incompatible pointer type} } */ + sve_sc_ptr = gnu_sc_ptr; /* { dg-warning {incompatible pointer type} } */ /* Pointer arithmetic. */ @@ -120,8 +120,8 @@ statements (int n) sve_sc_ptr -= 0; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ sve_sc_ptr -= 1; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ sve_sc_ptr - sve_sc_ptr; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ - gnu_sc_ptr - sve_sc_ptr; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ - sve_sc_ptr - gnu_sc_ptr; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ + gnu_sc_ptr - sve_sc_ptr; /* { dg-error {invalid operands to binary -} } */ + sve_sc_ptr - gnu_sc_ptr; /* { dg-error {invalid operands to binary -} } */ sve_sc1 = sve_sc_ptr[0]; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ sve_sc1 = sve_sc_ptr[1]; /* { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } */ @@ -133,18 +133,18 @@ statements (int n) sve_sc_ptr <= &sve_sc1; sve_sc_ptr > &sve_sc1; sve_sc_ptr >= &sve_sc1; - gnu_sc_ptr == sve_sc_ptr; - gnu_sc_ptr != sve_sc_ptr; - gnu_sc_ptr < sve_sc_ptr; - gnu_sc_ptr <= sve_sc_ptr; - gnu_sc_ptr > sve_sc_ptr; - gnu_sc_ptr >= sve_sc_ptr; - sve_sc_ptr == gnu_sc_ptr; - sve_sc_ptr != gnu_sc_ptr; - sve_sc_ptr < gnu_sc_ptr; - sve_sc_ptr <= gnu_sc_ptr; - sve_sc_ptr > gnu_sc_ptr; - sve_sc_ptr >= gnu_sc_ptr; + gnu_sc_ptr == sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr != sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr < sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr <= sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr > sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + gnu_sc_ptr >= sve_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr == gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr != gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr < gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr <= gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr > gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ + sve_sc_ptr >= gnu_sc_ptr; /* { dg-warning {comparison of distinct pointer types} } */ /* Conditional expressions. */ @@ -154,8 +154,8 @@ statements (int n) 0 ? 0 : sve_sc1; /* { dg-error {type mismatch in conditional expression} } */ 0 ?: sve_sc1; /* { dg-error {type mismatch in conditional expression} } */ 0 ? sve_sc_ptr : sve_sc_ptr; - 0 ? sve_sc_ptr : gnu_sc_ptr; - 0 ? gnu_sc_ptr : sve_sc_ptr; + 0 ? sve_sc_ptr : gnu_sc_ptr; /* { dg-warning {pointer type mismatch} } */ + 0 ? gnu_sc_ptr : sve_sc_ptr; /* { dg-warning {pointer type mismatch} } */ /* Generic associations. */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c index e2e7470..621666c 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/attributes_7.c @@ -85,19 +85,19 @@ f (int c) (void) (c ? fs8 : ss8); // { dg-error {type mismatch|different types} } (void) (c ? fs8 : fs8); - (void) (c ? fs8 : gs8); // { dg-error {type mismatch|different types} "" { xfail c++ } } + (void) (c ? fs8 : gs8); // { dg-error {type mismatch|different types} } (void) (c ? gs8 : ss8); // { dg-error {type mismatch|different types} } - (void) (c ? gs8 : fs8); // { dg-error {type mismatch|different types} "" { xfail c++ } } + (void) (c ? gs8 : fs8); // { dg-error {type mismatch|different types} } (void) (c ? gs8 : gs8); sb = fb; fb = sb; (void) (c ? sb : sb); - (void) (c ? sb : fb); // { dg-error {type mismatch|different types} "" { xfail *-*-* } } + (void) (c ? sb : fb); // { dg-error {type mismatch|different types} "" { xfail c } } - (void) (c ? fb : sb); // { dg-error {type mismatch|different types} "" { xfail *-*-* } } + (void) (c ? fb : sb); // { dg-error {type mismatch|different types} "" { xfail c } } (void) (c ? fb : fb); } @@ -123,24 +123,22 @@ g (int c) void *select __attribute__((unused)); diff = ss8 - ss8; // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} } - diff = ss8 - fs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" { xfail c } } - // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} "bogus" { target c } .-1 } - diff = ss8 - gs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" { xfail c } } - // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} "bogus" { target c } .-1 } + diff = ss8 - fs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } + diff = ss8 - gs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } - diff = fs8 - ss8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" { xfail c } } - // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} "bogus" { target c } .-1 } + diff = fs8 - ss8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } diff = fs8 - fs8; - diff = fs8 - gs8; + diff = fs8 - gs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } - diff = gs8 - ss8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" { xfail c } } - // { dg-error {arithmetic on pointer to SVE type 'svint8_t'} "bogus" { target c } .-1 } - diff = gs8 - fs8; + diff = gs8 - ss8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } + diff = gs8 - fs8; // { dg-error {invalid operands [^\n]* binary[^\n]*\-} "" } diff = gs8 - gs8; - fs8 = ss8; // { dg-error {invalid conversion} "" { xfail c } } + fs8 = ss8; // { dg-error {invalid conversion} "" { target c++ } } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = fs8; - fs8 = gs8; + fs8 = gs8; // { dg-error {invalid conversion} "" { target c++ } } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = su8; // { dg-error {cannot convert} "c++" { target c++ } } // { dg-warning {incompatible pointer type} "c" { target c } .-1 } @@ -150,36 +148,48 @@ g (int c) // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = ss16; // { dg-error {cannot convert} "c++" { target c++ } } - // { dg-warning {incompatible pointer type} "c" { target c } .-1 } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = fs16; // { dg-error {cannot convert} "c++" { target c++ } } - // { dg-warning {incompatible pointer type} "c" { target c } .-1 } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } fs8 = gs16; // { dg-error {cannot convert} "c++" { target c++ } } - // { dg-warning {incompatible pointer type} "c" { target c } .-1 } + // { dg-warning {incompatible pointer type} "c" { target c } .-1 } select = c ? ss8 : ss8; - select = c ? ss8 : fs8; // { dg-error {distinct pointer types} "" { xfail c } } - select = c ? ss8 : gs8; // { dg-error {distinct pointer types} "" { xfail c } } + select = c ? ss8 : fs8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } + select = c ? ss8 : gs8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } - select = c ? fs8 : ss8; // { dg-error {distinct pointer types} "" { xfail c } } + select = c ? fs8 : ss8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } select = c ? fs8 : fs8; - select = c ? fs8 : gs8; // { dg-error {distinct pointer types} "" { xfail *-*-* } } + select = c ? fs8 : gs8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } - select = c ? gs8 : ss8; // { dg-error {distinct pointer types} "" { xfail c } } - select = c ? gs8 : fs8; // { dg-error {distinct pointer types} "" { xfail *-*-* } } + select = c ? gs8 : ss8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } + select = c ? gs8 : fs8; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c } .-1 } select = c ? gs8 : gs8; diff = sb - sb; // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} } - diff = sb - fb; // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} } + diff = sb - fb; // { dg-error {invalid operands} "" { target c++ } } + // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} "c" { target c } .-1 } - diff = fb - sb; // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} } + diff = fb - sb; // { dg-error {invalid operands} "" { target c++ } } + // { dg-error {arithmetic on pointer to SVE type 'svbool_t'} "c" { target c } .-1 } diff = fb - fb; - sb = fb; - fb = sb; + sb = fb; // { dg-error {invalid conversion} "" { target c++ } } + // { dg-warning {incompatible pointer type} "c" { target c xfail c } .-1 } + fb = sb; // { dg-error {invalid conversion} "" { target c++ } } + // { dg-warning {incompatible pointer type} "c" { target c xfail c } .-1 } select = c ? sb : sb; - select = c ? sb : fb; // { dg-error {type mismatch|different types} "" { xfail *-*-* } } + select = c ? sb : fb; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c xfail c } .-1 } - select = c ? fb : sb; // { dg-error {type mismatch|different types} "" { xfail *-*-* } } + select = c ? fb : sb; // { dg-error {distinct pointer types} "" { target c++ } } + // { dg-warning {pointer type mismatch} "c" { target c xfail c } .-1 } select = c ? fb : fb; } -- cgit v1.1 From 01d0bda8bdf3cd804e1e00915d432ad0cdc49399 Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Tue, 27 Apr 2021 12:25:30 +0100 Subject: arm: fix UB when compiling thumb2 with PIC [PR100236] arm_compute_save_core_reg_mask contains UB in that the saved PIC register number is used to create a bit mask. However, for some target options this register is undefined and we end up with a shift of ~0. On native compilations this is benign since the shift will still be large enough to move the bit outside of the range of the mask, but if cross compiling from a system that truncates out-of-range shifts to zero (or worse, raises a trap for such values) we'll get potentially wrong code (or a fault). gcc: PR target/100236 * config/arm/arm.c (THUMB2_WORK_REGS): Check PIC_OFFSET_TABLE_REGNUM is valid before including it in the mask. --- gcc/config/arm/arm.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'gcc') diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 340f7c9..352b2cd 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -1051,9 +1051,13 @@ const char *fp_sysreg_names[NB_FP_SYSREGS] = { #define ARM_LSL_NAME "lsl" #define streq(string1, string2) (strcmp (string1, string2) == 0) -#define THUMB2_WORK_REGS (0xff & ~( (1 << THUMB_HARD_FRAME_POINTER_REGNUM) \ - | (1 << SP_REGNUM) | (1 << PC_REGNUM) \ - | (1 << PIC_OFFSET_TABLE_REGNUM))) +#define THUMB2_WORK_REGS \ + (0xff & ~((1 << THUMB_HARD_FRAME_POINTER_REGNUM) \ + | (1 << SP_REGNUM) \ + | (1 << PC_REGNUM) \ + | (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM \ + ? (1 << PIC_OFFSET_TABLE_REGNUM) \ + : 0))) /* Initialization code. */ -- cgit v1.1 From eea82246290010addf7f6be71a71b51079b3cb5d Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Tue, 27 Apr 2021 13:46:10 +0200 Subject: ipa-sra: Release dead LHS SSA_NAME when removing it (PR 99951) When IPA-SRA removes an SSA_NAME from a LHS of a call statement because it is not necessary, it does not release it. This patch fixes that. gcc/ChangeLog: 2021-04-08 Martin Jambor PR ipa/99951 * ipa-param-manipulation.c (ipa_param_adjustments::modify_call): If removing a call statement LHS SSA name, release it. --- gcc/ipa-param-manipulation.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'gcc') diff --git a/gcc/ipa-param-manipulation.c b/gcc/ipa-param-manipulation.c index 132bb24..1d1e64f 100644 --- a/gcc/ipa-param-manipulation.c +++ b/gcc/ipa-param-manipulation.c @@ -856,6 +856,7 @@ ipa_param_adjustments::modify_call (gcall *stmt, gcall *new_stmt = gimple_build_call_vec (callee_decl, vargs); + tree ssa_to_remove = NULL; if (tree lhs = gimple_call_lhs (stmt)) { if (!m_skip_return) @@ -880,6 +881,7 @@ ipa_param_adjustments::modify_call (gcall *stmt, } update_stmt (using_stmt); } + ssa_to_remove = lhs; } } @@ -898,6 +900,8 @@ ipa_param_adjustments::modify_call (gcall *stmt, fprintf (dump_file, "\n"); } gsi_replace (&gsi, new_stmt, true); + if (ssa_to_remove) + release_ssa_name (ssa_to_remove); if (update_references) do { -- cgit v1.1 From 3dcd1334b4f522352b80814513fdca902fc2a207 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Apr 2021 14:45:45 +0200 Subject: expand: Expand x / y * y as x - x % y if the latter is cheaper [PR96696] The following patch tests both x / y * y and x - x % y expansion for the former GIMPLE code and chooses the cheaper of those sequences. 2021-04-27 Jakub Jelinek PR tree-optimization/96696 * expr.c (expand_expr_divmod): New function. (expand_expr_real_2) : Use it for truncations and divisions. Formatting fixes. : Optimize x / y * y as x - x % y if the latter is cheaper. * gcc.target/i386/pr96696.c: New test. --- gcc/expr.c | 190 ++++++++++++++++++++++---------- gcc/testsuite/gcc.target/i386/pr96696.c | 30 +++++ 2 files changed, 162 insertions(+), 58 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr96696.c (limited to 'gcc') diff --git a/gcc/expr.c b/gcc/expr.c index 5ed716c..5a1fda7 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -8664,6 +8664,56 @@ expand_misaligned_mem_ref (rtx temp, machine_mode mode, int unsignedp, return temp; } +/* Helper function of expand_expr_2, expand a division or modulo. + op0 and op1 should be already expanded treeop0 and treeop1, using + expand_operands. */ + +static rtx +expand_expr_divmod (tree_code code, machine_mode mode, tree treeop0, + tree treeop1, rtx op0, rtx op1, rtx target, int unsignedp) +{ + bool mod_p = (code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR + || code == CEIL_MOD_EXPR || code == ROUND_MOD_EXPR); + if (SCALAR_INT_MODE_P (mode) + && optimize >= 2 + && get_range_pos_neg (treeop0) == 1 + && get_range_pos_neg (treeop1) == 1) + { + /* If both arguments are known to be positive when interpreted + as signed, we can expand it as both signed and unsigned + division or modulo. Choose the cheaper sequence in that case. */ + bool speed_p = optimize_insn_for_speed_p (); + do_pending_stack_adjust (); + start_sequence (); + rtx uns_ret = expand_divmod (mod_p, code, mode, op0, op1, target, 1); + rtx_insn *uns_insns = get_insns (); + end_sequence (); + start_sequence (); + rtx sgn_ret = expand_divmod (mod_p, code, mode, op0, op1, target, 0); + rtx_insn *sgn_insns = get_insns (); + end_sequence (); + unsigned uns_cost = seq_cost (uns_insns, speed_p); + unsigned sgn_cost = seq_cost (sgn_insns, speed_p); + + /* If costs are the same then use as tie breaker the other other + factor. */ + if (uns_cost == sgn_cost) + { + uns_cost = seq_cost (uns_insns, !speed_p); + sgn_cost = seq_cost (sgn_insns, !speed_p); + } + + if (uns_cost < sgn_cost || (uns_cost == sgn_cost && unsignedp)) + { + emit_insn (uns_insns); + return uns_ret; + } + emit_insn (sgn_insns); + return sgn_ret; + } + return expand_divmod (mod_p, code, mode, op0, op1, target, unsignedp); +} + rtx expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode, enum expand_modifier modifier) @@ -9201,14 +9251,78 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode, if (!REG_P (op0)) op0 = copy_to_mode_reg (mode, op0); - return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0, - gen_int_mode (tree_to_shwi (exp1), - TYPE_MODE (TREE_TYPE (exp1))))); + op1 = gen_int_mode (tree_to_shwi (exp1), + TYPE_MODE (TREE_TYPE (exp1))); + return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0, op1)); } if (modifier == EXPAND_STACK_PARM) target = 0; + if (SCALAR_INT_MODE_P (mode) && optimize >= 2) + { + gimple *def_stmt0 = get_def_for_expr (treeop0, TRUNC_DIV_EXPR); + gimple *def_stmt1 = get_def_for_expr (treeop1, TRUNC_DIV_EXPR); + if (def_stmt0 + && !operand_equal_p (treeop1, gimple_assign_rhs2 (def_stmt0), 0)) + def_stmt0 = NULL; + if (def_stmt1 + && !operand_equal_p (treeop0, gimple_assign_rhs2 (def_stmt1), 0)) + def_stmt1 = NULL; + + if (def_stmt0 || def_stmt1) + { + /* X / Y * Y can be expanded as X - X % Y too. + Choose the cheaper sequence of those two. */ + if (def_stmt0) + treeop0 = gimple_assign_rhs1 (def_stmt0); + else + { + treeop1 = treeop0; + treeop0 = gimple_assign_rhs1 (def_stmt1); + } + expand_operands (treeop0, treeop1, subtarget, &op0, &op1, + EXPAND_NORMAL); + bool speed_p = optimize_insn_for_speed_p (); + do_pending_stack_adjust (); + start_sequence (); + rtx divmul_ret + = expand_expr_divmod (TRUNC_DIV_EXPR, mode, treeop0, treeop1, + op0, op1, NULL_RTX, unsignedp); + divmul_ret = expand_mult (mode, divmul_ret, op1, target, + unsignedp); + rtx_insn *divmul_insns = get_insns (); + end_sequence (); + start_sequence (); + rtx modsub_ret + = expand_expr_divmod (TRUNC_MOD_EXPR, mode, treeop0, treeop1, + op0, op1, NULL_RTX, unsignedp); + this_optab = optab_for_tree_code (MINUS_EXPR, type, + optab_default); + modsub_ret = expand_binop (mode, this_optab, op0, modsub_ret, + target, unsignedp, OPTAB_LIB_WIDEN); + rtx_insn *modsub_insns = get_insns (); + end_sequence (); + unsigned divmul_cost = seq_cost (divmul_insns, speed_p); + unsigned modsub_cost = seq_cost (modsub_insns, speed_p); + /* If costs are the same then use as tie breaker the other other + factor. */ + if (divmul_cost == modsub_cost) + { + divmul_cost = seq_cost (divmul_insns, !speed_p); + modsub_cost = seq_cost (modsub_insns, !speed_p); + } + + if (divmul_cost <= modsub_cost) + { + emit_insn (divmul_insns); + return REDUCE_BIT_FIELD (divmul_ret); + } + emit_insn (modsub_insns); + return REDUCE_BIT_FIELD (modsub_ret); + } + } + expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL); return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp)); @@ -9222,61 +9336,21 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode, case CEIL_DIV_EXPR: case ROUND_DIV_EXPR: case EXACT_DIV_EXPR: - { - /* If this is a fixed-point operation, then we cannot use the code - below because "expand_divmod" doesn't support sat/no-sat fixed-point - divisions. */ - if (ALL_FIXED_POINT_MODE_P (mode)) - goto binop; - - if (modifier == EXPAND_STACK_PARM) - target = 0; - /* Possible optimization: compute the dividend with EXPAND_SUM - then if the divisor is constant can optimize the case - where some terms of the dividend have coeffs divisible by it. */ - expand_operands (treeop0, treeop1, - subtarget, &op0, &op1, EXPAND_NORMAL); - bool mod_p = code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR - || code == CEIL_MOD_EXPR || code == ROUND_MOD_EXPR; - if (SCALAR_INT_MODE_P (mode) - && optimize >= 2 - && get_range_pos_neg (treeop0) == 1 - && get_range_pos_neg (treeop1) == 1) - { - /* If both arguments are known to be positive when interpreted - as signed, we can expand it as both signed and unsigned - division or modulo. Choose the cheaper sequence in that case. */ - bool speed_p = optimize_insn_for_speed_p (); - do_pending_stack_adjust (); - start_sequence (); - rtx uns_ret = expand_divmod (mod_p, code, mode, op0, op1, target, 1); - rtx_insn *uns_insns = get_insns (); - end_sequence (); - start_sequence (); - rtx sgn_ret = expand_divmod (mod_p, code, mode, op0, op1, target, 0); - rtx_insn *sgn_insns = get_insns (); - end_sequence (); - unsigned uns_cost = seq_cost (uns_insns, speed_p); - unsigned sgn_cost = seq_cost (sgn_insns, speed_p); - - /* If costs are the same then use as tie breaker the other - other factor. */ - if (uns_cost == sgn_cost) - { - uns_cost = seq_cost (uns_insns, !speed_p); - sgn_cost = seq_cost (sgn_insns, !speed_p); - } - - if (uns_cost < sgn_cost || (uns_cost == sgn_cost && unsignedp)) - { - emit_insn (uns_insns); - return uns_ret; - } - emit_insn (sgn_insns); - return sgn_ret; - } - return expand_divmod (mod_p, code, mode, op0, op1, target, unsignedp); - } + /* If this is a fixed-point operation, then we cannot use the code + below because "expand_divmod" doesn't support sat/no-sat fixed-point + divisions. */ + if (ALL_FIXED_POINT_MODE_P (mode)) + goto binop; + + if (modifier == EXPAND_STACK_PARM) + target = 0; + /* Possible optimization: compute the dividend with EXPAND_SUM + then if the divisor is constant can optimize the case + where some terms of the dividend have coeffs divisible by it. */ + expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL); + return expand_expr_divmod (code, mode, treeop0, treeop1, op0, op1, + target, unsignedp); + case RDIV_EXPR: goto binop; diff --git a/gcc/testsuite/gcc.target/i386/pr96696.c b/gcc/testsuite/gcc.target/i386/pr96696.c new file mode 100644 index 0000000..b874e6d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr96696.c @@ -0,0 +1,30 @@ +/* PR tree-optimization/96696 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -masm=att" } */ +/* { dg-final { scan-assembler-times "\tidivl\t" 2 } } */ +/* { dg-final { scan-assembler-times "\tdivl\t" 2 } } */ +/* { dg-final { scan-assembler-not "\ti?mull\t" } } */ + +int +foo (int x, int y) +{ + return (x / y) * y; +} + +int +bar (int x, int y) +{ + return x - (x % y); +} + +unsigned +baz (unsigned x, unsigned y) +{ + return (x / y) * y; +} + +unsigned +qux (unsigned x, unsigned y) +{ + return x - (x % y); +} -- cgit v1.1 From 75f8900159133ce069ef1d2edf3b67c7bc82e305 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Apr 2021 14:47:54 +0200 Subject: match.pd: Add some __builtin_ctz (x) cmp cst simplifications [PR95527] This patch adds some ctz simplifications (e.g. ctz (x) >= 3 can be done by testing if the low 3 bits are zero, etc.). In addition, I've noticed that in the CLZ case, the #ifdef CLZ_DEFINED_VALUE_AT_ZERO don't really work as intended, they are evaluated during genmatch and the macro is not defined then (but, because of the missing tm.h includes it isn't defined in gimple-match.c or generic-match.c either). And when tm.h is included, defaults.h is included which defines a fallback version of that macro. For GCC 12, I wonder if it wouldn't be better to say in addition to __builtin_c[lt]z* is always UB at zero that it would be undefined for .C[LT]Z ifn too if it has just one operand and use a second operand to be the constant we expect at zero. 2021-04-27 Jakub Jelinek PR tree-optimization/95527 * generic-match-head.c: Include tm.h. * gimple-match-head.c: Include tm.h. * match.pd (CLZ == INTEGER_CST): Don't use #ifdef CLZ_DEFINED_VALUE_AT_ZERO, only test CLZ_DEFINED_VALUE_AT_ZERO if clz == CFN_CLZ. Add missing val declaration. (CTZ cmp CST): New simplifications. * gcc.dg/tree-ssa/pr95527-2.c: New test. --- gcc/generic-match-head.c | 1 + gcc/gimple-match-head.c | 1 + gcc/match.pd | 91 +++++++++++++++++++++++++++---- gcc/testsuite/gcc.dg/tree-ssa/pr95527-2.c | 57 +++++++++++++++++++ 4 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr95527-2.c (limited to 'gcc') diff --git a/gcc/generic-match-head.c b/gcc/generic-match-head.c index a063512..f426208 100644 --- a/gcc/generic-match-head.c +++ b/gcc/generic-match-head.c @@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see #include "gimplify.h" #include "optabs-tree.h" #include "dbgcnt.h" +#include "tm.h" /* Routine to determine if the types T1 and T2 are effectively the same for GENERIC. If T1 or T2 is not a type, the test diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c index 84fbaef..b084a3157 100644 --- a/gcc/gimple-match-head.c +++ b/gcc/gimple-match-head.c @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "optabs-tree.h" #include "tree-eh.h" #include "dbgcnt.h" +#include "tm.h" /* Forward declarations of the private auto-generated matchers. They expect valueized operands in canonical order and do not diff --git a/gcc/match.pd b/gcc/match.pd index bb1d623..19f4a78 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -6341,30 +6341,97 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (op (clz:s@2 @0) INTEGER_CST@1) (if (integer_zerop (@1) && single_use (@2)) /* clz(X) == 0 is (int)X < 0 and clz(X) != 0 is (int)X >= 0. */ - (with { tree stype = signed_type_for (TREE_TYPE (@0)); + (with { tree type0 = TREE_TYPE (@0); + tree stype = signed_type_for (type0); HOST_WIDE_INT val = 0; -#ifdef CLZ_DEFINED_VALUE_AT_ZERO /* Punt on hypothetical weird targets. */ - if (CLZ_DEFINED_VALUE_AT_ZERO (TYPE_MODE (TREE_TYPE (@0)), - val) == 2 + if (clz == CFN_CLZ + && CLZ_DEFINED_VALUE_AT_ZERO (SCALAR_TYPE_MODE (type0), + val) == 2 && val == 0) stype = NULL_TREE; -#endif } (if (stype) (cmp (convert:stype @0) { build_zero_cst (stype); }))) /* clz(X) == (prec-1) is X == 1 and clz(X) != (prec-1) is X != 1. */ (with { bool ok = true; -#ifdef CLZ_DEFINED_VALUE_AT_ZERO + HOST_WIDE_INT val = 0; + tree type0 = TREE_TYPE (@0); /* Punt on hypothetical weird targets. */ - if (CLZ_DEFINED_VALUE_AT_ZERO (TYPE_MODE (TREE_TYPE (@0)), - val) == 2 - && val == TYPE_PRECISION (TREE_TYPE (@0)) - 1) + if (clz == CFN_CLZ + && CLZ_DEFINED_VALUE_AT_ZERO (SCALAR_TYPE_MODE (type0), + val) == 2 + && val == TYPE_PRECISION (type0) - 1) ok = false; -#endif } - (if (ok && wi::to_wide (@1) == (TYPE_PRECISION (TREE_TYPE (@0)) - 1)) - (op @0 { build_one_cst (TREE_TYPE (@0)); }))))))) + (if (ok && wi::to_wide (@1) == (TYPE_PRECISION (type0) - 1)) + (op @0 { build_one_cst (type0); }))))))) + +/* CTZ simplifications. */ +(for ctz (CTZ) + (for op (ge gt le lt) + cmp (eq eq ne ne) + (simplify + /* __builtin_ctz (x) >= C -> (x & ((1 << C) - 1)) == 0. */ + (op (ctz:s @0) INTEGER_CST@1) + (with { bool ok = true; + HOST_WIDE_INT val = 0; + if (!tree_fits_shwi_p (@1)) + ok = false; + else + { + val = tree_to_shwi (@1); + /* Canonicalize to >= or <. */ + if (op == GT_EXPR || op == LE_EXPR) + { + if (val == HOST_WIDE_INT_MAX) + ok = false; + else + val++; + } + } + bool zero_res = false; + HOST_WIDE_INT zero_val = 0; + tree type0 = TREE_TYPE (@0); + int prec = TYPE_PRECISION (type0); + if (ctz == CFN_CTZ + && CTZ_DEFINED_VALUE_AT_ZERO (SCALAR_TYPE_MODE (type0), + zero_val) == 2) + zero_res = true; + } + (if (val <= 0) + (if (ok && (!zero_res || zero_val >= val)) + { constant_boolean_node (cmp == EQ_EXPR ? true : false, type); }) + (if (val >= prec) + (if (ok && (!zero_res || zero_val < val)) + { constant_boolean_node (cmp == EQ_EXPR ? false : true, type); }) + (if (ok && (!zero_res || zero_val < 0 || zero_val >= prec)) + (cmp (bit_and @0 { wide_int_to_tree (type0, + wi::mask (val, false, prec)); }) + { build_zero_cst (type0); }))))))) + (for op (eq ne) + (simplify + /* __builtin_ctz (x) == C -> (x & ((1 << (C + 1)) - 1)) == (1 << C). */ + (op (ctz:s @0) INTEGER_CST@1) + (with { bool zero_res = false; + HOST_WIDE_INT zero_val = 0; + tree type0 = TREE_TYPE (@0); + int prec = TYPE_PRECISION (type0); + if (ctz == CFN_CTZ + && CTZ_DEFINED_VALUE_AT_ZERO (SCALAR_TYPE_MODE (type0), + zero_val) == 2) + zero_res = true; + } + (if (tree_int_cst_sgn (@1) < 0 || wi::to_widest (@1) >= prec) + (if (!zero_res || zero_val != wi::to_widest (@1)) + { constant_boolean_node (op == EQ_EXPR ? false : true, type); }) + (if (!zero_res || zero_val < 0 || zero_val >= prec) + (op (bit_and @0 { wide_int_to_tree (type0, + wi::mask (tree_to_uhwi (@1) + 1, + false, prec)); }) + { wide_int_to_tree (type0, + wi::shifted_mask (tree_to_uhwi (@1), 1, + false, prec)); }))))))) /* POPCOUNT simplifications. */ /* popcount(X) + popcount(Y) is popcount(X|Y) when X&Y must be zero. */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr95527-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr95527-2.c new file mode 100644 index 0000000..b4ae2be --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr95527-2.c @@ -0,0 +1,57 @@ +/* PR tree-optimization/95527 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-original" } */ +/* { dg-final { scan-tree-dump "a & 7\\) == 0" "original" } } */ +/* { dg-final { scan-tree-dump "b & 63\\) != 0" "original" } } */ +/* { dg-final { scan-tree-dump-times "return 0;" 2 "original" } } */ +/* { dg-final { scan-tree-dump-times "return 1;" 2 "original" } } */ +/* { dg-final { scan-tree-dump "g & 15\\) == 8" "original" } } */ +/* { dg-final { scan-tree-dump "h & 255\\) != 128" "original" } } */ + +int +f1 (int a) +{ + return __builtin_ctz (a) >= 3; +} + +int +f2 (int b) +{ + return __builtin_ctz (b) < 6; +} + +int +f3 (int c) +{ + return __builtin_ctz (c) < 0; +} + +int +f4 (int d) +{ + return __builtin_ctz (d) >= 0; +} + +int +f5 (int e) +{ + return __builtin_ctz (e) >= __SIZEOF_INT__ * __CHAR_BIT__; +} + +int +f6 (int f) +{ + return __builtin_ctz (f) < __SIZEOF_INT__ * __CHAR_BIT__; +} + +int +f7 (int g) +{ + return __builtin_ctz (g) == 3; +} + +int +f8 (int h) +{ + return __builtin_ctz (h) != 7; +} -- cgit v1.1 From d8e1f1d24179690fd9c0f63c27b12e030010d9ea Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 7 Apr 2021 12:09:44 +0200 Subject: tree-optimization/99912 - schedule DSE before SRA For the testcase in the PR the main SRA pass is unable to do some important scalarizations because dead stores of addresses make the candiate variables disqualified. The following patch adds another DSE pass before SRA forming a DCE/DSE pair and moves the DSE pass that is currently closely after SRA up to after the next DCE pass, forming another DCE/DSE pair now residing after PRE. 2021-04-07 Richard Biener PR tree-optimization/99912 * passes.def (pass_all_optimizations): Add pass_dse before the first pass_dce, move the first pass_dse before the pass_dce following pass_pre. * gcc.dg/tree-ssa/ldist-33.c: Disable PRE and LIM. * gcc.dg/tree-ssa/pr96789.c: Adjust dump file scanned. * gcc.dg/tree-ssa/ssa-dse-28.c: Likewise. * gcc.dg/tree-ssa/ssa-dse-29.c: Likewise. --- gcc/passes.def | 3 ++- gcc/testsuite/gcc.dg/tree-ssa/ldist-33.c | 5 ++++- gcc/testsuite/gcc.dg/tree-ssa/pr96789.c | 2 +- gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-28.c | 3 ++- gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-29.c | 3 ++- 5 files changed, 11 insertions(+), 5 deletions(-) (limited to 'gcc') diff --git a/gcc/passes.def b/gcc/passes.def index e9ed3c7..61fe9fd 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -210,6 +210,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_merge_phi); NEXT_PASS (pass_thread_jumps); NEXT_PASS (pass_vrp, true /* warn_array_bounds_p */); + NEXT_PASS (pass_dse); NEXT_PASS (pass_dce); NEXT_PASS (pass_stdarg); NEXT_PASS (pass_call_cdce); @@ -236,7 +237,6 @@ along with GCC; see the file COPYING3. If not see /* Identify paths that should never be executed in a conforming program and isolate those paths. */ NEXT_PASS (pass_isolate_erroneous_paths); - NEXT_PASS (pass_dse); NEXT_PASS (pass_reassoc, true /* insert_powi_p */); NEXT_PASS (pass_dce); NEXT_PASS (pass_forwprop); @@ -254,6 +254,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_sancov); NEXT_PASS (pass_asan); NEXT_PASS (pass_tsan); + NEXT_PASS (pass_dse); NEXT_PASS (pass_dce); /* Pass group that runs when 1) enabled, 2) there are loops in the function. Make sure to run pass_fix_loops before diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-33.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-33.c index 9e0cedf..67846a5 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-33.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-33.c @@ -1,5 +1,8 @@ /* { dg-do compile { target size32plus } } */ -/* { dg-options "-O2 -ftree-loop-distribution -ftree-loop-distribute-patterns -fdump-tree-ldist-details" } */ +/* The desire is to show we can generate a memset from the outer loop + store. Both store motion and PRE expose a DSE opportunity for this + zeroing - while desirable this defeats the purpose of this testcase. */ +/* { dg-options "-O2 -fno-tree-loop-im -fno-tree-pre -ftree-loop-distribution -ftree-loop-distribute-patterns -fdump-tree-ldist-details" } */ #define N (1024) double a[N][N], b[N][N], c[N][N]; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr96789.c b/gcc/testsuite/gcc.dg/tree-ssa/pr96789.c index 5704952..4d4d4c8 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr96789.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr96789.c @@ -58,4 +58,4 @@ bar (int16_t res[16], uint8_t *val1, uint8_t *val2) } } -/* { dg-final { scan-tree-dump {Deleted dead store:.*tmp} "dse3" } } */ +/* { dg-final { scan-tree-dump {Deleted dead store:.*tmp} "dse4" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-28.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-28.c index b81cabe..3bf4e76 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-28.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-28.c @@ -17,5 +17,6 @@ int foo (int *p, int b) /* { dg-final { scan-tree-dump-not "Deleted dead store" "dse1"} } */ /* { dg-final { scan-tree-dump-not "Deleted dead store" "dse2"} } */ -/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse4"} } */ +/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse3"} } */ +/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse5"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-29.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-29.c index f4ef89c..4990ae0 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-29.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-29.c @@ -22,5 +22,6 @@ foo(int cond, struct z *s) /* { dg-final { scan-tree-dump-times "Deleted dead store" 3 "dse1"} } */ /* { dg-final { scan-tree-dump-not "Deleted dead store" "dse2"} } */ -/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse4"} } */ +/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse3"} } */ +/* { dg-final { scan-tree-dump-not "Deleted dead store" "dse5"} } */ -- cgit v1.1 From 8d4c374c4419a8751cfae18d6b58169c62dea49f Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 27 Apr 2021 14:27:40 +0200 Subject: tree-optimization/99912 - schedule another TODO_remove_unused_locals This makes sure to remove unused locals and prune CLOBBERs after the first scalar cleanup phase after IPA optimizations. On the testcase in the PR this results in 8000 CLOBBERs removed which in turn unleashes more DSE which otherwise hits its walking limit of 256 too early on this testcase. 2021-04-27 Richard Biener PR tree-optimization/99912 * passes.def: Add comment about new TODO_remove_unused_locals. * tree-stdarg.c (pass_data_stdarg): Run TODO_remove_unused_locals at start. --- gcc/passes.def | 3 +++ gcc/tree-stdarg.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/passes.def b/gcc/passes.def index 61fe9fd..f7c4289 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -212,6 +212,9 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_vrp, true /* warn_array_bounds_p */); NEXT_PASS (pass_dse); NEXT_PASS (pass_dce); + /* pass_stdarg is always run and at this point we execute + TODO_remove_unused_locals to prune CLOBBERs of dead + variables which are otherwise a churn on alias walkings. */ NEXT_PASS (pass_stdarg); NEXT_PASS (pass_call_cdce); NEXT_PASS (pass_cselim); diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c index ef21c12..2f77a61 100644 --- a/gcc/tree-stdarg.c +++ b/gcc/tree-stdarg.c @@ -1114,7 +1114,7 @@ const pass_data pass_data_stdarg = ( PROP_cfg | PROP_ssa ), /* properties_required */ PROP_gimple_lva, /* properties_provided */ 0, /* properties_destroyed */ - 0, /* todo_flags_start */ + TODO_remove_unused_locals, /* todo_flags_start */ 0, /* todo_flags_finish */ }; -- cgit v1.1 From e600df51a15b2ec7a72731921a2464ffe59cf5ab Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Apr 2021 15:26:24 +0200 Subject: cfgcleanup: Fix -fcompare-debug issue in outgoing_edges_match [PR100254] The following testcase fails with -fcompare-debug. The problem is that outgoing_edges_match behaves differently between -g0 and -g, if some load/store with REG_EH_REGION is followed by DEBUG_INSNs, the REG_EH_REGION check is not done, while when there are no DEBUG_INSNs, it is done. We already compute last1 and last2 as BB_END (bb{1,2}) with skipped debug insns and notes, so this patch just uses those. 2021-04-27 Jakub Jelinek PR rtl-optimization/100254 * cfgcleanup.c (outgoing_edges_match): Check REG_EH_REGION on last1 and last2 insns rather than BB_END (bb1) and BB_END (bb2) insns. * g++.dg/opt/pr100254.C: New test. --- gcc/cfgcleanup.c | 4 +- gcc/testsuite/g++.dg/opt/pr100254.C | 101 ++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr100254.C (limited to 'gcc') diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 8650fb7..260a896 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -1885,8 +1885,8 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2) /* Ensure the same EH region. */ { - rtx n1 = find_reg_note (BB_END (bb1), REG_EH_REGION, 0); - rtx n2 = find_reg_note (BB_END (bb2), REG_EH_REGION, 0); + rtx n1 = find_reg_note (last1, REG_EH_REGION, 0); + rtx n2 = find_reg_note (last2, REG_EH_REGION, 0); if (!n1 && n2) return false; diff --git a/gcc/testsuite/g++.dg/opt/pr100254.C b/gcc/testsuite/g++.dg/opt/pr100254.C new file mode 100644 index 0000000..dbdac16 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr100254.C @@ -0,0 +1,101 @@ +// PR rtl-optimization/100254 +// { dg-do compile } +// { dg-options "-O2 -fno-guess-branch-probability -fipa-pta -fnon-call-exceptions -fcompare-debug" } +// { dg-additional-options "-mtune=goldmont" { target i?86-*-* x86_64-*-* } } + +struct _Rb_tree_node_base { + typedef _Rb_tree_node_base *_Base_ptr; + typedef _Rb_tree_node_base *_Const_Base_ptr; + _Base_ptr _M_left; +}; +template struct _Rb_tree_key_compare { + _Key_compare _M_key_compare; +}; +struct _Rb_tree_header { + _Rb_tree_node_base _M_header; +}; +struct _Rb_tree_iterator { + _Rb_tree_iterator(_Rb_tree_node_base::_Base_ptr); + friend bool operator==(_Rb_tree_iterator, _Rb_tree_iterator); +}; +template struct _Rb_tree_const_iterator { + typedef _Rb_tree_const_iterator _Self; + _Rb_tree_const_iterator(_Rb_tree_node_base::_Const_Base_ptr) {} + _Tp operator*(); + template + friend bool operator!=(_Rb_tree_const_iterator<_Up>, _Rb_tree_const_iterator<_Up>); +}; +template struct _Rb_tree { + template + struct _Rb_tree_impl : _Rb_tree_key_compare<_Key_compare>, _Rb_tree_header {}; + _Rb_tree_impl<_Compare> _M_impl; + _Key _S_key(); + typedef _Rb_tree_const_iterator<_Val> const_iterator; + const_iterator begin() { return _M_impl._M_header._M_left; } + _Rb_tree_iterator find(const _Key &); +}; +template +_Rb_tree_iterator _Rb_tree<_Key, _Val, _Compare>::find(const _Key &__k) { + _Rb_tree_iterator __j = 0; + return __j == 0 || _M_impl._M_key_compare(__k, _S_key()) ? 0 : __j; +} +template struct set { + typedef _Key key_type; + typedef _Rb_tree _Rep_type; + _Rep_type _M_t; + typedef typename _Rep_type::const_iterator iterator; + iterator begin() { return _M_t.begin(); } + iterator end(); + void find(key_type __x) { _M_t.find(__x); } +}; +struct WindowDesc { + WindowDesc(short); +} _station_view_desc(0); +struct Window { + void IsWidgetLowered(); + virtual void OnClick(int, int, int); +}; +int AllocateWindowDescFront_window_number; +template void AllocateWindowDescFront(WindowDesc *desc, bool) { + Wcls(desc, AllocateWindowDescFront_window_number); +} +class CargoDataEntry; +struct CargoSorter { + bool operator()(const CargoDataEntry *, const CargoDataEntry *) const; +}; +struct CargoDataEntry { + ~CargoDataEntry(); + char Retrieve_cargo; + void Retrieve() { + CargoDataEntry t(Retrieve_cargo); + children->find(&t); + } + CargoDataEntry(char); + set *children; +}; +CargoDataEntry::CargoDataEntry(char) : children() {} +CargoDataEntry::~CargoDataEntry() { + if (children) + for (set::iterator i = children->begin(); + i != children->end();) + delete *i; +} +bool CargoSorter::operator()(const CargoDataEntry *, + const CargoDataEntry *) const { return false; } +struct StationViewWindow : Window { + StationViewWindow(WindowDesc *, int); + CargoDataEntry HandleCargoWaitingClick_filter; + void OnClick(int, int widget, int) { + switch (widget) { + case 0: + HandleCargoWaitingClick_filter.Retrieve(); + HandleCargoWaitingClick_filter.Retrieve(); + case 1: + IsWidgetLowered(); + } + } +}; +void ShowStationViewWindow_station() { + AllocateWindowDescFront(&_station_view_desc, + ShowStationViewWindow_station); +} -- cgit v1.1 From 83d26d0e1b3625ab6c2d83610a13976b52f63e0a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Apr 2021 15:42:47 +0200 Subject: veclower: Fix up vec_shl matching of VEC_PERM_EXPR [PR100239] The following testcase ICEs at -O0, because lower_vec_perm sees the _1 = { 0, 0, 0, 0, 0, 0, 0, 0 }; _2 = VEC_COND_EXPR <_1, { -1, -1, -1, -1, -1, -1, -1, -1 }, { 0, 0, 0, 0, 0, 0, 0, 0 }>; _3 = { 6, 0, 0, 0, 0, 0, 0, 0 }; _4 = VEC_PERM_EXPR <{ 0, 0, 0, 0, 0, 0, 0, 0 }, _2, _3>; and as the ISA is SSE2, there is no support for the particular permutation nor for variable mask permutation. But, the code to match vec_shl matches it, because the permutation has the first operand a zero vector and the mask picks all elements randomly from that vector. So, in the end that isn't a vec_shl, but the permutation could be in theory optimized into the first argument. As we keep it as is, it will fail during expansion though, because that for vec_shl correctly requires that it actually is a shift: unsigned firstidx = 0; for (unsigned int i = 0; i < nelt; i++) { if (known_eq (sel[i], nelt)) { if (i == 0 || firstidx) return NULL_RTX; firstidx = i; } else if (firstidx ? maybe_ne (sel[i], nelt + i - firstidx) : maybe_ge (sel[i], nelt)) return NULL_RTX; } if (firstidx == 0) return NULL_RTX; first = firstidx; The if (firstidx == 0) return NULL; is what is missing a counterpart on the lower_vec_perm side. As with optimize != 0 we fold it in other spots, I think it is not needed to optimize this cornercase in lower_vec_perm (which would mean we'd need to recurse on the newly created _4 = { 0, 0, 0, 0, 0, 0, 0, 0 }; whether it is supported or not). 2021-04-27 Jakub Jelinek PR tree-optimization/100239 * tree-vect-generic.c (lower_vec_perm): Don't accept constant permutations with all indices from the first zero element as vec_shl. * gcc.dg/pr100239.c: New test. --- gcc/testsuite/gcc.dg/pr100239.c | 12 ++++++++++++ gcc/tree-vect-generic.c | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr100239.c (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/pr100239.c b/gcc/testsuite/gcc.dg/pr100239.c new file mode 100644 index 0000000..1ade810 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr100239.c @@ -0,0 +1,12 @@ +/* PR tree-optimization/100239 */ +/* { dg-do compile } */ +/* { dg-options "-O0" } */ + +typedef short __attribute__((__vector_size__ (8 * sizeof (short)))) V; +V v, w; + +void +foo (void) +{ + w = __builtin_shuffle (v != v, 0 < (V) {}, (V) {192} >> 5); +} diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index 751f181..5cc32c4 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -1563,7 +1563,7 @@ lower_vec_perm (gimple_stmt_iterator *gsi) elements + i - first) : maybe_ge (poly_uint64 (indices[i]), elements)) break; - if (i == elements) + if (first && i == elements) { gimple_assign_set_rhs3 (stmt, mask); update_stmt (stmt); -- cgit v1.1 From 618ae596ebcd1de03857d20485d1324931852569 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Apr 2021 15:46:16 +0200 Subject: aarch64: Fix UB in the compiler [PR100200] The following patch fixes UBs in the compiler when negativing a CONST_INT containing HOST_WIDE_INT_MIN. I've changed the spots where there wasn't an obvious earlier condition check or predicate that would fail for such CONST_INTs. 2021-04-27 Jakub Jelinek PR target/100200 * config/aarch64/predicates.md (aarch64_sub_immediate, aarch64_plus_immediate): Use -UINTVAL instead of -INTVAL. * config/aarch64/aarch64.md (casesi, rotl3): Likewise. * config/aarch64/aarch64.c (aarch64_print_operand, aarch64_split_atomic_op, aarch64_expand_subvti): Likewise. --- gcc/config/aarch64/aarch64.c | 6 +++--- gcc/config/aarch64/aarch64.md | 5 +++-- gcc/config/aarch64/predicates.md | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) (limited to 'gcc') diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index dbaf6fb..aa148ac 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -10778,7 +10778,7 @@ aarch64_print_operand (FILE *f, rtx x, int code) } if (GET_MODE_CLASS (GET_MODE (x)) == MODE_VECTOR_INT) - asm_fprintf (f, "%wd", -INTVAL (elt)); + asm_fprintf (f, "%wd", -UINTVAL (elt)); else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_VECTOR_FLOAT && aarch64_print_vector_float_operand (f, x, true)) ; @@ -21598,7 +21598,7 @@ aarch64_split_atomic_op (enum rtx_code code, rtx old_out, rtx new_out, rtx mem, case MINUS: if (CONST_INT_P (value)) { - value = GEN_INT (-INTVAL (value)); + value = GEN_INT (-UINTVAL (value)); code = PLUS; } /* Fall through. */ @@ -23514,7 +23514,7 @@ aarch64_expand_subvti (rtx op0, rtx low_dest, rtx low_in1, { if (aarch64_plus_immediate (low_in2, DImode)) emit_insn (gen_subdi3_compare1_imm (low_dest, low_in1, low_in2, - GEN_INT (-INTVAL (low_in2)))); + GEN_INT (-UINTVAL (low_in2)))); else { low_in2 = force_reg (DImode, low_in2); diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index abfd845..aef6da9 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -747,7 +747,8 @@ constant can be represented in SImode, this is important for the corner case where operand[1] is INT_MIN. */ - operands[1] = GEN_INT (trunc_int_for_mode (-INTVAL (operands[1]), SImode)); + operands[1] + = GEN_INT (trunc_int_for_mode (-UINTVAL (operands[1]), SImode)); if (!(*insn_data[CODE_FOR_addsi3].operand[2].predicate) (operands[1], SImode)) @@ -5008,7 +5009,7 @@ /* (SZ - cnt) % SZ == -cnt % SZ */ if (CONST_INT_P (operands[2])) { - operands[2] = GEN_INT ((-INTVAL (operands[2])) + operands[2] = GEN_INT ((-UINTVAL (operands[2])) & (GET_MODE_BITSIZE (mode) - 1)); if (operands[2] == const0_rtx) { diff --git a/gcc/config/aarch64/predicates.md b/gcc/config/aarch64/predicates.md index c55842b..49f02ae 100644 --- a/gcc/config/aarch64/predicates.md +++ b/gcc/config/aarch64/predicates.md @@ -121,12 +121,12 @@ (define_predicate "aarch64_sub_immediate" (and (match_code "const_int") - (match_test "aarch64_uimm12_shift (-INTVAL (op))"))) + (match_test "aarch64_uimm12_shift (-UINTVAL (op))"))) (define_predicate "aarch64_plus_immediate" (and (match_code "const_int") (ior (match_test "aarch64_uimm12_shift (INTVAL (op))") - (match_test "aarch64_uimm12_shift (-INTVAL (op))")))) + (match_test "aarch64_uimm12_shift (-UINTVAL (op))")))) (define_predicate "aarch64_plus_operand" (ior (match_operand 0 "register_operand") -- cgit v1.1 From 42a10bb884c0d5af2583b8bfe4d239ce95bf9e43 Mon Sep 17 00:00:00 2001 From: Alex Coplan Date: Tue, 27 Apr 2021 14:56:15 +0100 Subject: arm: Fix ICEs with compare-and-swap and -march=armv8-m.base [PR99977] The PR shows two ICEs with __sync_bool_compare_and_swap and -mcpu=cortex-m23 (equivalently, -march=armv8-m.base): one in LRA and one later on, after the CAS insn is split. The LRA ICE occurs because the @atomic_compare_and_swap_1 pattern attempts to tie two output operands together (operands 0 and 1 in the third alternative). LRA can't handle this, since it doesn't make sense for an insn to assign to the same operand twice. The later (post-splitting) ICE occurs because the expansion of the cbranchsi4_scratch insn doesn't quite go according to plan. As it stands, arm_split_compare_and_swap calls gen_cbranchsi4_scratch, attempting to pass a register (neg_bval) to use as a scratch register. However, since the RTL template has a match_scratch here, gen_cbranchsi4_scratch ignores this argument and produces a scratch rtx. Since this is all happening after RA, this is doomed to fail (and we get an ICE about the insn not matching its constraints). It seems that the motivation for the choice of constraints in the atomic_compare_and_swap pattern comes from an attempt to satisfy the constraints of the cbranchsi4_scratch insn. This insn requires the scratch register to be the same as the input register in the case that we use a larger negative immediate (one that satisfies J, but not L). Of course, as noted above, LRA refuses to assign two output operands to the same register, so this was never going to work. The solution I'm proposing here is to collapse the alternatives to the CAS insn (allowing the two output register operands to be matched to different registers) and to ensure that the constraints for cbranchsi4_scratch are met in arm_split_compare_and_swap. We do this by inserting a move to ensure the source and destination registers match if necessary (i.e. in the case of large negative immediates). Another notable change here is that we only do: emit_move_insn (neg_bval, const1_rtx); for non-negative immediates. This is because the ADDS instruction used in the negative case suffices to leave a suitable value in neg_bval: if the operands compare equal, we don't take the branch (so neg_bval will be set by the load exclusive). Otherwise, the ADDS will leave a nonzero value in neg_bval, which will correctly signal that the CAS has failed when it is later negated. gcc/ChangeLog: PR target/99977 * config/arm/arm.c (arm_split_compare_and_swap): Fix up codegen with negative immediates: ensure we expand cbranchsi4_scratch correctly and ensure we satisfy its constraints. * config/arm/sync.md (@atomic_compare_and_swap_1): Don't attempt to tie two output operands together with constraints; collapse two alternatives. (@atomic_compare_and_swap_1): Likewise. * config/arm/thumb1.md (cbranchsi4_neg_late): New. gcc/testsuite/ChangeLog: PR target/99977 * gcc.target/arm/pr99977.c: New test. --- gcc/config/arm/arm.c | 26 ++++++++++++++++++++++---- gcc/config/arm/sync.md | 28 ++++++++++++++-------------- gcc/config/arm/thumb1.md | 15 +++++++++++++++ gcc/testsuite/gcc.target/arm/pr99977.c | 6 ++++++ 4 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 gcc/testsuite/gcc.target/arm/pr99977.c (limited to 'gcc') diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 352b2cd..6641e3f 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -30743,13 +30743,31 @@ arm_split_compare_and_swap (rtx operands[]) } else { - emit_move_insn (neg_bval, const1_rtx); cond = gen_rtx_NE (VOIDmode, rval, oldval); if (thumb1_cmpneg_operand (oldval, SImode)) - emit_unlikely_jump (gen_cbranchsi4_scratch (neg_bval, rval, oldval, - label2, cond)); + { + rtx src = rval; + if (!satisfies_constraint_L (oldval)) + { + gcc_assert (satisfies_constraint_J (oldval)); + + /* For such immediates, ADDS needs the source and destination regs + to be the same. + + Normally this would be handled by RA, but this is all happening + after RA. */ + emit_move_insn (neg_bval, rval); + src = neg_bval; + } + + emit_unlikely_jump (gen_cbranchsi4_neg_late (neg_bval, src, oldval, + label2, cond)); + } else - emit_unlikely_jump (gen_cbranchsi4_insn (cond, rval, oldval, label2)); + { + emit_move_insn (neg_bval, const1_rtx); + emit_unlikely_jump (gen_cbranchsi4_insn (cond, rval, oldval, label2)); + } } arm_emit_store_exclusive (mode, neg_bval, mem, newval, use_release); diff --git a/gcc/config/arm/sync.md b/gcc/config/arm/sync.md index e4682c0..b9fa870 100644 --- a/gcc/config/arm/sync.md +++ b/gcc/config/arm/sync.md @@ -187,20 +187,20 @@ ;; Constraints of this pattern must be at least as strict as those of the ;; cbranchsi operations in thumb1.md and aim to be as permissive. (define_insn_and_split "@atomic_compare_and_swap_1" - [(set (match_operand:CCSI 0 "cc_register_operand" "=&c,&l,&l,&l") ;; bool out + [(set (match_operand:CCSI 0 "cc_register_operand" "=&c,&l,&l") ;; bool out (unspec_volatile:CCSI [(const_int 0)] VUNSPEC_ATOMIC_CAS)) - (set (match_operand:SI 1 "s_register_operand" "=&r,&l,&0,&l*h") ;; val out + (set (match_operand:SI 1 "s_register_operand" "=&r,&l,&l*h") ;; val out (zero_extend:SI - (match_operand:NARROW 2 "mem_noofs_operand" "+Ua,Ua,Ua,Ua"))) ;; memory + (match_operand:NARROW 2 "mem_noofs_operand" "+Ua,Ua,Ua"))) ;; memory (set (match_dup 2) (unspec_volatile:NARROW - [(match_operand:SI 3 "arm_add_operand" "rIL,lIL*h,J,*r") ;; expected - (match_operand:NARROW 4 "s_register_operand" "r,r,r,r") ;; desired + [(match_operand:SI 3 "arm_add_operand" "rIL,lILJ*h,*r") ;; expected + (match_operand:NARROW 4 "s_register_operand" "r,r,r") ;; desired (match_operand:SI 5 "const_int_operand") ;; is_weak (match_operand:SI 6 "const_int_operand") ;; mod_s (match_operand:SI 7 "const_int_operand")] ;; mod_f VUNSPEC_ATOMIC_CAS)) - (clobber (match_scratch:SI 8 "=&r,X,X,X"))] + (clobber (match_scratch:SI 8 "=&r,X,X"))] "" "#" "&& reload_completed" @@ -209,7 +209,7 @@ arm_split_compare_and_swap (operands); DONE; } - [(set_attr "arch" "32,v8mb,v8mb,v8mb")]) + [(set_attr "arch" "32,v8mb,v8mb")]) (define_mode_attr cas_cmp_operand [(SI "arm_add_operand") (DI "cmpdi_operand")]) @@ -219,19 +219,19 @@ ;; Constraints of this pattern must be at least as strict as those of the ;; cbranchsi operations in thumb1.md and aim to be as permissive. (define_insn_and_split "@atomic_compare_and_swap_1" - [(set (match_operand:CCSI 0 "cc_register_operand" "=&c,&l,&l,&l") ;; bool out + [(set (match_operand:CCSI 0 "cc_register_operand" "=&c,&l,&l") ;; bool out (unspec_volatile:CCSI [(const_int 0)] VUNSPEC_ATOMIC_CAS)) - (set (match_operand:SIDI 1 "s_register_operand" "=&r,&l,&0,&l*h") ;; val out - (match_operand:SIDI 2 "mem_noofs_operand" "+Ua,Ua,Ua,Ua")) ;; memory + (set (match_operand:SIDI 1 "s_register_operand" "=&r,&l,&l*h") ;; val out + (match_operand:SIDI 2 "mem_noofs_operand" "+Ua,Ua,Ua")) ;; memory (set (match_dup 2) (unspec_volatile:SIDI - [(match_operand:SIDI 3 "" ",lIL*h,J,*r") ;; expect - (match_operand:SIDI 4 "s_register_operand" "r,r,r,r") ;; desired + [(match_operand:SIDI 3 "" ",lILJ*h,*r") ;; expect + (match_operand:SIDI 4 "s_register_operand" "r,r,r") ;; desired (match_operand:SI 5 "const_int_operand") ;; is_weak (match_operand:SI 6 "const_int_operand") ;; mod_s (match_operand:SI 7 "const_int_operand")] ;; mod_f VUNSPEC_ATOMIC_CAS)) - (clobber (match_scratch:SI 8 "=&r,X,X,X"))] + (clobber (match_scratch:SI 8 "=&r,X,X"))] "" "#" "&& reload_completed" @@ -240,7 +240,7 @@ arm_split_compare_and_swap (operands); DONE; } - [(set_attr "arch" "32,v8mb,v8mb,v8mb")]) + [(set_attr "arch" "32,v8mb,v8mb")]) (define_insn_and_split "atomic_exchange" [(set (match_operand:QHSD 0 "s_register_operand" "=&r,&r") ;; output diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md index c98b59c..084ed65 100644 --- a/gcc/config/arm/thumb1.md +++ b/gcc/config/arm/thumb1.md @@ -1206,6 +1206,21 @@ (set_attr "type" "multiple")] ) +;; An expander which makes use of the cbranchsi4_scratch insn, but can +;; be used safely after RA. +(define_expand "cbranchsi4_neg_late" + [(parallel [ + (set (pc) (if_then_else + (match_operator 4 "arm_comparison_operator" + [(match_operand:SI 1 "s_register_operand") + (match_operand:SI 2 "thumb1_cmpneg_operand")]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (match_operand:SI 0 "s_register_operand")) + ])] + "TARGET_THUMB1" +) + ;; Changes to the constraints of this pattern must be propagated to those of ;; atomic compare_and_swap splitters in sync.md. These must be at least as ;; strict as the constraints here and aim to be as permissive. diff --git a/gcc/testsuite/gcc.target/arm/pr99977.c b/gcc/testsuite/gcc.target/arm/pr99977.c new file mode 100644 index 0000000..7911899 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr99977.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-march=armv8-m.base -mfloat-abi=soft -O2" } */ +_Bool f1(int *p) { return __sync_bool_compare_and_swap (p, -1, 2); } +_Bool f2(int *p) { return __sync_bool_compare_and_swap (p, -8, 2); } +int g1(int *p) { return __sync_val_compare_and_swap (p, -1, 2); } +int g2(int *p) { return __sync_val_compare_and_swap (p, -8, 3); } -- cgit v1.1 From 3bb41228d76b3a3cbd9923d57388f0903f7683de Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 26 Apr 2021 15:36:18 -0700 Subject: op_by_pieces_d::run: Change a while loop to a do-while loop Change a while loop in op_by_pieces_d::run to a do-while loop to prepare for offset adjusted operation for the remaining bytes on the last piece operation of a memory region. PR middle-end/90773 * expr.c (op_by_pieces_d::get_usable_mode): New member function. (op_by_pieces_d::run): Cange a while loop to a do-while loop. --- gcc/expr.c | 76 +++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 23 deletions(-) (limited to 'gcc') diff --git a/gcc/expr.c b/gcc/expr.c index 5a1fda7..a4a004d 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -1041,6 +1041,9 @@ pieces_addr::maybe_postinc (HOST_WIDE_INT size) class op_by_pieces_d { + private: + scalar_int_mode get_usable_mode (scalar_int_mode mode, unsigned int); + protected: pieces_addr m_to, m_from; unsigned HOST_WIDE_INT m_len; @@ -1108,6 +1111,25 @@ op_by_pieces_d::op_by_pieces_d (rtx to, bool to_load, m_align = align; } +/* This function returns the largest usable integer mode for LEN bytes + whose size is no bigger than size of MODE. */ + +scalar_int_mode +op_by_pieces_d::get_usable_mode (scalar_int_mode mode, unsigned int len) +{ + unsigned int size; + do + { + size = GET_MODE_SIZE (mode); + if (len >= size && prepare_mode (mode, m_align)) + break; + /* NB: widest_int_mode_for_size checks SIZE > 1. */ + mode = widest_int_mode_for_size (size); + } + while (1); + return mode; +} + /* This function contains the main loop used for expanding a block operation. First move what we can in the largest integer mode, then go to successively smaller modes. For every access, call @@ -1116,42 +1138,50 @@ op_by_pieces_d::op_by_pieces_d (rtx to, bool to_load, void op_by_pieces_d::run () { - while (m_max_size > 1 && m_len > 0) + if (m_len == 0) + return; + + /* NB: widest_int_mode_for_size checks M_MAX_SIZE > 1. */ + scalar_int_mode mode = widest_int_mode_for_size (m_max_size); + mode = get_usable_mode (mode, m_len); + + do { - scalar_int_mode mode = widest_int_mode_for_size (m_max_size); + unsigned int size = GET_MODE_SIZE (mode); + rtx to1 = NULL_RTX, from1; - if (prepare_mode (mode, m_align)) + while (m_len >= size) { - unsigned int size = GET_MODE_SIZE (mode); - rtx to1 = NULL_RTX, from1; + if (m_reverse) + m_offset -= size; - while (m_len >= size) - { - if (m_reverse) - m_offset -= size; + to1 = m_to.adjust (mode, m_offset); + from1 = m_from.adjust (mode, m_offset); - to1 = m_to.adjust (mode, m_offset); - from1 = m_from.adjust (mode, m_offset); + m_to.maybe_predec (-(HOST_WIDE_INT)size); + m_from.maybe_predec (-(HOST_WIDE_INT)size); - m_to.maybe_predec (-(HOST_WIDE_INT)size); - m_from.maybe_predec (-(HOST_WIDE_INT)size); + generate (to1, from1, mode); - generate (to1, from1, mode); + m_to.maybe_postinc (size); + m_from.maybe_postinc (size); - m_to.maybe_postinc (size); - m_from.maybe_postinc (size); + if (!m_reverse) + m_offset += size; - if (!m_reverse) - m_offset += size; + m_len -= size; + } - m_len -= size; - } + finish_mode (mode); - finish_mode (mode); - } + if (m_len == 0) + return; - m_max_size = GET_MODE_SIZE (mode); + /* NB: widest_int_mode_for_size checks SIZE > 1. */ + mode = widest_int_mode_for_size (size); + mode = get_usable_mode (mode, m_len); } + while (1); /* The code above should have handled everything. */ gcc_assert (!m_len); -- cgit v1.1 From c33db31d9ad96f6414460315c12b4b505fad5dd7 Mon Sep 17 00:00:00 2001 From: Bernd Edlinger Date: Wed, 21 Apr 2021 14:13:04 +0200 Subject: Fix target/100106 ICE in gen_movdi As the test case shows, the outer mode may have a higher alignment requirement than the inner mode here. 2021-04-27 Bernd Edlinger PR target/100106 * simplify-rtx.c (simplify_context::simplify_subreg): Check the memory alignment for the outer mode. * gcc.c-torture/compile/pr100106.c: New testcase. --- gcc/simplify-rtx.c | 1 + gcc/testsuite/gcc.c-torture/compile/pr100106.c | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr100106.c (limited to 'gcc') diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index d13c390..ad3b7b2 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -7217,6 +7217,7 @@ simplify_context::simplify_subreg (machine_mode outermode, rtx op, have instruction to move the whole thing. */ && (! MEM_VOLATILE_P (op) || ! have_insn_for (SET, innermode)) + && !(STRICT_ALIGNMENT && MEM_ALIGN (op) < GET_MODE_ALIGNMENT (outermode)) && known_le (outersize, innersize)) return adjust_address_nv (op, outermode, byte); diff --git a/gcc/testsuite/gcc.c-torture/compile/pr100106.c b/gcc/testsuite/gcc.c-torture/compile/pr100106.c new file mode 100644 index 0000000..7f98b4f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr100106.c @@ -0,0 +1,11 @@ +union a { + float _Complex b; + long long c; +}; + +void g(union a); + +void e() { + union a f = {1.0f}; + g(f); +} -- cgit v1.1 From 1c0c371d0ea297af2e3180c64cd18f2bfce919b1 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Apr 2021 17:50:53 +0200 Subject: aarch64: Fix up last commit [PR100200] Pedantically signed vs. unsigned mismatches in va_arg are only well defined if the value can be represented in both signed and unsigned integer types. 2021-04-27 Jakub Jelinek PR target/100200 * config/aarch64/aarch64.c (aarch64_print_operand): Cast -UINTVAL back to HOST_WIDE_INT. --- gcc/config/aarch64/aarch64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index aa148ac..a863af1 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -10778,7 +10778,7 @@ aarch64_print_operand (FILE *f, rtx x, int code) } if (GET_MODE_CLASS (GET_MODE (x)) == MODE_VECTOR_INT) - asm_fprintf (f, "%wd", -UINTVAL (elt)); + asm_fprintf (f, "%wd", (HOST_WIDE_INT) -UINTVAL (elt)); else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_VECTOR_FLOAT && aarch64_print_vector_float_operand (f, x, true)) ; -- cgit v1.1 From a21b399708175f6fc0ac723a0cebc127da421c60 Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Sun, 11 Apr 2021 19:41:26 -0400 Subject: aix: TLS precompute register parameters (PR 94177) AIX uses a compiler-managed TOC for global data, including TLS symbols. The GCC TOC implementation manages the TOC entries through the constant pool. TLS symbols sometimes require a function call to obtain the TLS base pointer. The arguments to the TLS call can conflict with arguments to a normal function call if the TLS symbol is an argument in the normal call. GCC specifically checks for this situation and precomputes the TLS arguments, but the mechanism to check for this requirement utilizes legitimate_constant_p(). The necessary result of legitimate_constant_p() for correct TOC behavior and for correct TLS argument behavior is in conflict. This patch adds a new target hook precompute_tls_p() to decide if an argument should be precomputed regardless of the result from legitmate_constant_p(). gcc/ChangeLog: PR target/94177 * calls.c (precompute_register_parameters): Additionally test targetm.precompute_tls_p to pre-compute argument. * config/rs6000/aix.h (TARGET_PRECOMPUTE_TLS_P): Define. * config/rs6000/rs6000.c (rs6000_aix_precompute_tls_p): New. * target.def (precompute_tls_p): New. * doc/tm.texi.in (TARGET_PRECOMPUTE_TLS_P): Add hook documentation. * doc/tm.texi: Regenerated. --- gcc/calls.c | 3 ++- gcc/config/rs6000/aix.h | 1 + gcc/config/rs6000/rs6000.c | 15 ++++++++++++++- gcc/doc/tm.texi | 9 +++++++++ gcc/doc/tm.texi.in | 2 ++ gcc/target.def | 12 ++++++++++++ 6 files changed, 40 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/calls.c b/gcc/calls.c index ff60620..883d08b 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1002,7 +1002,8 @@ precompute_register_parameters (int num_actuals, struct arg_data *args, /* If the value is a non-legitimate constant, force it into a pseudo now. TLS symbols sometimes need a call to resolve. */ if (CONSTANT_P (args[i].value) - && !targetm.legitimate_constant_p (args[i].mode, args[i].value)) + && (!targetm.legitimate_constant_p (args[i].mode, args[i].value) + || targetm.precompute_tls_p (args[i].mode, args[i].value))) args[i].value = force_reg (args[i].mode, args[i].value); /* If we're going to have to load the value by parts, pull the diff --git a/gcc/config/rs6000/aix.h b/gcc/config/rs6000/aix.h index 7fccb313..b116e1a 100644 --- a/gcc/config/rs6000/aix.h +++ b/gcc/config/rs6000/aix.h @@ -279,3 +279,4 @@ /* Use standard DWARF numbering for DWARF debugging information. */ #define RS6000_USE_DWARF_NUMBERING +#define TARGET_PRECOMPUTE_TLS_P rs6000_aix_precompute_tls_p diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 844fee8..60b8e3e 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -9608,7 +9608,8 @@ rs6000_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x) && SYMBOL_REF_TLS_MODEL (XEXP (XEXP (x, 0), 0)) != 0) return true; - /* Do not place an ELF TLS symbol in the constant pool. */ + /* Allow AIX TOC TLS symbols in the constant pool, + but not ELF TLS symbols. */ return TARGET_ELF && tls_referenced_p (x); } @@ -25370,6 +25371,18 @@ rs6000_legitimate_constant_p (machine_mode mode, rtx x) return true; } +/* Implement TARGET_PRECOMPUTE_TLS_P. + + On the AIX, TLS symbols are in the TOC, which is maintained in the + constant pool. AIX TOC TLS symbols need to be pre-computed, but + must be considered legitimate constants. */ + +static bool +rs6000_aix_precompute_tls_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x) +{ + return tls_referenced_p (x); +} + /* Return TRUE iff the sequence ending in LAST sets the static chain. */ diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 823f85b..b370bc7 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -5880,6 +5880,15 @@ This hook returns true if @var{x} is a legitimate constant for a The default definition returns true. @end deftypefn +@deftypefn {Target Hook} bool TARGET_PRECOMPUTE_TLS_P (machine_mode @var{mode}, rtx @var{x}) +This hook returns true if @var{x} is a TLS operand on the target +machine that should be pre-computed when used as the argument in a call. +You can assume that @var{x} satisfies @code{CONSTANT_P}, so you need not +check this. + +The default definition returns false. +@end deftypefn + @deftypefn {Target Hook} rtx TARGET_DELEGITIMIZE_ADDRESS (rtx @var{x}) This hook is used to undo the possibly obfuscating effects of the @code{LEGITIMIZE_ADDRESS} and @code{LEGITIMIZE_RELOAD_ADDRESS} target diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 2321a5f..2974dae 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -4147,6 +4147,8 @@ address; but often a machine-dependent strategy can generate better code. @hook TARGET_LEGITIMATE_CONSTANT_P +@hook TARGET_PRECOMPUTE_TLS_P + @hook TARGET_DELEGITIMIZE_ADDRESS @hook TARGET_CONST_NOT_OK_FOR_DEBUG_P diff --git a/gcc/target.def b/gcc/target.def index d7b94bd..0ebfb58 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -2715,6 +2715,18 @@ The default definition returns true.", bool, (machine_mode mode, rtx x), hook_bool_mode_rtx_true) +/* True if X is a TLS operand whose value should be pre-computed. */ +DEFHOOK +(precompute_tls_p, + "This hook returns true if @var{x} is a TLS operand on the target\n\ +machine that should be pre-computed when used as the argument in a call.\n\ +You can assume that @var{x} satisfies @code{CONSTANT_P}, so you need not \n\ +check this.\n\ +\n\ +The default definition returns false.", + bool, (machine_mode mode, rtx x), + hook_bool_mode_rtx_false) + /* True if the constant X cannot be placed in the constant pool. */ DEFHOOK (cannot_force_const_mem, -- cgit v1.1 From f82658338756fe9a38a728aa542d786a0e889e21 Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Tue, 27 Apr 2021 16:59:59 +0000 Subject: powerpc: fix bootstrap. gcc/ChangeLog: * config/rs6000/rs6000.c (rs6000_aix_precompute_tls_p): Protect with TARGET_AIX_OS. --- gcc/config/rs6000/rs6000.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'gcc') diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 60b8e3e..14ff56a 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -25371,6 +25371,7 @@ rs6000_legitimate_constant_p (machine_mode mode, rtx x) return true; } +#if TARGET_AIX_OS /* Implement TARGET_PRECOMPUTE_TLS_P. On the AIX, TLS symbols are in the TOC, which is maintained in the @@ -25382,6 +25383,7 @@ rs6000_aix_precompute_tls_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x) { return tls_referenced_p (x); } +#endif /* Return TRUE iff the sequence ending in LAST sets the static chain. */ -- cgit v1.1 From 2ae2a45c287d254c2890feff2cca46ed2ddb06ca Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Tue, 27 Apr 2021 11:00:53 -0600 Subject: Remove malformed dg-warning directives. gcc/testsuite/ChangeLog: PR testsuite/100272 * g++.dg/ext/flexary13.C: Remove malformed directives. --- gcc/testsuite/g++.dg/ext/flexary13.C | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/ext/flexary13.C b/gcc/testsuite/g++.dg/ext/flexary13.C index f0603f9..1acfa2e 100644 --- a/gcc/testsuite/g++.dg/ext/flexary13.C +++ b/gcc/testsuite/g++.dg/ext/flexary13.C @@ -17,44 +17,40 @@ int32_t i = 12345678; int main () { { + // OK. Does not assign any elements to flexible array. Ax s = { 0 }; ASSERT (s.n == 0); } { - static Ax s = - { 0, { } }; // dg-warning "initialization of a flexible array member" } + // OK only for statically allocated objects, otherwise error. + static Ax s = { 0, { } }; ASSERT (s.n == 0); } { - static Ax s = - { 1, { 2 } }; // dg-warning "initialization of a flexible array member" } + static Ax s = { 1, { 2 } }; ASSERT (s.n == 1 && s.a [0] == 2); } { - static Ax s = - { 2, { 3, 4 } }; // dg-warning "initialization of a flexible array member" } + static Ax s = { 2, { 3, 4 } }; ASSERT (s.n = 2 && s.a [0] == 3 && s.a [1] == 4); } { - static Ax s = - { 123, i }; // dg-warning "initialization of a flexible array member" } + static Ax s = { 123, i }; ASSERT (s.n == 123 && s.a [0] == i); } { - static Ax s = - { 456, { i } }; // dg-warning "initialization of a flexible array member" } + static Ax s = { 456, { i } }; ASSERT (s.n == 456 && s.a [0] == i); } { int32_t j = i + 1, k = j + 1; - static Ax s = - { 3, { i, j, k } }; // dg-warning "initialization of a flexible array member" } + static Ax s = { 3, { i, j, k } }; ASSERT (s.n == 3 && s.a [0] == i && s.a [1] == j && s.a [2] == k); } { - AAx s = - { 1, { 2 } }; // dg-warning "initialization of a flexible array member" } + // OK. Does not assign any elements to flexible array. + AAx s = { 1, { 2 } }; ASSERT (s.i == 1 && s.ax.n == 2); } } -- cgit v1.1 From d0a57b030f1c7df33c6bc3c661d16c9cb79e96dd Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 27 Apr 2021 18:30:36 +0100 Subject: Fix handling of VEC_COND_EXPR trap tests [PR100284] Now that VEC_COND_EXPR has normal unnested operands, operation_could_trap_p can treat it like any other expression. This fixes many testsuite ICEs for SVE, but it turns out that none of the tests in gcc.target/aarch64/sve were affected. Anyone testing on non-SVE aarch64 therefore wouldn't have seen it. gcc/ PR middle-end/100284 * gimple.c (gimple_could_trap_p_1): Remove VEC_COND_EXPR test. * tree-eh.c (operation_could_trap_p): Handle VEC_COND_EXPR rather than asserting on it. gcc/testsuite/ PR middle-end/100284 * gcc.target/aarch64/sve/pr81003.c: New test. --- gcc/gimple.c | 3 --- gcc/testsuite/gcc.target/aarch64/sve/pr81003.c | 10 ++++++++++ gcc/tree-eh.c | 6 +++--- 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr81003.c (limited to 'gcc') diff --git a/gcc/gimple.c b/gcc/gimple.c index d067656..f1044e9 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -2161,9 +2161,6 @@ gimple_could_trap_p_1 (gimple *s, bool include_mem, bool include_stores) /* For COND_EXPR only the condition may trap. */ if (op == COND_EXPR) return tree_could_trap_p (gimple_assign_rhs1 (s)); - /* A VEC_COND_EXPR cannot trap. */ - else if (op == VEC_COND_EXPR) - return false; /* For comparisons we need to check rhs operand types instead of rhs type (which is BOOLEAN_TYPE). */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr81003.c b/gcc/testsuite/gcc.target/aarch64/sve/pr81003.c new file mode 100644 index 0000000..661a6f9 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr81003.c @@ -0,0 +1,10 @@ +/* { dg-options "-O3" } */ + +unsigned int a, b; + +void +foo (void) +{ + for (b = 0; b < 13; b += 2) + a &= !!b; +} diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index a68778b..601285c 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -2541,9 +2541,9 @@ operation_could_trap_p (enum tree_code op, bool fp_operation, bool honor_trapv, bool honor_snans = fp_operation && flag_signaling_nans != 0; bool handled; - /* This function cannot tell whether or not COND_EXPR and VEC_COND_EXPR could - trap, because that depends on the respective condition op. */ - gcc_assert (op != COND_EXPR && op != VEC_COND_EXPR); + /* This function cannot tell whether or not COND_EXPR could trap, + because that depends on its condition op. */ + gcc_assert (op != COND_EXPR); if (TREE_CODE_CLASS (op) != tcc_comparison && TREE_CODE_CLASS (op) != tcc_unary -- cgit v1.1 From 6c1976fa3ff57f5b547e0c3f1e0461409936586b Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Thu, 3 Dec 2020 11:35:06 +0000 Subject: ifcvt: Fall through to NCE if getting the CE condition failed If getting the condition for conditional execution has failed then fall through and try the non-conditional execution approach instead rather than giving up with dead code elimination altogether, for a better code structure if nothing else. The case may well now be that whenever `cond_exec_get_condition' fails `noce_get_condition' will as well, however in that case no change in semantics will result. If they ever diverge, then someone will have to chase this place. gcc/ * ifcvt.c (dead_or_predicable) [!IFCVT_MODIFY_TESTS]: Fall through to the non-conditional execution case if getting the condition for conditional execution has failed. --- gcc/ifcvt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index b467eb5..4de7bb9 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -5193,7 +5193,7 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, cond = cond_exec_get_condition (jump); if (! cond) - return FALSE; + goto nce; rtx note = find_reg_note (jump, REG_BR_PROB, NULL_RTX); profile_probability prob_val -- cgit v1.1 From 436e6f7d85cbd744c3f3aa393043e615dca1d36f Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Wed, 21 Apr 2021 23:33:02 +0200 Subject: VAX: Remove dead `adjacent_operands_p' function This function has never been used and it is unclear what its intended purpose was. gcc/ * config/vax/vax-protos.h (adjacent_operands_p): Remove prototype. * config/vax/vax.c (adjacent_operands_p): Remove. --- gcc/config/vax/vax-protos.h | 1 - gcc/config/vax/vax.c | 73 --------------------------------------------- 2 files changed, 74 deletions(-) (limited to 'gcc') diff --git a/gcc/config/vax/vax-protos.h b/gcc/config/vax/vax-protos.h index 89fddec..6dcbf53 100644 --- a/gcc/config/vax/vax-protos.h +++ b/gcc/config/vax/vax-protos.h @@ -24,7 +24,6 @@ extern void vax_expand_prologue (void); extern bool vax_acceptable_pic_operand_p (rtx, bool, bool); extern machine_mode vax_select_cc_mode (enum rtx_code, rtx, rtx); extern const char *cond_name (rtx); -extern bool adjacent_operands_p (rtx, rtx, machine_mode); extern const char *rev_cond_name (rtx); extern void print_operand_address (FILE *, rtx); extern void print_operand (FILE *, rtx, int); diff --git a/gcc/config/vax/vax.c b/gcc/config/vax/vax.c index 726c371..870af2b 100644 --- a/gcc/config/vax/vax.c +++ b/gcc/config/vax/vax.c @@ -2108,79 +2108,6 @@ vax_expand_addsub_di_operands (rtx * operands, enum rtx_code code) } } -bool -adjacent_operands_p (rtx lo, rtx hi, machine_mode mode) -{ - HOST_WIDE_INT lo_offset; - HOST_WIDE_INT hi_offset; - - if (GET_CODE (lo) != GET_CODE (hi)) - return false; - - if (REG_P (lo)) - return mode == SImode && REGNO (lo) + 1 == REGNO (hi); - if (CONST_INT_P (lo)) - return INTVAL (hi) == 0 && UINTVAL (lo) < 64; - if (CONST_INT_P (lo)) - return mode != SImode; - - if (!MEM_P (lo)) - return false; - - if (MEM_VOLATILE_P (lo) || MEM_VOLATILE_P (hi)) - return false; - - lo = XEXP (lo, 0); - hi = XEXP (hi, 0); - - if (GET_CODE (lo) == POST_INC /* || GET_CODE (lo) == PRE_DEC */) - return rtx_equal_p (lo, hi); - - switch (GET_CODE (lo)) - { - case REG: - case SYMBOL_REF: - lo_offset = 0; - break; - case CONST: - lo = XEXP (lo, 0); - /* FALLTHROUGH */ - case PLUS: - if (!CONST_INT_P (XEXP (lo, 1))) - return false; - lo_offset = INTVAL (XEXP (lo, 1)); - lo = XEXP (lo, 0); - break; - default: - return false; - } - - switch (GET_CODE (hi)) - { - case REG: - case SYMBOL_REF: - hi_offset = 0; - break; - case CONST: - hi = XEXP (hi, 0); - /* FALLTHROUGH */ - case PLUS: - if (!CONST_INT_P (XEXP (hi, 1))) - return false; - hi_offset = INTVAL (XEXP (hi, 1)); - hi = XEXP (hi, 0); - break; - default: - return false; - } - - if (GET_CODE (lo) == MULT || GET_CODE (lo) == PLUS) - return false; - - return rtx_equal_p (lo, hi) - && hi_offset - lo_offset == GET_MODE_SIZE (mode); -} - /* Output assembler code for a block containing the constant parts of a trampoline, leaving space for the variable parts. */ -- cgit v1.1 From f3bfed3381be2e616599679b2a093b0ac8f1c5f7 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Wed, 21 Apr 2021 23:33:11 +0200 Subject: VAX: Fix ill-formed `jbbi' insn operands The insn has extraneous operand #3 that is aliased in RTL to operand #0 with a constraint. The operands specify a single-bit field in memory that the machine instruction produced boths reads for the purpose of determining whether to branch or not and either clears or sets according to the machine operation selected with the `ccss' iterator. The caller of the insn is supposed to supply the same rtx for both operands. This odd arrangement happens to work with old reload, but breaks with libatomic if LRA is used instead: .../libatomic/flag.c: In function 'atomic_flag_test_and_set': .../libatomic/flag.c:36:1: error: unable to generate reloads for: 36 | } | ^ (jump_insn 7 6 19 2 (unspec_volatile [ (set (pc) (if_then_else (eq (zero_extract:SI (mem/v:QI (reg:SI 27) [-1 S1 A8]) (const_int 1 [0x1]) (const_int 0 [0])) (const_int 1 [0x1])) (label_ref:SI 25) (pc))) (set (zero_extract:SI (mem/v:QI (reg:SI 28) [-1 S1 A8]) (const_int 1 [0x1]) (const_int 0 [0])) (const_int 1 [0x1])) ] 100) ".../libatomic/flag.c":35:10 669 {jbbssiqi} (nil) -> 25) during RTL pass: reload .../libatomic/flag.c:36:1: internal compiler error: in curr_insn_transform, at lra-constraints.c:4098 0x1112c587 _fatal_insn(char const*, rtx_def const*, char const*, int, char const*) .../gcc/rtl-error.c:108 0x10ee6563 curr_insn_transform .../gcc/lra-constraints.c:4098 0x10eeaf87 lra_constraints(bool) .../gcc/lra-constraints.c:5133 0x10ec97e3 lra(_IO_FILE*) .../gcc/lra.c:2336 0x10e4633f do_reload .../gcc/ira.c:5827 0x10e46b27 execute .../gcc/ira.c:6013 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See for instructions. Switch to using `match_dup' as expected then for a machine instruction that in its encoding only has one actual operand in for the single-bit field. gcc/ * config/vax/builtins.md (jbbi): Remove operand #3. (sync_lock_test_and_set): Adjust accordingly. (sync_lock_release): Likewise. --- gcc/config/vax/builtins.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'gcc') diff --git a/gcc/config/vax/builtins.md b/gcc/config/vax/builtins.md index 3d1cbcd..ff97ff3 100644 --- a/gcc/config/vax/builtins.md +++ b/gcc/config/vax/builtins.md @@ -174,8 +174,7 @@ label = gen_label_rtx (); emit_move_insn (operands[0], const1_rtx); - emit_jump_insn (gen_jbbssi (operands[1], const0_rtx, label, - operands[1])); + emit_jump_insn (gen_jbbssi (operands[1], const0_rtx, label)); emit_move_insn (operands[0], const0_rtx); emit_label (label); DONE; @@ -193,8 +192,7 @@ FAIL; label = gen_label_rtx (); - emit_jump_insn (gen_jbbcci (operands[0], const0_rtx, label, - operands[0])); + emit_jump_insn (gen_jbbcci (operands[0], const0_rtx, label)); emit_label (label); DONE; }") @@ -204,13 +202,13 @@ [(set (pc) (if_then_else (eq (zero_extract:SI - (match_operand:VAXint 0 "any_memory_operand" "") + (match_operand:VAXint 0 "any_memory_operand" "+") (const_int 1) (match_operand:SI 1 "general_operand" "nrmT")) (const_int bit)) (label_ref (match_operand 2 "" "")) (pc))) - (set (zero_extract:SI (match_operand:VAXint 3 "any_memory_operand" "+0") + (set (zero_extract:SI (match_dup 0) (const_int 1) (match_dup 1)) (const_int bit))] -- cgit v1.1 From c605a8bf92708e81d771426a87b3baddc32082dd Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Wed, 21 Apr 2021 23:33:25 +0200 Subject: VAX: Accept ASHIFT in address expressions Fix regressions: FAIL: gcc.c-torture/execute/20090113-2.c -O1 (internal compiler error) FAIL: gcc.c-torture/execute/20090113-2.c -O1 (test for excess errors) FAIL: gcc.c-torture/execute/20090113-3.c -O1 (internal compiler error) FAIL: gcc.c-torture/execute/20090113-3.c -O1 (test for excess errors) triggering if LRA is used rather than old reload and caused by: (plus:SI (plus:SI (mult:SI (reg:SI 30 [ _10 ]) (const_int 4 [0x4])) (reg/f:SI 26 [ _6 ])) (const_int 12 [0xc])) coming from: (insn 58 57 59 10 (set (reg:SI 33 [ _13 ]) (zero_extract:SI (mem:SI (plus:SI (plus:SI (mult:SI (reg:SI 30 [ _10 ]) (const_int 4 [0x4])) (reg/f:SI 26 [ _6 ])) (const_int 12 [0xc])) [4 _6->bits[_10]+0 S4 A32]) (reg:QI 56) (reg:SI 53))) ".../gcc/testsuite/gcc.c-torture/execute/20090113-2.c":64:12 490 {*extzv_non_const} (expr_list:REG_DEAD (reg:QI 56) (expr_list:REG_DEAD (reg:SI 53) (expr_list:REG_DEAD (reg:SI 30 [ _10 ]) (expr_list:REG_DEAD (reg/f:SI 26 [ _6 ]) (nil)))))) being converted into: (plus:SI (plus:SI (ashift:SI (reg:SI 30 [ _10 ]) (const_int 2 [0x2])) (reg/f:SI 26 [ _6 ])) (const_int 12 [0xc])) which is an rtx the VAX backend currently does not recognize as a valid machine address, although apparently it is only inside MEM rtx's that indexed addressing is supposed to be canonicalized to a MULT rather than ASHIFT form. Handle the ASHIFT form too throughout the backend then. The change appears to also improve code generation with old reload and code size stats are as follows, collected from 18153 executables built in `check-c' GCC testing: samples average median -------------------------------------- regressions 47 0.702% 0.521% unchanged 17503 0.000% 0.000% progressions 603 -0.920% -0.403% -------------------------------------- total 18153 -0.029% 0.000% with a small number of outliers (over 5% size change): old new change %change filename ---------------------------------------------------- 1885 1645 -240 -12.7320 pr53505.exe 1331 1221 -110 -8.2644 pr89634.exe 1553 1473 -80 -5.1513 stdatomic-vm.exe 1413 1341 -72 -5.0955 pr45830.exe 1415 1343 -72 -5.0883 stdatomic-vm.exe 25765 24463 -1302 -5.0533 strlen-5.exe 25765 24463 -1302 -5.0533 strlen-5.exe 25765 24463 -1302 -5.0533 strlen-5.exe 1191 1131 -60 -5.0377 20050527-1.exe (all changes on the expansion side are below 5%). gcc/ * config/vax/vax.c (print_operand_address, vax_address_cost_1) (index_term_p): Handle ASHIFT too. --- gcc/config/vax/vax.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'gcc') diff --git a/gcc/config/vax/vax.c b/gcc/config/vax/vax.c index 870af2b..96a7925 100644 --- a/gcc/config/vax/vax.c +++ b/gcc/config/vax/vax.c @@ -333,12 +333,12 @@ print_operand_address (FILE * file, rtx addr) case PLUS: /* There can be either two or three things added here. One must be a - REG. One can be either a REG or a MULT of a REG and an appropriate - constant, and the third can only be a constant or a MEM. + REG. One can be either a REG or a MULT/ASHIFT of a REG and an + appropriate constant, and the third can only be a constant or a MEM. We get these two or three things and put the constant or MEM in - OFFSET, the MULT or REG in IREG, and the REG in BREG. If we have - a register and can't tell yet if it is a base or index register, + OFFSET, the MULT/ASHIFT or REG in IREG, and the REG in BREG. If we + have a register and can't tell yet if it is a base or index register, put it into REG1. */ reg1 = 0; ireg = 0; breg = 0; offset = 0; @@ -355,12 +355,14 @@ print_operand_address (FILE * file, rtx addr) offset = XEXP (addr, 1); addr = XEXP (addr, 0); } - else if (GET_CODE (XEXP (addr, 1)) == MULT) + else if (GET_CODE (XEXP (addr, 1)) == MULT + || GET_CODE (XEXP (addr, 1)) == ASHIFT) { ireg = XEXP (addr, 1); addr = XEXP (addr, 0); } - else if (GET_CODE (XEXP (addr, 0)) == MULT) + else if (GET_CODE (XEXP (addr, 0)) == MULT + || GET_CODE (XEXP (addr, 0)) == ASHIFT) { ireg = XEXP (addr, 0); addr = XEXP (addr, 1); @@ -385,7 +387,7 @@ print_operand_address (FILE * file, rtx addr) else reg1 = addr; } - else if (GET_CODE (addr) == MULT) + else if (GET_CODE (addr) == MULT || GET_CODE (addr) == ASHIFT) ireg = addr; else { @@ -416,7 +418,8 @@ print_operand_address (FILE * file, rtx addr) } else { - gcc_assert (GET_CODE (XEXP (addr, 0)) == MULT); + gcc_assert (GET_CODE (XEXP (addr, 0)) == MULT + || GET_CODE (XEXP (addr, 0)) == ASHIFT); gcc_assert (!ireg); ireg = XEXP (addr, 0); } @@ -447,7 +450,8 @@ print_operand_address (FILE * file, rtx addr) } else { - gcc_assert (GET_CODE (XEXP (addr, 1)) == MULT); + gcc_assert (GET_CODE (XEXP (addr, 1)) == MULT + || GET_CODE (XEXP (addr, 1)) == ASHIFT); gcc_assert (!ireg); ireg = XEXP (addr, 1); } @@ -506,7 +510,7 @@ print_operand_address (FILE * file, rtx addr) if (ireg != 0) { - if (GET_CODE (ireg) == MULT) + if (GET_CODE (ireg) == MULT || GET_CODE (ireg) == ASHIFT) ireg = XEXP (ireg, 0); gcc_assert (REG_P (ireg)); fprintf (file, "[%s]", reg_names[REGNO (ireg)]); @@ -707,6 +711,7 @@ vax_address_cost_1 (rtx addr) reg = 1; break; case MULT: + case ASHIFT: indexed = 1; /* 2 on VAX 2 */ break; case CONST_INT: @@ -1824,23 +1829,26 @@ static bool index_term_p (rtx prod, machine_mode mode, bool strict) { rtx xfoo0, xfoo1; + bool log_p; if (GET_MODE_SIZE (mode) == 1) return BASE_REGISTER_P (prod, strict); - if (GET_CODE (prod) != MULT || GET_MODE_SIZE (mode) > 8) + if ((GET_CODE (prod) != MULT && GET_CODE (prod) != ASHIFT) + || GET_MODE_SIZE (mode) > 8) return false; + log_p = GET_CODE (prod) == ASHIFT; xfoo0 = XEXP (prod, 0); xfoo1 = XEXP (prod, 1); if (CONST_INT_P (xfoo0) - && INTVAL (xfoo0) == (int)GET_MODE_SIZE (mode) + && GET_MODE_SIZE (mode) == (log_p ? 1 << INTVAL (xfoo0) : INTVAL (xfoo0)) && INDEX_REGISTER_P (xfoo1, strict)) return true; if (CONST_INT_P (xfoo1) - && INTVAL (xfoo1) == (int)GET_MODE_SIZE (mode) + && GET_MODE_SIZE (mode) == (log_p ? 1 << INTVAL (xfoo1) : INTVAL (xfoo1)) && INDEX_REGISTER_P (xfoo0, strict)) return true; -- cgit v1.1 From 37d2b98100cefcb9d312d379473c12aa6d61fc62 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Tue, 27 Apr 2021 14:18:25 -0400 Subject: c++: Fix Bases(args...)... base initialization [PR88580] When substituting into the arguments of a base initializer pack expansion, tsubst_initializer_list uses a dummy EXPR_PACK_EXPANSION in order to expand an initializer such as Bases(args)... into Bases#{0}(args#{0}) and so on. But when an argument inside the base initializer is itself a pack expansion, as in Bases(args...)..., the argument is already an EXPR_PACK_EXPANSION so we don't need to wrap it. It's also independent from the outer expansion of Bases, so we need to "multiplicatively" append the expansion of args... onto the argument list of each expanded base. gcc/cp/ChangeLog: PR c++/88580 * pt.c (tsubst_initializer_list): Correctly handle the case where an argument inside a base initializer pack expansion is itself a pack expansion. gcc/testsuite/ChangeLog: PR c++/88580 * g++.dg/cpp0x/variadic182.C: New test. --- gcc/cp/pt.c | 28 ++++++++++++++++++++-------- gcc/testsuite/g++.dg/cpp0x/variadic182.C | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic182.C (limited to 'gcc') diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8c3c814..eaf4665 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -26389,9 +26389,16 @@ tsubst_initializer_list (tree t, tree argvec) tree expanded_exprs; /* Expand the argument. */ - SET_PACK_EXPANSION_PATTERN (expr, TREE_VALUE (arg)); + tree value; + if (TREE_CODE (TREE_VALUE (arg)) == EXPR_PACK_EXPANSION) + value = TREE_VALUE (arg); + else + { + value = expr; + SET_PACK_EXPANSION_PATTERN (value, TREE_VALUE (arg)); + } expanded_exprs - = tsubst_pack_expansion (expr, argvec, + = tsubst_pack_expansion (value, argvec, tf_warning_or_error, NULL_TREE); if (expanded_exprs == error_mark_node) @@ -26400,12 +26407,17 @@ tsubst_initializer_list (tree t, tree argvec) /* Prepend each of the expanded expressions to the corresponding TREE_LIST in EXPANDED_ARGUMENTS. */ for (i = 0; i < len; i++) - { - TREE_VEC_ELT (expanded_arguments, i) = - tree_cons (NULL_TREE, - TREE_VEC_ELT (expanded_exprs, i), - TREE_VEC_ELT (expanded_arguments, i)); - } + if (TREE_CODE (TREE_VALUE (arg)) == EXPR_PACK_EXPANSION) + for (int j = 0; j < TREE_VEC_LENGTH (expanded_exprs); j++) + TREE_VEC_ELT (expanded_arguments, i) + = tree_cons (NULL_TREE, + TREE_VEC_ELT (expanded_exprs, j), + TREE_VEC_ELT (expanded_arguments, i)); + else + TREE_VEC_ELT (expanded_arguments, i) + = tree_cons (NULL_TREE, + TREE_VEC_ELT (expanded_exprs, i), + TREE_VEC_ELT (expanded_arguments, i)); } in_base_initializer = 0; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic182.C b/gcc/testsuite/g++.dg/cpp0x/variadic182.C new file mode 100644 index 0000000..078de74 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic182.C @@ -0,0 +1,18 @@ +// PR c++/88580 +// { dg-do compile { target c++11 } } + +template +struct Derived : Bases... { + template + Derived(Ts... args) : Bases(args, args..., args)... { } +}; + +struct A { }; +struct B { }; +struct C { }; + +struct Base1 { Base1(A, A, B, C, A); }; +struct Base2 { Base2(B, A, B, C, B); }; +struct Base3 { Base3(C, A, B, C, C); }; + +Derived d(A{}, B{}, C{}); -- cgit v1.1 From 37846c42f1f5ac4d9ba190d49c4373673c89c8b5 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 23 Apr 2021 16:41:35 -0400 Subject: c++: -Wdeprecated-copy and using operator= [PR92145] For the purpose of [depr.impldec] "if the class has a user-declared copy assignment operator", an operator= brought in from a base class with 'using' may be a copy-assignment operator, but it isn't a copy-assignment operator for the derived class. gcc/cp/ChangeLog: PR c++/92145 * class.c (classtype_has_depr_implicit_copy): Check DECL_CONTEXT of operator=. gcc/testsuite/ChangeLog: PR c++/92145 * g++.dg/cpp0x/depr-copy3.C: New test. --- gcc/cp/class.c | 3 ++- gcc/testsuite/g++.dg/cpp0x/depr-copy3.C | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/depr-copy3.C (limited to 'gcc') diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 90b3438..2cf527e 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5670,7 +5670,8 @@ classtype_has_depr_implicit_copy (tree t) iter; ++iter) { tree fn = *iter; - if (user_provided_p (fn) && copy_fn_p (fn)) + if (DECL_CONTEXT (fn) == t + && user_provided_p (fn) && copy_fn_p (fn)) return fn; } diff --git a/gcc/testsuite/g++.dg/cpp0x/depr-copy3.C b/gcc/testsuite/g++.dg/cpp0x/depr-copy3.C new file mode 100644 index 0000000..c303c9d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/depr-copy3.C @@ -0,0 +1,35 @@ +// PR c++/92145 +// { dg-do compile { target c++11 } } +// { dg-additional-options "-Wdeprecated-copy" } + +struct base +{ + base() { } + base(const base&) { } + base(base&&) { } + base& operator=(const base&) { return *this; } + base& operator=(base&&) { return *this; } +}; + +struct foo : base +{ + //using base::base; + using base::operator=; +}; + +struct bar +{ + bar& operator=(foo v) + { + value = v; + return *this; + } + + foo value; +}; + +int main() +{ + foo a; + foo{a}; +} -- cgit v1.1 From 0366e2b40e9ea5fc61c9a694de0c8c76a238b03c Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Tue, 27 Apr 2021 16:09:07 -0400 Subject: aix: Alias -m64 to -maix64 and -m32 to -maix32. GCC on AIX historically has used -maix64 and -maix32 to switch to 64 bit mode or 32 bit mode, unlike other ports that use -m64 and -m32. The Alias() directive for options cannot be used because aix64 is expected in multiple parts of the compiler infrastructure and one cannot switch to -m64 due to backward compatibility. This patch defines DRIVER_SELF_SPECS to translate -m64 to -maix64 and -m32 to -maix32 so that the command line option compatible with other targets can be used while continuing to allow the historical options. gcc/ChangeLog: * config/rs6000/aix.h (SUBTARGET_DRIVER_SELF_SPECS): New. * config/rs6000/aix64.opt (m64): New. (m32): New. --- gcc/config/rs6000/aix.h | 6 ++++++ gcc/config/rs6000/aix64.opt | 6 ++++++ 2 files changed, 12 insertions(+) (limited to 'gcc') diff --git a/gcc/config/rs6000/aix.h b/gcc/config/rs6000/aix.h index b116e1a..662785c 100644 --- a/gcc/config/rs6000/aix.h +++ b/gcc/config/rs6000/aix.h @@ -280,3 +280,9 @@ #define RS6000_USE_DWARF_NUMBERING #define TARGET_PRECOMPUTE_TLS_P rs6000_aix_precompute_tls_p + +/* Replace -m64 with -maix64 and -m32 with -maix32. */ +#undef SUBTARGET_DRIVER_SELF_SPECS +#define SUBTARGET_DRIVER_SELF_SPECS \ +"%{m64:-maix64} % Date: Wed, 28 Apr 2021 00:16:36 +0000 Subject: Daily bump. --- gcc/ChangeLog | 187 ++++++++++++++++++++++++++++++++++++++++++++++++ gcc/DATESTAMP | 2 +- gcc/cp/ChangeLog | 13 ++++ gcc/testsuite/ChangeLog | 108 ++++++++++++++++++++++++++++ 4 files changed, 309 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c93637..74eda05 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,190 @@ +2021-04-27 David Edelsohn + + * config/rs6000/aix.h (SUBTARGET_DRIVER_SELF_SPECS): New. + * config/rs6000/aix64.opt (m64): New. + (m32): New. + +2021-04-27 Maciej W. Rozycki + + * config/vax/vax.c (print_operand_address, vax_address_cost_1) + (index_term_p): Handle ASHIFT too. + +2021-04-27 Maciej W. Rozycki + + * config/vax/builtins.md (jbbi): Remove operand #3. + (sync_lock_test_and_set): Adjust accordingly. + (sync_lock_release): Likewise. + +2021-04-27 Maciej W. Rozycki + + * config/vax/vax-protos.h (adjacent_operands_p): Remove + prototype. + * config/vax/vax.c (adjacent_operands_p): Remove. + +2021-04-27 Maciej W. Rozycki + + * ifcvt.c (dead_or_predicable) [!IFCVT_MODIFY_TESTS]: Fall + through to the non-conditional execution case if getting the + condition for conditional execution has failed. + +2021-04-27 Richard Sandiford + + PR middle-end/100284 + * gimple.c (gimple_could_trap_p_1): Remove VEC_COND_EXPR test. + * tree-eh.c (operation_could_trap_p): Handle VEC_COND_EXPR rather + than asserting on it. + +2021-04-27 David Edelsohn + + * config/rs6000/rs6000.c (rs6000_aix_precompute_tls_p): Protect + with TARGET_AIX_OS. + +2021-04-27 David Edelsohn + + PR target/94177 + * calls.c (precompute_register_parameters): Additionally test + targetm.precompute_tls_p to pre-compute argument. + * config/rs6000/aix.h (TARGET_PRECOMPUTE_TLS_P): Define. + * config/rs6000/rs6000.c (rs6000_aix_precompute_tls_p): New. + * target.def (precompute_tls_p): New. + * doc/tm.texi.in (TARGET_PRECOMPUTE_TLS_P): Add hook documentation. + * doc/tm.texi: Regenerated. + +2021-04-27 Jakub Jelinek + + PR target/100200 + * config/aarch64/aarch64.c (aarch64_print_operand): Cast -UINTVAL + back to HOST_WIDE_INT. + +2021-04-27 Bernd Edlinger + + PR target/100106 + * simplify-rtx.c (simplify_context::simplify_subreg): Check the + memory alignment for the outer mode. + +2021-04-27 H.J. Lu + + PR middle-end/90773 + * expr.c (op_by_pieces_d::get_usable_mode): New member function. + (op_by_pieces_d::run): Cange a while loop to a do-while loop. + +2021-04-27 Alex Coplan + + PR target/99977 + * config/arm/arm.c (arm_split_compare_and_swap): Fix up codegen + with negative immediates: ensure we expand cbranchsi4_scratch + correctly and ensure we satisfy its constraints. + * config/arm/sync.md + (@atomic_compare_and_swap_1): Don't + attempt to tie two output operands together with constraints; + collapse two alternatives. + (@atomic_compare_and_swap_1): Likewise. + * config/arm/thumb1.md (cbranchsi4_neg_late): New. + +2021-04-27 Jakub Jelinek + + PR target/100200 + * config/aarch64/predicates.md (aarch64_sub_immediate, + aarch64_plus_immediate): Use -UINTVAL instead of -INTVAL. + * config/aarch64/aarch64.md (casesi, rotl3): Likewise. + * config/aarch64/aarch64.c (aarch64_print_operand, + aarch64_split_atomic_op, aarch64_expand_subvti): Likewise. + +2021-04-27 Jakub Jelinek + + PR tree-optimization/100239 + * tree-vect-generic.c (lower_vec_perm): Don't accept constant + permutations with all indices from the first zero element as vec_shl. + +2021-04-27 Jakub Jelinek + + PR rtl-optimization/100254 + * cfgcleanup.c (outgoing_edges_match): Check REG_EH_REGION on + last1 and last2 insns rather than BB_END (bb1) and BB_END (bb2) insns. + +2021-04-27 Richard Biener + + PR tree-optimization/99912 + * passes.def: Add comment about new TODO_remove_unused_locals. + * tree-stdarg.c (pass_data_stdarg): Run TODO_remove_unused_locals + at start. + +2021-04-27 Richard Biener + + PR tree-optimization/99912 + * passes.def (pass_all_optimizations): Add pass_dse before + the first pass_dce, move the first pass_dse before the + pass_dce following pass_pre. + +2021-04-27 Jakub Jelinek + + PR tree-optimization/95527 + * generic-match-head.c: Include tm.h. + * gimple-match-head.c: Include tm.h. + * match.pd (CLZ == INTEGER_CST): Don't use + #ifdef CLZ_DEFINED_VALUE_AT_ZERO, only test CLZ_DEFINED_VALUE_AT_ZERO + if clz == CFN_CLZ. Add missing val declaration. + (CTZ cmp CST): New simplifications. + +2021-04-27 Jakub Jelinek + + PR tree-optimization/96696 + * expr.c (expand_expr_divmod): New function. + (expand_expr_real_2) : Use it for truncations and + divisions. Formatting fixes. + : Optimize x / y * y as x - x % y if the latter is + cheaper. + +2021-04-27 Martin Jambor + + PR ipa/99951 + * ipa-param-manipulation.c (ipa_param_adjustments::modify_call): + If removing a call statement LHS SSA name, release it. + +2021-04-27 Richard Earnshaw + + PR target/100236 + * config/arm/arm.c (THUMB2_WORK_REGS): Check PIC_OFFSET_TABLE_REGNUM + is valid before including it in the mask. + +2021-04-27 Richard Sandiford + + PR target/100270 + * config/aarch64/aarch64.c (aarch64_comp_type_attributes): Handle + SVE attributes. + +2021-04-27 Richard Biener + + PR tree-optimization/100051 + * tree-ssa-alias.c (indirect_ref_may_alias_decl_p): Add + disambiguator based on access size vs. decl size. + +2021-04-27 Richard Biener + + PR tree-optimization/100278 + * tree-ssa-pre.c (compute_avail): Give up when we cannot + adjust TBAA beacuse of mismatching bases. + +2021-04-27 Jakub Jelinek + + PR target/99405 + * config/i386/i386.md (*3_mask, *3_mask_1): + For any_rotate define_insn_split and following splitters, use + SWI iterator instead of SWI48. + +2021-04-27 Richard Biener + + PR tree-optimization/99776 + * match.pd (bit_field_ref (ctor)): Relax element extract + type compatibility checks. + +2021-04-27 Cui,Lili + + * common/config/i386/i386-common.c (processor_names): + Sync processor_names with processor_type. + * config/i386/i386-options.c (processor_cost_table): + Sync processor_cost_table with processor_type. + 2021-04-26 Aldy Hernandez * value-range.cc (irange::irange_set_1bit_anti_range): Add assert. diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index f347a06..5bc3f0e 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20210427 +20210428 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ec6e1d6..ca8382f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2021-04-27 Jason Merrill + + PR c++/92145 + * class.c (classtype_has_depr_implicit_copy): Check DECL_CONTEXT + of operator=. + +2021-04-27 Patrick Palka + + PR c++/88580 + * pt.c (tsubst_initializer_list): Correctly handle the case + where an argument inside a base initializer pack expansion is + itself a pack expansion. + 2021-04-26 Patrick Palka PR c++/100209 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 26c41ac..122dddc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,111 @@ +2021-04-27 Jason Merrill + + PR c++/92145 + * g++.dg/cpp0x/depr-copy3.C: New test. + +2021-04-27 Patrick Palka + + PR c++/88580 + * g++.dg/cpp0x/variadic182.C: New test. + +2021-04-27 Richard Sandiford + + PR middle-end/100284 + * gcc.target/aarch64/sve/pr81003.c: New test. + +2021-04-27 Martin Sebor + + PR testsuite/100272 + * g++.dg/ext/flexary13.C: Remove malformed directives. + +2021-04-27 Bernd Edlinger + + PR target/100106 + * gcc.c-torture/compile/pr100106.c: New testcase. + +2021-04-27 Alex Coplan + + PR target/99977 + * gcc.target/arm/pr99977.c: New test. + +2021-04-27 Jakub Jelinek + + PR tree-optimization/100239 + * gcc.dg/pr100239.c: New test. + +2021-04-27 Jakub Jelinek + + PR rtl-optimization/100254 + * g++.dg/opt/pr100254.C: New test. + +2021-04-27 Richard Biener + + PR tree-optimization/99912 + * gcc.dg/tree-ssa/ldist-33.c: Disable PRE and LIM. + * gcc.dg/tree-ssa/pr96789.c: Adjust dump file scanned. + * gcc.dg/tree-ssa/ssa-dse-28.c: Likewise. + * gcc.dg/tree-ssa/ssa-dse-29.c: Likewise. + +2021-04-27 Jakub Jelinek + + PR tree-optimization/95527 + * gcc.dg/tree-ssa/pr95527-2.c: New test. + +2021-04-27 Jakub Jelinek + + PR tree-optimization/96696 + * gcc.target/i386/pr96696.c: New test. + +2021-04-27 Richard Sandiford + + PR target/100270 + * gcc.target/aarch64/sve/acle/general-c/pr100270_1.c: New test. + * gcc.target/aarch64/sve/acle/general-c/sizeless-2.c: Change + expected error message when subtracting pointers to different + vector types. Expect warnings when mixing them elsewhere. + * gcc.target/aarch64/sve/acle/general/attributes_7.c: Remove + XFAILs. Tweak error messages for some cases. + +2021-04-27 Richard Sandiford + + * gcc.target/aarch64/simd/ssra.c: Use +nosve + * gcc.target/aarch64/simd/usra.c: Likewise. + +2021-04-27 Richard Biener + + PR tree-optimization/100051 + * gcc.dg/tree-ssa/ssa-fre-92.c: New testcase. + +2021-04-27 Richard Biener + + PR testsuite/100272 + * gcc.dg/tree-ssa/predcom-1.c: Re-enable PRE and fix + malformed dg directive. + +2021-04-27 Richard Biener + + PR testsuite/100272 + * g++.dg/diagnostic/ptrtomem1.C: Fix dg directives. + * g++.dg/ipa/pr45572-2.C: Likewise. + * g++.dg/template/spec26.C: Likewise. + * gcc.dg/pr20126.c: Likewise. + * gcc.dg/tree-ssa/pr20739.c: Likewise. + +2021-04-27 Richard Biener + + PR tree-optimization/100278 + * gcc.dg/tree-ssa/pr100278.c: New testcase. + +2021-04-27 Jakub Jelinek + + PR target/99405 + * gcc.target/i386/pr99405.c: New test. + +2021-04-27 Richard Biener + + PR tree-optimization/99776 + * gcc.dg/tree-ssa/ssa-fre-91.c: New testcase. + 2021-04-26 Patrick Palka PR c++/100209 -- cgit v1.1 From 852dd866e2faba95cb407c98d31a48b6aae66677 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 28 Apr 2021 09:43:02 +0200 Subject: Fix loss of optimization of array iteration due to inlining This helps loop-invariant motion to hoist complicated offset computations. gcc/ada/ * gcc-interface/trans.c (language_function): Add comment. (loop_info_d): Add fndecl and invariants fields. (find_loop_for): Test fndecl instead of the context of var. (find_loop): New function. (Regular_Loop_to_gnu): Fold back into... (Loop_Statement_to_gnu): ...this. Emit invariants on entry, if any. (gnat_to_gnu) : Record nonconstant invariant offset computations in loops when optimization is enabled. * gcc-interface/utils2.c (gnat_invariant_expr): Handle BIT_AND_EXPR. gcc/testsuite/ * gnat.dg/opt93.ads, gnat.dg/opt93.adb: New test. --- gcc/ada/gcc-interface/trans.c | 134 +++++++++++++++++++++++----------------- gcc/ada/gcc-interface/utils2.c | 11 ++++ gcc/testsuite/gnat.dg/opt93.adb | 20 ++++++ gcc/testsuite/gnat.dg/opt93.ads | 14 +++++ 4 files changed, 121 insertions(+), 58 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/opt93.adb create mode 100644 gcc/testsuite/gnat.dg/opt93.ads (limited to 'gcc') diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 5a55ca4..4e533ce 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -112,7 +112,7 @@ struct GTY (()) parm_attr_d { typedef struct parm_attr_d *parm_attr; - +/* Structure used to record information for a function. */ struct GTY(()) language_function { vec *parm_attr_cache; bitmap named_ret_val; @@ -194,9 +194,9 @@ struct GTY(()) range_check_info_d { typedef struct range_check_info_d *range_check_info; - /* Structure used to record information for a loop. */ struct GTY(()) loop_info_d { + tree fndecl; tree stmt; tree loop_var; tree low_bound; @@ -205,11 +205,11 @@ struct GTY(()) loop_info_d { tree omp_construct_clauses; enum tree_code omp_code; vec *checks; + vec *invariants; }; typedef struct loop_info_d *loop_info; - /* Stack of loop_info structures associated with LOOP_STMT nodes. */ static GTY(()) vec *gnu_loop_stack; @@ -2768,13 +2768,27 @@ find_loop_for (tree expr, tree *disp, bool *neg_p) if (TREE_CODE (var) != VAR_DECL) return NULL; - if (decl_function_context (var) != current_function_decl) - return NULL; + gcc_checking_assert (vec_safe_length (gnu_loop_stack) > 0); + + FOR_EACH_VEC_ELT_REVERSE (*gnu_loop_stack, i, iter) + if (iter->loop_var == var && iter->fndecl == current_function_decl) + break; + + return iter; +} - gcc_assert (vec_safe_length (gnu_loop_stack) > 0); +/* Return the innermost enclosing loop in the current function. */ + +static struct loop_info_d * +find_loop (void) +{ + struct loop_info_d *iter = NULL; + unsigned int i; + + gcc_checking_assert (vec_safe_length (gnu_loop_stack) > 0); FOR_EACH_VEC_ELT_REVERSE (*gnu_loop_stack, i, iter) - if (var == iter->loop_var) + if (iter->fndecl == current_function_decl) break; return iter; @@ -2924,26 +2938,30 @@ independent_iterations_p (tree stmt_list) return true; } -/* Helper for Loop_Statement_to_gnu, to translate the body of a loop not - subject to any sort of parallelization directive or restriction, designated - by GNAT_NODE. - - We expect the top of gnu_loop_stack to hold a pointer to the loop info - setup for the translation, which holds a pointer to the initial gnu loop - stmt node. We return the new gnu loop statement to use. - - We might also set *GNU_COND_EXPR_P to request a variant of the translation - scheme in Loop_Statement_to_gnu. */ +/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Loop_Statement, + to a GCC tree, which is returned. */ static tree -Regular_Loop_to_gnu (Node_Id gnat_node, tree *gnu_cond_expr_p) +Loop_Statement_to_gnu (Node_Id gnat_node) { const Node_Id gnat_iter_scheme = Iteration_Scheme (gnat_node); - struct loop_info_d *const gnu_loop_info = gnu_loop_stack->last (); - tree gnu_loop_stmt = gnu_loop_info->stmt; - tree gnu_loop_label = LOOP_STMT_LABEL (gnu_loop_stmt); - tree gnu_cond_expr = *gnu_cond_expr_p; - tree gnu_low = NULL_TREE, gnu_high = NULL_TREE; + struct loop_info_d *gnu_loop_info = ggc_cleared_alloc (); + tree gnu_loop_stmt = build4 (LOOP_STMT, void_type_node, NULL_TREE, + NULL_TREE, NULL_TREE, NULL_TREE); + tree gnu_loop_label = create_artificial_label (input_location); + tree gnu_cond_expr = NULL_TREE, gnu_low = NULL_TREE, gnu_high = NULL_TREE; + tree gnu_result; + + /* Push the loop_info structure associated with the LOOP_STMT. */ + gnu_loop_info->fndecl = current_function_decl; + gnu_loop_info->stmt = gnu_loop_stmt; + vec_safe_push (gnu_loop_stack, gnu_loop_info); + + /* Set location information for statement and end label. */ + set_expr_location_from_node (gnu_loop_stmt, gnat_node); + Sloc_to_locus (Sloc (End_Label (gnat_node)), + &DECL_SOURCE_LOCATION (gnu_loop_label)); + LOOP_STMT_LABEL (gnu_loop_stmt) = gnu_loop_label; /* Set the condition under which the loop must keep going. If we have an explicit condition, use it to set the location information throughout @@ -3277,7 +3295,16 @@ Regular_Loop_to_gnu (Node_Id gnat_node, tree *gnu_cond_expr_p) } } - /* Second, if loop vectorization is enabled and the iterations of the + /* Second, if we have recorded invariants to be hoisted, emit them. */ + if (vec_safe_length (gnu_loop_info->invariants) > 0) + { + tree *iter; + unsigned int i; + FOR_EACH_VEC_ELT (*gnu_loop_info->invariants, i, iter) + add_stmt_with_node_force (*iter, gnat_node); + } + + /* Third, if loop vectorization is enabled and the iterations of the loop can easily be proved as independent, mark the loop. */ if (optimize >= 3 && independent_iterations_p (LOOP_STMT_BODY (gnu_loop_stmt))) @@ -3288,40 +3315,6 @@ Regular_Loop_to_gnu (Node_Id gnat_node, tree *gnu_cond_expr_p) gnu_loop_stmt = end_stmt_group (); } - *gnu_cond_expr_p = gnu_cond_expr; - - return gnu_loop_stmt; -} - -/* Subroutine of gnat_to_gnu to translate gnat_node, an N_Loop_Statement, - to a GCC tree, which is returned. */ - -static tree -Loop_Statement_to_gnu (Node_Id gnat_node) -{ - struct loop_info_d *gnu_loop_info = ggc_cleared_alloc (); - - tree gnu_loop_stmt = build4 (LOOP_STMT, void_type_node, NULL_TREE, - NULL_TREE, NULL_TREE, NULL_TREE); - tree gnu_cond_expr = NULL_TREE; - tree gnu_loop_label = create_artificial_label (input_location); - tree gnu_result; - - /* Push the loop_info structure associated with the LOOP_STMT. */ - vec_safe_push (gnu_loop_stack, gnu_loop_info); - - /* Set location information for statement and end label. */ - set_expr_location_from_node (gnu_loop_stmt, gnat_node); - Sloc_to_locus (Sloc (End_Label (gnat_node)), - &DECL_SOURCE_LOCATION (gnu_loop_label)); - LOOP_STMT_LABEL (gnu_loop_stmt) = gnu_loop_label; - - /* Save the statement for later reuse. */ - gnu_loop_info->stmt = gnu_loop_stmt; - - /* Perform the core loop body translation. */ - gnu_loop_stmt = Regular_Loop_to_gnu (gnat_node, &gnu_cond_expr); - /* If we have an outer COND_EXPR, that's our result and this loop is its "true" statement. Otherwise, the result is the LOOP_STMT. */ if (gnu_cond_expr) @@ -6731,6 +6724,8 @@ gnat_to_gnu (Node_Id gnat_node) else { tree gnu_field = gnat_to_gnu_field_decl (gnat_field); + tree gnu_offset; + struct loop_info_d *loop; gnu_result = build_component_ref (gnu_prefix, gnu_field, @@ -6738,6 +6733,29 @@ gnat_to_gnu (Node_Id gnat_node) == N_Attribute_Reference) && lvalue_required_for_attribute_p (Parent (gnat_node))); + + /* If optimization is enabled and we are inside a loop, we try to + hoist nonconstant but invariant offset computations outside of + the loop, since they very likely contain loads that could turn + out to be hard to move if they end up in active EH regions. */ + if (optimize + && inside_loop_p () + && TREE_CODE (gnu_result) == COMPONENT_REF + && (gnu_offset = component_ref_field_offset (gnu_result)) + && !TREE_CONSTANT (gnu_offset) + && (gnu_offset = gnat_invariant_expr (gnu_offset)) + && (loop = find_loop ())) + { + tree invariant + = build1 (SAVE_EXPR, TREE_TYPE (gnu_offset), gnu_offset); + vec_safe_push (loop->invariants, invariant); + tree field = TREE_OPERAND (gnu_result, 1); + tree factor + = size_int (DECL_OFFSET_ALIGN (field) / BITS_PER_UNIT); + /* Divide the offset by its alignment. */ + TREE_OPERAND (gnu_result, 2) + = size_binop (EXACT_DIV_EXPR, invariant, factor); + } } gnu_result_type = get_unpadded_type (Etype (gnat_node)); diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index 316033b..83cc794 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -2946,6 +2946,17 @@ gnat_invariant_expr (tree expr) if (TREE_CONSTANT (expr)) return fold_convert (type, expr); + /* Deal with aligning patterns. */ + if (TREE_CODE (expr) == BIT_AND_EXPR + && TREE_CONSTANT (TREE_OPERAND (expr, 1))) + { + tree op0 = gnat_invariant_expr (TREE_OPERAND (expr, 0)); + if (op0) + return fold_build2 (BIT_AND_EXPR, type, op0, TREE_OPERAND (expr, 1)); + else + return NULL_TREE; + } + /* Deal with addition or subtraction of constants. */ if (is_simple_additive_expression (expr, &add, &cst, &minus_p)) { diff --git a/gcc/testsuite/gnat.dg/opt93.adb b/gcc/testsuite/gnat.dg/opt93.adb new file mode 100644 index 0000000..5c82ad2 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt93.adb @@ -0,0 +1,20 @@ +-- { dg-do compile } +-- { dg-options "-O2 -fdump-tree-optimized" } + +package body Opt93 is + + function Worker (Obj : T) return Boolean is + begin + return (for some J in 1 .. Obj.D2 => Obj.A (J) = 0); + end; + + function Contains_Zero (Obj : T) return Boolean is + begin + return Worker (Obj); + exception + when Others => raise Program_Error; + end; + +end Opt93; + +-- { dg-final { scan-tree-dump "ivtmp.\[0-9_]+ = ivtmp.\[0-9_]+ \\+ 2" "optimized" } } diff --git a/gcc/testsuite/gnat.dg/opt93.ads b/gcc/testsuite/gnat.dg/opt93.ads new file mode 100644 index 0000000..61bc236 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt93.ads @@ -0,0 +1,14 @@ +package Opt93 is + + type Arr is array (Natural range <>) of Short_Integer; + + type Rec (D1, D2 : Natural) is record + S : String (1 .. D1); + A : Arr (1 .. D2); + end record; + + type T is access Rec; + + function Contains_Zero (Obj : T) return Boolean; + +end Opt93; -- cgit v1.1 From b81e2d5e76a6bcc71f45b122e8b5538ddb7ebf4c Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 28 Apr 2021 09:58:21 +0200 Subject: Get rid of useless temporary for call to pure function This avoids creating a useless temporary for a call to a pure function with good properties by using the RSO. gcc/ada/ * gcc-interface/trans.c (is_array_of_scalar_type): New predicate. (find_decls_r): New function. (return_slot_opt_for_pure_call_p): New predicate. (Call_to_gnu): Do not create a temporary for the return value if the parent node is an aggregate. If there is a target, try to apply the return slot optimization to regular calls to pure functions returning an array of scalar type. --- gcc/ada/gcc-interface/trans.c | 94 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 9 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 4e533ce..07f5e81 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -4377,6 +4377,69 @@ create_init_temporary (const char *prefix, tree gnu_init, tree *gnu_init_stmt, return gnu_temp; } +/* Return true if TYPE is an array of scalar type. */ + +static bool +is_array_of_scalar_type (tree type) +{ + if (TREE_CODE (type) != ARRAY_TYPE) + return false; + + type = TREE_TYPE (type); + + return !AGGREGATE_TYPE_P (type) && !POINTER_TYPE_P (type); +} + +/* Helper function for walk_tree, used by return_slot_opt_for_pure_call_p. */ + +static tree +find_decls_r (tree *tp, int *walk_subtrees, void *data) +{ + bitmap decls = (bitmap) data; + + if (TYPE_P (*tp)) + *walk_subtrees = 0; + + else if (DECL_P (*tp)) + bitmap_set_bit (decls, DECL_UID (*tp)); + + return NULL_TREE; +} + +/* Return whether the assignment TARGET = CALL can be subject to the return + slot optimization, under the assumption that the called function be pure + in the Ada sense and return an array of scalar type. */ + +static bool +return_slot_opt_for_pure_call_p (tree target, tree call) +{ + /* Check that the target is a DECL. */ + if (!DECL_P (target)) + return false; + + const bitmap decls = BITMAP_GGC_ALLOC (); + call_expr_arg_iterator iter; + tree arg; + + /* Check that all the arguments have either a scalar type (we assume that + this means by-copy passing mechanism) or array of scalar type. */ + FOR_EACH_CALL_EXPR_ARG (arg, iter, call) + { + tree arg_type = TREE_TYPE (arg); + if (TREE_CODE (arg_type) == REFERENCE_TYPE) + arg_type = TREE_TYPE (arg_type); + + if (is_array_of_scalar_type (arg_type)) + walk_tree_without_duplicates (&arg, find_decls_r, decls); + + else if (AGGREGATE_TYPE_P (arg_type) || POINTER_TYPE_P (arg_type)) + return false; + } + + /* Check that the target is not referenced by the non-scalar arguments. */ + return !bitmap_bit_p (decls, DECL_UID (target)); +} + /* Subroutine of gnat_to_gnu to translate gnat_node, either an N_Function_Call or an N_Procedure_Call_Statement, to a GCC tree, which is returned. GNU_RESULT_TYPE_P is a pointer to where we should place the result type. @@ -4501,15 +4564,16 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, because we need to preserve the return value before copying back the parameters. - 2. There is no target and the call is made for neither an object, nor a - renaming declaration, nor a return statement, nor an allocator, and - the return type has variable size because in this case the gimplifier - cannot create the temporary, or more generally is an aggregate type, - because the gimplifier would create the temporary in the outermost - scope instead of locally. But there is an exception for an allocator - of an unconstrained record type with default discriminant because we - allocate the actual size in this case, unlike the other 3 cases, so - we need a temporary to fetch the discriminant and we create it here. + 2. There is no target and the call is made for neither the declaration + of an object (regular or renaming), nor a return statement, nor an + allocator, nor an aggregate, and the return type has variable size + because in this case the gimplifier cannot create the temporary, or + more generally is an aggregate type, because the gimplifier would + create the temporary in the outermost scope instead of locally here. + But there is an exception for an allocator of unconstrained record + type with default discriminant because we allocate the actual size + in this case, unlike in the other cases, so we need a temporary to + fetch the discriminant and we create it here. 3. There is a target and it is a slice or an array with fixed size, and the return type has variable size, because the gimplifier @@ -4535,6 +4599,7 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, && (!(Nkind (Parent (gnat_node)) == N_Qualified_Expression && Nkind (Parent (Parent (gnat_node))) == N_Allocator) || type_is_padding_self_referential (gnu_result_type)) + && Nkind (Parent (gnat_node)) != N_Aggregate && AGGREGATE_TYPE_P (gnu_result_type) && !TYPE_IS_FAT_POINTER_P (gnu_result_type)) || (gnu_target @@ -5153,6 +5218,17 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, That's what has been done historically. */ if (return_type_with_variable_size_p (gnu_result_type)) op_code = INIT_EXPR; + + /* If this is a call to a pure function returning an array of scalar + type, try to apply the return slot optimization. */ + else if ((TYPE_READONLY (gnu_subprog_type) + || TYPE_RESTRICT (gnu_subprog_type)) + && is_array_of_scalar_type (gnu_result_type) + && TYPE_MODE (gnu_result_type) == BLKmode + && aggregate_value_p (gnu_result_type, gnu_subprog_type) + && return_slot_opt_for_pure_call_p (gnu_target, gnu_call)) + op_code = INIT_EXPR; + else op_code = MODIFY_EXPR; -- cgit v1.1 From fccc47dddc2ee605dd7fce5c1d1711404e19cd7f Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 28 Apr 2021 10:21:59 +0200 Subject: Avoid creating useless local bounds around calls This prevents the compiler from creating useless local bounds around calls that take a parameter of an unconstrained array type when the bounds already exist somewhere else for the actual parameter. gcc/ada/ * gcc-interface/decl.c (gnat_to_gnu_subprog_type): Do not demote a const or pure function because of a parameter whose type is pointer to function. * gcc-interface/trans.c (Call_to_gnu): Do not put back a conversion between an actual and a formal that are unconstrained array types. (gnat_gimplify_expr) : New case. * gcc-interface/utils2.c (build_binary_op): Do not use |= operator. (gnat_stabilize_reference_1): Likewise. (gnat_rewrite_reference): Likewise. (build_unary_op): Do not clear existing TREE_CONSTANT on the result. (gnat_build_constructor): Also accept the address of a constant CONSTRUCTOR as constant element. --- gcc/ada/gcc-interface/decl.c | 11 ++++++----- gcc/ada/gcc-interface/trans.c | 34 +++++++++++++++++++++++++++++++++- gcc/ada/gcc-interface/utils2.c | 40 +++++++++++++++++++++++++--------------- 3 files changed, 64 insertions(+), 21 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 27ef51a..6fd5c2c 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -6059,12 +6059,13 @@ gnat_to_gnu_subprog_type (Entity_Id gnat_subprog, bool definition, /* A pure function in the Ada sense which takes an access parameter may modify memory through it and thus need be considered neither - const nor pure in the GCC sense. Likewise it if takes a by-ref - In Out or Out parameter. But if it takes a by-ref In parameter, - then it may only read memory through it and can be considered - pure in the GCC sense. */ + const nor pure in the GCC sense, unless it's access-to-function. + Likewise it if takes a by-ref In Out or Out parameter. But if it + takes a by-ref In parameter, then it may only read memory through + it and can be considered pure in the GCC sense. */ if ((const_flag || pure_flag) - && (POINTER_TYPE_P (gnu_param_type) + && ((POINTER_TYPE_P (gnu_param_type) + && TREE_CODE (TREE_TYPE (gnu_param_type)) != FUNCTION_TYPE) || TYPE_IS_FAT_POINTER_P (gnu_param_type))) { const_flag = false; diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 07f5e81..2461259 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -4816,7 +4816,9 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, may have suppressed a conversion to the Etype of the actual earlier, since the parent is a procedure call, so put it back here. Note that we might have a dummy type here if the actual is the dereference of a - pointer to it, but that's OK if the formal is passed by reference. */ + pointer to it, but that's OK when the formal is passed by reference. + We also do not put back a conversion between an actual and a formal + that are unconstrained array types to avoid creating local bounds. */ tree gnu_actual_type = get_unpadded_type (Etype (gnat_actual)); if (TYPE_IS_DUMMY_P (gnu_actual_type)) gcc_assert (is_true_formal_parm && DECL_BY_REF_P (gnu_formal)); @@ -4824,6 +4826,11 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, && Nkind (gnat_actual) == N_Unchecked_Type_Conversion) gnu_actual = unchecked_convert (gnu_actual_type, gnu_actual, No_Truncation (gnat_actual)); + else if ((TREE_CODE (TREE_TYPE (gnu_actual)) == UNCONSTRAINED_ARRAY_TYPE + || (TREE_CODE (TREE_TYPE (gnu_actual)) == RECORD_TYPE + && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (gnu_actual)))) + && TREE_CODE (gnu_formal_type) == UNCONSTRAINED_ARRAY_TYPE) + ; else gnu_actual = convert (gnu_actual_type, gnu_actual); @@ -8835,6 +8842,31 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p, return GS_UNHANDLED; + case CALL_EXPR: + /* If we are passing a constant fat pointer CONSTRUCTOR, make sure it is + put into static memory; this performs a restricted version of constant + propagation on fat pointers in calls. But do not do it for strings to + avoid blocking concatenation in the caller when it is inlined. */ + for (int i = 0; i < call_expr_nargs (expr); i++) + { + tree arg = *(CALL_EXPR_ARGP (expr) + i); + + if (TREE_CODE (arg) == CONSTRUCTOR + && TREE_CONSTANT (arg) + && TYPE_IS_FAT_POINTER_P (TREE_TYPE (arg))) + { + tree t = CONSTRUCTOR_ELT (arg, 0)->value; + if (TREE_CODE (t) == NOP_EXPR) + t = TREE_OPERAND (t, 0); + if (TREE_CODE (t) == ADDR_EXPR) + t = TREE_OPERAND (t, 0); + if (TREE_CODE (t) != STRING_CST) + *(CALL_EXPR_ARGP (expr) + i) = tree_output_constant_def (arg); + } + } + + return GS_UNHANDLED; + case VIEW_CONVERT_EXPR: op = TREE_OPERAND (expr, 0); diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index 83cc794..3bf0e15 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -1301,11 +1301,11 @@ build_binary_op (enum tree_code op_code, tree result_type, if (TYPE_VOLATILE (operation_type)) TREE_THIS_VOLATILE (result) = 1; } - else - TREE_CONSTANT (result) - |= (TREE_CONSTANT (left_operand) && TREE_CONSTANT (right_operand)); + else if (TREE_CONSTANT (left_operand) && TREE_CONSTANT (right_operand)) + TREE_CONSTANT (result) = 1; - TREE_SIDE_EFFECTS (result) |= has_side_effects; + if (has_side_effects) + TREE_SIDE_EFFECTS (result) = 1; /* If we are working with modular types, perform the MOD operation if something above hasn't eliminated the need for it. */ @@ -1528,7 +1528,9 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) result = build_fold_addr_expr (operand); } - TREE_CONSTANT (result) = staticp (operand) || TREE_CONSTANT (operand); + if (TREE_CONSTANT (operand) || staticp (operand)) + TREE_CONSTANT (result) = 1; + break; case INDIRECT_REF: @@ -1957,14 +1959,19 @@ gnat_build_constructor (tree type, vec *v) the elements along the way for possible sorting purposes below. */ FOR_EACH_CONSTRUCTOR_ELT (v, n_elmts, obj, val) { - /* The predicate must be in keeping with output_constructor. */ + /* The predicate must be in keeping with output_constructor and, unlike + initializer_constant_valid_p, we accept "&{...}" because we'll put + the CONSTRUCTOR into the constant pool during gimplification. */ if ((!TREE_CONSTANT (val) && !TREE_STATIC (val)) || (TREE_CODE (type) == RECORD_TYPE && CONSTRUCTOR_BITFIELD_P (obj) && !initializer_constant_valid_for_bitfield_p (val)) - || !initializer_constant_valid_p (val, - TREE_TYPE (val), - TYPE_REVERSE_STORAGE_ORDER (type))) + || (!initializer_constant_valid_p (val, + TREE_TYPE (val), + TYPE_REVERSE_STORAGE_ORDER (type)) + && !(TREE_CODE (val) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (val, 0)) == CONSTRUCTOR + && TREE_CONSTANT (TREE_OPERAND (val, 0))))) allconstant = false; if (!TREE_READONLY (val)) @@ -2676,10 +2683,13 @@ gnat_stabilize_reference_1 (tree e, void *data) gcc_unreachable (); } + /* See gnat_rewrite_reference below for the rationale. */ TREE_READONLY (result) = TREE_READONLY (e); - TREE_SIDE_EFFECTS (result) |= TREE_SIDE_EFFECTS (e); TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (e); + if (TREE_SIDE_EFFECTS (e)) + TREE_SIDE_EFFECTS (result) = 1; + return result; } @@ -2796,18 +2806,18 @@ gnat_rewrite_reference (tree ref, rewrite_fn func, void *data, tree *init) gcc_unreachable (); } - /* TREE_THIS_VOLATILE and TREE_SIDE_EFFECTS set on the initial expression - may not be sustained across some paths, such as the way via build1 for - INDIRECT_REF. We reset those flags here in the general case, which is - consistent with the GCC version of this routine. + /* TREE_READONLY and TREE_THIS_VOLATILE set on the initial expression may + not be sustained across some paths, such as the one for INDIRECT_REF. Special care should be taken regarding TREE_SIDE_EFFECTS, because some paths introduce side-effects where there was none initially (e.g. if a SAVE_EXPR is built) and we also want to keep track of that. */ TREE_READONLY (result) = TREE_READONLY (ref); - TREE_SIDE_EFFECTS (result) |= TREE_SIDE_EFFECTS (ref); TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (ref); + if (TREE_SIDE_EFFECTS (ref)) + TREE_SIDE_EFFECTS (result) = 1; + if (code == INDIRECT_REF || code == UNCONSTRAINED_ARRAY_REF || code == ARRAY_REF -- cgit v1.1 From 5b4b66291f2086f56dc3a1d7df494f901cd0b63e Mon Sep 17 00:00:00 2001 From: Richard Wai Date: Mon, 15 Mar 2021 06:24:00 -0400 Subject: [Ada] Hashed container Cursor type predefined equality non-conformance gcc/ada/ * libgnat/a-cohase.ads (Cursor): Synchronize comments for the Cursor type definition to be consistent with identical definitions in other container packages. Add additional comments regarding the importance of maintaining the "Position" component for predefined equality. * libgnat/a-cohama.ads (Cursor): Likewise. * libgnat/a-cihama.ads (Cursor): Likewise. * libgnat/a-cohase.adb (Find, Insert): Ensure that Cursor objects always have their "Position" component set to ensure predefined equality works as required. * libgnat/a-cohama.adb (Find, Insert): Likewise. * libgnat/a-cihama.adb (Find, Insert): Likewise. gcc/testsuite/ * gnat.dg/containers2.adb: New test. --- gcc/ada/libgnat/a-cihama.adb | 4 +- gcc/ada/libgnat/a-cihama.ads | 14 +++ gcc/ada/libgnat/a-cohama.adb | 5 +- gcc/ada/libgnat/a-cohama.ads | 10 ++- gcc/ada/libgnat/a-cohase.adb | 8 +- gcc/ada/libgnat/a-cohase.ads | 14 +++ gcc/testsuite/gnat.dg/containers2.adb | 158 ++++++++++++++++++++++++++++++++++ 7 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/containers2.adb (limited to 'gcc') diff --git a/gcc/ada/libgnat/a-cihama.adb b/gcc/ada/libgnat/a-cihama.adb index 7a490d5..50adea1 100644 --- a/gcc/ada/libgnat/a-cihama.adb +++ b/gcc/ada/libgnat/a-cihama.adb @@ -522,7 +522,8 @@ is return No_Element; end if; - return Cursor'(Container'Unrestricted_Access, Node, Hash_Type'Last); + return Cursor' + (Container'Unrestricted_Access, Node, HT_Ops.Index (HT, Node)); end Find; -------------------- @@ -748,6 +749,7 @@ is end if; Position.Container := Container'Unchecked_Access; + Position.Position := HT_Ops.Index (HT, Position.Node); end Insert; procedure Insert diff --git a/gcc/ada/libgnat/a-cihama.ads b/gcc/ada/libgnat/a-cihama.ads index ccf5f4e..f896167 100644 --- a/gcc/ada/libgnat/a-cihama.ads +++ b/gcc/ada/libgnat/a-cihama.ads @@ -363,8 +363,22 @@ private type Cursor is record Container : Map_Access; + -- Access to this cursor's container + Node : Node_Access; + -- Access to the node pointed to by this cursor + Position : Hash_Type := Hash_Type'Last; + -- Position of the node in the buckets of the container. If this is + -- equal to Hash_Type'Last, then it will not be used. Position is + -- not requried by the implementation, but improves the efficiency + -- of various operations. + -- + -- However, this value must be maintained so that the predefined + -- equality operation acts as required by RM A.18.4-18/2, which + -- states: "The predefined "=" operator for type Cursor returns True + -- if both cursors are No_Element, or designate the same element + -- in the same container." end record; procedure Write diff --git a/gcc/ada/libgnat/a-cohama.adb b/gcc/ada/libgnat/a-cohama.adb index 9c4e51a..fb46e07 100644 --- a/gcc/ada/libgnat/a-cohama.adb +++ b/gcc/ada/libgnat/a-cohama.adb @@ -478,7 +478,8 @@ is return No_Element; end if; - return Cursor'(Container'Unrestricted_Access, Node, Hash_Type'Last); + return Cursor' + (Container'Unrestricted_Access, Node, HT_Ops.Index (HT, Node)); end Find; -------------------- @@ -635,6 +636,7 @@ is end if; Position.Container := Container'Unrestricted_Access; + Position.Position := HT_Ops.Index (HT, Position.Node); end Insert; procedure Insert @@ -677,6 +679,7 @@ is end if; Position.Container := Container'Unrestricted_Access; + Position.Position := HT_Ops.Index (HT, Position.Node); end Insert; procedure Insert diff --git a/gcc/ada/libgnat/a-cohama.ads b/gcc/ada/libgnat/a-cohama.ads index 21b6935..c6e377c 100644 --- a/gcc/ada/libgnat/a-cohama.ads +++ b/gcc/ada/libgnat/a-cohama.ads @@ -465,7 +465,15 @@ private Position : Hash_Type := Hash_Type'Last; -- Position of the node in the buckets of the container. If this is - -- equal to Hash_Type'Last, then it will not be used. + -- equal to Hash_Type'Last, then it will not be used. Position is + -- not requried by the implementation, but improves the efficiency + -- of various operations. + -- + -- However, this value must be maintained so that the predefined + -- equality operation acts as required by RM A.18.4-18/2, which + -- states: "The predefined "=" operator for type Cursor returns True + -- if both cursors are No_Element, or designate the same element + -- in the same container." end record; procedure Read diff --git a/gcc/ada/libgnat/a-cohase.adb b/gcc/ada/libgnat/a-cohase.adb index 0131f73..aac5b1b 100644 --- a/gcc/ada/libgnat/a-cohase.adb +++ b/gcc/ada/libgnat/a-cohase.adb @@ -605,13 +605,13 @@ is is HT : Hash_Table_Type renames Container'Unrestricted_Access.HT; Node : constant Node_Access := Element_Keys.Find (HT, Item); - begin if Node = null then return No_Element; end if; - return Cursor'(Container'Unrestricted_Access, Node, Hash_Type'Last); + return Cursor' + (Container'Unrestricted_Access, Node, HT_Ops.Index (HT, Node)); end Find; -------------------- @@ -763,9 +763,11 @@ is Position : out Cursor; Inserted : out Boolean) is + HT : Hash_Table_Type renames Container'Unrestricted_Access.HT; begin Insert (Container.HT, New_Item, Position.Node, Inserted); Position.Container := Container'Unchecked_Access; + Position.Position := HT_Ops.Index (HT, Position.Node); end Insert; procedure Insert @@ -1998,7 +2000,7 @@ is return No_Element; else return Cursor' - (Container'Unrestricted_Access, Node, Hash_Type'Last); + (Container'Unrestricted_Access, Node, HT_Ops.Index (HT, Node)); end if; end Find; diff --git a/gcc/ada/libgnat/a-cohase.ads b/gcc/ada/libgnat/a-cohase.ads index a0aca52..c1415b5 100644 --- a/gcc/ada/libgnat/a-cohase.ads +++ b/gcc/ada/libgnat/a-cohase.ads @@ -537,8 +537,22 @@ private type Cursor is record Container : Set_Access; + -- Access to this cursor's container + Node : Node_Access; + -- Access to the node pointed to by this cursor + Position : Hash_Type := Hash_Type'Last; + -- Position of the node in the buckets of the container. If this is + -- equal to Hash_Type'Last, then it will not be used. Position is + -- not requried by the implementation, but improves the efficiency + -- of various operations. + -- + -- However, this value must be maintained so that the predefined + -- equality operation acts as required by RM A.18.7-17/2, which + -- states: "The predefined "=" operator for type Cursor returns True + -- if both cursors are No_Element, or designate the same element + -- in the same container." end record; procedure Write diff --git a/gcc/testsuite/gnat.dg/containers2.adb b/gcc/testsuite/gnat.dg/containers2.adb new file mode 100644 index 0000000..9c5dc0f --- /dev/null +++ b/gcc/testsuite/gnat.dg/containers2.adb @@ -0,0 +1,158 @@ +-- { dg-do run } +-- { dg-options "-gnata" } + +with Ada.Strings.Hash; +with Ada.Containers.Hashed_Sets; +with Ada.Containers.Hashed_Maps; +with Ada.Containers.Indefinite_Hashed_Sets; +with Ada.Containers.Indefinite_Hashed_Maps; + +procedure Containers2 is + -- Check that Cursors of the hashed containers follow the correct + -- predefined equality rules - that two Cursors to the same element + -- are equal, one one is obtained through, for example, iteration, + -- and the other is obtained through a search + + subtype Definite_Name is String (1 .. 5); + + type Named_Item is + record + Name : Definite_Name; + Item : Integer := 0; + end record; + + + function Equivalent_Item (Left, Right: Named_Item) return Boolean + is (Left.Name = Right.Name); + + function DI_Hash (Item: Named_Item) return Ada.Containers.Hash_Type + is (Ada.Strings.Hash (Item.Name)); + + package HS is new Ada.Containers.Hashed_Sets + (Element_Type => Named_Item, + Hash => DI_Hash, + Equivalent_Elements => Equivalent_Item); + + package IHS is new Ada.Containers.Indefinite_Hashed_Sets + (Element_Type => Named_Item, + Hash => DI_Hash, + Equivalent_Elements => Equivalent_Item); + + package HM is new Ada.Containers.Hashed_Maps + (Key_Type => Definite_Name, + Element_Type => Integer, + Hash => Ada.Strings.Hash, + Equivalent_Keys => "="); + + package IHM is new Ada.Containers.Indefinite_Hashed_Maps + (Key_Type => Definite_Name, + Element_Type => Integer, + Hash => Ada.Strings.Hash, + Equivalent_Keys => "="); + + Item_Data : constant array (1 .. 5) of Named_Item + := ((Name => "ABCDE", others => <>), + (Name => "FGHIJ", others => <>), + (Name => "KLMNO", others => <>), + (Name => "PQRST", others => <>), + (Name => "UVWXY", others => <>)); + + use type HS.Cursor; + use type IHS.Cursor; + use type HM.Cursor; + use type IHM.Cursor; + + type HS_Cursor_Vec is array (Item_Data'Range) of HS.Cursor; + type IHS_Cursor_Vec is array (Item_Data'Range) of IHS.Cursor; + type HM_Cursor_Vec is array (Item_Data'Range) of HM.Cursor; + type IHM_Cursor_Vec is array (Item_Data'Range) of IHM.Cursor; + + HSC : HS.Set; + IHSC : IHS.Set; + HMC : HM.Map; + IHMC : IHM.Map; + + HS_Create_Cursors : HS_Cursor_Vec; + IHS_Create_Cursors : IHS_Cursor_Vec; + HM_Create_Cursors : HM_Cursor_Vec; + IHM_Create_Cursors : IHM_Cursor_Vec; + + HS_Index : HS.Cursor; + IHS_Index : IHS.Cursor; + HM_Index : HM.Cursor; + IHM_Index : IHM.Cursor; + + HS_Find : HS.Cursor; + IHS_Find : IHS.Cursor; + HM_Find : HM.Cursor; + IHM_Find : IHM.Cursor; + + + Inserted : Boolean; + +begin + + for I in Item_Data'Range loop + HSC.Insert (New_Item => Item_Data(I), + Position => HS_Create_Cursors(I), + Inserted => Inserted); + + pragma Assert (Inserted); + + + IHSC.Insert (New_Item => Item_Data(I), + Position => IHS_Create_Cursors(I), + Inserted => Inserted); + + pragma Assert (Inserted); + + HMC.Insert (New_Item => Item_Data(I).Item, + Key => Item_Data(I).Name, + Position => HM_Create_Cursors(I), + Inserted => Inserted); + + pragma Assert (Inserted); + + IHMC.Insert (New_Item => Item_Data(I).Item, + Key => Item_Data(I).Name, + Position => IHM_Create_Cursors(I), + Inserted => Inserted); + + pragma Assert (Inserted); + + end loop; + + HS_Index := HSC.First; + IHS_Index := IHSC.First; + HM_Index := HMC.First; + IHM_Index := IHMC.First; + + for I in Item_Data'Range loop + pragma Assert (HS.Has_Element (HS_Index)); + pragma Assert (IHS.Has_Element (IHS_Index)); + pragma Assert (HM.Has_Element (HM_Index)); + pragma Assert (IHM.Has_Element (IHM_Index)); + + HS_Find := HSC.Find (Item_Data(I)); + pragma Assert (HS_Create_Cursors(I) = HS_Index); + pragma Assert (HS_Find = HS_Index); + + IHS_Find := IHSC.Find (Item_Data(I)); + pragma Assert (IHS_Create_Cursors(I) = IHS_Index); + pragma Assert (IHS_Find = IHS_Index); + + HM_Find := HMC.Find (Item_Data(I).Name); + pragma Assert (HM_Create_Cursors(I) = HM_Index); + pragma Assert (HM_Find = HM_Index); + + IHM_Find := IHMC.Find (Item_Data(I).Name); + pragma Assert (IHM_Create_Cursors(I) = IHM_Index); + pragma Assert (IHM_Find = IHM_Index); + + HS.Next (HS_Index); + IHS.Next (IHS_Index); + HM.Next (HM_Index); + IHM.Next (IHM_Index); + end loop; + +end; -- cgit v1.1 From 4c118453c7c6db1e24145401abf70d286133de3f Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Wed, 7 Apr 2021 05:11:57 -0400 Subject: [Ada] Fix the Sphinx configuration and port it to Python3 gcc/ada/ * .gitignore: New. * doc/share/conf.py: Add Python 3 compatibility. * doc/share/gnat.sty: Add missing file. --- gcc/ada/.gitignore | 2 ++ gcc/ada/doc/share/conf.py | 32 ++++++++++----------- gcc/ada/doc/share/gnat.sty | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 gcc/ada/.gitignore create mode 100644 gcc/ada/doc/share/gnat.sty (limited to 'gcc') diff --git a/gcc/ada/.gitignore b/gcc/ada/.gitignore new file mode 100644 index 0000000..36a0db0 --- /dev/null +++ b/gcc/ada/.gitignore @@ -0,0 +1,2 @@ +# Sphinx build artifacts +doc/build diff --git a/gcc/ada/doc/share/conf.py b/gcc/ada/doc/share/conf.py index e6fafcf..debd716 100644 --- a/gcc/ada/doc/share/conf.py +++ b/gcc/ada/doc/share/conf.py @@ -37,45 +37,45 @@ def get_copyright(): def get_gnat_version(): - m = re.search(r'Gnat_Static_Version_String : ' + - r'constant String := "([^\(\)]+)\(.*\)?";', + m = re.search(br'Gnat_Static_Version_String : ' + + br'constant String := "([^\(\)]+)\(.*\)?";', gnatvsn_content) if m: - return m.group(1).strip() + return m.group(1).strip().decode() else: if texi_fsf and os.path.exists(basever): return '' try: - with open(basever, 'rb') as fd: + with open(basever) as fd: return fd.read() - except: + except Exception: pass - print 'cannot find GNAT version in gnatvsn.ads or in ' + basever + print('cannot find GNAT version in gnatvsn.ads or in ' + basever) sys.exit(1) def get_gnat_build_type(): - m = re.search(r'Build_Type : constant Gnat_Build_Type := (.+);', + m = re.search(br'Build_Type : constant Gnat_Build_Type := (.+);', gnatvsn_content) if m: - return {'Gnatpro': 'PRO', - 'FSF': 'FSF', - 'GPL': 'GPL'}[m.group(1).strip()] + return {b'Gnatpro': 'PRO', + b'FSF': 'FSF', + b'GPL': 'GPL'}[m.group(1).strip()] else: - print 'cannot compute GNAT build type' + print('cannot compute GNAT build type') sys.exit(1) # First retrieve the name of the documentation we are building doc_name = os.environ.get('DOC_NAME', None) if doc_name is None: - print 'DOC_NAME environment variable should be set' + print('DOC_NAME environment variable should be set') sys.exit(1) if doc_name not in DOCS: - print '%s is not a valid documentation name' % doc_name + print('%s is not a valid documentation name' % doc_name) sys.exit(1) @@ -84,11 +84,11 @@ exclude_patterns = [] for d in os.listdir(root_source_dir): if d not in ('share', doc_name, doc_name + '.rst'): exclude_patterns.append(d) - print 'ignoring %s' % d + print('ignoring %s' % d) if doc_name == 'gnat_rm': exclude_patterns.append('share/gnat_project_manager.rst') - print 'ignoring share/gnat_project_manager.rst' + print('ignoring share/gnat_project_manager.rst') extensions = [] templates_path = ['_templates'] @@ -103,7 +103,7 @@ copyright = get_copyright() version = get_gnat_version() release = get_gnat_version() -pygments_style = 'sphinx' +pygments_style = None tags.add(get_gnat_build_type()) html_theme = 'sphinxdoc' if os.path.isfile('adacore_transparent.png'): diff --git a/gcc/ada/doc/share/gnat.sty b/gcc/ada/doc/share/gnat.sty new file mode 100644 index 0000000..1a152fb --- /dev/null +++ b/gcc/ada/doc/share/gnat.sty @@ -0,0 +1,72 @@ +% Needed to generate footers with total number of pages +\RequirePackage{lastpage} + +% AdaCore specific maketitle +\renewcommand{\maketitle}{% + \begin{titlepage}% + \let\footnotesize\small + \let\footnoterule\relax + \rule{\textwidth}{1pt}% + \ifsphinxpdfoutput + \begingroup + % These \defs are required to deal with multi-line authors; it + % changes \\ to ', ' (comma-space), making it pass muster for + % generating document info in the PDF file. + \def\\{, } + \def\and{and } + \pdfinfo{ + /Author (\@author) + /Title (\@title) + } + \endgroup + \fi + \begin{flushright}% + \sphinxlogo% + {\rm\Huge \@title \par}% + {\em\LARGE\py@HeaderFamily \py@release\releaseinfo \par} + \vfill + {\LARGE\py@HeaderFamily + \par} + \vfill\vfill + {\large + \@date \par + \vfill + \py@authoraddress \par + }% + \end{flushright}%\par + \@thanks + \end{titlepage}% + \cleardoublepage% + \setcounter{footnote}{0}% + \let\thanks\relax\let\maketitle\relax +} + +% AdaCore specific headers/footers +% Redefine the 'normal' header/footer style when using "fancyhdr" package: +\@ifundefined{fancyhf}{}{ + % Use \pagestyle{normal} as the primary pagestyle for text. + \fancypagestyle{normal}{ + \fancyhf{} + \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage\ of \pageref*{LastPage}}} + \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} + \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} + \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}} + \renewcommand{\headrulewidth}{0.4pt} + \renewcommand{\footrulewidth}{0.4pt} + % define chaptermark with \@chappos when \@chappos is available for Japanese + \ifx\@chappos\undefined\else + \def\chaptermark##1{\markboth{\@chapapp\space\thechapter\space\@chappos\space ##1}{}} + \fi + } + % Update the plain style so we get the page number & footer line, + % but not a chapter or section title. This is to keep the first + % page of a chapter and the blank page between chapters `clean.' + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage\ of \pageref*{LastPage}}} + \fancyfoot[LO,RE]{{\py@HeaderFamily \GNATFullDocumentName}} + \fancyhead[LE,RO]{{\py@HeaderFamily \@title\ \GNATVersion}} + \renewcommand{\headrulewidth}{0.0pt} + \renewcommand{\footrulewidth}{0.4pt} + } +} -- cgit v1.1 From ce32ccfc25a1b12ff9f42b1d9b6150ea128a26ec Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Wed, 2 Dec 2020 04:15:36 -0500 Subject: [Ada] Bad handling of 'Valid_Scalars and arrays gcc/ada/ * exp_attr.adb (Build_Array_VS_Func, Build_Record_VS_Func, Expand_N_Attribute_Reference): Use Get_Fullest_View instead of Validated_View. (Build_Record_VS_Func): Adjust to keep using Validated_View. (Expand_N_Attribute_Reference) [Valid]: Use Small_Integer_Type_For to allow for more compile time evaluations. * sem_util.adb (Cannot_Raise_Constraint_Error): Add more precise support for N_Indexed_Component and fix support for N_Selected_Component which wasn't completely safe. (List_Cannot_Raise_CE): New. * libgnat/i-cobol.adb (Valid_Packed): Simplify test to address new GNAT warning. --- gcc/ada/exp_attr.adb | 47 +++++++++++++++++++++++++++++++++--------- gcc/ada/libgnat/i-cobol.adb | 2 +- gcc/ada/sem_util.adb | 50 ++++++++++++++++++++++++++++++--------------- 3 files changed, 72 insertions(+), 27 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb index 7f63a2d..b3ac7b7 100644 --- a/gcc/ada/exp_attr.adb +++ b/gcc/ada/exp_attr.adb @@ -244,7 +244,7 @@ package body Exp_Attr is is Loc : constant Source_Ptr := Sloc (Attr); Comp_Typ : constant Entity_Id := - Validated_View (Component_Type (Array_Typ)); + Get_Fullest_View (Component_Type (Array_Typ)); function Validate_Component (Obj_Id : Entity_Id; @@ -531,7 +531,7 @@ package body Exp_Attr is is Field_Id : constant Entity_Id := Defining_Entity (Field); Field_Nam : constant Name_Id := Chars (Field_Id); - Field_Typ : constant Entity_Id := Validated_View (Etype (Field_Id)); + Field_Typ : constant Entity_Id := Get_Fullest_View (Etype (Field_Id)); Attr_Nam : Name_Id; begin @@ -733,7 +733,7 @@ package body Exp_Attr is -- Start of processing for Build_Record_VS_Func begin - Typ := Rec_Typ; + Typ := Validated_View (Rec_Typ); -- Use the root type when dealing with a class-wide type @@ -7329,7 +7329,7 @@ package body Exp_Attr is -- of the size of the type, not the range of the values). We write -- this as two tests, rather than a range check, so that static -- evaluation will easily remove either or both of the checks if - -- they can be -statically determined to be true (this happens + -- they can be statically determined to be true (this happens -- when the type of X is static and the range extends to the full -- range of stored values). @@ -7350,12 +7350,39 @@ package body Exp_Attr is else declare - Uns : constant Boolean - := Is_Unsigned_Type (Ptyp) - or else (Is_Private_Type (Ptyp) - and then Is_Unsigned_Type (Btyp)); + Uns : constant Boolean := + Is_Unsigned_Type (Ptyp) + or else (Is_Private_Type (Ptyp) + and then Is_Unsigned_Type (Btyp)); + Size : Uint; + P : Node_Id := Pref; + begin - PBtyp := Integer_Type_For (Esize (Ptyp), Uns); + -- If the prefix has an entity, use the Esize from this entity + -- to handle in a more user friendly way the case of objects + -- or components with a large Size aspect: if a Size aspect is + -- specified, we want to read a scalar value as large as the + -- Size, unless the Size is larger than + -- System_Max_Integer_Size. + + if Nkind (P) = N_Selected_Component then + P := Selector_Name (P); + end if; + + if Nkind (P) in N_Has_Entity + and then Present (Entity (P)) + and then Esize (Entity (P)) /= Uint_0 + then + if Esize (Entity (P)) <= System_Max_Integer_Size then + Size := Esize (Entity (P)); + else + Size := UI_From_Int (System_Max_Integer_Size); + end if; + else + Size := Esize (Ptyp); + end if; + + PBtyp := Small_Integer_Type_For (Size, Uns); Rewrite (N, Make_Range_Test); end; end if; @@ -7385,7 +7412,7 @@ package body Exp_Attr is ------------------- when Attribute_Valid_Scalars => Valid_Scalars : declare - Val_Typ : constant Entity_Id := Validated_View (Ptyp); + Val_Typ : constant Entity_Id := Get_Fullest_View (Ptyp); Expr : Node_Id; begin diff --git a/gcc/ada/libgnat/i-cobol.adb b/gcc/ada/libgnat/i-cobol.adb index d69ef9d..96f6f81 100644 --- a/gcc/ada/libgnat/i-cobol.adb +++ b/gcc/ada/libgnat/i-cobol.adb @@ -692,7 +692,7 @@ package body Interfaces.COBOL is -- For signed, accept all standard and non-standard signs else - return Item (Item'Last) in 16#A# .. 16#F#; + return Item (Item'Last) >= 16#A#; end if; end case; end Valid_Packed; diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 1cf5c69..e3ac718 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -2900,6 +2900,32 @@ package body Sem_Util is ----------------------------------- function Cannot_Raise_Constraint_Error (Expr : Node_Id) return Boolean is + + function List_Cannot_Raise_CE (L : List_Id) return Boolean; + -- Returns True if none of the list members cannot possibly raise + -- Constraint_Error. + + -------------------------- + -- List_Cannot_Raise_CE -- + -------------------------- + + function List_Cannot_Raise_CE (L : List_Id) return Boolean is + N : Node_Id; + begin + N := First (L); + while Present (N) loop + if Cannot_Raise_Constraint_Error (N) then + Next (N); + else + return False; + end if; + end loop; + + return True; + end List_Cannot_Raise_CE; + + -- Start of processing for Cannot_Raise_Constraint_Error + begin if Compile_Time_Known_Value (Expr) then return True; @@ -2918,8 +2944,14 @@ package body Sem_Util is when N_Expanded_Name => return True; + when N_Indexed_Component => + return not Do_Range_Check (Expr) + and then Cannot_Raise_Constraint_Error (Prefix (Expr)) + and then List_Cannot_Raise_CE (Expressions (Expr)); + when N_Selected_Component => - return not Do_Discriminant_Check (Expr); + return not Do_Discriminant_Check (Expr) + and then Cannot_Raise_Constraint_Error (Prefix (Expr)); when N_Attribute_Reference => if Do_Overflow_Check (Expr) then @@ -2929,21 +2961,7 @@ package body Sem_Util is return True; else - declare - N : Node_Id; - - begin - N := First (Expressions (Expr)); - while Present (N) loop - if Cannot_Raise_Constraint_Error (N) then - Next (N); - else - return False; - end if; - end loop; - - return True; - end; + return List_Cannot_Raise_CE (Expressions (Expr)); end if; when N_Type_Conversion => -- cgit v1.1 From 3cb4256addca89ff6d6c47ed3ea53499d5b97a52 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Mon, 7 Dec 2020 07:47:37 -0500 Subject: [Ada] Remove unused subprograms gcc/ada/ * sem_ch3.adb (Analyze_Object_Declaration): Remove dead code. * ali.ads, ali.adb (Scan_ALI): Remove unused parameters. Remove unused code related to Xref lines. (Get_Typeref): Removed, no longer used. --- gcc/ada/ali.adb | 474 +--------------------------------------------------- gcc/ada/ali.ads | 20 --- gcc/ada/sem_ch3.adb | 19 +-- 3 files changed, 8 insertions(+), 505 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/ali.adb b/gcc/ada/ali.adb index f213c30..7093766 100644 --- a/gcc/ada/ali.adb +++ b/gcc/ada/ali.adb @@ -894,8 +894,6 @@ package body ALI is T : Text_Buffer_Ptr; Ignore_ED : Boolean; Err : Boolean; - Read_Xref : Boolean := False; - Read_Lines : String := ""; Ignore_Lines : String := "X"; Ignore_Errors : Boolean := False; Directly_Scanned : Boolean := False) return ALI_Id @@ -907,7 +905,8 @@ package body ALI is NS_Found : Boolean; First_Arg : Arg_Id; - Ignore : array (Character range 'A' .. 'Z') of Boolean; + Ignore : array (Character range 'A' .. 'Z') of Boolean := + (others => False); -- Ignore (X) is set to True if lines starting with X are to -- be ignored by Scan_ALI and skipped, and False if the lines -- are to be read and processed. @@ -1006,16 +1005,6 @@ package body ALI is function Nextc return Character; -- Return current character without modifying pointer P - procedure Get_Typeref - (Current_File_Num : Sdep_Id; - Ref : out Tref_Kind; - File_Num : out Sdep_Id; - Line : out Nat; - Ref_Type : out Character; - Col : out Nat; - Standard_Entity : out Name_Id); - -- Parse the definition of a typeref (<...>, {...} or (...)) - procedure Scan_Invocation_Graph_Line; -- Parse a single line that encodes a piece of the invocation graph @@ -1423,94 +1412,6 @@ package body ALI is return T; end Get_Stamp; - ----------------- - -- Get_Typeref -- - ----------------- - - procedure Get_Typeref - (Current_File_Num : Sdep_Id; - Ref : out Tref_Kind; - File_Num : out Sdep_Id; - Line : out Nat; - Ref_Type : out Character; - Col : out Nat; - Standard_Entity : out Name_Id) - is - N : Nat; - begin - case Nextc is - when '<' => Ref := Tref_Derived; - when '(' => Ref := Tref_Access; - when '{' => Ref := Tref_Type; - when others => Ref := Tref_None; - end case; - - -- Case of typeref field present - - if Ref /= Tref_None then - P := P + 1; -- skip opening bracket - - if Nextc in 'a' .. 'z' then - File_Num := No_Sdep_Id; - Line := 0; - Ref_Type := ' '; - Col := 0; - Standard_Entity := Get_Name (Ignore_Spaces => True); - else - N := Get_Nat; - - if Nextc = '|' then - File_Num := Sdep_Id (N + Nat (First_Sdep_Entry) - 1); - P := P + 1; - N := Get_Nat; - else - File_Num := Current_File_Num; - end if; - - Line := N; - Ref_Type := Getc; - Col := Get_Nat; - Standard_Entity := No_Name; - end if; - - -- ??? Temporary workaround for nested generics case: - -- 4i4 Directories{1|4I9[4|6[3|3]]} - -- See C918-002 - - declare - Nested_Brackets : Natural := 0; - - begin - loop - case Nextc is - when '[' => - Nested_Brackets := Nested_Brackets + 1; - when ']' => - Nested_Brackets := Nested_Brackets - 1; - when others => - if Nested_Brackets = 0 then - exit; - end if; - end case; - - Skipc; - end loop; - end; - - P := P + 1; -- skip closing bracket - Skip_Space; - - -- No typeref entry present - - else - File_Num := No_Sdep_Id; - Line := 0; - Ref_Type := ' '; - Col := 0; - Standard_Entity := No_Name; - end if; - end Get_Typeref; - ---------- -- Getc -- ---------- @@ -1836,31 +1737,10 @@ package body ALI is begin First_Sdep_Entry := Sdep.Last + 1; - -- Acquire lines to be ignored - - if Read_Xref then - Ignore := - ('T' | 'U' | 'W' | 'Y' | 'Z' | 'D' | 'X' => False, others => True); - - -- Read_Lines parameter given - - elsif Read_Lines /= "" then - Ignore := ('U' => False, others => True); - - for J in Read_Lines'Range loop - Ignore (Read_Lines (J)) := False; - end loop; - - -- Process Ignore_Lines parameter - - else - Ignore := (others => False); - - for J in Ignore_Lines'Range loop - pragma Assert (Ignore_Lines (J) /= 'U'); - Ignore (Ignore_Lines (J)) := True; - end loop; - end if; + for J in Ignore_Lines'Range loop + pragma Assert (Ignore_Lines (J) /= 'U'); + Ignore (Ignore_Lines (J)) := True; + end loop; -- Setup ALI Table entry with appropriate defaults @@ -3465,347 +3345,7 @@ package body ALI is Fatal_Error; end if; - -- If we are ignoring Xref sections we are done (we ignore all - -- remaining lines since only xref related lines follow X). - - if Ignore ('X') and then not Debug_Flag_X then - return Id; - end if; - - -- Loop through Xref sections - - X_Loop : loop - Check_Unknown_Line; - exit X_Loop when C /= 'X'; - - -- Make new entry in section table - - Xref_Section.Increment_Last; - - Read_Refs_For_One_File : declare - XS : Xref_Section_Record renames - Xref_Section.Table (Xref_Section.Last); - - Current_File_Num : Sdep_Id; - -- Keeps track of the current file number (changed by nn|) - - begin - XS.File_Num := Sdep_Id (Get_Nat + Nat (First_Sdep_Entry) - 1); - XS.File_Name := Get_File_Name; - XS.First_Entity := Xref_Entity.Last + 1; - - Current_File_Num := XS.File_Num; - - Skip_Space; - - Skip_Eol; - C := Nextc; - - -- Loop through Xref entities - - while C /= 'X' and then C /= EOF loop - Xref_Entity.Increment_Last; - - Read_Refs_For_One_Entity : declare - XE : Xref_Entity_Record renames - Xref_Entity.Table (Xref_Entity.Last); - N : Nat; - - procedure Read_Instantiation_Reference; - -- Acquire instantiation reference. Caller has checked - -- that current character is '[' and on return the cursor - -- is skipped past the corresponding closing ']'. - - ---------------------------------- - -- Read_Instantiation_Reference -- - ---------------------------------- - - procedure Read_Instantiation_Reference is - Local_File_Num : Sdep_Id := Current_File_Num; - - begin - Xref.Increment_Last; - - declare - XR : Xref_Record renames Xref.Table (Xref.Last); - - begin - P := P + 1; -- skip [ - N := Get_Nat; - - if Nextc = '|' then - XR.File_Num := - Sdep_Id (N + Nat (First_Sdep_Entry) - 1); - Local_File_Num := XR.File_Num; - P := P + 1; - N := Get_Nat; - - else - XR.File_Num := Local_File_Num; - end if; - - XR.Line := N; - XR.Rtype := ' '; - XR.Col := 0; - - -- Recursive call for next reference - - if Nextc = '[' then - pragma Warnings (Off); -- kill recursion warning - Read_Instantiation_Reference; - pragma Warnings (On); - end if; - - -- Skip closing bracket after recursive call - - P := P + 1; - end; - end Read_Instantiation_Reference; - - -- Start of processing for Read_Refs_For_One_Entity - - begin - XE.Line := Get_Nat; - XE.Etype := Getc; - XE.Col := Get_Nat; - - case Getc is - when '*' => - XE.Visibility := Global; - when '+' => - XE.Visibility := Static; - when others => - XE.Visibility := Other; - end case; - - XE.Entity := Get_Name; - - -- Handle the information about generic instantiations - - if Nextc = '[' then - Skipc; -- Opening '[' - N := Get_Nat; - - if Nextc /= '|' then - XE.Iref_File_Num := Current_File_Num; - XE.Iref_Line := N; - else - XE.Iref_File_Num := - Sdep_Id (N + Nat (First_Sdep_Entry) - 1); - Skipc; - XE.Iref_Line := Get_Nat; - end if; - - if Getc /= ']' then - Fatal_Error; - end if; - - else - XE.Iref_File_Num := No_Sdep_Id; - XE.Iref_Line := 0; - end if; - - Current_File_Num := XS.File_Num; - - -- Renaming reference is present - - if Nextc = '=' then - P := P + 1; - XE.Rref_Line := Get_Nat; - - if Getc /= ':' then - Fatal_Error; - end if; - - XE.Rref_Col := Get_Nat; - - -- No renaming reference present - - else - XE.Rref_Line := 0; - XE.Rref_Col := 0; - end if; - - Skip_Space; - - XE.Oref_File_Num := No_Sdep_Id; - XE.Tref_File_Num := No_Sdep_Id; - XE.Tref := Tref_None; - XE.First_Xref := Xref.Last + 1; - - -- Loop to check for additional info present - - loop - declare - Ref : Tref_Kind; - File : Sdep_Id; - Line : Nat; - Typ : Character; - Col : Nat; - Std : Name_Id; - - begin - Get_Typeref - (Current_File_Num, Ref, File, Line, Typ, Col, Std); - exit when Ref = Tref_None; - - -- Do we have an overriding procedure? - - if Ref = Tref_Derived and then Typ = 'p' then - XE.Oref_File_Num := File; - XE.Oref_Line := Line; - XE.Oref_Col := Col; - - -- Arrays never override anything, and <> points to - -- the index types instead - - elsif Ref = Tref_Derived and then XE.Etype = 'A' then - - -- Index types are stored in the list of references - - Xref.Increment_Last; - - declare - XR : Xref_Record renames Xref.Table (Xref.Last); - begin - XR.File_Num := File; - XR.Line := Line; - XR.Rtype := Array_Index_Reference; - XR.Col := Col; - XR.Name := Std; - end; - - -- Interfaces are stored in the list of references, - -- although the parent type itself is stored in XE. - -- The first interface (when there are only - -- interfaces) is stored in XE.Tref*) - - elsif Ref = Tref_Derived - and then Typ = 'R' - and then XE.Tref_File_Num /= No_Sdep_Id - then - Xref.Increment_Last; - - declare - XR : Xref_Record renames Xref.Table (Xref.Last); - begin - XR.File_Num := File; - XR.Line := Line; - XR.Rtype := Interface_Reference; - XR.Col := Col; - XR.Name := Std; - end; - - else - XE.Tref := Ref; - XE.Tref_File_Num := File; - XE.Tref_Line := Line; - XE.Tref_Type := Typ; - XE.Tref_Col := Col; - XE.Tref_Standard_Entity := Std; - end if; - end; - end loop; - - -- Loop through cross-references for this entity - - loop - Skip_Space; - - if At_Eol then - Skip_Eol; - exit when Nextc /= '.'; - P := P + 1; - end if; - - Xref.Increment_Last; - - declare - XR : Xref_Record renames Xref.Table (Xref.Last); - - begin - N := Get_Nat; - - if Nextc = '|' then - XR.File_Num := - Sdep_Id (N + Nat (First_Sdep_Entry) - 1); - Current_File_Num := XR.File_Num; - P := P + 1; - N := Get_Nat; - else - XR.File_Num := Current_File_Num; - end if; - - XR.Line := N; - XR.Rtype := Getc; - - -- Imported entities reference as in: - -- 494b25 - - if Nextc = '<' then - Skipc; - XR.Imported_Lang := Get_Name; - - pragma Assert (Nextc = ','); - Skipc; - - XR.Imported_Name := Get_Name; - - pragma Assert (Nextc = '>'); - Skipc; - - else - XR.Imported_Lang := No_Name; - XR.Imported_Name := No_Name; - end if; - - XR.Col := Get_Nat; - - if Nextc = '[' then - Read_Instantiation_Reference; - end if; - end; - end loop; - - -- Record last cross-reference - - XE.Last_Xref := Xref.Last; - C := Nextc; - - exception - when Bad_ALI_Format => - - -- If ignoring errors, then we skip a line with an - -- unexpected error, and try to continue subsequent - -- xref lines. - - if Ignore_Errors then - Xref_Entity.Decrement_Last; - Skip_Line; - C := Nextc; - - -- Otherwise, we reraise the fatal exception - - else - raise; - end if; - end Read_Refs_For_One_Entity; - end loop; - - -- Record last entity - - XS.Last_Entity := Xref_Entity.Last; - end Read_Refs_For_One_File; - - C := Getc; - end loop X_Loop; - - -- Here after dealing with xref sections - - -- Ignore remaining lines, which belong to an additional section of the - -- ALI file not considered here (like SCO or SPARK information). - - Check_Unknown_Line; + -- This ALI parser does not care about Xref lines. return Id; diff --git a/gcc/ada/ali.ads b/gcc/ada/ali.ads index ccb516f..90bc94a 100644 --- a/gcc/ada/ali.ads +++ b/gcc/ada/ali.ads @@ -1391,8 +1391,6 @@ package ALI is T : Text_Buffer_Ptr; Ignore_ED : Boolean; Err : Boolean; - Read_Xref : Boolean := False; - Read_Lines : String := ""; Ignore_Lines : String := "X"; Ignore_Errors : Boolean := False; Directly_Scanned : Boolean := False) return ALI_Id; @@ -1417,24 +1415,6 @@ package ALI is -- tables will not be filled in this case. It is not possible -- to ignore U (unit) lines, they are always read. -- - -- Read_Lines requests that Scan_ALI process only lines that start - -- with one of the given characters. The corresponding data in the - -- ALI file for any characters not given in the list will not be - -- set. The default value of the null string indicates that all - -- lines should be read (unless Ignore_Lines is specified). U - -- (unit) lines are always read regardless of the value of this - -- parameter. - -- - -- Note: either Ignore_Lines or Read_Lines should be non-null, but not - -- both. If both are provided then only the Read_Lines value is used, - -- and the Ignore_Lines parameter is ignored. - -- - -- Read_Xref is set True to read and acquire the cross-reference - -- information. If Read_XREF is set to True, then the effect is to ignore - -- all lines other than U, W, D and X lines and the Ignore_Lines and - -- Read_Lines parameters are ignored (i.e. the use of True for Read_XREF - -- is equivalent to specifying an argument of "UWDX" for Read_Lines. - -- -- Ignore_Errors is normally False. If it is set True, then Scan_ALI -- will do its best to scan through a file and extract all information -- it can, even if there are errors. In this case Err is only set if diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 4c7b8e7..d796c47 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -4164,27 +4164,10 @@ package body Sem_Ch3 is Set_Related_Array_Object (Base_Type (T), Id); end if; - -- Special checks for protected objects not at library level + -- Check for protected objects not at library level if Has_Protected (T) and then not Is_Library_Level_Entity (Id) then Check_Restriction (No_Local_Protected_Objects, Id); - - -- Protected objects with interrupt handlers must be at library level - - -- Ada 2005: This test is not needed (and the corresponding clause - -- in the RM is removed) because accessibility checks are sufficient - -- to make handlers not at the library level illegal. - - -- AI05-0303: The AI is in fact a binding interpretation, and thus - -- applies to the '95 version of the language as well. - - if Is_Protected_Type (T) - and then Has_Interrupt_Handler (T) - and then Ada_Version < Ada_95 - then - Error_Msg_N - ("interrupt object can only be declared at library level", Id); - end if; end if; -- Check for violation of No_Local_Timing_Events -- cgit v1.1 From cbd743fe0942e91eaa5e788ad21ac660f686a0de Mon Sep 17 00:00:00 2001 From: Bob Duff Date: Mon, 7 Dec 2020 08:16:34 -0500 Subject: [Ada] Incorrect error with Default_Value on private/modular type gcc/ada/ * exp_ch3.adb (Simple_Init_Defaulted_Type): Simplify the code, and always use OK_Convert_To, rather than Unchecked_Convert_To and Convert_To. --- gcc/ada/exp_ch3.adb | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index e0040ed..b916aef 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -8597,35 +8597,28 @@ package body Exp_Ch3 is -------------------------------- function Simple_Init_Defaulted_Type return Node_Id is - Subtyp : constant Entity_Id := First_Subtype (Typ); + Subtyp : Entity_Id := First_Subtype (Typ); begin - -- Use the Sloc of the context node when constructing the initial - -- value because the expression of Default_Value may come from a - -- different unit. Updating the Sloc will result in accurate error - -- diagnostics. - -- When the first subtype is private, retrieve the expression of the -- Default_Value from the underlying type. if Is_Private_Type (Subtyp) then - return - Unchecked_Convert_To - (Typ => Typ, - Expr => - New_Copy_Tree - (Source => Default_Aspect_Value (Full_View (Subtyp)), - New_Sloc => Loc)); - - else - return - Convert_To - (Typ => Typ, - Expr => - New_Copy_Tree - (Source => Default_Aspect_Value (Subtyp), - New_Sloc => Loc)); + Subtyp := Full_View (Subtyp); end if; + + -- Use the Sloc of the context node when constructing the initial + -- value because the expression of Default_Value may come from a + -- different unit. Updating the Sloc will result in accurate error + -- diagnostics. + + return + OK_Convert_To + (Typ => Typ, + Expr => + New_Copy_Tree + (Source => Default_Aspect_Value (Subtyp), + New_Sloc => Loc)); end Simple_Init_Defaulted_Type; ----------------------------------------- -- cgit v1.1 From 7458323aa60cc9a42bed8d029059e5ebd33bafb9 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Mon, 7 Dec 2020 15:32:40 +0100 Subject: [Ada] Cleanups related to entry barrier conditions gcc/ada/ * exp_ch9.adb (Build_Barrier_Function): Refine type of a protected type entity. (Is_Pure_Barrier): Fix style. --- gcc/ada/exp_ch9.adb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb index b055b27..32bf11c 100644 --- a/gcc/ada/exp_ch9.adb +++ b/gcc/ada/exp_ch9.adb @@ -120,7 +120,7 @@ package body Exp_Ch9 is function Build_Barrier_Function (N : Node_Id; Ent : Entity_Id; - Pid : Node_Id) return Node_Id; + Pid : Entity_Id) return Node_Id; -- Build the function body returning the value of the barrier expression -- for the specified entry body. @@ -1052,7 +1052,7 @@ package body Exp_Ch9 is function Build_Barrier_Function (N : Node_Id; Ent : Entity_Id; - Pid : Node_Id) return Node_Id + Pid : Entity_Id) return Node_Id is Ent_Formals : constant Node_Id := Entry_Body_Formal_Part (N); Cond : constant Node_Id := Condition (Ent_Formals); @@ -6322,8 +6322,8 @@ package body Exp_Ch9 is end if; when N_Short_Circuit - | N_If_Expression - | N_Case_Expression + | N_If_Expression + | N_Case_Expression => return OK; -- cgit v1.1 From 416d48eba3a3809757ef7c9d35dd0ac0c9795be4 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Mon, 7 Dec 2020 16:54:06 +0100 Subject: [Ada] Extend compile-time evaluation in case statements to all objects gcc/ada/ * sem_ch5.adb (Analyze_Case_Statement): Extend optimization to all objects; fix typo in comment. --- gcc/ada/sem_ch5.adb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb index 04fc980..0869bea 100644 --- a/gcc/ada/sem_ch5.adb +++ b/gcc/ada/sem_ch5.adb @@ -1456,7 +1456,7 @@ package body Sem_Ch5 is if Is_Entity_Name (Exp) then Ent := Entity (Exp); - if Is_Assignable (Ent) then + if Is_Object (Ent) then if List_Length (Choices) = 1 and then Nkind (First (Choices)) in N_Subexpr and then Compile_Time_Known_Value (First (Choices)) @@ -1475,7 +1475,7 @@ package body Sem_Ch5 is end if; end if; - -- Case where expression is not an entity name of a variable + -- Case where expression is not an entity name of an object Analyze_Statements (Statements (Alternative)); end Process_Statements; -- cgit v1.1 From 75716ebc25bfb4a647b05d0b2443b5495dab425e Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 7 Dec 2020 22:04:43 +0100 Subject: [Ada] Couple of adjustments for the sake of static analyzers gcc/ada/ * libgnat/s-valrea.adb (Integer_to_Real): Use a subtype of Num for the component type of the table of powers of ten. * libgnat/s-valuer.adb (Round_Extra): Add assertion on Base. --- gcc/ada/libgnat/s-valrea.adb | 4 +++- gcc/ada/libgnat/s-valuer.adb | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ada/libgnat/s-valrea.adb b/gcc/ada/libgnat/s-valrea.adb index 0ac3846..582b966 100644 --- a/gcc/ada/libgnat/s-valrea.adb +++ b/gcc/ada/libgnat/s-valrea.adb @@ -173,7 +173,9 @@ package body System.Val_Real is when 10 => declare - Powten : constant array (0 .. Maxpow) of Num; + subtype Pow_Num is Num range 1.0 .. Num'Last; + + Powten : constant array (0 .. Maxpow) of Pow_Num; pragma Import (Ada, Powten); for Powten'Address use Powten_Address; diff --git a/gcc/ada/libgnat/s-valuer.adb b/gcc/ada/libgnat/s-valuer.adb index 9e4de3e..bd57bfb 100644 --- a/gcc/ada/libgnat/s-valuer.adb +++ b/gcc/ada/libgnat/s-valuer.adb @@ -128,6 +128,8 @@ package body System.Value_R is Extra : in out Char_As_Digit; Base : Unsigned) is + pragma Assert (Base in 2 .. 16); + B : constant Uns := Uns (Base); begin -- cgit v1.1 From 3545103fa4c2586796e1738b19ca8cb049998951 Mon Sep 17 00:00:00 2001 From: Yannick Moy Date: Tue, 8 Dec 2020 09:23:09 +0100 Subject: [Ada] Improve error message for ghost in predicate gcc/ada/ * ghost.adb (Check_Ghost_Context): Add continuation message when in predicate. --- gcc/ada/ghost.adb | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'gcc') diff --git a/gcc/ada/ghost.adb b/gcc/ada/ghost.adb index 866f7f7..0311020 100644 --- a/gcc/ada/ghost.adb +++ b/gcc/ada/ghost.adb @@ -159,6 +159,9 @@ package body Ghost is -- Determine whether node Context denotes a Ghost-friendly context where -- a Ghost entity can safely reside (SPARK RM 6.9(10)). + function In_Aspect_Or_Pragma_Predicate (N : Node_Id) return Boolean; + -- Return True iff N is enclosed in an aspect or pragma Predicate + ------------------------- -- Is_OK_Ghost_Context -- ------------------------- @@ -540,6 +543,40 @@ package body Ghost is end if; end Check_Ghost_Policy; + ----------------------------------- + -- In_Aspect_Or_Pragma_Predicate -- + ----------------------------------- + + function In_Aspect_Or_Pragma_Predicate (N : Node_Id) return Boolean is + Par : Node_Id := N; + begin + while Present (Par) loop + if Nkind (Par) = N_Pragma + and then Get_Pragma_Id (Par) = Pragma_Predicate + then + return True; + + elsif Nkind (Par) = N_Aspect_Specification + and then Same_Aspect (Get_Aspect_Id (Par), Aspect_Predicate) + then + return True; + + -- Stop the search when it's clear it cannot be inside an aspect + -- or pragma. + + elsif Is_Declaration (Par) + or else Is_Statement (Par) + or else Is_Body (Par) + then + return False; + end if; + + Par := Parent (Par); + end loop; + + return False; + end In_Aspect_Or_Pragma_Predicate; + -- Start of processing for Check_Ghost_Context begin @@ -555,6 +592,19 @@ package body Ghost is else Error_Msg_N ("ghost entity cannot appear in this context", Ghost_Ref); + + -- When the Ghost entity appears in a pragma Predicate, explain the + -- reason for this being illegal, and suggest a fix instead. + + if In_Aspect_Or_Pragma_Predicate (Ghost_Ref) then + Error_Msg_N + ("\as predicates are checked in membership tests, " + & "the type and its predicate must be both ghost", + Ghost_Ref); + Error_Msg_N + ("\either make the type ghost " + & "or use a type invariant on a private type", Ghost_Ref); + end if; end if; end Check_Ghost_Context; -- cgit v1.1 From ef1acd3f18b8d16db139cbab96d27abe0a81d7e0 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Mon, 7 Dec 2020 23:47:12 +0100 Subject: [Ada] Update reference with description of type resolution gcc/ada/ * sem_res.ads: Update reference in comment. * sem_type.ads: Fix casing in a name of a unit. --- gcc/ada/sem_res.ads | 2 +- gcc/ada/sem_type.ads | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/sem_res.ads b/gcc/ada/sem_res.ads index 44a8487..d538566 100644 --- a/gcc/ada/sem_res.ads +++ b/gcc/ada/sem_res.ads @@ -31,7 +31,7 @@ with Types; use Types; package Sem_Res is - -- As described in Sem_Ch4, the type resolution proceeds in two phases. + -- As described in Sem_Type, the type resolution proceeds in two phases. -- The first phase is a bottom up pass that is achieved during the -- recursive traversal performed by the Analyze procedures. This phase -- determines unambiguous types, and collects sets of possible types diff --git a/gcc/ada/sem_type.ads b/gcc/ada/sem_type.ads index 6c6d5eb..4dea6e2 100644 --- a/gcc/ada/sem_type.ads +++ b/gcc/ada/sem_type.ads @@ -85,7 +85,7 @@ package Sem_Type is -- with the appropriate use clause. The global variable Candidate_Type is -- set in Add_One_Interp whenever an interpretation might be legal for an -- operator if the type were directly visible. This variable is used in - -- sem_ch4 when no legal interpretation is found. + -- Sem_Ch4 when no legal interpretation is found. Candidate_Type : Entity_Id; -- cgit v1.1 From 4ba1f7f65b46c1f0e0143ec982a62e6bd9a3ef2e Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Tue, 8 Dec 2020 00:22:20 +0100 Subject: [Ada] Remove double initialization of interpretation tables gcc/ada/ * fmap.ads (Reset_Tables): Remove outdated references to GNSA/ASIS. * sem_eval.ads (Initialize): Likewise. * sem_type.adb (Headers): Remove initialization at elaboration. * sem_type.ads (Init_Interp_Tables): Remove outdated reference to gnatf. * stringt.ads (Initialize): Fix style in comment. --- gcc/ada/fmap.ads | 5 +---- gcc/ada/sem_eval.ads | 3 +-- gcc/ada/sem_type.adb | 2 +- gcc/ada/sem_type.ads | 2 +- gcc/ada/stringt.ads | 2 +- 5 files changed, 5 insertions(+), 9 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/fmap.ads b/gcc/ada/fmap.ads index 862b8ea..aae3219 100644 --- a/gcc/ada/fmap.ads +++ b/gcc/ada/fmap.ads @@ -68,10 +68,7 @@ package Fmap is -- mapping file whose file name is File_Name. procedure Reset_Tables; - -- Initialize all the internal data structures. This procedure is used - -- when several compilations are performed by the same process (by GNSA - -- for ASIS, for example) to remove any existing mappings from a previous - -- compilation. + -- Initialize all the internal data structures procedure Add_Forbidden_File_Name (Name : File_Name_Type); -- Indicate that a source file name is forbidden. This is used when there diff --git a/gcc/ada/sem_eval.ads b/gcc/ada/sem_eval.ads index 972cee6..3cbd438 100644 --- a/gcc/ada/sem_eval.ads +++ b/gcc/ada/sem_eval.ads @@ -556,8 +556,7 @@ package Sem_Eval is -- messages must always point to the same location as the parent message. procedure Initialize; - -- Initializes the internal data structures. Must be called before each - -- separate main program unit (e.g. in a GNSA/ASIS context). + -- Initializes the internal data structures private -- The Eval routines are all marked inline, since they are called once diff --git a/gcc/ada/sem_type.adb b/gcc/ada/sem_type.adb index 8dbfa18..8f636be 100644 --- a/gcc/ada/sem_type.adb +++ b/gcc/ada/sem_type.adb @@ -97,7 +97,7 @@ package body Sem_Type is Header_Size : constant Int := 2 ** 12; No_Entry : constant Int := -1; - Headers : array (0 .. Header_Size) of Int := (others => No_Entry); + Headers : array (0 .. Header_Size) of Int; package Interp_Map is new Table.Table ( Table_Component_Type => Interp_Ref, diff --git a/gcc/ada/sem_type.ads b/gcc/ada/sem_type.ads index 4dea6e2..3177bd3 100644 --- a/gcc/ada/sem_type.ads +++ b/gcc/ada/sem_type.ads @@ -94,7 +94,7 @@ package Sem_Type is ----------------- procedure Init_Interp_Tables; - -- Invoked by gnatf when processing multiple files + -- Initialize data structures for overload resolution procedure Collect_Interps (N : Node_Id); -- Invoked when the name N has more than one visible interpretation. This diff --git a/gcc/ada/stringt.ads b/gcc/ada/stringt.ads index 77a794e..b85a590 100644 --- a/gcc/ada/stringt.ads +++ b/gcc/ada/stringt.ads @@ -56,7 +56,7 @@ package Stringt is -------------------------------------- procedure Initialize; - -- Initializes the strings table for a new compilation. + -- Initializes the strings table for a new compilation procedure Lock; -- Lock internal tables before calling back end -- cgit v1.1 From df5f901ce89cdbf73ae827ee528da776cbcacfac Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Tue, 8 Dec 2020 08:16:45 -0500 Subject: [Ada] Incorrect discriminant check on call to access to subprogram gcc/ada/ * exp_ch6.adb: Fix typo in comment. * sem_ch3.adb (Access_Subprogram_Declaration): Add missing call to Create_Extra_Formals. Remove obsolete bootstrap check. * sem_eval.adb (Eval_Selected_Component): Simplify a selected_component on an aggregate. --- gcc/ada/exp_ch6.adb | 2 +- gcc/ada/sem_ch3.adb | 9 ++------- gcc/ada/sem_eval.adb | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 9 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index 2cd40e4..6b14656 100644 --- a/gcc/ada/exp_ch6.adb +++ b/gcc/ada/exp_ch6.adb @@ -3801,7 +3801,7 @@ package body Exp_Ch6 is -- is internally generated code that manipulates addresses, -- e.g. when building interface tables. No check should -- occur in this case, and the discriminated object is not - -- directly a hand. + -- directly at hand. if not Comes_From_Source (Actual) and then Nkind (Actual) = N_Unchecked_Type_Conversion diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index d796c47..41e1e49 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -840,13 +840,6 @@ package body Sem_Ch3 is -- the corresponding semantic routine if Present (Access_To_Subprogram_Definition (N)) then - - -- Compiler runtime units are compiled in Ada 2005 mode when building - -- the runtime library but must also be compilable in Ada 95 mode - -- (when bootstrapping the compiler). - - Check_Compiler_Unit ("anonymous access to subprogram", N); - Access_Subprogram_Declaration (T_Name => Anon_Type, T_Def => Access_To_Subprogram_Definition (N)); @@ -1312,6 +1305,8 @@ package body Sem_Ch3 is Set_Can_Never_Be_Null (T_Name, Null_Exclusion_Present (T_Def)); Check_Restriction (No_Access_Subprograms, T_Def); + + Create_Extra_Formals (Desig_Type); end Access_Subprogram_Declaration; ---------------------------- diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb index 8d47589..263b9fd 100644 --- a/gcc/ada/sem_eval.adb +++ b/gcc/ada/sem_eval.adb @@ -3830,6 +3830,11 @@ package body Sem_Eval is ----------------------------- procedure Eval_Selected_Component (N : Node_Id) is + Node : Node_Id; + Comp : Node_Id; + C : Node_Id; + Nam : Name_Id; + begin -- If an attribute reference or a LHS, nothing to do. -- Also do not fold if N is an [in] out subprogram parameter. @@ -3839,7 +3844,36 @@ package body Sem_Eval is and then Is_LHS (N) = No and then not Is_Actual_Out_Or_In_Out_Parameter (N) then - Fold (N); + -- Simplify a selected_component on an aggregate by extracting + -- the field directly. + + Node := Prefix (N); + + while Nkind (Node) = N_Qualified_Expression loop + Node := Expression (Node); + end loop; + + if Nkind (Node) = N_Aggregate then + Comp := First (Component_Associations (Node)); + Nam := Chars (Selector_Name (N)); + + while Present (Comp) loop + C := First (Choices (Comp)); + + while Present (C) loop + if Chars (C) = Nam then + Rewrite (N, Relocate_Node (Expression (Comp))); + return; + end if; + + Next (C); + end loop; + + Next (Comp); + end loop; + else + Fold (N); + end if; end if; end Eval_Selected_Component; -- cgit v1.1 From ff683f9f0341391253eef171890f1b98f18ec99d Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Thu, 3 Dec 2020 10:06:47 -0500 Subject: [Ada] Crash with declare expression used in a postcondition gcc/ada/ * sem_aux.adb (Is_Limited_Type): Fix logic to check Is_Type before assuming Ent is a typo. * sem_ch4.adb (Analyze_Expression_With_Actions): Update comments, minor reformatting. * sem_res.adb (Resolve_Declare_Expression): Add protection against no type. --- gcc/ada/sem_aux.adb | 10 +++++++--- gcc/ada/sem_ch4.adb | 11 +++++++---- gcc/ada/sem_res.adb | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/sem_aux.adb b/gcc/ada/sem_aux.adb index 4925ffd..3eddad9 100644 --- a/gcc/ada/sem_aux.adb +++ b/gcc/ada/sem_aux.adb @@ -1072,14 +1072,18 @@ package body Sem_Aux is --------------------- function Is_Limited_Type (Ent : Entity_Id) return Boolean is - Btype : constant E := Base_Type (Ent); - Rtype : constant E := Root_Type (Btype); + Btype : Entity_Id; + Rtype : Entity_Id; begin if not Is_Type (Ent) then return False; + end if; - elsif Ekind (Btype) = E_Limited_Private_Type + Btype := Base_Type (Ent); + Rtype := Root_Type (Btype); + + if Ekind (Btype) = E_Limited_Private_Type or else Is_Limited_Composite (Btype) then return True; diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 7a8c261..ad6c7fd 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -2278,9 +2278,12 @@ package body Sem_Ch4 is procedure Analyze_Expression_With_Actions (N : Node_Id) is procedure Check_Action_OK (A : Node_Id); - -- Check that the action is something that is allows as a declare_item - -- of a declare_expression, except the checks are suppressed for - -- generated code. + -- Check that the action A is allowed as a declare_item of a declare + -- expression if N and A come from source. + + --------------------- + -- Check_Action_OK -- + --------------------- procedure Check_Action_OK (A : Node_Id) is begin @@ -2324,7 +2327,7 @@ package body Sem_Ch4 is Error_Msg_N ("object renaming or constant declaration expected", A); end Check_Action_OK; - A : Node_Id; + A : Node_Id; EWA_Scop : Entity_Id; -- Start of processing for Analyze_Expression_With_Actions diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index f6e0eab..39907ae 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -7494,6 +7494,7 @@ package body Sem_Res is Node := First (Actions (N)); while Present (Node) loop if Nkind (Node) = N_Object_Declaration + and then Is_Type (Etype (Defining_Identifier (Node))) and then Requires_Transient_Scope (Etype (Defining_Identifier (Node))) then -- cgit v1.1 From bb60efc5c75afa2c409c740b970f5f1e6fdd4890 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Mon, 7 Dec 2020 19:34:01 -0500 Subject: [Ada] Crash on inherited component in type extension in generic unit. gcc/ada/ * exp_ch3.adb (Expand_Record_Extension): Set Parent_Subtype on the type extension when within a generic unit, even though expansion is disabled, to allow for proper resolution of selected components inherited from an ancestor. --- gcc/ada/exp_ch3.adb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index b916aef..56924a0 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -7782,9 +7782,14 @@ package body Exp_Ch3 is -- Expand_Record_Extension is called directly from the semantics, so -- we must check to see whether expansion is active before proceeding, -- because this affects the visibility of selected components in bodies - -- of instances. + -- of instances. Within a generic we still need to set Parent_Subtype + -- link because the visibility of inherited components will have to be + -- verified in subsequent instances. if not Expander_Active then + if Inside_A_Generic and then Ekind (T) = E_Record_Type then + Set_Parent_Subtype (T, Etype (T)); + end if; return; end if; -- cgit v1.1 From d2e59934c4f79791b337470e9ef7c34ef66b1b49 Mon Sep 17 00:00:00 2001 From: Gary Dismukes Date: Mon, 7 Dec 2020 01:58:10 -0500 Subject: [Ada] AI12-0397: Default_Initial_Condition expressions for derived types gcc/ada/ * exp_util.adb (Add_Own_DIC): Suppress expansion of a DIC pragma when the pragma occurs for an abstract type, since that could lead to a call to an abstract function, and such DIC checks can never be performed for abstract types in any case. * sem_disp.adb (Check_Dispatching_Context): Suppress the check for illegal calls to abstract subprograms when the call occurs within a Default_Initial_Condition aspect and the call is passed the current instance as an actual. (Has_Controlling_Current_Instance_Actual): New function to test a call to see if it has any actuals given by direct references to a current instance of a type * sem_res.adb (Resolve_Actuals): Issue an error for a call within a DIC aspect to a nonprimitive subprogram with an actual given by the name of the DIC type's current instance (which will show up as a reference to the formal parameter of a DIC procedure). --- gcc/ada/exp_util.adb | 18 ++++++++++------ gcc/ada/sem_disp.adb | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ gcc/ada/sem_res.adb | 35 +++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 6 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index cf4059a..36af89b 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -1854,12 +1854,18 @@ package body Exp_Util is end if; -- Once the DIC assertion expression is fully processed, add a check - -- to the statements of the DIC procedure. - - Add_DIC_Check - (DIC_Prag => DIC_Prag, - DIC_Expr => Expr, - Stmts => Stmts); + -- to the statements of the DIC procedure (unless the type is an + -- abstract type, in which case we don't want the possibility of + -- generating a call to an abstract function of the type; such DIC + -- procedures can never be called in any case, so not generating the + -- check at all is OK). + + if not Is_Abstract_Type (DIC_Typ) then + Add_DIC_Check + (DIC_Prag => DIC_Prag, + DIC_Expr => Expr, + Stmts => Stmts); + end if; end Add_Own_DIC; --------------------- diff --git a/gcc/ada/sem_disp.adb b/gcc/ada/sem_disp.adb index 36efa42..360e73c 100644 --- a/gcc/ada/sem_disp.adb +++ b/gcc/ada/sem_disp.adb @@ -517,6 +517,12 @@ package body Sem_Disp is procedure Abstract_Context_Error; -- Error for abstract call dispatching on result is not dispatching + function Has_Controlling_Current_Instance_Actual_In_DIC + (Call : Node_Id) return Boolean; + -- Return True if the subprogram call Call has a controlling actual + -- given directly by a current instance referenced within a DIC + -- aspect. + ---------------------------- -- Abstract_Context_Error -- ---------------------------- @@ -536,6 +542,44 @@ package body Sem_Disp is end if; end Abstract_Context_Error; + ---------------------------------------- + -- Has_Current_Instance_Actual_In_DIC -- + ---------------------------------------- + + function Has_Controlling_Current_Instance_Actual_In_DIC + (Call : Node_Id) return Boolean + is + A : Node_Id; + F : Entity_Id; + begin + F := First_Formal (Subp_Entity); + A := First_Actual (Call); + + while Present (F) loop + + -- Return True if the actual denotes a current instance (which + -- will be represented by an in-mode formal of the enclosing + -- DIC_Procedure) passed to a controlling formal. We don't have + -- to worry about controlling access formals here, because its + -- illegal to apply Access (etc.) attributes to a current + -- instance within an aspect (by AI12-0068). + + if Is_Controlling_Formal (F) + and then Nkind (A) = N_Identifier + and then Ekind (Entity (A)) = E_In_Parameter + and then Is_Subprogram (Scope (Entity (A))) + and then Is_DIC_Procedure (Scope (Entity (A))) + then + return True; + end if; + + Next_Formal (F); + Next_Actual (A); + end loop; + + return False; + end Has_Controlling_Current_Instance_Actual_In_DIC; + -- Local variables Scop : constant Entity_Id := Current_Scope_No_Loops; @@ -591,6 +635,20 @@ package body Sem_Disp is then null; + -- Similarly to the dispensation for postconditions, a call to + -- an abstract function within a Default_Initial_Condition aspect + -- can be legal when passed a current instance of the type. Such + -- a call will be effectively mapped to a call to a primitive of + -- a descendant type (see AI12-0397, as well as AI12-0170), so + -- doesn't need to be dispatching. We test for being within a DIC + -- procedure, since that's where the call will be analyzed. + + elsif Is_Subprogram (Scop) + and then Is_DIC_Procedure (Scop) + and then Has_Controlling_Current_Instance_Actual_In_DIC (Call) + then + null; + elsif Ekind (Current_Scope) = E_Function and then Nkind (Unit_Declaration_Node (Scop)) = N_Generic_Subprogram_Declaration diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 39907ae..fb551d3 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -5036,6 +5036,41 @@ package body Sem_Res is end if; end if; + -- (AI12-0397): The target of a subprogram call that occurs within + -- the expression of an Default_Initial_Condition aspect and has + -- an actual that is the current instance of the type must be + -- either a primitive of the type or a class-wide subprogram, + -- because the type of the current instance in such an aspect is + -- considered to be a notional formal derived type whose only + -- operations correspond to the primitives of the enclosing type. + -- Nonprimitives can be called, but the current instance must be + -- converted rather than passed directly. Note that a current + -- instance of a type with DIC will occur as a reference to an + -- in-mode formal of an enclosing DIC procedure or partial DIC + -- procedure. (It seems that this check should perhaps also apply + -- to calls within Type_Invariant'Class, but not Type_Invariant, + -- aspects???) + + if Nkind (A) = N_Identifier + and then Ekind (Entity (A)) = E_In_Parameter + + and then Is_Subprogram (Scope (Entity (A))) + and then Is_DIC_Procedure (Scope (Entity (A))) + + -- We check Comes_From_Source to exclude inherited primitives + -- from being flagged, because such subprograms turn out to not + -- always have the Is_Primitive flag set. ??? + + and then Comes_From_Source (Nam) + + and then not Is_Primitive (Nam) + and then not Is_Class_Wide_Type (Etype (F)) + then + Error_Msg_NE + ("call to nonprimitive & with current instance not allowed " & + "for aspect", A, Nam); + end if; + Next_Actual (A); -- Case where actual is not present -- cgit v1.1 From ae77b299e9717e3a76ac6b7be65145a50aa31ed2 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Tue, 8 Dec 2020 12:14:08 -0500 Subject: [Ada] Assert failure on complex code with private type and discriminant gcc/ada/ * einfo.adb (Discriminant_Constraint): Refine assertion. --- gcc/ada/einfo.adb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ada/einfo.adb b/gcc/ada/einfo.adb index 8c401ca..471aea3 100644 --- a/gcc/ada/einfo.adb +++ b/gcc/ada/einfo.adb @@ -1120,7 +1120,9 @@ package body Einfo is function Discriminant_Constraint (Id : E) return L is begin - pragma Assert (Is_Composite_Type (Id) and then Has_Discriminants (Id)); + pragma Assert + (Is_Composite_Type (Id) + and then (Has_Discriminants (Id) or else Is_Constrained (Id))); return Elist21 (Id); end Discriminant_Constraint; -- cgit v1.1 From 9d5f3b7a694ceb774330d45894b38e34bb90f86a Mon Sep 17 00:00:00 2001 From: Yannick Moy Date: Mon, 7 Dec 2020 16:45:23 +0100 Subject: [Ada] Use spans instead of locations for compiler diagnostics gcc/ada/ * errout.adb: (Error_Msg_Internal): Use span instead of location. (Error_Msg, Error_Msg_NEL): Add versions with span parameter. (Error_Msg_F, Error_Msg_FE, Error_Msg_N, Error_Msg_NE, Error_Msg_NW): Retrieve span from node. (First_Node): Use the new First_And_Last_Nodes. (First_And_Last_Nodes): Expand on previous First_Node. Apply to other nodes than expressions. (First_Sloc): Protect against inconsistent locations. (Last_Node): New function based on First_And_Last_Nodes. (Last_Sloc): New function similar to First_Sloc. (Output_Messages): Update output when -gnatdF is used. Use character ~ for making the span visible, similar to what is done in GCC and Clang. * errout.ads (Error_Msg, Error_Msg_NEL): Add versions with span parameter. (First_And_Last_Nodes, Last_Node, Last_Sloc): New subprograms. * erroutc.adb: Adapt to Sptr field being a span. * erroutc.ads (Error_Msg_Object): Change field Sptr from location to span. * errutil.adb: Adapt to Sptr field being a span. * freeze.adb: Use Errout reporting procedures for nodes to get spans. * par-ch3.adb: Likewise. * par-prag.adb: Likewise. * par-util.adb: Likewise. * sem_case.adb: Likewise. * sem_ch13.adb: Likewise. * sem_ch3.adb: Likewise. * sem_prag.adb: Likewise. * types.ads: (Source_Span): New type for spans. (To_Span): Basic constructors for spans. --- gcc/ada/errout.adb | 466 +++++++++++++++++++++++++++++++++++++++++---------- gcc/ada/errout.ads | 38 ++++- gcc/ada/erroutc.adb | 16 +- gcc/ada/erroutc.ads | 2 +- gcc/ada/errutil.adb | 4 +- gcc/ada/freeze.adb | 4 +- gcc/ada/par-ch3.adb | 4 +- gcc/ada/par-prag.adb | 40 ++--- gcc/ada/par-util.adb | 2 +- gcc/ada/sem_case.adb | 10 +- gcc/ada/sem_ch13.adb | 17 +- gcc/ada/sem_ch3.adb | 5 +- gcc/ada/sem_prag.adb | 17 +- gcc/ada/types.ads | 10 ++ 14 files changed, 479 insertions(+), 156 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/errout.adb b/gcc/ada/errout.adb index cc291c6..97fd9d4 100644 --- a/gcc/ada/errout.adb +++ b/gcc/ada/errout.adb @@ -98,8 +98,8 @@ package body Errout is procedure Error_Msg_Internal (Msg : String; - Sptr : Source_Ptr; - Optr : Source_Ptr; + Span : Source_Span; + Opan : Source_Span; Msg_Cont : Boolean; Node : Node_Id); -- This is the low level routine used to post messages after dealing with @@ -218,7 +218,7 @@ package body Errout is Err_Id : Error_Msg_Id := Error_Id; begin - Set_Msg_Text (New_Msg, Errors.Table (Error_Id).Sptr); + Set_Msg_Text (New_Msg, Errors.Table (Error_Id).Sptr.Ptr); Errors.Table (Error_Id).Text := new String'(Msg_Buffer (1 .. Msglen)); -- If in immediate error message mode, output modified error message now @@ -300,14 +300,19 @@ package body Errout is --------------- -- Error_Msg posts a flag at the given location, except that if the - -- Flag_Location points within a generic template and corresponds to an - -- instantiation of this generic template, then the actual message will be - -- posted on the generic instantiation, along with additional messages - -- referencing the generic declaration. + -- Flag_Location/Flag_Span points within a generic template and corresponds + -- to an instantiation of this generic template, then the actual message + -- will be posted on the generic instantiation, along with additional + -- messages referencing the generic declaration. procedure Error_Msg (Msg : String; Flag_Location : Source_Ptr) is begin - Error_Msg (Msg, Flag_Location, Current_Node); + Error_Msg (Msg, To_Span (Flag_Location), Current_Node); + end Error_Msg; + + procedure Error_Msg (Msg : String; Flag_Span : Source_Span) is + begin + Error_Msg (Msg, Flag_Span, Current_Node); end Error_Msg; procedure Error_Msg @@ -318,7 +323,7 @@ package body Errout is Save_Is_Compile_Time_Msg : constant Boolean := Is_Compile_Time_Msg; begin Is_Compile_Time_Msg := Is_Compile_Time_Pragma; - Error_Msg (Msg, Flag_Location, Current_Node); + Error_Msg (Msg, To_Span (Flag_Location), Current_Node); Is_Compile_Time_Msg := Save_Is_Compile_Time_Msg; end Error_Msg; @@ -327,6 +332,17 @@ package body Errout is Flag_Location : Source_Ptr; N : Node_Id) is + begin + Error_Msg (Msg, To_Span (Flag_Location), N); + end Error_Msg; + + procedure Error_Msg + (Msg : String; + Flag_Span : Source_Span; + N : Node_Id) + is + Flag_Location : constant Source_Ptr := Flag_Span.Ptr; + Sindex : Source_File_Index; -- Source index for flag location @@ -429,7 +445,7 @@ package body Errout is -- Error_Msg_Internal to place the message in the requested location. if Instantiation (Sindex) = No_Location then - Error_Msg_Internal (Msg, Flag_Location, Flag_Location, False, N); + Error_Msg_Internal (Msg, Flag_Span, Flag_Span, False, N); return; end if; @@ -525,32 +541,32 @@ package body Errout is if Is_Info_Msg then Error_Msg_Internal (Msg => "info: in inlined body #", - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); elsif Is_Warning_Msg then Error_Msg_Internal (Msg => Warn_Insertion & "in inlined body #", - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); elsif Is_Style_Msg then Error_Msg_Internal (Msg => "style: in inlined body #", - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); else Error_Msg_Internal (Msg => "error in inlined body #", - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); end if; @@ -561,32 +577,32 @@ package body Errout is if Is_Info_Msg then Error_Msg_Internal (Msg => "info: in instantiation #", - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); elsif Is_Warning_Msg then Error_Msg_Internal (Msg => Warn_Insertion & "in instantiation #", - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); elsif Is_Style_Msg then Error_Msg_Internal (Msg => "style: in instantiation #", - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); else Error_Msg_Internal (Msg => "instantiation error #", - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); end if; @@ -605,8 +621,8 @@ package body Errout is Error_Msg_Internal (Msg => Msg, - Sptr => Actual_Error_Loc, - Optr => Flag_Location, + Span => To_Span (Actual_Error_Loc), + Opan => Flag_Span, Msg_Cont => Msg_Cont_Status, Node => N); end; @@ -834,8 +850,13 @@ package body Errout is ----------------- procedure Error_Msg_F (Msg : String; N : Node_Id) is + Fst, Lst : Node_Id; begin - Error_Msg_NEL (Msg, N, N, Sloc (First_Node (N))); + First_And_Last_Nodes (N, Fst, Lst); + Error_Msg_NEL (Msg, N, N, + To_Span (Ptr => Sloc (Fst), + First => First_Sloc (Fst), + Last => Last_Sloc (Lst))); end Error_Msg_F; ------------------ @@ -847,8 +868,13 @@ package body Errout is N : Node_Id; E : Node_Or_Entity_Id) is + Fst, Lst : Node_Id; begin - Error_Msg_NEL (Msg, N, E, Sloc (First_Node (N))); + First_And_Last_Nodes (N, Fst, Lst); + Error_Msg_NEL (Msg, N, E, + To_Span (Ptr => Sloc (Fst), + First => First_Sloc (Fst), + Last => Last_Sloc (Lst))); end Error_Msg_FE; ------------------------ @@ -857,11 +883,14 @@ package body Errout is procedure Error_Msg_Internal (Msg : String; - Sptr : Source_Ptr; - Optr : Source_Ptr; + Span : Source_Span; + Opan : Source_Span; Msg_Cont : Boolean; Node : Node_Id) is + Sptr : constant Source_Ptr := Span.Ptr; + Optr : constant Source_Ptr := Opan.Ptr; + Next_Msg : Error_Msg_Id; -- Pointer to next message at insertion point @@ -1136,7 +1165,7 @@ package body Errout is ((Text => new String'(Msg_Buffer (1 .. Msglen)), Next => No_Error_Msg, Prev => No_Error_Msg, - Sptr => Sptr, + Sptr => Span, Optr => Optr, Insertion_Sloc => (if Has_Insertion_Line then Error_Msg_Sloc else No_Location), @@ -1196,9 +1225,9 @@ package body Errout is if Last_Error_Msg /= No_Error_Msg and then Errors.Table (Cur_Msg).Sfile = Errors.Table (Last_Error_Msg).Sfile - and then (Sptr > Errors.Table (Last_Error_Msg).Sptr + and then (Sptr > Errors.Table (Last_Error_Msg).Sptr.Ptr or else - (Sptr = Errors.Table (Last_Error_Msg).Sptr + (Sptr = Errors.Table (Last_Error_Msg).Sptr.Ptr and then Optr > Errors.Table (Last_Error_Msg).Optr)) then @@ -1216,8 +1245,8 @@ package body Errout is if Errors.Table (Cur_Msg).Sfile = Errors.Table (Next_Msg).Sfile then - exit when Sptr < Errors.Table (Next_Msg).Sptr - or else (Sptr = Errors.Table (Next_Msg).Sptr + exit when Sptr < Errors.Table (Next_Msg).Sptr.Ptr + or else (Sptr = Errors.Table (Next_Msg).Sptr.Ptr and then Optr < Errors.Table (Next_Msg).Optr); end if; @@ -1364,8 +1393,13 @@ package body Errout is ----------------- procedure Error_Msg_N (Msg : String; N : Node_Or_Entity_Id) is + Fst, Lst : Node_Id; begin - Error_Msg_NEL (Msg, N, N, Sloc (N)); + First_And_Last_Nodes (N, Fst, Lst); + Error_Msg_NEL (Msg, N, N, + To_Span (Ptr => Sloc (N), + First => First_Sloc (Fst), + Last => Last_Sloc (Lst))); end Error_Msg_N; ------------------ @@ -1377,8 +1411,13 @@ package body Errout is N : Node_Or_Entity_Id; E : Node_Or_Entity_Id) is + Fst, Lst : Node_Id; begin - Error_Msg_NEL (Msg, N, E, Sloc (N)); + First_And_Last_Nodes (N, Fst, Lst); + Error_Msg_NEL (Msg, N, E, + To_Span (Ptr => Sloc (N), + First => First_Sloc (Fst), + Last => Last_Sloc (Lst))); end Error_Msg_NE; ------------------- @@ -1392,6 +1431,16 @@ package body Errout is Flag_Location : Source_Ptr) is begin + Error_Msg_NEL (Msg, N, E, To_Span (Flag_Location)); + end Error_Msg_NEL; + + procedure Error_Msg_NEL + (Msg : String; + N : Node_Or_Entity_Id; + E : Node_Or_Entity_Id; + Flag_Span : Source_Span) + is + begin if Special_Msg_Delete (Msg, N, E) then return; end if; @@ -1443,7 +1492,7 @@ package body Errout is then Debug_Output (N); Error_Msg_Node_1 := E; - Error_Msg (Msg, Flag_Location, N); + Error_Msg (Msg, Flag_Span, N); else Last_Killed := True; @@ -1463,12 +1512,17 @@ package body Errout is Msg : String; N : Node_Or_Entity_Id) is + Fst, Lst : Node_Id; begin if Eflag and then In_Extended_Main_Source_Unit (N) and then Comes_From_Source (N) then - Error_Msg_NEL (Msg, N, N, Sloc (N)); + First_And_Last_Nodes (N, Fst, Lst); + Error_Msg_NEL (Msg, N, N, + To_Span (Ptr => Sloc (N), + First => First_Sloc (Fst), + Last => Last_Sloc (Lst))); end if; end Error_Msg_NW; @@ -1563,7 +1617,7 @@ package body Errout is F := Nxt; while F /= No_Error_Msg - and then Errors.Table (F).Sptr = Errors.Table (Cur).Sptr + and then Errors.Table (F).Sptr.Ptr = Errors.Table (Cur).Sptr.Ptr loop Check_Duplicate_Message (Cur, F); F := Errors.Table (F).Next; @@ -1583,8 +1637,8 @@ package body Errout is begin if (CE.Warn and not CE.Deleted) and then - (Warning_Specifically_Suppressed (CE.Sptr, CE.Text, Tag) /= - No_String + (Warning_Specifically_Suppressed (CE.Sptr.Ptr, CE.Text, Tag) + /= No_String or else Warning_Specifically_Suppressed (CE.Optr, CE.Text, Tag) /= No_String) @@ -1630,23 +1684,40 @@ package body Errout is ---------------- function First_Node (C : Node_Id) return Node_Id is + Fst, Lst : Node_Id; + begin + First_And_Last_Nodes (C, Fst, Lst); + return Fst; + end First_Node; + + -------------------------- + -- First_And_Last_Nodes -- + -------------------------- + + procedure First_And_Last_Nodes + (C : Node_Id; + First_Node, Last_Node : out Node_Id) + is Orig : constant Node_Id := Original_Node (C); Loc : constant Source_Ptr := Sloc (Orig); Sfile : constant Source_File_Index := Get_Source_File_Index (Loc); Earliest : Node_Id; + Latest : Node_Id; Eloc : Source_Ptr; + Lloc : Source_Ptr; - function Test_Earlier (N : Node_Id) return Traverse_Result; + function Test_First_And_Last (N : Node_Id) return Traverse_Result; -- Function applied to every node in the construct - procedure Search_Tree_First is new Traverse_Proc (Test_Earlier); + procedure Search_Tree_First_And_Last is new + Traverse_Proc (Test_First_And_Last); -- Create traversal procedure - ------------------ - -- Test_Earlier -- - ------------------ + ------------------------- + -- Test_First_And_Last -- + ------------------------- - function Test_Earlier (N : Node_Id) return Traverse_Result is + function Test_First_And_Last (N : Node_Id) return Traverse_Result is Norig : constant Node_Id := Original_Node (N); Loc : constant Source_Ptr := Sloc (Norig); @@ -1670,22 +1741,61 @@ package body Errout is Eloc := Loc; end if; + -- Check for later + + if Loc > Lloc + + -- Ignore nodes with no useful location information + + and then Loc /= Standard_Location + and then Loc /= No_Location + + -- Ignore nodes from a different file. This ensures against cases + -- of strange foreign code somehow being present. We don't want + -- wild placement of messages if that happens. + + and then Get_Source_File_Index (Loc) = Sfile + then + Latest := Norig; + Lloc := Loc; + end if; + return OK_Orig; - end Test_Earlier; + end Test_First_And_Last; - -- Start of processing for First_Node + -- Start of processing for First_And_Last_Nodes begin - if Nkind (Orig) in N_Subexpr then + if Nkind (Orig) in N_Subexpr + | N_Declaration + | N_Access_To_Subprogram_Definition + | N_Generic_Instantiation + | N_Subprogram_Declaration + | N_Use_Package_Clause + | N_Array_Type_Definition + | N_Renaming_Declaration + | N_Generic_Renaming_Declaration + | N_Assignment_Statement + | N_Raise_Statement + | N_Simple_Return_Statement + | N_Exit_Statement + | N_Pragma + | N_Use_Type_Clause + | N_With_Clause + then Earliest := Orig; Eloc := Loc; - Search_Tree_First (Orig); - return Earliest; + Latest := Orig; + Lloc := Loc; + Search_Tree_First_And_Last (Orig); + First_Node := Earliest; + Last_Node := Latest; else - return Orig; + First_Node := Orig; + Last_Node := Orig; end if; - end First_Node; + end First_And_Last_Nodes; ---------------- -- First_Sloc -- @@ -1694,6 +1804,7 @@ package body Errout is function First_Sloc (N : Node_Id) return Source_Ptr is SI : constant Source_File_Index := Source_Index (Get_Source_Unit (N)); SF : constant Source_Ptr := Source_First (SI); + SL : constant Source_Ptr := Source_Last (SI); F : Node_Id; S : Source_Ptr; @@ -1701,6 +1812,14 @@ package body Errout is F := First_Node (N); S := Sloc (F); + -- ??? Protect against inconsistency in locations, by returning S + -- immediately if not in the expected range, rather than failing with + -- a Constraint_Error when accessing Source_Text(SI)(S) + + if S not in SF .. SL then + return S; + end if; + -- The following circuit is a bit subtle. When we have parenthesized -- expressions, then the Sloc will not record the location of the paren, -- but we would like to post the flag on the paren. So what we do is to @@ -1786,6 +1905,92 @@ package body Errout is -- True if S starts with Size_For end Is_Size_Too_Small_Message; + --------------- + -- Last_Node -- + --------------- + + function Last_Node (C : Node_Id) return Node_Id is + Fst, Lst : Node_Id; + begin + First_And_Last_Nodes (C, Fst, Lst); + return Lst; + end Last_Node; + + --------------- + -- Last_Sloc -- + --------------- + + function Last_Sloc (N : Node_Id) return Source_Ptr is + SI : constant Source_File_Index := Source_Index (Get_Source_Unit (N)); + SF : constant Source_Ptr := Source_First (SI); + SL : constant Source_Ptr := Source_Last (SI); + F : Node_Id; + S : Source_Ptr; + + begin + F := Last_Node (N); + S := Sloc (F); + + -- ??? Protect against inconsistency in locations, by returning S + -- immediately if not in the expected range, rather than failing with + -- a Constraint_Error when accessing Source_Text(SI)(S) + + if S not in SF .. SL then + return S; + end if; + + -- Skip past an identifier + + while S in SF .. SL - 1 + and then Source_Text (SI) (S + 1) + in + '0' .. '9' | 'a' .. 'z' | 'A' .. 'Z' | '.' | '_' + loop + S := S + 1; + end loop; + + -- The following circuit attempts at crawling up the tree from the + -- Last_Node, adjusting the Sloc value for any parentheses we know + -- are present, similarly to what is done in First_Sloc. + + Node_Loop : loop + Paren_Loop : for J in 1 .. Paren_Count (F) loop + + -- We don't look more than 12 characters after the current + -- location + + Search_Loop : for K in 1 .. 12 loop + exit Node_Loop when S = SL; + + if Source_Text (SI) (S + 1) = ')' then + S := S + 1; + exit Search_Loop; + + elsif Source_Text (SI) (S + 1) <= ' ' then + S := S + 1; + + else + exit Search_Loop; + end if; + end loop Search_Loop; + end loop Paren_Loop; + + exit Node_Loop when F = N; + F := Parent (F); + exit Node_Loop when Nkind (F) not in N_Subexpr; + end loop Node_Loop; + + -- Remove any trailing space + + while S in SF + 1 .. SL + and then Source_Text (SI) (S) = ' ' + loop + S := S - 1; + end loop; + + return S; + end Last_Sloc; + ----------------- -- No_Warnings -- ----------------- @@ -1858,13 +2063,30 @@ package body Errout is procedure Write_Max_Errors; -- Write message if max errors reached - procedure Write_Source_Code_Line (Loc : Source_Ptr); - -- Write the source code line corresponding to Loc, as follows: + procedure Write_Source_Code_Lines (Span : Source_Span); + -- Write the source code line corresponding to Span, as follows when + -- Span in on one line: + -- + -- line | actual code line here with Span somewhere + -- | ~~~~~^~~~ + -- + -- where the caret on the line points to location Span.Ptr, and the + -- range Span.First..Span.Last is underlined. + -- + -- or when the span is over multiple lines: + -- + -- line | beginning of the Span on this line + -- ... | ... + -- line>| actual code line here with Span.Ptr somewhere + -- ... | ... + -- line | end of the Span on this line + -- + -- or when the span is a simple location, as follows: -- - -- line | actual code line here with Loc somewhere + -- line | actual code line here with Span somewhere -- | ^ here -- - -- where the carret on the last line points to location Loc. + -- where the caret on the line points to location Span.Ptr ------------------------- -- Write_Error_Summary -- @@ -2056,17 +2278,25 @@ package body Errout is end if; end Write_Max_Errors; - ---------------------------- - -- Write_Source_Code_Line -- - ---------------------------- + ----------------------------- + -- Write_Source_Code_Lines -- + ----------------------------- - procedure Write_Source_Code_Line (Loc : Source_Ptr) is + procedure Write_Source_Code_Lines (Span : Source_Span) is function Image (X : Positive; Width : Positive) return String; -- Output number X over Width characters, with whitespace padding. -- Only output the low-order Width digits of X, if X is larger than -- Width digits. + procedure Write_Line_Marker + (Num : Pos; + Mark : Boolean; + Width : Positive); + -- Output the line number Num over Width characters, with possibly + -- a Mark to denote the line with the main location when reporting + -- a span over multiple lines. + ----------- -- Image -- ----------- @@ -2087,26 +2317,76 @@ package body Errout is return Str; end Image; + ----------------------- + -- Write_Line_Marker -- + ----------------------- + + procedure Write_Line_Marker + (Num : Pos; + Mark : Boolean; + Width : Positive) + is + begin + Write_Str (Image (Positive (Num), Width => Width)); + Write_Str ((if Mark then ">" else " ") & "|"); + end Write_Line_Marker; + -- Local variables - Line : constant Pos := Pos (Get_Physical_Line_Number (Loc)); - Col : constant Natural := Natural (Get_Column_Number (Loc)); - Width : constant := 5; + Loc : constant Source_Ptr := Span.Ptr; + Line : constant Pos := Pos (Get_Physical_Line_Number (Loc)); - Buf : Source_Buffer_Ptr; - Cur_Loc : Source_Ptr := Loc; + Col : constant Natural := Natural (Get_Column_Number (Loc)); - -- Start of processing for Write_Source_Code_Line + Fst : constant Source_Ptr := Span.First; + Line_Fst : constant Pos := + Pos (Get_Physical_Line_Number (Fst)); + Col_Fst : constant Natural := + Natural (Get_Column_Number (Fst)); + Lst : constant Source_Ptr := Span.Last; + Line_Lst : constant Pos := + Pos (Get_Physical_Line_Number (Lst)); + Col_Lst : constant Natural := + Natural (Get_Column_Number (Lst)); + + Width : constant := 5; + Buf : Source_Buffer_Ptr; + Cur_Loc : Source_Ptr := Fst; + Cur_Line : Pos := Line_Fst; + + -- Start of processing for Write_Source_Code_Lines begin if Loc >= First_Source_Ptr then Buf := Source_Text (Get_Source_File_Index (Loc)); - -- First line with the actual source code line + -- First line of the span with actual source code - Write_Str (Image (Positive (Line), Width => Width)); - Write_Str (" |"); - Write_Str (String (Buf (Loc - Source_Ptr (Col) + 1 .. Loc - 1))); + Write_Line_Marker + (Cur_Line, + Line_Fst /= Line_Lst and then Cur_Line = Line, + Width); + Write_Str + (String (Buf (Fst - Source_Ptr (Col_Fst) + 1 .. Fst - 1))); + + -- Output all the lines in the span + + while Cur_Loc <= Buf'Last + and then Cur_Loc < Lst + loop + Write_Char (Buf (Cur_Loc)); + Cur_Loc := Cur_Loc + 1; + + if Buf (Cur_Loc - 1) = ASCII.LF then + Cur_Line := Cur_Line + 1; + Write_Line_Marker + (Cur_Line, + Line_Fst /= Line_Lst and then Cur_Line = Line, + Width); + end if; + end loop; + + -- Output the rest of the last line of the span while Cur_Loc <= Buf'Last and then Buf (Cur_Loc) /= ASCII.LF @@ -2117,15 +2397,28 @@ package body Errout is Write_Eol; - -- Second line with carret sign pointing to location Loc + -- If the span is on one line, output a second line with caret + -- sign pointing to location Loc - Write_Str (String'(1 .. Width => ' ')); - Write_Str (" |"); - Write_Str (String'(1 .. Col - 1 => ' ')); - Write_Str ("^ here"); - Write_Eol; + if Line_Fst = Line_Lst then + Write_Str (String'(1 .. Width => ' ')); + Write_Str (" |"); + Write_Str (String'(1 .. Col_Fst - 1 => ' ')); + Write_Str (String'(Col_Fst .. Col - 1 => '~')); + Write_Str ("^"); + Write_Str (String'(Col + 1 .. Col_Lst => '~')); + + -- If the span is really just a location, add the word "here" + -- to clarify this is the location for the message. + + if Col_Fst = Col_Lst then + Write_Str (" here"); + end if; + + Write_Eol; + end if; end if; - end Write_Source_Code_Line; + end Write_Source_Code_Lines; -- Local variables @@ -2217,12 +2510,12 @@ package body Errout is Errors.Table (E).Insertion_Sloc; begin if Loc /= No_Location then - Write_Source_Code_Line (Loc); + Write_Source_Code_Lines (To_Span (Loc)); end if; end; else - Write_Source_Code_Line (Errors.Table (E).Sptr); + Write_Source_Code_Lines (Errors.Table (E).Sptr); end if; end if; end if; @@ -2355,11 +2648,12 @@ package body Errout is -- subunits for a body). while E /= No_Error_Msg - and then (not In_Extended_Main_Source_Unit (Errors.Table (E).Sptr) + and then (not In_Extended_Main_Source_Unit + (Errors.Table (E).Sptr.Ptr) or else (Debug_Flag_Dot_M and then Get_Source_Unit - (Errors.Table (E).Sptr) /= Main_Unit)) + (Errors.Table (E).Sptr.Ptr) /= Main_Unit)) loop if Errors.Table (E).Deleted then E := Errors.Table (E).Next; diff --git a/gcc/ada/errout.ads b/gcc/ada/errout.ads index 02cfdee..f9a8379 100644 --- a/gcc/ada/errout.ads +++ b/gcc/ada/errout.ads @@ -703,10 +703,15 @@ package Errout is procedure Error_Msg (Msg : String; Flag_Location : Source_Ptr); procedure Error_Msg + (Msg : String; Flag_Span : Source_Span); + procedure Error_Msg (Msg : String; Flag_Location : Source_Ptr; N : Node_Id); + procedure Error_Msg + (Msg : String; Flag_Span : Source_Span; N : Node_Id); -- Output a message at specified location. Can be called from the parser -- or the semantic analyzer. If N is set, points to the relevant node for - -- this message. + -- this message. The version with a span is preferred whenever possible, + -- in other cases the version with a location can still be used. procedure Error_Msg (Msg : String; @@ -782,8 +787,13 @@ package Errout is N : Node_Or_Entity_Id; E : Node_Or_Entity_Id; Flag_Location : Source_Ptr); + procedure Error_Msg_NEL + (Msg : String; + N : Node_Or_Entity_Id; + E : Node_Or_Entity_Id; + Flag_Span : Source_Span); -- Exactly the same as Error_Msg_NE, except that the flag is placed at - -- the specified Flag_Location instead of at Sloc (N). + -- the specified Flag_Location/Flag_Span instead of at Sloc (N). procedure Error_Msg_NW (Eflag : Boolean; @@ -801,12 +811,17 @@ package Errout is -- the given text. This text may contain insertion characters in the -- usual manner, and need not be the same length as the original text. + procedure First_And_Last_Nodes + (C : Node_Id; + First_Node, Last_Node : out Node_Id); + -- Given a construct C, finds the first and last node in the construct, + -- i.e. the ones with the lowest and highest Sloc value. This is useful in + -- placing error msgs. Note that this procedure uses Original_Node to look + -- at the original source tree, since that's what we want for placing an + -- error message flag in the right place. + function First_Node (C : Node_Id) return Node_Id; - -- Given a construct C, finds the first node in the construct, i.e. the one - -- with the lowest Sloc value. This is useful in placing error msgs. Note - -- that this procedure uses Original_Node to look at the original source - -- tree, since that's what we want for placing an error message flag in - -- the right place. + -- Return the first output of First_And_Last_Nodes function First_Sloc (N : Node_Id) return Source_Ptr; -- Given the node for an expression, return a source pointer value that @@ -817,6 +832,15 @@ package Errout is function Get_Ignore_Errors return Boolean; -- Return True if all error calls are ignored. + function Last_Node (C : Node_Id) return Node_Id; + -- Return the last output of First_And_Last_Nodes + + function Last_Sloc (N : Node_Id) return Source_Ptr; + -- Given the node for an expression, return a source pointer value that + -- points to the end of the last token in the expression. In the case + -- where the expression is parenthesized, an attempt is made to include + -- the parentheses (i.e. to return the location of the final paren). + procedure Purge_Messages (From : Source_Ptr; To : Source_Ptr) renames Erroutc.Purge_Messages; -- All error messages whose location is in the range From .. To (not diff --git a/gcc/ada/erroutc.adb b/gcc/ada/erroutc.adb index d0cc6ff..d7ca221 100644 --- a/gcc/ada/erroutc.adb +++ b/gcc/ada/erroutc.adb @@ -321,7 +321,7 @@ package body Erroutc is Write_Str (" Sptr = "); - Write_Location (E.Sptr); + Write_Location (E.Sptr.Ptr); -- ??? Do not write the full span for now Write_Eol; Write_Str @@ -350,7 +350,7 @@ package body Erroutc is function Get_Location (E : Error_Msg_Id) return Source_Ptr is begin - return Errors.Table (E).Sptr; + return Errors.Table (E).Sptr.Ptr; end Get_Location; ---------------- @@ -477,7 +477,7 @@ package body Erroutc is and then Errors.Table (T).Line = Errors.Table (E).Line and then Errors.Table (T).Sfile = Errors.Table (E).Sfile loop - if Errors.Table (T).Sptr > Errors.Table (E).Sptr then + if Errors.Table (T).Sptr.Ptr > Errors.Table (E).Sptr.Ptr then Mult_Flags := True; end if; @@ -490,7 +490,7 @@ package body Erroutc is if not Debug_Flag_2 then Write_Str (" "); - P := Line_Start (Errors.Table (E).Sptr); + P := Line_Start (Errors.Table (E).Sptr.Ptr); Flag_Num := 1; -- Loop through error messages for this line to place flags @@ -507,7 +507,7 @@ package body Erroutc is begin -- Loop to output blanks till current flag position - while P < Errors.Table (T).Sptr loop + while P < Errors.Table (T).Sptr.Ptr loop -- Horizontal tab case, just echo the tab @@ -536,7 +536,7 @@ package body Erroutc is -- Output flag (unless already output, this happens if more -- than one error message occurs at the same flag position). - if P = Errors.Table (T).Sptr then + if P = Errors.Table (T).Sptr.Ptr then if (Flag_Num = 1 and then not Mult_Flags) or else Flag_Num > 9 then @@ -955,8 +955,8 @@ package body Erroutc is function To_Be_Purged (E : Error_Msg_Id) return Boolean is begin if E /= No_Error_Msg - and then Errors.Table (E).Sptr > From - and then Errors.Table (E).Sptr < To + and then Errors.Table (E).Sptr.Ptr > From + and then Errors.Table (E).Sptr.Ptr < To then if Errors.Table (E).Warn or else Errors.Table (E).Style then Warnings_Detected := Warnings_Detected - 1; diff --git a/gcc/ada/erroutc.ads b/gcc/ada/erroutc.ads index 4c0e68a..eb43466 100644 --- a/gcc/ada/erroutc.ads +++ b/gcc/ada/erroutc.ads @@ -197,7 +197,7 @@ package Erroutc is -- refers to a template, always references the original template -- not an instantiation copy. - Sptr : Source_Ptr; + Sptr : Source_Span; -- Flag pointer. In the case of an error that refers to a template, -- always references the original template, not an instantiation copy. -- This value is the actual place in the source that the error message diff --git a/gcc/ada/errutil.adb b/gcc/ada/errutil.adb index d4821fc..0a9f6ad 100644 --- a/gcc/ada/errutil.adb +++ b/gcc/ada/errutil.adb @@ -207,7 +207,7 @@ package body Errutil is Next => No_Error_Msg, Prev => No_Error_Msg, Sfile => Get_Source_File_Index (Sptr), - Sptr => Sptr, + Sptr => To_Span (Sptr), Optr => Optr, Insertion_Sloc => No_Location, Line => Get_Physical_Line_Number (Sptr), @@ -234,7 +234,7 @@ package body Errutil is Errors.Table (Cur_Msg).Sfile < Errors.Table (Next_Msg).Sfile; if Errors.Table (Cur_Msg).Sfile = Errors.Table (Next_Msg).Sfile then - exit when Sptr < Errors.Table (Next_Msg).Sptr; + exit when Sptr < Errors.Table (Next_Msg).Sptr.Ptr; end if; Prev_Msg := Next_Msg; diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index da14af9..cbdecaa 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -3644,8 +3644,8 @@ package body Freeze is and then not Freezing_Library_Level_Tagged_Type then Error_Msg_Node_1 := F_Type; - Error_Msg - ("type & must be fully defined before this point", Loc); + Error_Msg_N + ("type & must be fully defined before this point", N); end if; end if; diff --git a/gcc/ada/par-ch3.adb b/gcc/ada/par-ch3.adb index 78a3ebd..41aad79 100644 --- a/gcc/ada/par-ch3.adb +++ b/gcc/ada/par-ch3.adb @@ -1379,9 +1379,9 @@ package body Ch3 is procedure No_List is begin if Num_Idents > 1 then - Error_Msg + Error_Msg_N ("identifier list not allowed for RENAMES", - Sloc (Idents (2))); + Idents (2)); end if; List_OK := False; diff --git a/gcc/ada/par-prag.adb b/gcc/ada/par-prag.adb index 51409f2..d05f267 100644 --- a/gcc/ada/par-prag.adb +++ b/gcc/ada/par-prag.adb @@ -158,7 +158,7 @@ function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id is procedure Check_Arg_Count (Required : Int) is begin if Arg_Count /= Required then - Error_Msg ("wrong number of arguments for pragma%", Pragma_Sloc); + Error_Msg_N ("wrong number of arguments for pragma%", Pragma_Node); raise Error_Resync; end if; end Check_Arg_Count; @@ -177,7 +177,7 @@ function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id is Error_Msg_Name_2 := Name_On; Error_Msg_Name_3 := Name_Off; - Error_Msg ("argument for pragma% must be% or%", Sloc (Argx)); + Error_Msg_N ("argument for pragma% must be% or%", Argx); raise Error_Resync; end if; end Check_Arg_Is_On_Or_Off; @@ -189,9 +189,9 @@ function Prag (Pragma_Node : Node_Id; Semi : Source_Ptr) return Node_Id is procedure Check_Arg_Is_String_Literal (Arg : Node_Id) is begin if Nkind (Expression (Arg)) /= N_String_Literal then - Error_Msg + Error_Msg_N ("argument for pragma% must be string literal", - Sloc (Expression (Arg))); + Expression (Arg)); raise Error_Resync; end if; end Check_Arg_Is_String_Literal; @@ -466,7 +466,7 @@ begin A := Expression (Arg1); if Nkind (A) /= N_Identifier then - Error_Msg ("incorrect argument for pragma %", Sloc (A)); + Error_Msg_N ("incorrect argument for pragma %", A); else Set_Name_Table_Boolean3 (Chars (A), True); end if; @@ -718,9 +718,9 @@ begin begin if Prag_Id = Pragma_Source_File_Name then if Project_File_In_Use = In_Use then - Error_Msg + Error_Msg_N ("pragma Source_File_Name cannot be used " & - "with a project file", Pragma_Sloc); + "with a project file", Pragma_Node); else Project_File_In_Use := Not_In_Use; @@ -728,9 +728,9 @@ begin else if Project_File_In_Use = Not_In_Use then - Error_Msg + Error_Msg_N ("pragma Source_File_Name_Project should only be used " & - "with a project file", Pragma_Sloc); + "with a project file", Pragma_Node); else Project_File_In_Use := In_Use; end if; @@ -773,9 +773,9 @@ begin or else Intval (Expr) > 999 or else Intval (Expr) <= 0 then - Error_Msg + Error_Msg_N ("pragma% index must be integer literal" & - " in range 1 .. 999", Sloc (Expr)); + " in range 1 .. 999", Expr); raise Error_Resync; else Index := UI_To_Int (Intval (Expr)); @@ -908,8 +908,8 @@ begin and then Num_SRef_Pragmas (Current_Source_File) = 0 and then Operating_Mode /= Check_Syntax then - Error_Msg -- CODEFIX - ("first % pragma must be first line of file", Pragma_Sloc); + Error_Msg_N -- CODEFIX + ("first % pragma must be first line of file", Pragma_Node); raise Error_Resync; end if; @@ -917,9 +917,9 @@ begin if Arg_Count = 1 then if Num_SRef_Pragmas (Current_Source_File) = 0 then - Error_Msg + Error_Msg_N ("file name required for first % pragma in file", - Pragma_Sloc); + Pragma_Node); raise Error_Resync; else Fname := No_File; @@ -934,17 +934,17 @@ begin if Num_SRef_Pragmas (Current_Source_File) > 0 then if Fname /= Full_Ref_Name (Current_Source_File) then - Error_Msg - ("file name must be same in all % pragmas", Pragma_Sloc); + Error_Msg_N + ("file name must be same in all % pragmas", Pragma_Node); raise Error_Resync; end if; end if; end if; if Nkind (Expression (Arg1)) /= N_Integer_Literal then - Error_Msg + Error_Msg_N ("argument for pragma% must be integer literal", - Sloc (Expression (Arg1))); + Expression (Arg1)); raise Error_Resync; -- OK, this source reference pragma is effective, however, we @@ -1059,7 +1059,7 @@ begin end if; if not OK then - Error_Msg ("incorrect argument for pragma%", Sloc (A)); + Error_Msg_N ("incorrect argument for pragma%", A); raise Error_Resync; end if; end if; diff --git a/gcc/ada/par-util.adb b/gcc/ada/par-util.adb index 1f26075..0571c0f 100644 --- a/gcc/ada/par-util.adb +++ b/gcc/ada/par-util.adb @@ -254,7 +254,7 @@ package body Util is then return Mark; else - Error_Msg ("subtype mark expected", Sloc (Mark)); + Error_Msg_N ("subtype mark expected", Mark); return Error; end if; end Check_Subtype_Mark; diff --git a/gcc/ada/sem_case.adb b/gcc/ada/sem_case.adb index 6cda6a9..7f35cfc 100644 --- a/gcc/ada/sem_case.adb +++ b/gcc/ada/sem_case.adb @@ -677,8 +677,6 @@ package body Sem_Case is -------------------- procedure Missing_Choice (Value1 : Uint; Value2 : Uint) is - Msg_Sloc : constant Source_Ptr := Sloc (Case_Node); - begin -- AI05-0188 : within an instance the non-others choices do not have -- to belong to the actual subtype. @@ -704,10 +702,10 @@ package body Sem_Case is if Value1 = Value2 then if Is_Integer_Type (Bounds_Type) then Error_Msg_Uint_1 := Value1; - Error_Msg ("missing case value: ^!", Msg_Sloc); + Error_Msg_N ("missing case value: ^!", Case_Node); else Error_Msg_Name_1 := Choice_Image (Value1, Bounds_Type); - Error_Msg ("missing case value: %!", Msg_Sloc); + Error_Msg_N ("missing case value: %!", Case_Node); end if; -- More than one choice value, so print range of values @@ -716,11 +714,11 @@ package body Sem_Case is if Is_Integer_Type (Bounds_Type) then Error_Msg_Uint_1 := Value1; Error_Msg_Uint_2 := Value2; - Error_Msg ("missing case values: ^ .. ^!", Msg_Sloc); + Error_Msg_N ("missing case values: ^ .. ^!", Case_Node); else Error_Msg_Name_1 := Choice_Image (Value1, Bounds_Type); Error_Msg_Name_2 := Choice_Image (Value2, Bounds_Type); - Error_Msg ("missing case values: % .. %!", Msg_Sloc); + Error_Msg_N ("missing case values: % .. %!", Case_Node); end if; end if; end Missing_Choice; diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 4724e0e..07dec4c 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -4147,8 +4147,8 @@ package body Sem_Ch13 is -- Must not be parenthesized if Paren_Count (Expr) /= 0 then - Error_Msg -- CODEFIX - ("redundant parentheses", First_Sloc (Expr)); + Error_Msg_F -- CODEFIX + ("redundant parentheses", Expr); end if; -- List of arguments is list of aggregate expressions @@ -4442,8 +4442,8 @@ package body Sem_Ch13 is -- parentheses). if Paren_Count (Expr) /= 0 then - Error_Msg -- CODEFIX - ("redundant parentheses", First_Sloc (Expr)); + Error_Msg_F -- CODEFIX + ("redundant parentheses", Expr); goto Continue; end if; @@ -4860,11 +4860,11 @@ package body Sem_Ch13 is Error_Msg_Name_1 := Aspect_Names (A_Id); Error_Msg_Sloc := Sloc (Inherited_Aspect); - Error_Msg + Error_Msg_N ("overriding aspect specification for " & "nonoverridable aspect % does not confirm " & "aspect specification inherited from #", - Sloc (Aspect)); + Aspect); end if; end; end if; @@ -7909,9 +7909,8 @@ package body Sem_Ch13 is -- Check that the expression is a proper aggregate (no parentheses) elsif Paren_Count (Aggr) /= 0 then - Error_Msg - ("extra parentheses surrounding aggregate not allowed", - First_Sloc (Aggr)); + Error_Msg_F + ("extra parentheses surrounding aggregate not allowed", Aggr); return; -- All tests passed, so set rep clause in place diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 41e1e49..4784397 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -1575,9 +1575,8 @@ package body Sem_Ch3 is begin if not RTE_Available (RE_Interface_Tag) then - Error_Msg - ("(Ada 2005) interface types not supported by this run-time!", - Sloc (N)); + Error_Msg_N + ("(Ada 2005) interface types not supported by this run-time!", N); return; end if; diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 3ef5e82..1b1e01b 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -566,8 +566,8 @@ package body Sem_Prag is -- Check that the expression is a proper aggregate (no parentheses) if Paren_Count (CCases) /= 0 then - Error_Msg -- CODEFIX - ("redundant parentheses", First_Sloc (CCases)); + Error_Msg_F -- CODEFIX + ("redundant parentheses", CCases); end if; -- Ensure that the formal parameters are visible when analyzing all @@ -15041,9 +15041,8 @@ package body Sem_Prag is else -- All other cases: diagnose error - Error_Msg - ("argument of pragma ""Debug"" is not procedure call", - Sloc (Call)); + Error_Msg_N + ("argument of pragma ""Debug"" is not procedure call", Call); return; end if; @@ -25632,9 +25631,9 @@ package body Sem_Prag is Set_Specific_Warning_On (Loc, Message, Err); if Err then - Error_Msg + Error_Msg_N ("??pragma Warnings On with no matching " - & "Warnings Off", Loc); + & "Warnings Off", N); end if; end if; end; @@ -29206,8 +29205,8 @@ package body Sem_Prag is -- Check that the expression is a proper aggregate (no parentheses) if Paren_Count (Variants) /= 0 then - Error_Msg -- CODEFIX - ("redundant parentheses", First_Sloc (Variants)); + Error_Msg_F -- CODEFIX + ("redundant parentheses", Variants); end if; -- Ensure that the formal parameters are visible when analyzing all diff --git a/gcc/ada/types.ads b/gcc/ada/types.ads index 175ffb2..408d661 100644 --- a/gcc/ada/types.ads +++ b/gcc/ada/types.ads @@ -218,6 +218,16 @@ package Types is -- which source it refers to. Note that negative numbers are allowed to -- accommodate the following special values. + type Source_Span is record + Ptr, First, Last : Source_Ptr; + end record; + -- Type used to represent a source span, consisting in a main location Ptr, + -- with a First and Last location, such that Ptr in First .. Last + + function To_Span (Loc : Source_Ptr) return Source_Span is ((others => Loc)); + function To_Span (Ptr, First, Last : Source_Ptr) return Source_Span is + ((Ptr, First, Last)); + No_Location : constant Source_Ptr := -1; -- Value used to indicate no source position set in a node. A test for a -- Source_Ptr value being > No_Location is the approved way to test for a -- cgit v1.1 From 35e3a1f670dc5ef033184ef1103f8d4e0fb42d1e Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 8 Dec 2020 23:53:43 +0100 Subject: [Ada] Eliminate early roundoff error for Long_Long_Float on x86 gcc/ada/ * libgnat/s-valrea.adb (Fast2Sum): New function. (Integer_to_Real): Use it in an iterated addition with exact error handling for the case where an extra digit is needed. Move local variable now only used in the exponentiation case. --- gcc/ada/libgnat/s-valrea.adb | 100 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 84 insertions(+), 16 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/libgnat/s-valrea.adb b/gcc/ada/libgnat/s-valrea.adb index 582b966..99dd25d 100644 --- a/gcc/ada/libgnat/s-valrea.adb +++ b/gcc/ada/libgnat/s-valrea.adb @@ -46,7 +46,7 @@ package body System.Val_Real is -- If the mantissa of the floating-point type is almost as large as the -- unsigned type, we do not have enough space for an extra digit in the -- unsigned type so we handle the extra digit separately, at the cost of - -- a potential roundoff error. + -- a bit more work in Integer_to_Real. Precision_Limit : constant Uns := (if Need_Extra then 2**Num'Machine_Mantissa - 1 else 2**Uns'Size - 1); @@ -76,6 +76,10 @@ package body System.Val_Real is 7 => 5836, 8 => 5461, 9 => 5168, 10 => 4932, 11 => 4736, 12 => 4570, 13 => 4427, 14 => 4303, 15 => 4193, 16 => 4095); + function Fast2Sum (A, B : Num; Err : in out Num) return Num; + -- This is the classical Fast2Sum function assuming round to nearest, + -- with the error accumulated into Err. + function Integer_to_Real (Str : String; Val : Uns; @@ -85,6 +89,25 @@ package body System.Val_Real is Minus : Boolean) return Num; -- Convert the real value from integer to real representation + -------------- + -- Fast2Sum -- + -------------- + + function Fast2Sum (A, B : Num; Err : in out Num) return Num is + S, Z : Num; + + begin + pragma Assert (abs (A) >= abs (B)); + + S := A + B; + Z := S - A; + Z := B - Z; + + Err := Err + Z; + + return S; + end Fast2Sum; + --------------------- -- Integer_to_Real -- --------------------- @@ -110,8 +133,6 @@ package body System.Val_Real is else raise Program_Error); -- Maximum exponent of the base that can fit in Num - B : constant Num := Num (Base); - R_Val : Num; S : Integer := Scale; @@ -129,12 +150,53 @@ package body System.Val_Real is R_Val := Num (Val); - -- Take into account the extra digit, if need be. In this case, the - -- three operands are exact, so using an FMA would be ideal. + -- Take into account the extra digit, i.e. do the two computations + + -- (1) R_Val := R_Val * Num (B) + Num (Extra) + -- (2) S := S - 1 + + -- In the first, the three operands are exact, so using an FMA would + -- be ideal, but we are most likely running on the x87 FPU, hence we + -- may not have one. That is why we turn the multiplication into an + -- iterated addition with exact error handling, so that we can do a + -- single rounding at the end. if Need_Extra and then Extra > 0 then - R_Val := R_Val * B + Num (Extra); - S := S - 1; + declare + B : Unsigned := Base; + + Acc : Num := 0.0; + Err : Num := 0.0; + Fac : Num := R_Val; + + begin + loop + -- If B is odd, add one factor. Note that the accumulator is + -- never larger than the factor at this point (it is in fact + -- never larger than the factor minus the initial value). + + if B rem 2 /= 0 then + Acc := (if Acc = 0.0 then Fac else Fast2Sum (Fac, Acc, Err)); + exit when B = 1; + end if; + + -- Now B is (morally) even, halve it and double the factor, + -- which is always an exact operation. + + B := B / 2; + Fac := Fac * 2.0; + end loop; + + -- Add Extra to the error, which are both small integers + + Err := Err + Num (Extra); + + -- Acc + Err is the exact result before rounding + + R_Val := Acc + Err; + + S := S - 1; + end; end if; -- Compute the final value @@ -207,17 +269,23 @@ package body System.Val_Real is -- an artificial underflow. when others => - if S > 0 then - R_Val := R_Val * B ** S; + declare + B : constant Num := Num (Base); - else - if S < -Maxexp then - R_Val := R_Val / B ** Maxexp; - S := S + Maxexp; - end if; + begin - R_Val := R_Val / B ** (-S); - end if; + if S > 0 then + R_Val := R_Val * B ** S; + + else + if S < -Maxexp then + R_Val := R_Val / B ** Maxexp; + S := S + Maxexp; + end if; + + R_Val := R_Val / B ** (-S); + end if; + end; end case; end if; -- cgit v1.1 From 43d5138227078bf9fca4f9b40074609cf51f8e69 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Wed, 9 Dec 2020 17:02:26 +0100 Subject: [Ada] Simplify folding of selected components with qualified prefixes gcc/ada/ * sem_eval.adb (Eval_Selected_Component): Simplify with Unqualify. --- gcc/ada/sem_eval.adb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb index 263b9fd..7b1e48d 100644 --- a/gcc/ada/sem_eval.adb +++ b/gcc/ada/sem_eval.adb @@ -3847,11 +3847,7 @@ package body Sem_Eval is -- Simplify a selected_component on an aggregate by extracting -- the field directly. - Node := Prefix (N); - - while Nkind (Node) = N_Qualified_Expression loop - Node := Expression (Node); - end loop; + Node := Unqualify (Prefix (N)); if Nkind (Node) = N_Aggregate then Comp := First (Component_Associations (Node)); -- cgit v1.1 From 12e67086ad2777e1f583124f15210ee0323533c3 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Wed, 9 Dec 2020 14:34:45 +0100 Subject: [Ada] More precise error about aspects conflicting with Static gcc/ada/ * sem_ch13.adb (Analyze_Aspect_Static): Use aspect name in the error message. --- gcc/ada/sem_ch13.adb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 07dec4c..2273887 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -2594,8 +2594,9 @@ package body Sem_Ch13 is for Asp in Pre_Post_Aspects loop if Has_Aspect (E, Asp) then + Error_Msg_Name_1 := Aspect_Names (Asp); Error_Msg_N - ("this aspect is not allowed for a static " + ("aspect % is not allowed for a static " & "expression function", Find_Aspect (E, Asp)); -- cgit v1.1 From 189c58042ddde50ab07ee105d14c7a24d05f9482 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Wed, 9 Dec 2020 15:22:29 +0100 Subject: [Ada] Refactor repeated checks for the expression of aspect Static gcc/ada/ * sem_ch13.adb (Analyze_Aspect_Static): Refactor to have a single check for the expression being present; adapt comments. --- gcc/ada/sem_ch13.adb | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 2273887..25e3bd7 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -2610,25 +2610,23 @@ package body Sem_Ch13 is -- component type C, a similar rule applies to C." end if; - -- Preanalyze the expression (if any) when the aspect resides - -- in a generic unit. (Is this generic-related code necessary - -- for this aspect? It's modeled on what's done for aspect - -- Disable_Controlled. ???) + -- When the expression is present, it must be static. If it + -- evaluates to True, the expression function is treated as + -- a static function. Otherwise the aspect appears without + -- an expression and defaults to True. - if Inside_A_Generic then - if Present (Expr) then - Preanalyze_And_Resolve (Expr, Any_Boolean); - end if; + if Present (Expr) then + -- Preanalyze the expression when the aspect resides in a + -- generic unit. (Is this generic-related code necessary + -- for this aspect? It's modeled on what's done for aspect + -- Disable_Controlled. ???) - -- Otherwise the aspect resides in a nongeneric context + if Inside_A_Generic then + Preanalyze_And_Resolve (Expr, Any_Boolean); - else - -- When the expression statically evaluates to True, the - -- expression function is treated as a static function. - -- Otherwise the aspect appears without an expression and - -- defaults to True. + -- Otherwise the aspect resides in a nongeneric context - if Present (Expr) then + else Analyze_And_Resolve (Expr, Any_Boolean); -- Error if the boolean expression is not static -- cgit v1.1 From 88fd22e721c32580610d1756701cef892e713ad8 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Wed, 9 Dec 2020 14:44:00 +0100 Subject: [Ada] Consistent diagnostic on missing -gnat2020 switch for aspects gcc/ada/ * sem_ch13.adb (Analyze_Aspect_Static): Reuse Error_Msg_Ada_2020_Feature for aspect Static. (Analyze_One_Aspect): Likewise for aspect Full_Access. --- gcc/ada/sem_ch13.adb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 25e3bd7..6af3238 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -2500,10 +2500,7 @@ package body Sem_Ch13 is begin if Ada_Version < Ada_2020 then - Error_Msg_N - ("aspect % is an Ada 202x feature", Aspect); - Error_Msg_N ("\compile with -gnat2020", Aspect); - + Error_Msg_Ada_2020_Feature ("aspect %", Sloc (Aspect)); return; end if; @@ -4575,11 +4572,7 @@ package body Sem_Ch13 is -- Ada 202x (AI12-0363): Full_Access_Only elsif A_Id = Aspect_Full_Access_Only then - if Ada_Version < Ada_2020 then - Error_Msg_N - ("aspect % is an Ada 202x feature", Aspect); - Error_Msg_N ("\compile with -gnat2020", Aspect); - end if; + Error_Msg_Ada_2020_Feature ("aspect %", Sloc (Aspect)); -- Ada 202x (AI12-0075): static expression functions -- cgit v1.1 From f358e5c17720c744e227da0c121c1ae168e5c533 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Tue, 8 Dec 2020 21:28:24 +0100 Subject: [Ada] Replace dubious use of Traverse_Func with Traverse_Proc gcc/ada/ * inline.adb (Do_Reset_Calls): Now an instance of Traverse_Proc. --- gcc/ada/inline.adb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/inline.adb b/gcc/ada/inline.adb index bb4d97c..f373e89 100644 --- a/gcc/ada/inline.adb +++ b/gcc/ada/inline.adb @@ -3578,17 +3578,10 @@ package body Inline is return OK; end Do_Reset; - function Do_Reset_Calls is new Traverse_Func (Do_Reset); - - -- Local variables - - Dummy : constant Traverse_Result := Do_Reset_Calls (N); - pragma Unreferenced (Dummy); - - -- Start of processing for Reset_Dispatching_Calls + procedure Do_Reset_Calls is new Traverse_Proc (Do_Reset); begin - null; + Do_Reset_Calls (N); end Reset_Dispatching_Calls; --------------------------- -- cgit v1.1 From 894376c44d94df54727b591292e5965cfa35001b Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Tue, 8 Dec 2020 22:34:29 +0100 Subject: [Ada] Simplify data structures for overloaded interpretations gcc/ada/ * sem_type.ads (Write_Interp_Ref): Removed; no longer needed. * sem_type.adb (Headers): Removed; now the hash table is directly in the Interp_Map alone. (Interp_Map): Now an instance of the GNAT.HTable.Simple_HTable. (Last_Overloaded): New variable to emulate Interp_Map.Last. (Add_One_Interp): Adapt to new data structure. (Get_First_Interp): Likewise. (Hash): Likewise. (Init_Interp_Tables): Likewise. (New_Interps): Likewise. (Save_Interps): Likewise; handle O_N variable like in Get_First_Interp. (Write_Interp_Ref): Removed; no longer needed. --- gcc/ada/sem_type.adb | 167 +++++++++++++++------------------------------------ gcc/ada/sem_type.ads | 4 -- 2 files changed, 50 insertions(+), 121 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/sem_type.adb b/gcc/ada/sem_type.adb index 8f636be..8c12b08 100644 --- a/gcc/ada/sem_type.adb +++ b/gcc/ada/sem_type.adb @@ -50,6 +50,8 @@ with Table; with Treepr; use Treepr; with Uintp; use Uintp; +with GNAT.HTable; use GNAT.HTable; + package body Sem_Type is --------------------- @@ -60,21 +62,17 @@ package body Sem_Type is -- their interpretations. An overloaded node has an entry in Interp_Map, -- which in turn contains a pointer into the All_Interp array. The -- interpretations of a given node are contiguous in All_Interp. Each set - -- of interpretations is terminated with the marker No_Interp. In order to - -- speed up the retrieval of the interpretations of an overloaded node, the - -- Interp_Map table is accessed by means of a simple hashing scheme, and - -- the entries in Interp_Map are chained. The heads of clash lists are - -- stored in array Headers. - - -- Headers Interp_Map All_Interp - - -- _ +-----+ +--------+ - -- |_| |_____| --->|interp1 | - -- |_|---------->|node | | |interp2 | - -- |_| |index|---------| |nointerp| - -- |_| |next | | | - -- |-----| | | - -- +-----+ +--------+ + -- of interpretations is terminated with the marker No_Interp. + + -- Interp_Map All_Interp + + -- +-----+ +--------+ + -- | | --->|interp1 | + -- |_____| | |interp2 | + -- |index|---------| |nointerp| + -- |-----| | | + -- | | | | + -- +-----+ +--------+ -- This scheme does not currently reclaim interpretations. In principle, -- after a unit is compiled, all overloadings have been resolved, and the @@ -89,28 +87,26 @@ package body Sem_Type is Table_Increment => Alloc.All_Interp_Increment, Table_Name => "All_Interp"); - type Interp_Ref is record - Node : Node_Id; - Index : Interp_Index; - Next : Int; - end record; - - Header_Size : constant Int := 2 ** 12; - No_Entry : constant Int := -1; - Headers : array (0 .. Header_Size) of Int; + Header_Max : constant := 3079; + -- The number of hash buckets; an arbitrary prime number - package Interp_Map is new Table.Table ( - Table_Component_Type => Interp_Ref, - Table_Index_Type => Int, - Table_Low_Bound => 0, - Table_Initial => Alloc.Interp_Map_Initial, - Table_Increment => Alloc.Interp_Map_Increment, - Table_Name => "Interp_Map"); + subtype Header_Num is Integer range 0 .. Header_Max - 1; - function Hash (N : Node_Id) return Int; + function Hash (N : Node_Id) return Header_Num; -- A trivial hashing function for nodes, used to insert an overloaded -- node into the Interp_Map table. + package Interp_Map is new Simple_HTable + (Header_Num => Header_Num, + Element => Interp_Index, + No_Element => -1, + Key => Node_Id, + Hash => Hash, + Equal => "="); + + Last_Overloaded : Node_Id := Empty; + -- Overloaded node after initializing a new collection of intepretation + ------------------------------------- -- Handling of Overload Resolution -- ------------------------------------- @@ -479,9 +475,9 @@ package body Sem_Type is -- node or the interpretation that is present is for a different -- node. In both cases add a new interpretation to the table. - elsif Interp_Map.Last < 0 + elsif No (Last_Overloaded) or else - (Interp_Map.Table (Interp_Map.Last).Node /= N + (Last_Overloaded /= N and then not Is_Overloaded (N)) then New_Interps (N); @@ -2380,7 +2376,6 @@ package body Sem_Type is It : out Interp) is Int_Ind : Interp_Index; - Map_Ptr : Int; O_N : Node_Id; begin @@ -2398,21 +2393,16 @@ package body Sem_Type is O_N := N; end if; - Map_Ptr := Headers (Hash (O_N)); - while Map_Ptr /= No_Entry loop - if Interp_Map.Table (Map_Ptr).Node = O_N then - Int_Ind := Interp_Map.Table (Map_Ptr).Index; - It := All_Interp.Table (Int_Ind); - I := Int_Ind; - return; - else - Map_Ptr := Interp_Map.Table (Map_Ptr).Next; - end if; - end loop; + Int_Ind := Interp_Map.Get (O_N); -- Procedure should never be called if the node has no interpretations - raise Program_Error; + if Int_Ind < 0 then + raise Program_Error; + end if; + + I := Int_Ind; + It := All_Interp.Table (Int_Ind); end Get_First_Interp; --------------------- @@ -2545,12 +2535,9 @@ package body Sem_Type is -- Hash -- ---------- - function Hash (N : Node_Id) return Int is + function Hash (N : Node_Id) return Header_Num is begin - -- Nodes have a size that is power of two, so to select significant - -- bits only we remove the low-order bits. - - return ((Int (N) / 2 ** 5) mod Header_Size); + return Header_Num (N mod Header_Max); end Hash; -------------- @@ -2575,8 +2562,7 @@ package body Sem_Type is procedure Init_Interp_Tables is begin All_Interp.Init; - Interp_Map.Init; - Headers := (others => No_Entry); + Interp_Map.Reset; end Init_Interp_Tables; ----------------------------------- @@ -3094,47 +3080,12 @@ package body Sem_Type is ----------------- procedure New_Interps (N : Node_Id) is - Map_Ptr : Int; - begin All_Interp.Append (No_Interp); - Map_Ptr := Headers (Hash (N)); - - if Map_Ptr = No_Entry then - - -- Place new node at end of table - - Interp_Map.Increment_Last; - Headers (Hash (N)) := Interp_Map.Last; - - else - -- Place node at end of chain, or locate its previous entry - - loop - if Interp_Map.Table (Map_Ptr).Node = N then - - -- Node is already in the table, and is being rewritten. - -- Start a new interp section, retain hash link. - - Interp_Map.Table (Map_Ptr).Node := N; - Interp_Map.Table (Map_Ptr).Index := All_Interp.Last; - Set_Is_Overloaded (N, True); - return; - - else - exit when Interp_Map.Table (Map_Ptr).Next = No_Entry; - Map_Ptr := Interp_Map.Table (Map_Ptr).Next; - end if; - end loop; - - -- Chain the new node - - Interp_Map.Increment_Last; - Interp_Map.Table (Map_Ptr).Next := Interp_Map.Last; - end if; - - Interp_Map.Table (Interp_Map.Last) := (N, All_Interp.Last, No_Entry); + -- Add or rewrite the existing node + Last_Overloaded := N; + Interp_Map.Set (N, All_Interp.Last); Set_Is_Overloaded (N, True); end New_Interps; @@ -3319,8 +3270,8 @@ package body Sem_Type is ------------------ procedure Save_Interps (Old_N : Node_Id; New_N : Node_Id) is - Map_Ptr : Int; - O_N : Node_Id := Old_N; + Old_Ind : Interp_Index; + O_N : Node_Id; begin if Is_Overloaded (Old_N) then @@ -3330,18 +3281,15 @@ package body Sem_Type is and then Is_Overloaded (Selector_Name (Old_N)) then O_N := Selector_Name (Old_N); + else + O_N := Old_N; end if; - Map_Ptr := Headers (Hash (O_N)); - - while Interp_Map.Table (Map_Ptr).Node /= O_N loop - Map_Ptr := Interp_Map.Table (Map_Ptr).Next; - pragma Assert (Map_Ptr /= No_Entry); - end loop; + Old_Ind := Interp_Map.Get (O_N); + pragma Assert (Old_Ind >= 0); New_Interps (New_N); - Interp_Map.Table (Interp_Map.Last).Index := - Interp_Map.Table (Map_Ptr).Index; + Interp_Map.Set (New_N, Old_Ind); end if; end Save_Interps; @@ -3646,21 +3594,6 @@ package body Sem_Type is Print_Tree_Node (It.Abstract_Op); end Write_Interp; - ---------------------- - -- Write_Interp_Ref -- - ---------------------- - - procedure Write_Interp_Ref (Map_Ptr : Int) is - begin - Write_Str (" Node: "); - Write_Int (Int (Interp_Map.Table (Map_Ptr).Node)); - Write_Str (" Index: "); - Write_Int (Int (Interp_Map.Table (Map_Ptr).Index)); - Write_Str (" Next: "); - Write_Int (Interp_Map.Table (Map_Ptr).Next); - Write_Eol; - end Write_Interp_Ref; - --------------------- -- Write_Overloads -- --------------------- diff --git a/gcc/ada/sem_type.ads b/gcc/ada/sem_type.ads index 3177bd3..a9c1ba2 100644 --- a/gcc/ada/sem_type.ads +++ b/gcc/ada/sem_type.ads @@ -268,10 +268,6 @@ package Sem_Type is procedure Write_Interp (It : Interp); -- Debugging procedure to display an Interp - procedure Write_Interp_Ref (Map_Ptr : Int); - -- Debugging procedure to display entry in Interp_Map. Would not be needed - -- if it were possible to debug instantiations of Table. - procedure Write_Overloads (N : Node_Id); -- Debugging procedure to output info on possibly overloaded entities for -- specified node. -- cgit v1.1 From bed6154a5a64235fb196e9d6007a4382481e426e Mon Sep 17 00:00:00 2001 From: Patrick Bernardi Date: Wed, 9 Dec 2020 16:48:20 -0500 Subject: [Ada] Install_Restricted_Handlers: define Prio parameter as Interrupt_Priority gcc/ada/ * libgnarl/s-interr.adb (Install_Restricted_Handlers): Change Prio parameter to type Interrupt_Priority. * libgnarl/s-interr.ads (Install_Restricted_Handlers): Likewise. * libgnarl/s-interr__dummy.adb (Install_Restricted_Handlers): Likewise. * libgnarl/s-interr__hwint.adb (Install_Restricted_Handlers): Likewise. * libgnarl/s-interr__sigaction.adb (Install_Restricted_Handlers): Likewise. * libgnarl/s-interr__vxworks.adb (Install_Restricted_Handlers): Likewise. --- gcc/ada/libgnarl/s-interr.adb | 2 +- gcc/ada/libgnarl/s-interr.ads | 2 +- gcc/ada/libgnarl/s-interr__dummy.adb | 2 +- gcc/ada/libgnarl/s-interr__hwint.adb | 2 +- gcc/ada/libgnarl/s-interr__sigaction.adb | 2 +- gcc/ada/libgnarl/s-interr__vxworks.adb | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/libgnarl/s-interr.adb b/gcc/ada/libgnarl/s-interr.adb index c386c47..4cdd912 100644 --- a/gcc/ada/libgnarl/s-interr.adb +++ b/gcc/ada/libgnarl/s-interr.adb @@ -473,7 +473,7 @@ package body System.Interrupts is --------------------------------- procedure Install_Restricted_Handlers - (Prio : Any_Priority; + (Prio : Interrupt_Priority; Handlers : New_Handler_Array) is pragma Unreferenced (Prio); diff --git a/gcc/ada/libgnarl/s-interr.ads b/gcc/ada/libgnarl/s-interr.ads index 0f82beb..ed1602f 100644 --- a/gcc/ada/libgnarl/s-interr.ads +++ b/gcc/ada/libgnarl/s-interr.ads @@ -267,7 +267,7 @@ package System.Interrupts is -- the new static handlers. procedure Install_Restricted_Handlers - (Prio : Any_Priority; + (Prio : Interrupt_Priority; Handlers : New_Handler_Array); -- Install the static Handlers for the given interrupts and do not -- store previously installed handlers. This procedure is used when diff --git a/gcc/ada/libgnarl/s-interr__dummy.adb b/gcc/ada/libgnarl/s-interr__dummy.adb index ffa0710..99df03d 100644 --- a/gcc/ada/libgnarl/s-interr__dummy.adb +++ b/gcc/ada/libgnarl/s-interr__dummy.adb @@ -188,7 +188,7 @@ package body System.Interrupts is --------------------------------- procedure Install_Restricted_Handlers - (Prio : Any_Priority; + (Prio : Interrupt_Priority; Handlers : New_Handler_Array) is begin diff --git a/gcc/ada/libgnarl/s-interr__hwint.adb b/gcc/ada/libgnarl/s-interr__hwint.adb index 5c2c321..912da07 100644 --- a/gcc/ada/libgnarl/s-interr__hwint.adb +++ b/gcc/ada/libgnarl/s-interr__hwint.adb @@ -478,7 +478,7 @@ package body System.Interrupts is --------------------------------- procedure Install_Restricted_Handlers - (Prio : Any_Priority; + (Prio : Interrupt_Priority; Handlers : New_Handler_Array) is pragma Unreferenced (Prio); diff --git a/gcc/ada/libgnarl/s-interr__sigaction.adb b/gcc/ada/libgnarl/s-interr__sigaction.adb index 83bd36c..3e456e3 100644 --- a/gcc/ada/libgnarl/s-interr__sigaction.adb +++ b/gcc/ada/libgnarl/s-interr__sigaction.adb @@ -291,7 +291,7 @@ package body System.Interrupts is --------------------------------- procedure Install_Restricted_Handlers - (Prio : Any_Priority; + (Prio : Interrupt_Priority; Handlers : New_Handler_Array) is pragma Unreferenced (Prio); diff --git a/gcc/ada/libgnarl/s-interr__vxworks.adb b/gcc/ada/libgnarl/s-interr__vxworks.adb index 157f82f..646c822 100644 --- a/gcc/ada/libgnarl/s-interr__vxworks.adb +++ b/gcc/ada/libgnarl/s-interr__vxworks.adb @@ -494,7 +494,7 @@ package body System.Interrupts is --------------------------------- procedure Install_Restricted_Handlers - (Prio : Any_Priority; + (Prio : Interrupt_Priority; Handlers : New_Handler_Array) is pragma Unreferenced (Prio); -- cgit v1.1 From 33d1be873954bc387387c2f9462fa0139157a182 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Thu, 10 Dec 2020 13:12:22 +0100 Subject: [Ada] Remove redundant assignment in Formal_Is_Used_Once gcc/ada/ * inline.adb (Formal_Is_Used_Once): Refine type of the counter variable; remove redundant assignment. --- gcc/ada/inline.adb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/inline.adb b/gcc/ada/inline.adb index f373e89..16c4cd7 100644 --- a/gcc/ada/inline.adb +++ b/gcc/ada/inline.adb @@ -2827,7 +2827,7 @@ package body Inline is ------------------------- function Formal_Is_Used_Once (Formal : Entity_Id) return Boolean is - Use_Counter : Int := 0; + Use_Counter : Nat := 0; function Count_Uses (N : Node_Id) return Traverse_Result; -- Traverse the tree and count the uses of the formal parameter. @@ -2856,13 +2856,10 @@ package body Inline is then Use_Counter := Use_Counter + 1; - if Use_Counter > 1 then - - -- Denote more than one use and abandon the traversal + -- If this is a second use then abandon the traversal - Use_Counter := 2; + if Use_Counter > 1 then return Abandon; - end if; end if; -- cgit v1.1 From 4e60fea9206696782e2292419da9add02d0b609c Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 10 Dec 2020 21:02:07 +0100 Subject: [Ada] Fix computation of Prec/Succ of zero without denormals gcc/ada/ * libgnat/s-fatgen.adb: Add use clause for Interfaces.Unsigned_16 and Interfaces.Unsigned_32. (Small16): New constant. (Small32): Likewise. (Small64): Likewise. (Small80): Likewise. (Pred): Declare a local overlay for Small and return it negated for zero if the type does not support denormalized numbers. (Succ): Likewise, but return it directly. --- gcc/ada/libgnat/s-fatgen.adb | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/libgnat/s-fatgen.adb b/gcc/ada/libgnat/s-fatgen.adb index 9f25987..01493b7 100644 --- a/gcc/ada/libgnat/s-fatgen.adb +++ b/gcc/ada/libgnat/s-fatgen.adb @@ -42,6 +42,8 @@ pragma Warnings (Off, "non-static constant in preelaborated unit"); -- Every constant is static given our instantiation model package body System.Fat_Gen is + use type Interfaces.Unsigned_16; + use type Interfaces.Unsigned_32; use type Interfaces.Unsigned_64; pragma Assert (T'Machine_Radix = 2); @@ -59,6 +61,18 @@ package body System.Fat_Gen is -- Small : constant T := Rad ** (T'Machine_Emin - 1); -- Smallest positive normalized number + Small16 : constant Interfaces.Unsigned_16 := 2**(Mantissa - 1); + Small32 : constant Interfaces.Unsigned_32 := 2**(Mantissa - 1); + Small64 : constant Interfaces.Unsigned_64 := 2**(Mantissa - 1); + Small80 : constant array (1 .. 2) of Interfaces.Unsigned_64 := + (2**48 * (1 - Standard'Default_Bit_Order), + 1 * Standard'Default_Bit_Order); + for Small80'Alignment use Standard'Maximum_Alignment; + -- We cannot use the direct declaration because it cannot be translated + -- into C90, as the hexadecimal floating constants were introduced in C99. + -- So we work around this by using an overlay of the integer constant. + -- ??? Revisit this when the new CCG technoloy is in production + -- Tiny : constant T := Rad ** (T'Machine_Emin - Mantissa); -- Smallest positive denormalized number @@ -72,6 +86,7 @@ package body System.Fat_Gen is -- We cannot use the direct declaration because it cannot be translated -- into C90, as the hexadecimal floating constants were introduced in C99. -- So we work around this by using an overlay of the integer constant. + -- ??? Revisit this when the new CCG technoloy is in production RM1 : constant T := Rad ** (Mantissa - 1); -- Smallest positive member of the large consecutive integers. It is equal @@ -424,6 +439,13 @@ package body System.Fat_Gen is ---------- function Pred (X : T) return T is + Small : constant T; + pragma Import (Ada, Small); + for Small'Address use (if T'Size = 16 then Small16'Address + elsif T'Size = 32 then Small32'Address + elsif T'Size = 64 then Small64'Address + elsif Mantissa = 64 then Small80'Address + else raise Program_Error); Tiny : constant T; pragma Import (Ada, Tiny); for Tiny'Address use (if T'Size = 16 then Tiny16'Address @@ -438,7 +460,7 @@ package body System.Fat_Gen is -- Zero has to be treated specially, since its exponent is zero if X = 0.0 then - return -Tiny; + return -(if T'Denorm then Tiny else Small); -- Special treatment for largest negative number: raise Constraint_Error @@ -700,6 +722,13 @@ package body System.Fat_Gen is ---------- function Succ (X : T) return T is + Small : constant T; + pragma Import (Ada, Small); + for Small'Address use (if T'Size = 16 then Small16'Address + elsif T'Size = 32 then Small32'Address + elsif T'Size = 64 then Small64'Address + elsif Mantissa = 64 then Small80'Address + else raise Program_Error); Tiny : constant T; pragma Import (Ada, Tiny); for Tiny'Address use (if T'Size = 16 then Tiny16'Address @@ -714,7 +743,7 @@ package body System.Fat_Gen is -- Treat zero specially since it has a zero exponent if X = 0.0 then - return Tiny; + return (if T'Denorm then Tiny else Small); -- Special treatment for largest positive number: raise Constraint_Error -- cgit v1.1 From 5485d0e5569037c0bdc04192e174a048f7d69a61 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Thu, 10 Dec 2020 11:22:23 -0500 Subject: [Ada] Fix recent optimization in evaluation of selected component for GNATprove gcc/ada/ * sem_eval.adb (Eval_Selected_Component): Only consider compile time known aggregates. --- gcc/ada/sem_eval.adb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb index 7b1e48d..3ccf3a0 100644 --- a/gcc/ada/sem_eval.adb +++ b/gcc/ada/sem_eval.adb @@ -3849,7 +3849,9 @@ package body Sem_Eval is Node := Unqualify (Prefix (N)); - if Nkind (Node) = N_Aggregate then + if Nkind (Node) = N_Aggregate + and then Compile_Time_Known_Aggregate (Node) + then Comp := First (Component_Associations (Node)); Nam := Chars (Selector_Name (N)); -- cgit v1.1 From ba344f1ba6948ded21ba3bda4d0f7460eee2862b Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Fri, 11 Dec 2020 00:42:22 +0100 Subject: [Ada] Adjust List_Length description gcc/ada/ * nlists.ads (List_Length): Adapt comment to match the behaviour. --- gcc/ada/nlists.ads | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/nlists.ads b/gcc/ada/nlists.ads index 169c8e5..c006131 100644 --- a/gcc/ada/nlists.ads +++ b/gcc/ada/nlists.ads @@ -146,9 +146,9 @@ package Nlists is -- No_List. (No_List is not considered to be the same as an empty list). function List_Length (List : List_Id) return Nat; - -- Returns number of items in the given list. It is an error to call - -- this function with No_List (No_List is not considered to be the same - -- as an empty list). + -- Returns number of items in the given list. If called on No_List it + -- returns 0, even though No_List is not considered to be the same as an + -- empty list. function Next (Node : Node_Or_Entity_Id) return Node_Or_Entity_Id; pragma Inline (Next); -- cgit v1.1 From f9d670128f6e6b3631a2db575ddf6f19fa43afdc Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Fri, 11 Dec 2020 10:41:20 +0100 Subject: [Ada] Style fixes related to calls to List_Length gcc/ada/ * sem_ch13.adb, sem_util.adb: Fix style. --- gcc/ada/sem_ch13.adb | 2 ++ gcc/ada/sem_util.adb | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 6af3238..c863154 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -11794,6 +11794,8 @@ package body Sem_Ch13 is end; end Check_Component_List; + -- Local variables + Sbit : Uint; -- Starting bit for call to Check_Component_List. Zero for an -- untagged type. The size of the Tag for a nonderived tagged diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index e3ac718..b7b622d 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -29957,7 +29957,7 @@ package body Sem_Util is procedure Normalize_Interval_List (List : in out Discrete_Interval_List; Last : out Nat); - -- Perform sorting and merging as required by Check_Consistency. + -- Perform sorting and merging as required by Check_Consistency ------------------------- -- Aggregate_Intervals -- @@ -29972,6 +29972,10 @@ package body Sem_Util is -- Count the number of intervals given in the aggregate N; the others -- choice (if present) is not taken into account. + ------------------------------ + -- Unmerged_Intervals_Count -- + ------------------------------ + function Unmerged_Intervals_Count return Nat is Count : Nat := 0; Choice : Node_Id; @@ -30072,7 +30076,7 @@ package body Sem_Util is (Discrete_Choices : List_Id) return Discrete_Interval_List is function Unmerged_Choice_Count return Nat; - -- The number of intervals before adjacent intervals are merged. + -- The number of intervals before adjacent intervals are merged --------------------------- -- Unmerged_Choice_Count -- -- cgit v1.1 From f7ee6a1e8ac62950dd32874bf75e748a2895d595 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 28 Apr 2021 10:41:41 +0200 Subject: tree-optimization/100292 - avoid invalid GIMPLE from vector lowering We have to avoid folding the condition when building a COND_EXPR since we no longer gimplify the whole thing. The folding done at COND_EXPR build time will deal with possible simplifications. 2021-04-28 Richard Biener PR tree-optimization/100292 * tree-vect-generic.c (expand_vector_condition): Do not fold the comparisons. * gcc.dg/pr100292.c: New testcase. --- gcc/testsuite/gcc.dg/pr100292.c | 11 +++++++++++ gcc/tree-vect-generic.c | 6 +++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr100292.c (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/pr100292.c b/gcc/testsuite/gcc.dg/pr100292.c new file mode 100644 index 0000000..675a60c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr100292.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +typedef unsigned char __attribute__((__vector_size__ (4))) V; + +extern void bar (V v); + +void +foo (char c) +{ + bar (c <= (V) 127); +} diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index 5cc32c4..d9c0ac9 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -1116,15 +1116,15 @@ expand_vector_condition (gimple_stmt_iterator *gsi, bitmap dce_ssa_names) comp_width, comp_index); tree aa2 = tree_vec_extract (gsi, comp_inner_type, a2, comp_width, comp_index); - aa = fold_build2 (code, cond_type, aa1, aa2); + aa = build2 (code, cond_type, aa1, aa2); } else if (a_is_scalar_bitmask) { wide_int w = wi::set_bit_in_zero (i, TYPE_PRECISION (TREE_TYPE (a))); result = gimplify_build2 (gsi, BIT_AND_EXPR, TREE_TYPE (a), a, wide_int_to_tree (TREE_TYPE (a), w)); - aa = fold_build2 (NE_EXPR, boolean_type_node, result, - build_zero_cst (TREE_TYPE (a))); + aa = build2 (NE_EXPR, boolean_type_node, result, + build_zero_cst (TREE_TYPE (a))); } else aa = tree_vec_extract (gsi, cond_type, a, width, index); -- cgit v1.1 From ea3d2e3c164cb4a32f5c82aa49693de260db3501 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Apr 2021 11:37:30 +0200 Subject: c++: Remove #error for release builds * module.cc: Remove #error that triggers if DEV-PHASE is empty. --- gcc/cp/module.cc | 2 -- 1 file changed, 2 deletions(-) (limited to 'gcc') diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index ab8b1f1..02c19f5 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -194,8 +194,6 @@ Classes used: #define MODULE_MINOR(V) ((V) % 10000) #define EXPERIMENT(A,B) (IS_EXPERIMENTAL (MODULE_VERSION) ? (A) : (B)) #ifndef MODULE_VERSION -// Be sure you're ready! Remove #error this before release! -#error "Shtopp! What are you doing? This is not ready yet." #include "bversion.h" #define MODULE_VERSION (BUILDING_GCC_MAJOR * 10000U + BUILDING_GCC_MINOR) #elif !IS_EXPERIMENTAL (MODULE_VERSION) -- cgit v1.1 From b020cee5af4cb40b9971bfb943d7bd2795b2a3eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rui=20Faustino=20de=20Sousa?= Date: Wed, 28 Apr 2021 11:20:25 +0000 Subject: Fortran: Fix double function call with -fcheck=pointer [PR] gcc/fortran/ChangeLog: PR fortran/82376 * trans-expr.c (gfc_conv_procedure_call): Evaluate function result and then pass a pointer. gcc/testsuite/ChangeLog: PR fortran/82376 * gfortran.dg/PR82376.f90: New test. --- gcc/fortran/trans-expr.c | 7 ++--- gcc/testsuite/gfortran.dg/PR82376.f90 | 59 +++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/PR82376.f90 (limited to 'gcc') diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 213f32b..b83b021 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -6014,11 +6014,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, || (!e->value.function.esym && e->symtree->n.sym->attr.pointer)) && fsym && fsym->attr.target) - { - gfc_conv_expr (&parmse, e); - parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr); - } - + /* Make sure the function only gets called once. */ + gfc_conv_expr_reference (&parmse, e, false); else if (e->expr_type == EXPR_FUNCTION && e->symtree->n.sym->result && e->symtree->n.sym->result != e->symtree->n.sym diff --git a/gcc/testsuite/gfortran.dg/PR82376.f90 b/gcc/testsuite/gfortran.dg/PR82376.f90 new file mode 100644 index 0000000..07143ab --- /dev/null +++ b/gcc/testsuite/gfortran.dg/PR82376.f90 @@ -0,0 +1,59 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original -fcheck=pointer" } +! +! Test the fix for PR82376. The pointer check was doubling up the call +! to new. The fix reduces the count of 'new' from 5 to 4. +! +! Contributed by José Rui Faustino de Sousa +! +program main_p + + integer, parameter :: n = 10 + + type :: foo_t + integer, pointer :: v =>null() + end type foo_t + + integer, save :: pcnt = 0 + + type(foo_t) :: int + integer :: i + + do i = 1, n + call init(int, i) + if(.not.associated(int%v)) stop 1 + if(int%v/=i) stop 2 + if(pcnt/=i) stop 3 + end do + +contains + + function new(data) result(this) + integer, target, intent(in) :: data + + integer, pointer :: this + + nullify(this) + this => data + pcnt = pcnt + 1 + return + end function new + + subroutine init(this, data) + type(foo_t), intent(out) :: this + integer, intent(in) :: data + + call set(this, new(data)) + return + end subroutine init + + subroutine set(this, that) + type(foo_t), intent(inout) :: this + integer, target, intent(in) :: that + + this%v => that + return + end subroutine set + +end program main_p +! { dg-final { scan-tree-dump-times "new" 4 "original" } } -- cgit v1.1 From fe5bfa6704179f8db7d1ae0b485439e9896df8eb Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Wed, 28 Apr 2021 18:46:47 +0200 Subject: offload-defaulted: Config option to silently ignore uninstalled offload compilers If configured with --enable-offload-defaulted, configured but not installed offload compilers and libgomp plugins are silently ignored. Useful for distribution compilers where those are in separate optional packages. 2021-04-28 Jakub Jelinek Tobias Burnus ChangeLog: * configure.ac (--enable-offload-defaulted): New. * configure: Regenerate. gcc/ChangeLog: * configure.ac (OFFLOAD_DEFAULTED): AC_DEFINE if offload-defaulted. * gcc.c (process_command): New variable. (driver::maybe_putenv_OFFLOAD_TARGETS): If OFFLOAD_DEFAULTED, set it if -foffload is defaulted. * lto-wrapper.c (OFFLOAD_TARGET_DEFAULT_ENV): Define. (compile_offload_image): If OFFLOAD_DEFAULTED and OFFLOAD_TARGET_DEFAULT is in the environment, don't fail if corresponding mkoffload can't be found. (compile_images_for_offload_targets): Likewise. Free and clear offload_names if no valid offload is found. * config.in: Regenerate. * configure: Regenerate. libgomp/ChangeLog: * configure.ac (OFFLOAD_DEFAULTED): AC_DEFINE if offload-defaulted. * target.c (gomp_load_plugin_for_device): If set and if a plugin can't be dlopened, silently assume it has no devices. * Makefile.in: Regenerate. * config.h.in: Regenerate. * configure: Regenerate. --- gcc/config.in | 6 ++++++ gcc/configure | 10 ++++++++-- gcc/configure.ac | 5 +++++ gcc/gcc.c | 17 ++++++++++++++++- gcc/lto-wrapper.c | 26 ++++++++++++++++++++++++-- 5 files changed, 59 insertions(+), 5 deletions(-) (limited to 'gcc') diff --git a/gcc/config.in b/gcc/config.in index 313c13c..fb88acb 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -2190,6 +2190,12 @@ #endif +/* Define to 1 to if -foffload is defaulted */ +#ifndef USED_FOR_TARGET +#undef OFFLOAD_DEFAULTED +#endif + + /* Define to offload targets, separated by commas. */ #ifndef USED_FOR_TARGET #undef OFFLOAD_TARGETS diff --git a/gcc/configure b/gcc/configure index 33eae54..f5bef76 100755 --- a/gcc/configure +++ b/gcc/configure @@ -8058,6 +8058,12 @@ $as_echo "#define ENABLE_OFFLOADING 0" >>confdefs.h fi +if test "x$enable_offload_defaulted" = xyes; then + +$as_echo "#define OFFLOAD_DEFAULTED 1" >>confdefs.h + +fi + # Check whether --with-multilib-list was given. if test "${with_multilib_list+set}" = set; then : @@ -19392,7 +19398,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 19395 "configure" +#line 19401 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -19498,7 +19504,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 19501 "configure" +#line 19507 "configure" #include "confdefs.h" #if HAVE_DLFCN_H diff --git a/gcc/configure.ac b/gcc/configure.ac index 96a6f62..22305e3 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -1139,6 +1139,11 @@ else [Define this to enable support for offloading.]) fi +if test "x$enable_offload_defaulted" = xyes; then + AC_DEFINE(OFFLOAD_DEFAULTED, 1, + [Define to 1 to if -foffload is defaulted]) +fi + AC_ARG_WITH(multilib-list, [AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, SH and x86-64 only)])], :, diff --git a/gcc/gcc.c b/gcc/gcc.c index 7837553..bd561ac 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -319,6 +319,12 @@ static const char *spec_host_machine = DEFAULT_REAL_TARGET_MACHINE; static char *offload_targets = NULL; +#if OFFLOAD_DEFAULTED +/* Set to true if -foffload has not been used and offload_targets + is set to the configured in default. */ +static bool offload_targets_default; +#endif + /* Nonzero if cross-compiling. When -b is used, the value comes from the `specs' file. */ @@ -4828,7 +4834,12 @@ process_command (unsigned int decoded_options_count, /* If the user didn't specify any, default to all configured offload targets. */ if (ENABLE_OFFLOADING && offload_targets == NULL) - handle_foffload_option (OFFLOAD_TARGETS); + { + handle_foffload_option (OFFLOAD_TARGETS); +#if OFFLOAD_DEFAULTED + offload_targets_default = true; +#endif + } if (output_file && strcmp (output_file, "-") != 0 @@ -8484,6 +8495,10 @@ driver::maybe_putenv_OFFLOAD_TARGETS () const obstack_grow (&collect_obstack, offload_targets, strlen (offload_targets) + 1); xputenv (XOBFINISH (&collect_obstack, char *)); +#if OFFLOAD_DEFAULTED + if (offload_targets_default) + xputenv ("OFFLOAD_TARGET_DEFAULT=1"); +#endif } free (offload_targets); diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index 49894e4..e95b0d8 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see /* Environment variable, used for passing the names of offload targets from GCC driver to lto-wrapper. */ #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES" +#define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT" /* By default there is no special suffix for target executables. */ #ifdef TARGET_EXECUTABLE_SUFFIX @@ -906,6 +907,13 @@ compile_offload_image (const char *target, const char *compiler_path, compiler = paths[i]; break; } +#if OFFLOAD_DEFAULTED + if (!compiler && getenv (OFFLOAD_TARGET_DEFAULT_ENV)) + { + free_array_of_ptrs ((void **) paths, n_paths); + return NULL; + } +#endif if (!compiler) fatal_error (input_location, @@ -976,6 +984,7 @@ compile_images_for_offload_targets (unsigned in_argc, char *in_argv[], if (!target_names) return; unsigned num_targets = parse_env_var (target_names, &names, NULL); + int next_name_entry = 0; const char *compiler_path = getenv ("COMPILER_PATH"); if (!compiler_path) @@ -986,15 +995,28 @@ compile_images_for_offload_targets (unsigned in_argc, char *in_argv[], offload_names = XCNEWVEC (char *, num_targets + 1); for (unsigned i = 0; i < num_targets; i++) { - offload_names[i] + offload_names[next_name_entry] = compile_offload_image (names[i], compiler_path, in_argc, in_argv, compiler_opts, compiler_opt_count, linker_opts, linker_opt_count); - if (!offload_names[i]) + if (!offload_names[next_name_entry]) +#if OFFLOAD_DEFAULTED + continue; +#else fatal_error (input_location, "problem with building target image for %s", names[i]); +#endif + next_name_entry++; } +#if OFFLOAD_DEFAULTED + if (next_name_entry == 0) + { + free (offload_names); + offload_names = NULL; + } +#endif + out: free_array_of_ptrs ((void **) names, num_targets); } -- cgit v1.1 From 668df9e769e7d89bcefa07f72b68dcae9a8f3970 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 28 Apr 2021 17:54:52 +0100 Subject: aarch64: Fix address mode for vec_concat pattern [PR100305] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The load_pair_lanes patterns match a vec_concat of two adjacent 64-bit memory locations as a single 128-bit load. The Utq constraint made sure that the address was suitable for a 128-bit vector, but this meant that it allowed some addresses that aren't valid for the 64-bit element mode. Two obvious fixes were: (1) Continue to accept addresses that aren't valid for the element modes. This would mean changing the mode of operands[1] before printing it. It would also mean using a custom predicate instead of the current memory_operand. (2) Restrict addresses to the intersection of those that are valid element and vector addresses. The problem with (1) is that, as well as being more complicated, it doesn't deal with the fact that we still have a memory_operand for the second element. If we encourage the first operand to be outside the range of a normal element memory_operand, we'll have to reload the second operand to make it valid. This reload will often be dead code, but will be kept around because the RTL pattern makes it look as though the second element address is still needed. This patch therefore does (2) instead. As mentioned in the PR notes, I think we have a general problem with the way that the aarch64 port deals with paired addresses. There's nothing to guarantee that the two addresses will be reloaded in a way that keeps them “obviously” adjacent, so the rtx_equal_p conditions could fail if something rechecked them later. For this particular pattern, I think it would be better to teach simplify-rtx.c to fold the vec_concat to a normal vector memory reference, to remove any suggestion that targets should try to match the unsimplified form. That obviously wouldn't be suitable for backports though. gcc/ PR target/100305 * config/aarch64/constraints.md (Utq): Require the address to be valid for both the element mode and for V2DImode. gcc/testsuite/ PR target/100305 * gcc.c-torture/compile/pr100305.c: New test. --- gcc/config/aarch64/constraints.md | 2 ++ gcc/testsuite/gcc.c-torture/compile/pr100305.c | 13 +++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr100305.c (limited to 'gcc') diff --git a/gcc/config/aarch64/constraints.md b/gcc/config/aarch64/constraints.md index fd3e925..3b49b45 100644 --- a/gcc/config/aarch64/constraints.md +++ b/gcc/config/aarch64/constraints.md @@ -327,6 +327,8 @@ "@internal An address valid for loading or storing a 128-bit AdvSIMD register" (and (match_code "mem") + (match_test "aarch64_legitimate_address_p (GET_MODE (op), + XEXP (op, 0), 1)") (match_test "aarch64_legitimate_address_p (V2DImode, XEXP (op, 0), 1)"))) diff --git a/gcc/testsuite/gcc.c-torture/compile/pr100305.c b/gcc/testsuite/gcc.c-torture/compile/pr100305.c new file mode 100644 index 0000000..e098b90b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr100305.c @@ -0,0 +1,13 @@ +/* { dg-options "-O" } */ + +typedef double v2df __attribute__((vector_size(16))); + +#define N 4096 +void consume (void *); +v2df +foo (void) +{ + double x[N+2]; + consume (x); + return (v2df) { x[N], x[N + 1] }; +} -- cgit v1.1 From 59f5d16f2c5db4d9592c8ce6453afe81334bb012 Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Wed, 28 Apr 2021 17:56:38 +0100 Subject: arm: fix UB due to missing mode check [PR100311] Some places in the compiler iterate over all the fixed registers to check if that register can be used in a particular mode. The idiom is to iterate over the register and then for that register, if it supports the current mode to check all that register and any additional registers needed (HARD_REGNO_NREGS). If these two checks are not fully aligned then it is possible to generate a buffer overrun when testing data objects that are sized by the number of hard regs in the machine. The VPR register is a case where these checks were not consistent and because this is the last HARD register the result was that we ended up overflowing the fixed_regs array. gcc: PR target/100311 * config/arm/arm.c (arm_hard_regno_mode_ok): Only allow VPR to be used in HImode. --- gcc/config/arm/arm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 6641e3f..0371d98 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -25269,7 +25269,7 @@ arm_hard_regno_mode_ok (unsigned int regno, machine_mode mode) return false; if (IS_VPR_REGNUM (regno)) - return true; + return mode == HImode; if (TARGET_THUMB1) /* For the Thumb we only allow values bigger than SImode in -- cgit v1.1 From 16683cefc636636ba6fed23fe0de89ed19bc7876 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 28 Apr 2021 14:07:41 -0300 Subject: fix asm-not pattern in dwarf2/inline5.c The test is supposed to check that the abstract lexical block of a function that was inlined doesn't have attributes, and that the concrete inlined lexical block does. There are two patterns to verify the absence of attributes in the abstract lexical block, one for the case in which the concrete block appears after the abstract one, and another for the case in which it's before. The former has a problem that is not visible when asm comments start with a single character, but that becomes apparent when they start with "/ ". The pattern starts by matching the abstract DW_TAG_lexical_block DIE header, and checking that the next line has, after any of the comment-starter characters (e.g. '/'), there are one or more blanks ' +', and then a character other than the '(' that would start another DIE. The problem is that '[.../...]+ +[^(].*' matches '/ (DIE...', because '[^(]' may match the second blank, and after that anything goes. So we end up recognizing the pattern, as if it was an abstract lexical block with an attribute. This could be minimally fixed by changing '[^(]' to '[^ (]', but the pattern that matches concrete before abstract checks for an explicit DW_AT after the abstract DIE, so I'm using that in the other pattern as well. For reference, the lines that start the unwanted match are: .uleb128 0xc / (DIE (0xa4) DW_TAG_lexical_block) .uleb128 0xd / (DIE (0xa5) DW_TAG_variable) for gcc/testsuite/ChangeLog * gcc.dg/debug/dwarf2/inline5.c: Adjust pattern to avoid mismatch when asm comments start with "/ ". --- gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c b/gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c index bd34f0d..3b50e9f 100644 --- a/gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c @@ -9,7 +9,7 @@ /* We do not know which is output first so look for both invalid abstract origins on the lexical blocks (knowing that the abstract instance has no attribute following the DW_TAG_lexical_block. */ -/* { dg-final { scan-assembler-not "\\(DIE \\(0x(\[0-9a-f\]*)\\) DW_TAG_lexical_block\\)\[^#/!@;\\|\]*\[#/!@;\\|\]+ +\[^(\].*DW_TAG_lexical_block\\)\[^#/!@;\\|x\]*x\\1\[^#/!@;\\|\]*\[#/!@;\\|\] +DW_AT_abstract_origin" { xfail { { *-*-aix* || *-*-solaris2.* } && { ! gas } } } } } */ +/* { dg-final { scan-assembler-not "\\(DIE \\(0x(\[0-9a-f\]*)\\) DW_TAG_lexical_block\\)\[^#/!@;\\|\]*\[#/!@;\\|\]+ +DW_AT.*DW_TAG_lexical_block\\)\[^#/!@;\\|x\]*x\\1\[^#/!@;\\|\]*\[#/!@;\\|\] +DW_AT_abstract_origin" { xfail { { *-*-aix* || *-*-solaris2.* } && { ! gas } } } } } */ /* { dg-final { scan-assembler-not "DW_TAG_lexical_block\\)\[^#/!@;\\|x\]*x(\[0-9a-f\]*)\[^#/!@;\\|\]*\[#/!@;\\|\]+ +DW_AT_abstract_origin.*\\(DIE \\(0x\\1\\) DW_TAG_lexical_block\\)\[^#/!@;\\|\]*\[#/!@;\\|\]+ +DW_AT" } } */ int foo (int i) -- cgit v1.1 From da4a0817beb506bc1c05d85e783ba6ffd079a194 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 28 Apr 2021 14:07:43 -0300 Subject: omit frame pointer in pr89676 This i386 test expects only two movl instructions. In configurations that --enable-frame-pointer, -O2 won't implicitly enable -fomit-frame-pointer, so we end up with a third movl to set up the frame pointer. This patch enables -fomit-frame-pointer explicitly, so that the result no longer depends on that configuration option. for gcc/testsuite/ChangeLog * gcc.target/i386/pr89676.c: Add -fomit-frame-pointer. --- gcc/testsuite/gcc.target/i386/pr89676.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/testsuite/gcc.target/i386/pr89676.c b/gcc/testsuite/gcc.target/i386/pr89676.c index 164a9da..7afa1a1 100644 --- a/gcc/testsuite/gcc.target/i386/pr89676.c +++ b/gcc/testsuite/gcc.target/i386/pr89676.c @@ -1,6 +1,6 @@ /* PR rtl-optimization/89676 */ /* { dg-do compile { target ia32 } } */ -/* { dg-options "-O2 -mno-stv" } */ +/* { dg-options "-O2 -mno-stv -fomit-frame-pointer" } */ unsigned long long foo (unsigned long long i) -- cgit v1.1 From 3ba781d3b5c8efadb60866c9743b657e8f0eb222 Mon Sep 17 00:00:00 2001 From: Senthil Kumar Selvaraj Date: Wed, 28 Apr 2021 17:29:12 +0000 Subject: AVR cc0 conversion See https://gcc.gnu.org/pipermail/gcc-patches/2021-January/563638.html for background. This patch converts the avr backend to MODE_CC. It addresses some of the comments made in the previous submission over here (https://gcc.gnu.org/pipermail/gcc-patches/2020-December/561757.html). Specifically, this patch has 1. Automatic clobber of REG_CC in inline asm statements, via TARGET_MD_ASM_ADJUST hook. 2. Direct clobber of REG_CC in insns emitted after reload (pro and epilogue). 3. Regression testing done on atmega8, atmega128, attiny40 and atxmega128a3 devices (more details below). 4. Verification and fixes for casesi and avr_compare_pattern related code that inspects insns, by looking at avr-casesi and mach RTL dumps. 5. Use length of parallel instead of passing in operand counts when generating code for shift patterns. 6. Fixes for indentation glitches. 7. Removal of CC_xxx stuff in avr-protos.h. In the places where the macros were still used (cond_string), I've replaced them with a bool hardcoded to false. I expect this will go away/get fixed when I eventually add specific CC modes. Things still to do: 1. Adjustment of peepholes/define_splits to match against patterns with REG_CC clobber. 2. Model effect of non-compare insns on REG_CC using additional CC modes. I'm hoping to use of a modified version of the cc attribute and define_subst (again inspired by the cris port), to do this. 3. RTX cost adjustment. gcc/ * config/avr/avr-dimode.md: Turn existing patterns into define_insn_and_split style patterns where the splitter adds a clobber of the condition code register. Drop "cc" attribute. Add new patterns to match output of the splitters. * config/avr/avr-fixed.md: Likewise. * config/avr/avr.c (cc_reg_rtx): New. (avr_parallel_insn_from_insns): Adjust insn count for removal of set of cc0. (avr_is_casesi_sequence): Likewise. (avr_casei_sequence_check_operands): Likewise. (avr_optimize_casesi): Likewise. Also insert new insns after jump_insn. (avr_pass_casesi::avr_rest_of_handle_casesi): Adjust for removal of set of cc0. (avr_init_expanders): Initialize cc_reg_rtx. (avr_regno_reg_class): Handle REG_CC. (cond_string): Remove usage of CC_OVERFLOW_UNUSABLE. (avr_notice_update_cc): Remove function. (ret_cond_branch): Remove usage of CC_OVERFLOW_UNUSABLE. (compare_condition): Adjust for PARALLEL with REG_CC clobber. (out_shift_with_cnt): Likewise. (ashlhi3_out): Likewise. (ashrhi3_out): Likewise. (lshrhi3_out): Likewise. (avr_class_max_nregs): Return single reg for REG_CC. (avr_compare_pattern): Check for REG_CC instead of cc0_rtx. (avr_reorg_remove_redundant_compare): Likewise. (avr_reorg):Adjust for PARALLEL with REG_CC clobber. (avr_hard_regno_nregs): Return single reg for REG_CC. (avr_hard_regno_mode_ok): Allow only CCmode for REG_CC. (avr_md_asm_adjust): Clobber REG_CC. (TARGET_HARD_REGNO_NREGS): Define. (TARGET_CLASS_MAX_NREGS): Define. (TARGET_MD_ASM_ADJUST): Define. * config/avr/avr.h (FIRST_PSEUDO_REGISTER): Adjust for REG_CC. (enum reg_class): Add CC_REG class. (NOTICE_UPDATE_CC): Remove. (CC_OVERFLOW_UNUSABLE): Remove. (CC_NO_CARRY): Remove. * config/avr/avr.md: Turn existing patterns into define_insn_and_split style patterns where the splitter adds a clobber of the condition code register. Drop "cc" attribute. Add new patterns to match output of the splitters. (sez): Remove unused pattern. --- gcc/config/avr/avr-dimode.md | 336 +++- gcc/config/avr/avr-fixed.md | 380 +++- gcc/config/avr/avr.c | 318 ++-- gcc/config/avr/avr.h | 34 +- gcc/config/avr/avr.md | 4244 +++++++++++++++++++++++++++++++++--------- 5 files changed, 4120 insertions(+), 1192 deletions(-) (limited to 'gcc') diff --git a/gcc/config/avr/avr-dimode.md b/gcc/config/avr/avr-dimode.md index 1817c16..1eb9599 100644 --- a/gcc/config/avr/avr-dimode.md +++ b/gcc/config/avr/avr-dimode.md @@ -95,39 +95,77 @@ ;; "adddq3_insn" "addudq3_insn" ;; "addda3_insn" "adduda3_insn" ;; "addta3_insn" "adduta3_insn" -(define_insn "add3_insn" +(define_insn_and_split "add3_insn" [(set (reg:ALL8 ACC_A) (plus:ALL8 (reg:ALL8 ACC_A) (reg:ALL8 ACC_B)))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8 ACC_A) + (plus:ALL8 (reg:ALL8 ACC_A) + (reg:ALL8 ACC_B))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*add3_insn" + [(set (reg:ALL8 ACC_A) + (plus:ALL8 (reg:ALL8 ACC_A) + (reg:ALL8 ACC_B))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" "%~call __adddi3" - [(set_attr "adjust_len" "call") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "call")]) -(define_insn "adddi3_const8_insn" +(define_insn_and_split "adddi3_const8_insn" [(set (reg:DI ACC_A) (plus:DI (reg:DI ACC_A) (sign_extend:DI (reg:QI REG_X))))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:DI ACC_A) + (plus:DI (reg:DI ACC_A) + (sign_extend:DI (reg:QI REG_X)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*adddi3_const8_insn" + [(set (reg:DI ACC_A) + (plus:DI (reg:DI ACC_A) + (sign_extend:DI (reg:QI REG_X)))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" "%~call __adddi3_s8" - [(set_attr "adjust_len" "call") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "call")]) ;; "adddi3_const_insn" ;; "adddq3_const_insn" "addudq3_const_insn" ;; "addda3_const_insn" "adduda3_const_insn" ;; "addta3_const_insn" "adduta3_const_insn" -(define_insn "add3_const_insn" +(define_insn_and_split "add3_const_insn" [(set (reg:ALL8 ACC_A) (plus:ALL8 (reg:ALL8 ACC_A) (match_operand:ALL8 0 "const_operand" "n Ynn")))] "avr_have_dimode && !s8_operand (operands[0], VOIDmode)" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8 ACC_A) + (plus:ALL8 (reg:ALL8 ACC_A) + (match_dup 0))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*add3_const_insn" + [(set (reg:ALL8 ACC_A) + (plus:ALL8 (reg:ALL8 ACC_A) + (match_operand:ALL8 0 "const_operand" "n Ynn"))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode + && !s8_operand (operands[0], VOIDmode) + && reload_completed" { return avr_out_plus (insn, operands); } - [(set_attr "adjust_len" "plus") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "plus")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -167,29 +205,53 @@ ;; "subdq3_insn" "subudq3_insn" ;; "subda3_insn" "subuda3_insn" ;; "subta3_insn" "subuta3_insn" -(define_insn "sub3_insn" +(define_insn_and_split "sub3_insn" [(set (reg:ALL8 ACC_A) (minus:ALL8 (reg:ALL8 ACC_A) (reg:ALL8 ACC_B)))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8 ACC_A) + (minus:ALL8 (reg:ALL8 ACC_A) + (reg:ALL8 ACC_B))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sub3_insn" + [(set (reg:ALL8 ACC_A) + (minus:ALL8 (reg:ALL8 ACC_A) + (reg:ALL8 ACC_B))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" "%~call __subdi3" - [(set_attr "adjust_len" "call") - (set_attr "cc" "set_czn")]) + [(set_attr "adjust_len" "call")]) ;; "subdi3_const_insn" ;; "subdq3_const_insn" "subudq3_const_insn" ;; "subda3_const_insn" "subuda3_const_insn" ;; "subta3_const_insn" "subuta3_const_insn" -(define_insn "sub3_const_insn" +(define_insn_and_split "sub3_const_insn" [(set (reg:ALL8 ACC_A) (minus:ALL8 (reg:ALL8 ACC_A) (match_operand:ALL8 0 "const_operand" "n Ynn")))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8 ACC_A) + (minus:ALL8 (reg:ALL8 ACC_A) + (match_dup 0))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sub3_const_insn" + [(set (reg:ALL8 ACC_A) + (minus:ALL8 (reg:ALL8 ACC_A) + (match_operand:ALL8 0 "const_operand" "n Ynn"))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" { return avr_out_plus (insn, operands); } - [(set_attr "adjust_len" "plus") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "plus")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Signed Saturating Addition and Subtraction @@ -220,25 +282,49 @@ DONE; }) -(define_insn "3_insn" +(define_insn_and_split "3_insn" [(set (reg:ALL8S ACC_A) (ss_addsub:ALL8S (reg:ALL8S ACC_A) (reg:ALL8S ACC_B)))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8S ACC_A) + (ss_addsub:ALL8S (reg:ALL8S ACC_A) + (reg:ALL8S ACC_B))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3_insn" + [(set (reg:ALL8S ACC_A) + (ss_addsub:ALL8S (reg:ALL8S ACC_A) + (reg:ALL8S ACC_B))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" "%~call __3" - [(set_attr "adjust_len" "call") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "call")]) -(define_insn "3_const_insn" +(define_insn_and_split "3_const_insn" [(set (reg:ALL8S ACC_A) (ss_addsub:ALL8S (reg:ALL8S ACC_A) (match_operand:ALL8S 0 "const_operand" "n Ynn")))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8S ACC_A) + (ss_addsub:ALL8S (reg:ALL8S ACC_A) + (match_dup 0))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3_const_insn" + [(set (reg:ALL8S ACC_A) + (ss_addsub:ALL8S (reg:ALL8S ACC_A) + (match_operand:ALL8S 0 "const_operand" "n Ynn"))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" { return avr_out_plus (insn, operands); } - [(set_attr "adjust_len" "plus") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "plus")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Unsigned Saturating Addition and Subtraction @@ -269,25 +355,49 @@ DONE; }) -(define_insn "3_insn" +(define_insn_and_split "3_insn" [(set (reg:ALL8U ACC_A) (us_addsub:ALL8U (reg:ALL8U ACC_A) (reg:ALL8U ACC_B)))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8U ACC_A) + (us_addsub:ALL8U (reg:ALL8U ACC_A) + (reg:ALL8U ACC_B))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3_insn" + [(set (reg:ALL8U ACC_A) + (us_addsub:ALL8U (reg:ALL8U ACC_A) + (reg:ALL8U ACC_B))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" "%~call __3" - [(set_attr "adjust_len" "call") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "call")]) -(define_insn "3_const_insn" +(define_insn_and_split "3_const_insn" [(set (reg:ALL8U ACC_A) (us_addsub:ALL8U (reg:ALL8U ACC_A) (match_operand:ALL8U 0 "const_operand" "n Ynn")))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8U ACC_A) + (us_addsub:ALL8U (reg:ALL8U ACC_A) + (match_operand:ALL8U 0 "const_operand" "n Ynn"))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3_const_insn" + [(set (reg:ALL8U ACC_A) + (us_addsub:ALL8U (reg:ALL8U ACC_A) + (match_operand:ALL8U 0 "const_operand" "n Ynn"))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" { return avr_out_plus (insn, operands); } - [(set_attr "adjust_len" "plus") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "plus")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Negation @@ -306,13 +416,23 @@ DONE; }) -(define_insn "negdi2_insn" +(define_insn_and_split "negdi2_insn" [(set (reg:DI ACC_A) (neg:DI (reg:DI ACC_A)))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:DI ACC_A) + (neg:DI (reg:DI ACC_A))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*negdi2_insn" + [(set (reg:DI ACC_A) + (neg:DI (reg:DI ACC_A))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" "%~call __negdi2" - [(set_attr "adjust_len" "call") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "call")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -322,7 +442,7 @@ (define_expand "conditional_jump" [(set (pc) (if_then_else - (match_operator 0 "ordered_comparison_operator" [(cc0) + (match_operator 0 "ordered_comparison_operator" [(reg:CC REG_CC) (const_int 0)]) (label_ref (match_operand 1 "" "")) (pc)))] @@ -333,13 +453,14 @@ ;; "cbranchda4" "cbranchuda4" ;; "cbranchta4" "cbranchuta4" (define_expand "cbranch4" - [(parallel [(match_operand:ALL8 1 "register_operand" "") - (match_operand:ALL8 2 "nonmemory_operand" "") - (match_operator 0 "ordered_comparison_operator" [(cc0) - (const_int 0)]) - (label_ref (match_operand 3 "" ""))])] + [(set (pc) + (if_then_else (match_operator 0 "ordered_comparison_operator" + [(match_operand:ALL8 1 "register_operand" "") + (match_operand:ALL8 2 "nonmemory_operand" "")]) + (label_ref (match_operand 3 "" "")) + (pc)))] "avr_have_dimode" - { + { rtx acc_a = gen_rtx_REG (mode, ACC_A); avr_fix_inputs (operands, 1 << 2, regmask (mode, ACC_A)); @@ -348,19 +469,36 @@ if (s8_operand (operands[2], VOIDmode)) { emit_move_insn (gen_rtx_REG (QImode, REG_X), operands[2]); - emit_insn (gen_compare_const8_di2 ()); + emit_jump_insn (gen_cbranch_const8_di2_split (operands[0], operands[3])); } else if (const_operand (operands[2], GET_MODE (operands[2]))) { - emit_insn (gen_compare_const_2 (operands[2])); + emit_jump_insn (gen_cbranch_const_2_split (operands[0], + operands[2], + operands[3])); } else { emit_move_insn (gen_rtx_REG (mode, ACC_B), operands[2]); - emit_insn (gen_compare_2 ()); + emit_jump_insn (gen_cbranch_2_split (operands[0], operands[3])); } + DONE; + }) - emit_jump_insn (gen_conditional_jump (operands[0], operands[3])); +(define_insn_and_split "cbranch_2_split" + [(set (pc) + (if_then_else (match_operator 0 "ordered_comparison_operator" + [(reg:ALL8 ACC_A) + (reg:ALL8 ACC_B)]) + (label_ref (match_operand 1 "" "")) + (pc)))] + "avr_have_dimode" + "#" + "&& reload_completed" + [(const_int 0)] + { + emit_insn (gen_compare_2 ()); + emit_jump_insn (gen_conditional_jump (operands[0], operands[1])); DONE; }) @@ -369,39 +507,74 @@ ;; "compare_da2" "compare_uda2" ;; "compare_ta2" "compare_uta2" (define_insn "compare_2" - [(set (cc0) - (compare (reg:ALL8 ACC_A) - (reg:ALL8 ACC_B)))] - "avr_have_dimode" + [(set (reg:CC REG_CC) + (compare:CC (reg:ALL8 ACC_A) + (reg:ALL8 ACC_B)))] + "reload_completed && avr_have_dimode" "%~call __cmpdi2" - [(set_attr "adjust_len" "call") - (set_attr "cc" "compare")]) + [(set_attr "adjust_len" "call")]) -(define_insn "compare_const8_di2" - [(set (cc0) - (compare (reg:DI ACC_A) - (sign_extend:DI (reg:QI REG_X))))] +(define_insn_and_split "cbranch_const8_di2_split" + [(set (pc) + (if_then_else (match_operator 0 "ordered_comparison_operator" + [(reg:DI ACC_A) + (sign_extend:DI (reg:QI REG_X))]) + (label_ref (match_operand 1 "" "")) + (pc)))] "avr_have_dimode" + "#" + "&& reload_completed" + [(const_int 0)] + { + emit_insn (gen_compare_const8_di2 ()); + emit_jump_insn (gen_conditional_jump (operands[0], operands[1])); + DONE; + }) + +(define_insn "compare_const8_di2" + [(set (reg:CC REG_CC) + (compare:CC (reg:DI ACC_A) + (sign_extend:DI (reg:QI REG_X))))] + "reload_completed && avr_have_dimode" "%~call __cmpdi2_s8" - [(set_attr "adjust_len" "call") - (set_attr "cc" "compare")]) + [(set_attr "adjust_len" "call")]) + +(define_insn_and_split "cbranch_const_2_split" + [(set (pc) + (if_then_else (match_operator 0 "ordered_comparison_operator" + [(reg:ALL8 ACC_A) + (match_operand:ALL8 1 "const_operand" "n Ynn")]) + (label_ref (match_operand 2 "" "")) + (pc))) + (clobber (match_scratch:QI 3 "=&d"))] + "avr_have_dimode + && !s8_operand (operands[1], VOIDmode)" + "#" + "&& reload_completed" + [(const_int 0)] + { + emit_insn (gen_compare_const_2 (operands[1], operands[3])); + emit_jump_insn (gen_conditional_jump (operands[0], operands[2])); + DONE; + }) + ;; "compare_const_di2" ;; "compare_const_dq2" "compare_const_udq2" ;; "compare_const_da2" "compare_const_uda2" ;; "compare_const_ta2" "compare_const_uta2" (define_insn "compare_const_2" - [(set (cc0) - (compare (reg:ALL8 ACC_A) - (match_operand:ALL8 0 "const_operand" "n Ynn"))) - (clobber (match_scratch:QI 1 "=&d"))] - "avr_have_dimode + [(set (reg:CC REG_CC) + (compare:CC (reg:ALL8 ACC_A) + (match_operand:ALL8 0 "const_operand" "n Ynn"))) + (clobber (match_operand:QI 1 "register_operand" "=&d"))] + "reload_completed + && avr_have_dimode && !s8_operand (operands[0], VOIDmode)" { return avr_out_compare64 (insn, operands, NULL); } - [(set_attr "adjust_len" "compare64") - (set_attr "cc" "compare")]) + [(set_attr "adjust_len" "compare64")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -444,14 +617,26 @@ ;; "ashludq3_insn" "ashrudq3_insn" "lshrudq3_insn" "rotludq3_insn" ;; "ashluda3_insn" "ashruda3_insn" "lshruda3_insn" "rotluda3_insn" ;; "ashluta3_insn" "ashruta3_insn" "lshruta3_insn" "rotluta3_insn" -(define_insn "3_insn" +(define_insn_and_split "3_insn" [(set (reg:ALL8 ACC_A) (di_shifts:ALL8 (reg:ALL8 ACC_A) (reg:QI 16)))] "avr_have_dimode" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL8 ACC_A) + (di_shifts:ALL8 (reg:ALL8 ACC_A) + (reg:QI 16))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3_insn" + [(set (reg:ALL8 ACC_A) + (di_shifts:ALL8 (reg:ALL8 ACC_A) + (reg:QI 16))) + (clobber (reg:CC REG_CC))] + "avr_have_dimode && reload_completed" "%~call __di3" - [(set_attr "adjust_len" "call") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "call")]) ;; "umulsidi3" ;; "mulsidi3" @@ -475,7 +660,8 @@ ;; "umulsidi3_insn" ;; "mulsidi3_insn" -(define_insn "mulsidi3_insn" + +(define_insn_and_split "mulsidi3_insn" [(set (reg:DI ACC_A) (mult:DI (any_extend:DI (reg:SI 18)) (any_extend:DI (reg:SI 22)))) @@ -483,6 +669,24 @@ (clobber (reg:HI REG_Z))] "avr_have_dimode && AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:DI ACC_A) + (mult:DI (any_extend:DI (reg:SI 18)) + (any_extend:DI (reg:SI 22)))) + (clobber (reg:HI REG_X)) + (clobber (reg:HI REG_Z)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulsidi3_insn" + [(set (reg:DI ACC_A) + (mult:DI (any_extend:DI (reg:SI 18)) + (any_extend:DI (reg:SI 22)))) + (clobber (reg:HI REG_X)) + (clobber (reg:HI REG_Z)) + (clobber (reg:CC REG_CC))] + "avr_have_dimode + && AVR_HAVE_MUL + && reload_completed" "%~call __mulsidi3" - [(set_attr "adjust_len" "call") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "call")]) diff --git a/gcc/config/avr/avr-fixed.md b/gcc/config/avr/avr-fixed.md index a3b49d5..1c4902f 100644 --- a/gcc/config/avr/avr-fixed.md +++ b/gcc/config/avr/avr-fixed.md @@ -56,27 +56,53 @@ TA UTA QI HI SI DI]) -(define_insn "fract2" +(define_insn_and_split "fract2" [(set (match_operand:FIXED_A 0 "register_operand" "=r") (fract_convert:FIXED_A (match_operand:FIXED_B 1 "register_operand" "r")))] "mode != mode" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (fract_convert:FIXED_A + (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*fract2" + [(set (match_operand:FIXED_A 0 "register_operand" "=r") + (fract_convert:FIXED_A + (match_operand:FIXED_B 1 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "mode != mode + && reload_completed" { return avr_out_fract (insn, operands, true, NULL); } - [(set_attr "cc" "clobber") - (set_attr "adjust_len" "sfract")]) + [(set_attr "adjust_len" "sfract")]) -(define_insn "fractuns2" +(define_insn_and_split "fractuns2" [(set (match_operand:FIXED_A 0 "register_operand" "=r") (unsigned_fract_convert:FIXED_A (match_operand:FIXED_B 1 "register_operand" "r")))] "mode != mode" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (unsigned_fract_convert:FIXED_A + (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*fractuns2" + [(set (match_operand:FIXED_A 0 "register_operand" "=r") + (unsigned_fract_convert:FIXED_A + (match_operand:FIXED_B 1 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "mode != mode + && reload_completed" { return avr_out_fract (insn, operands, false, NULL); } - [(set_attr "cc" "clobber") - (set_attr "adjust_len" "ufract")]) + [(set_attr "adjust_len" "ufract")]) ;****************************************************************************** ;** Saturated Addition and Subtraction @@ -92,29 +118,53 @@ ;; "ssaddqq3" "ssaddhq3" "ssaddha3" "ssaddsq3" "ssaddsa3" ;; "sssubqq3" "sssubhq3" "sssubha3" "sssubsq3" "sssubsa3" -(define_insn "3" +(define_insn_and_split "3" [(set (match_operand:ALL124S 0 "register_operand" "=??d,d") (ss_addsub:ALL124S (match_operand:ALL124S 1 "register_operand" "0,0") (match_operand:ALL124S 2 "nonmemory_operand" "r,Ynn")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ss_addsub:ALL124S (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3" + [(set (match_operand:ALL124S 0 "register_operand" "=??d,d") + (ss_addsub:ALL124S (match_operand:ALL124S 1 "register_operand" "0,0") + (match_operand:ALL124S 2 "nonmemory_operand" "r,Ynn"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_plus (insn, operands); } - [(set_attr "cc" "clobber") - (set_attr "adjust_len" "plus")]) + [(set_attr "adjust_len" "plus")]) ;; "usadduqq3" "usadduhq3" "usadduha3" "usaddusq3" "usaddusa3" ;; "ussubuqq3" "ussubuhq3" "ussubuha3" "ussubusq3" "ussubusa3" -(define_insn "3" +(define_insn_and_split "3" [(set (match_operand:ALL124U 0 "register_operand" "=??r,d") (us_addsub:ALL124U (match_operand:ALL124U 1 "register_operand" "0,0") (match_operand:ALL124U 2 "nonmemory_operand" "r,Ynn")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (us_addsub:ALL124U (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3" + [(set (match_operand:ALL124U 0 "register_operand" "=??r,d") + (us_addsub:ALL124U (match_operand:ALL124U 1 "register_operand" "0,0") + (match_operand:ALL124U 2 "nonmemory_operand" "r,Ynn"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_plus (insn, operands); } - [(set_attr "cc" "clobber") - (set_attr "adjust_len" "plus")]) + [(set_attr "adjust_len" "plus")]) ;****************************************************************************** ;** Saturated Negation and Absolute Value @@ -134,21 +184,41 @@ DONE; }) -(define_insn "ssnegqq2" +(define_insn_and_split "ssnegqq2" [(set (match_operand:QQ 0 "register_operand" "=r") (ss_neg:QQ (match_operand:QQ 1 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ss_neg:QQ (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ssnegqq2" + [(set (match_operand:QQ 0 "register_operand" "=r") + (ss_neg:QQ (match_operand:QQ 1 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "neg %0\;brvc 0f\;dec %0\;0:" - [(set_attr "cc" "clobber") - (set_attr "length" "3")]) + [(set_attr "length" "3")]) -(define_insn "ssabsqq2" +(define_insn_and_split "ssabsqq2" [(set (match_operand:QQ 0 "register_operand" "=r") (ss_abs:QQ (match_operand:QQ 1 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ss_abs:QQ (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ssabsqq2" + [(set (match_operand:QQ 0 "register_operand" "=r") + (ss_abs:QQ (match_operand:QQ 1 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sbrc %0,7\;neg %0\;sbrc %0,7\;dec %0" - [(set_attr "cc" "clobber") - (set_attr "length" "4")]) + [(set_attr "length" "4")]) ;; "ssneghq2" "ssnegha2" "ssnegsq2" "ssnegsa2" ;; "ssabshq2" "ssabsha2" "ssabssq2" "ssabssa2" @@ -166,23 +236,43 @@ ;; "*ssneghq2" "*ssnegha2" ;; "*ssabshq2" "*ssabsha2" -(define_insn "*2" +(define_insn_and_split "*2_split" [(set (reg:ALL2S 24) (ss_abs_neg:ALL2S (reg:ALL2S 24)))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL2S 24) + (ss_abs_neg:ALL2S (reg:ALL2S 24))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*2" + [(set (reg:ALL2S 24) + (ss_abs_neg:ALL2S (reg:ALL2S 24))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call ___2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "*ssnegsq2" "*ssnegsa2" ;; "*ssabssq2" "*ssabssa2" -(define_insn "*2" +(define_insn_and_split "*2_split" [(set (reg:ALL4S 22) (ss_abs_neg:ALL4S (reg:ALL4S 22)))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL4S 22) + (ss_abs_neg:ALL4S (reg:ALL4S 22))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*2" + [(set (reg:ALL4S 22) + (ss_abs_neg:ALL4S (reg:ALL4S 22))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call ___4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;****************************************************************************** ; mul @@ -200,23 +290,47 @@ DONE; }) -(define_insn "mulqq3_enh" +(define_insn_and_split "mulqq3_enh" [(set (match_operand:QQ 0 "register_operand" "=r") (mult:QQ (match_operand:QQ 1 "register_operand" "a") (match_operand:QQ 2 "register_operand" "a")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:QQ (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulqq3_enh" + [(set (match_operand:QQ 0 "register_operand" "=r") + (mult:QQ (match_operand:QQ 1 "register_operand" "a") + (match_operand:QQ 2 "register_operand" "a"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "fmuls %1,%2\;dec r1\;brvs 0f\;inc r1\;0:\;mov %0,r1\;clr __zero_reg__" - [(set_attr "length" "6") - (set_attr "cc" "clobber")]) + [(set_attr "length" "6")]) -(define_insn "muluqq3_enh" +(define_insn_and_split "muluqq3_enh" [(set (match_operand:UQQ 0 "register_operand" "=r") (mult:UQQ (match_operand:UQQ 1 "register_operand" "r") (match_operand:UQQ 2 "register_operand" "r")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:UQQ (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*muluqq3_enh" + [(set (match_operand:UQQ 0 "register_operand" "=r") + (mult:UQQ (match_operand:UQQ 1 "register_operand" "r") + (match_operand:UQQ 2 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%2\;mov %0,r1\;clr __zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) (define_expand "mulqq3_nomul" [(set (reg:QQ 24) @@ -255,16 +369,32 @@ avr_fix_inputs (operands, 1 << 2, regmask (UQQmode, 22)); }) -(define_insn "*mulqq3.call" +(define_insn_and_split "*mulqq3.call_split" [(set (reg:QQ 23) (mult:QQ (reg:QQ 24) (reg:QQ 25))) (clobber (reg:QI 22)) (clobber (reg:HI 24))] "!AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:QQ 23) + (mult:QQ (reg:QQ 24) + (reg:QQ 25))) + (clobber (reg:QI 22)) + (clobber (reg:HI 24)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulqq3.call" + [(set (reg:QQ 23) + (mult:QQ (reg:QQ 24) + (reg:QQ 25))) + (clobber (reg:QI 22)) + (clobber (reg:HI 24)) + (clobber (reg:CC REG_CC))] + "!AVR_HAVE_MUL && reload_completed" "%~call __mulqq3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "mulhq3" "muluhq3" @@ -288,15 +418,29 @@ ;; "*mulhq3.call" "*muluhq3.call" ;; "*mulha3.call" "*muluha3.call" -(define_insn "*mul3.call" +(define_insn_and_split "*mul3.call_split" [(set (reg:ALL2QA 24) (mult:ALL2QA (reg:ALL2QA 18) (reg:ALL2QA 26))) (clobber (reg:HI 22))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL2QA 24) + (mult:ALL2QA (reg:ALL2QA 18) + (reg:ALL2QA 26))) + (clobber (reg:HI 22)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mul3.call" + [(set (reg:ALL2QA 24) + (mult:ALL2QA (reg:ALL2QA 18) + (reg:ALL2QA 26))) + (clobber (reg:HI 22)) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mul3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; On the enhanced core, don't clobber either input and use a separate output @@ -318,14 +462,26 @@ }) ;; "*mulsa3.call" "*mulusa3.call" -(define_insn "*mul3.call" +(define_insn_and_split "*mul3.call_split" [(set (reg:ALL4A 24) (mult:ALL4A (reg:ALL4A 16) (reg:ALL4A 20)))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL4A 24) + (mult:ALL4A (reg:ALL4A 16) + (reg:ALL4A 20))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mul3.call" + [(set (reg:ALL4A 24) + (mult:ALL4A (reg:ALL4A 16) + (reg:ALL4A 20))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mul3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ; div @@ -351,15 +507,29 @@ ;; "*divqq3.call" "*udivuqq3.call" -(define_insn "*3.call" +(define_insn_and_split "*3.call_split" [(set (reg:ALL1Q 24) (usdiv:ALL1Q (reg:ALL1Q 25) (reg:ALL1Q 22))) (clobber (reg:QI 25))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL1Q 24) + (usdiv:ALL1Q (reg:ALL1Q 25) + (reg:ALL1Q 22))) + (clobber (reg:QI 25)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3.call" + [(set (reg:ALL1Q 24) + (usdiv:ALL1Q (reg:ALL1Q 25) + (reg:ALL1Q 22))) + (clobber (reg:QI 25)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "divhq3" "udivuhq3" ;; "divha3" "udivuha3" @@ -382,16 +552,32 @@ ;; "*divhq3.call" "*udivuhq3.call" ;; "*divha3.call" "*udivuha3.call" -(define_insn "*3.call" +(define_insn_and_split "*3.call_split" [(set (reg:ALL2QA 24) (usdiv:ALL2QA (reg:ALL2QA 26) (reg:ALL2QA 22))) (clobber (reg:HI 26)) (clobber (reg:QI 21))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL2QA 24) + (usdiv:ALL2QA (reg:ALL2QA 26) + (reg:ALL2QA 22))) + (clobber (reg:HI 26)) + (clobber (reg:QI 21)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3.call" + [(set (reg:ALL2QA 24) + (usdiv:ALL2QA (reg:ALL2QA 26) + (reg:ALL2QA 22))) + (clobber (reg:HI 26)) + (clobber (reg:QI 21)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; Note the first parameter gets passed in already offset by 2 bytes @@ -414,16 +600,32 @@ }) ;; "*divsa3.call" "*udivusa3.call" -(define_insn "*3.call" +(define_insn_and_split "*3.call_split" [(set (reg:ALL4A 22) (usdiv:ALL4A (reg:ALL4A 24) (reg:ALL4A 18))) (clobber (reg:HI 26)) (clobber (reg:HI 30))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL4A 22) + (usdiv:ALL4A (reg:ALL4A 24) + (reg:ALL4A 18))) + (clobber (reg:HI 26)) + (clobber (reg:HI 30)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*3.call" + [(set (reg:ALL4A 22) + (usdiv:ALL4A (reg:ALL4A 24) + (reg:ALL4A 18))) + (clobber (reg:HI 26)) + (clobber (reg:HI 30)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;****************************************************************************** @@ -474,51 +676,109 @@ ;; "roundqq3_const" "rounduqq3_const" ;; "roundhq3_const" "rounduhq3_const" "roundha3_const" "rounduha3_const" ;; "roundsq3_const" "roundusq3_const" "roundsa3_const" "roundusa3_const" -(define_insn "round3_const" +(define_insn_and_split "round3_const" [(set (match_operand:ALL124QA 0 "register_operand" "=d") (unspec:ALL124QA [(match_operand:ALL124QA 1 "register_operand" "0") (match_operand:HI 2 "const_int_operand" "n") (const_int 0)] UNSPEC_ROUND))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (unspec:ALL124QA [(match_dup 1) + (match_dup 2) + (const_int 0)] + UNSPEC_ROUND)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*round3_const" + [(set (match_operand:ALL124QA 0 "register_operand" "=d") + (unspec:ALL124QA [(match_operand:ALL124QA 1 "register_operand" "0") + (match_operand:HI 2 "const_int_operand" "n") + (const_int 0)] + UNSPEC_ROUND)) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_round (insn, operands); } - [(set_attr "cc" "clobber") - (set_attr "adjust_len" "round")]) + [(set_attr "adjust_len" "round")]) ;; "*roundqq3.libgcc" "*rounduqq3.libgcc" -(define_insn "*round3.libgcc" +(define_insn_and_split "*round3.libgcc_split" [(set (reg:ALL1Q 24) (unspec:ALL1Q [(reg:ALL1Q 22) (reg:QI 24)] UNSPEC_ROUND)) (clobber (reg:ALL1Q 22))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL1Q 24) + (unspec:ALL1Q [(reg:ALL1Q 22) + (reg:QI 24)] UNSPEC_ROUND)) + (clobber (reg:ALL1Q 22)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*round3.libgcc" + [(set (reg:ALL1Q 24) + (unspec:ALL1Q [(reg:ALL1Q 22) + (reg:QI 24)] UNSPEC_ROUND)) + (clobber (reg:ALL1Q 22)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __round3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "*roundhq3.libgcc" "*rounduhq3.libgcc" ;; "*roundha3.libgcc" "*rounduha3.libgcc" -(define_insn "*round3.libgcc" +(define_insn_and_split "*round3.libgcc_split" [(set (reg:ALL2QA 24) (unspec:ALL2QA [(reg:ALL2QA 22) (reg:QI 24)] UNSPEC_ROUND)) (clobber (reg:ALL2QA 22))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL2QA 24) + (unspec:ALL2QA [(reg:ALL2QA 22) + (reg:QI 24)] UNSPEC_ROUND)) + (clobber (reg:ALL2QA 22)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*round3.libgcc" + [(set (reg:ALL2QA 24) + (unspec:ALL2QA [(reg:ALL2QA 22) + (reg:QI 24)] UNSPEC_ROUND)) + (clobber (reg:ALL2QA 22)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __round3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "*roundsq3.libgcc" "*roundusq3.libgcc" ;; "*roundsa3.libgcc" "*roundusa3.libgcc" -(define_insn "*round3.libgcc" +(define_insn_and_split "*round3.libgcc_split" [(set (reg:ALL4QA 22) (unspec:ALL4QA [(reg:ALL4QA 18) (reg:QI 24)] UNSPEC_ROUND)) (clobber (reg:ALL4QA 18))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:ALL4QA 22) + (unspec:ALL4QA [(reg:ALL4QA 18) + (reg:QI 24)] UNSPEC_ROUND)) + (clobber (reg:ALL4QA 18)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*round3.libgcc" + [(set (reg:ALL4QA 22) + (unspec:ALL4QA [(reg:ALL4QA 18) + (reg:QI 24)] UNSPEC_ROUND)) + (clobber (reg:ALL4QA 18)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __round3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 3a250df..06c84d5 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -195,6 +195,10 @@ rtx tmp_reg_rtx; extern GTY(()) rtx zero_reg_rtx; rtx zero_reg_rtx; +/* Condition Code register RTX (reg:CC REG_CC) */ +extern GTY(()) rtx cc_reg_rtx; +rtx cc_reg_rtx; + /* RTXs for all general purpose registers as QImode */ extern GTY(()) rtx all_regs_rtx[32]; rtx all_regs_rtx[32]; @@ -376,10 +380,10 @@ make_avr_pass_casesi (gcc::context *ctxt) /* Make one parallel insn with all the patterns from insns i[0]..i[5]. */ static rtx_insn* -avr_parallel_insn_from_insns (rtx_insn *i[6]) +avr_parallel_insn_from_insns (rtx_insn *i[5]) { - rtvec vec = gen_rtvec (6, PATTERN (i[0]), PATTERN (i[1]), PATTERN (i[2]), - PATTERN (i[3]), PATTERN (i[4]), PATTERN (i[5])); + rtvec vec = gen_rtvec (5, PATTERN (i[0]), PATTERN (i[1]), PATTERN (i[2]), + PATTERN (i[3]), PATTERN (i[4])); start_sequence(); emit (gen_rtx_PARALLEL (VOIDmode, vec)); rtx_insn *insn = get_insns(); @@ -397,22 +401,21 @@ avr_parallel_insn_from_insns (rtx_insn *i[6]) pattern casesi__sequence forged from the sequence to recog_data. */ static bool -avr_is_casesi_sequence (basic_block bb, rtx_insn *insn, rtx_insn *insns[6]) +avr_is_casesi_sequence (basic_block bb, rtx_insn *insn, rtx_insn *insns[5]) { - rtx set_5, set_0; + rtx set_4, set_0; /* A first and quick test for a casesi sequences. As a side effect of - the test, harvest respective insns to INSNS[0..5]. */ + the test, harvest respective insns to INSNS[0..4]. */ - if (!(JUMP_P (insns[5] = insn) + if (!(JUMP_P (insns[4] = insn) // casesi is the only insn that comes up with UNSPEC_INDEX_JMP, // hence the following test ensures that we are actually dealing // with code from casesi. - && (set_5 = single_set (insns[5])) - && UNSPEC == GET_CODE (SET_SRC (set_5)) - && UNSPEC_INDEX_JMP == XINT (SET_SRC (set_5), 1) + && (set_4 = single_set (insns[4])) + && UNSPEC == GET_CODE (SET_SRC (set_4)) + && UNSPEC_INDEX_JMP == XINT (SET_SRC (set_4), 1) - && (insns[4] = prev_real_insn (insns[5])) && (insns[3] = prev_real_insn (insns[4])) && (insns[2] = prev_real_insn (insns[3])) && (insns[1] = prev_real_insn (insns[2])) @@ -429,7 +432,7 @@ avr_is_casesi_sequence (basic_block bb, rtx_insn *insn, rtx_insn *insns[6]) { fprintf (dump_file, ";; Sequence from casesi in " "[bb %d]:\n\n", bb->index); - for (int i = 0; i < 6; i++) + for (int i = 0; i < 5; i++) print_rtl_single (dump_file, insns[i]); } @@ -519,7 +522,7 @@ avr_casei_sequence_check_operands (rtx *xop) } -/* INSNS[1..5] is a sequence as generated by casesi and INSNS[0] is an +/* INSNS[1..4] is a sequence as generated by casesi and INSNS[0] is an extension of an 8-bit or 16-bit integer to SImode. XOP contains the operands of INSNS as extracted by insn_extract from pattern casesi__sequence: @@ -541,7 +544,7 @@ avr_casei_sequence_check_operands (rtx *xop) switch value instead of SImode. */ static void -avr_optimize_casesi (rtx_insn *insns[6], rtx *xop) +avr_optimize_casesi (rtx_insn *insns[5], rtx *xop) { // Original mode of the switch value; this is QImode or HImode. machine_mode mode = GET_MODE (xop[10]); @@ -597,16 +600,21 @@ avr_optimize_casesi (rtx_insn *insns[6], rtx *xop) rtx reg = copy_to_mode_reg (mode, xop[10]); rtx (*gen_add)(rtx,rtx,rtx) = QImode == mode ? gen_addqi3 : gen_addhi3; - rtx (*gen_cmp)(rtx,rtx) = QImode == mode ? gen_cmpqi3 : gen_cmphi3; + rtx (*gen_cbranch)(rtx,rtx,rtx,rtx) + = QImode == mode ? gen_cbranchqi4 : gen_cbranchhi4; emit_insn (gen_add (reg, reg, gen_int_mode (-low_idx, mode))); - emit_insn (gen_cmp (reg, gen_int_mode (num_idx, mode))); + rtx op0 = reg; rtx op1 = gen_int_mode (num_idx, mode); + rtx labelref = copy_rtx (xop[4]); + emit_jump_insn (gen_cbranch (gen_rtx_fmt_ee (GTU, VOIDmode, op0, op1), + op0, op1, + labelref)); seq1 = get_insns(); last1 = get_last_insn(); end_sequence(); - emit_insn_before (seq1, insns[1]); + emit_insn_after (seq1, insns[2]); // After the out-of-bounds test and corresponding branch, use a // 16-bit index. If QImode is used, extend it to HImode first. @@ -627,7 +635,7 @@ avr_optimize_casesi (rtx_insn *insns[6], rtx *xop) last2 = get_last_insn(); end_sequence(); - emit_insn_after (seq2, insns[4]); + emit_insn_after (seq2, insns[3]); if (dump_file) { @@ -648,7 +656,7 @@ avr_optimize_casesi (rtx_insn *insns[6], rtx *xop) } fprintf (dump_file, ";; Deleting insns: %d, %d, %d.\n\n", - INSN_UID (insns[1]), INSN_UID (insns[2]), INSN_UID (insns[4])); + INSN_UID (insns[1]), INSN_UID (insns[2]), INSN_UID (insns[3])); } // Pseudodelete the SImode and subreg of SImode insns. We don't care @@ -657,7 +665,7 @@ avr_optimize_casesi (rtx_insn *insns[6], rtx *xop) SET_INSN_DELETED (insns[1]); SET_INSN_DELETED (insns[2]); - SET_INSN_DELETED (insns[4]); + SET_INSN_DELETED (insns[3]); } @@ -668,7 +676,7 @@ avr_pass_casesi::avr_rest_of_handle_casesi (function *func) FOR_EACH_BB_FN (bb, func) { - rtx_insn *insn, *insns[6]; + rtx_insn *insn, *insns[5]; FOR_BB_INSNS (bb, insn) { @@ -814,6 +822,8 @@ avr_init_expanders (void) tmp_reg_rtx = all_regs_rtx[AVR_TMP_REGNO]; zero_reg_rtx = all_regs_rtx[AVR_ZERO_REGNO]; + cc_reg_rtx = gen_rtx_REG (CCmode, REG_CC); + lpm_addr_reg_rtx = gen_rtx_REG (HImode, REG_Z); sreg_rtx = gen_rtx_MEM (QImode, GEN_INT (avr_addr.sreg)); @@ -864,6 +874,9 @@ avr_regno_reg_class (int r) if (r <= 33) return reg_class_tab[r]; + if (r == REG_CC) + return CC_REG; + return ALL_REGS; } @@ -2641,6 +2654,8 @@ ptrreg_to_str (int regno) static const char* cond_string (enum rtx_code code) { + bool cc_overflow_unusable = false; + switch (code) { case NE: @@ -2648,12 +2663,12 @@ cond_string (enum rtx_code code) case EQ: return "eq"; case GE: - if (cc_prev_status.flags & CC_OVERFLOW_UNUSABLE) + if (cc_overflow_unusable) return "pl"; else return "ge"; case LT: - if (cc_prev_status.flags & CC_OVERFLOW_UNUSABLE) + if (cc_overflow_unusable) return "mi"; else return "lt"; @@ -2989,152 +3004,6 @@ avr_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size, return size <= MOVE_MAX_PIECES; } - -/* Worker function for `NOTICE_UPDATE_CC'. */ -/* Update the condition code in the INSN. */ - -void -avr_notice_update_cc (rtx body ATTRIBUTE_UNUSED, rtx_insn *insn) -{ - rtx set; - enum attr_cc cc = get_attr_cc (insn); - - switch (cc) - { - default: - break; - - case CC_PLUS: - case CC_LDI: - { - rtx *op = recog_data.operand; - int len_dummy, icc; - - /* Extract insn's operands. */ - extract_constrain_insn_cached (insn); - - switch (cc) - { - default: - gcc_unreachable(); - - case CC_PLUS: - avr_out_plus (insn, op, &len_dummy, &icc); - cc = (enum attr_cc) icc; - break; - - case CC_LDI: - - cc = (op[1] == CONST0_RTX (GET_MODE (op[0])) - && reg_overlap_mentioned_p (op[0], zero_reg_rtx)) - /* Loading zero-reg with 0 uses CLR and thus clobbers cc0. */ - ? CC_CLOBBER - /* Any other "r,rL" combination does not alter cc0. */ - : CC_NONE; - - break; - } /* inner switch */ - - break; - } - } /* outer swicth */ - - switch (cc) - { - default: - /* Special values like CC_OUT_PLUS from above have been - mapped to "standard" CC_* values so we never come here. */ - - gcc_unreachable(); - break; - - case CC_NONE: - /* Insn does not affect CC at all, but it might set some registers - that are stored in cc_status. If such a register is affected by - the current insn, for example by means of a SET or a CLOBBER, - then we must reset cc_status; cf. PR77326. - - Unfortunately, set_of cannot be used as reg_overlap_mentioned_p - will abort on COMPARE (which might be found in cc_status.value1/2). - Thus work out the registers set by the insn and regs mentioned - in cc_status.value1/2. */ - - if (cc_status.value1 - || cc_status.value2) - { - HARD_REG_SET regs_used; - HARD_REG_SET regs_set; - CLEAR_HARD_REG_SET (regs_used); - - if (cc_status.value1 - && !CONSTANT_P (cc_status.value1)) - { - find_all_hard_regs (cc_status.value1, ®s_used); - } - - if (cc_status.value2 - && !CONSTANT_P (cc_status.value2)) - { - find_all_hard_regs (cc_status.value2, ®s_used); - } - - find_all_hard_reg_sets (insn, ®s_set, false); - - if (hard_reg_set_intersect_p (regs_used, regs_set)) - { - CC_STATUS_INIT; - } - } - - break; // CC_NONE - - case CC_SET_N: - CC_STATUS_INIT; - break; - - case CC_SET_ZN: - set = single_set (insn); - CC_STATUS_INIT; - if (set) - { - cc_status.flags |= CC_NO_OVERFLOW; - cc_status.value1 = SET_DEST (set); - } - break; - - case CC_SET_VZN: - /* Insn like INC, DEC, NEG that set Z,N,V. We currently don't make use - of this combination, cf. also PR61055. */ - CC_STATUS_INIT; - break; - - case CC_SET_CZN: - /* Insn sets the Z,N,C flags of CC to recog_operand[0]. - The V flag may or may not be known but that's ok because - alter_cond will change tests to use EQ/NE. */ - set = single_set (insn); - CC_STATUS_INIT; - if (set) - { - cc_status.value1 = SET_DEST (set); - cc_status.flags |= CC_OVERFLOW_UNUSABLE; - } - break; - - case CC_COMPARE: - set = single_set (insn); - CC_STATUS_INIT; - if (set) - cc_status.value1 = SET_SRC (set); - break; - - case CC_CLOBBER: - /* Insn doesn't leave CC in a usable state. */ - CC_STATUS_INIT; - break; - } -} - /* Choose mode for jump insn: 1 - relative jump in range -63 <= x <= 62 ; 2 - relative jump in range -2046 <= x <= 2045 ; @@ -3167,11 +3036,12 @@ const char* ret_cond_branch (rtx x, int len, int reverse) { RTX_CODE cond = reverse ? reverse_condition (GET_CODE (x)) : GET_CODE (x); + bool cc_overflow_unusable = false; switch (cond) { case GT: - if (cc_prev_status.flags & CC_OVERFLOW_UNUSABLE) + if (cc_overflow_unusable) return (len == 1 ? ("breq .+2" CR_TAB "brpl %0") : len == 2 ? ("breq .+4" CR_TAB @@ -3200,7 +3070,7 @@ ret_cond_branch (rtx x, int len, int reverse) "brlo .+4" CR_TAB "jmp %0")); case LE: - if (cc_prev_status.flags & CC_OVERFLOW_UNUSABLE) + if (cc_overflow_unusable) return (len == 1 ? ("breq %0" CR_TAB "brmi %0") : len == 2 ? ("breq .+2" CR_TAB @@ -5820,6 +5690,8 @@ compare_condition (rtx_insn *insn) if (next && JUMP_P (next)) { rtx pat = PATTERN (next); + if (GET_CODE (pat) == PARALLEL) + pat = XVECEXP (pat, 0, 0); rtx src = SET_SRC (pat); if (IF_THEN_ELSE == GET_CODE (src)) @@ -6179,7 +6051,13 @@ out_shift_with_cnt (const char *templ, rtx_insn *insn, rtx operands[], if (CONST_INT_P (operands[2])) { + /* Operand 3 is a scratch register if this is a + parallel with three elements i.e. a set, + a clobber of a scratch, and clobber of REG_CC. + If a scratch reg is not available, then the parallel + will contain only a set and clobber of REG_CC. */ bool scratch = (GET_CODE (PATTERN (insn)) == PARALLEL + && XVECLEN (PATTERN (insn), 0) == 3 && REG_P (operands[3])); int count = INTVAL (operands[2]); int max_len = 10; /* If larger than this, always use a loop. */ @@ -6376,7 +6254,9 @@ ashlhi3_out (rtx_insn *insn, rtx operands[], int *len) { if (CONST_INT_P (operands[2])) { - int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL); + int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL + && XVECLEN (PATTERN (insn), 0) == 3 + && REG_P (operands[3])); int ldi_ok = test_hard_reg_class (LD_REGS, operands[0]); int k; int *t = len; @@ -6857,7 +6737,9 @@ ashrhi3_out (rtx_insn *insn, rtx operands[], int *len) { if (CONST_INT_P (operands[2])) { - int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL); + int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL + && XVECLEN (PATTERN (insn), 0) == 3 + && REG_P (operands[3])); int ldi_ok = test_hard_reg_class (LD_REGS, operands[0]); int k; int *t = len; @@ -7271,7 +7153,9 @@ lshrhi3_out (rtx_insn *insn, rtx operands[], int *len) { if (CONST_INT_P (operands[2])) { - int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL); + int scratch = (GET_CODE (PATTERN (insn)) == PARALLEL + && XVECLEN (PATTERN (insn), 0) == 3 + && REG_P (operands[3])); int ldi_ok = test_hard_reg_class (LD_REGS, operands[0]); int k; int *t = len; @@ -9619,6 +9503,18 @@ avr_assemble_integer (rtx x, unsigned int size, int aligned_p) return default_assemble_integer (x, size, aligned_p); } +/* Implement TARGET_CLASS_MAX_NREGS. Reasons described in comments for + avr_hard_regno_nregs. */ + +static unsigned char +avr_class_max_nregs (reg_class_t rclass, machine_mode mode) +{ + if (rclass == CC_REG && mode == CCmode) + return 1; + + return CEIL (GET_MODE_SIZE (mode), UNITS_PER_WORD); +} + /* Implement `TARGET_CLASS_LIKELY_SPILLED_P'. */ /* Return value is nonzero if pseudos that have been @@ -11719,7 +11615,8 @@ avr_compare_pattern (rtx_insn *insn) if (pattern && NONJUMP_INSN_P (insn) - && SET_DEST (pattern) == cc0_rtx + && REG_P (SET_DEST (pattern)) + && REGNO (SET_DEST (pattern)) == REG_CC && GET_CODE (SET_SRC (pattern)) == COMPARE) { machine_mode mode0 = GET_MODE (XEXP (SET_SRC (pattern), 0)); @@ -11740,18 +11637,18 @@ avr_compare_pattern (rtx_insn *insn) /* Expansion of switch/case decision trees leads to code like - cc0 = compare (Reg, Num) - if (cc0 == 0) + REG_CC = compare (Reg, Num) + if (REG_CC == 0) goto L1 - cc0 = compare (Reg, Num) - if (cc0 > 0) + REG_CC = compare (Reg, Num) + if (REG_CC > 0) goto L2 The second comparison is superfluous and can be deleted. The second jump condition can be transformed from a - "difficult" one to a "simple" one because "cc0 > 0" and - "cc0 >= 0" will have the same effect here. + "difficult" one to a "simple" one because "REG_CC > 0" and + "REG_CC >= 0" will have the same effect here. This function relies on the way switch/case is being expaned as binary decision tree. For example code see PR 49903. @@ -11822,8 +11719,8 @@ avr_reorg_remove_redundant_compare (rtx_insn *insn1) || LABEL_REF != GET_CODE (XEXP (ifelse1, 1)) || LABEL_REF != GET_CODE (XEXP (ifelse2, 1)) || !COMPARISON_P (XEXP (ifelse2, 0)) - || cc0_rtx != XEXP (XEXP (ifelse1, 0), 0) - || cc0_rtx != XEXP (XEXP (ifelse2, 0), 0) + || REG_CC != REGNO (XEXP (XEXP (ifelse1, 0), 0)) + || REG_CC != REGNO (XEXP (XEXP (ifelse2, 0), 0)) || const0_rtx != XEXP (XEXP (ifelse1, 0), 1) || const0_rtx != XEXP (XEXP (ifelse2, 0), 1)) { @@ -11832,20 +11729,20 @@ avr_reorg_remove_redundant_compare (rtx_insn *insn1) /* We filtered the insn sequence to look like - (set (cc0) + (set (reg:CC cc) (compare (reg:M N) (const_int VAL))) (set (pc) - (if_then_else (eq (cc0) + (if_then_else (eq (reg:CC cc) (const_int 0)) (label_ref L1) (pc))) - (set (cc0) + (set (reg:CC cc) (compare (reg:M N) (const_int VAL))) (set (pc) - (if_then_else (CODE (cc0) + (if_then_else (CODE (reg:CC cc) (const_int 0)) (label_ref L2) (pc))) @@ -11893,7 +11790,7 @@ avr_reorg_remove_redundant_compare (rtx_insn *insn1) JUMP_LABEL (jump) = JUMP_LABEL (branch1); target = XEXP (XEXP (ifelse2, 1), 0); - cond = gen_rtx_fmt_ee (code, VOIDmode, cc0_rtx, const0_rtx); + cond = gen_rtx_fmt_ee (code, VOIDmode, cc_reg_rtx, const0_rtx); jump = emit_jump_insn_after (gen_branch_unspec (target, cond), insn2); JUMP_LABEL (jump) = JUMP_LABEL (branch2); @@ -11936,6 +11833,8 @@ avr_reorg (void) rtx_insn *next = next_real_insn (insn); rtx pat = PATTERN (next); + if (GET_CODE (pat) == PARALLEL) + pat = XVECEXP (pat, 0, 0); pattern = SET_SRC (pattern); @@ -12119,6 +12018,22 @@ jump_over_one_insn_p (rtx_insn *insn, rtx dest) && avr_2word_insn_p (next_active_insn (insn)))); } +/* Implement TARGET_HARD_REGNO_NREGS. CCmode is four units for historical + reasons. If this hook is not defined, TARGET_HARD_REGNO_NREGS + reports that CCmode requires four registers. + Define this hook to allow CCmode to fit in a single REG_CC. For + other modes and regs, return the number of words in mode (i.e whatever + the default implementation of the hook returned). */ + +static unsigned int +avr_hard_regno_nregs (unsigned int regno, machine_mode mode) +{ + if (regno == REG_CC && mode == CCmode) + return 1; + + return CEIL (GET_MODE_SIZE (mode), UNITS_PER_WORD); +} + /* Implement TARGET_HARD_REGNO_MODE_OK. On the enhanced core, anything larger than 1 byte must start in even numbered register for "movw" to @@ -12127,6 +12042,9 @@ jump_over_one_insn_p (rtx_insn *insn, rtx dest) static bool avr_hard_regno_mode_ok (unsigned int regno, machine_mode mode) { + if (regno == REG_CC) + return mode == CCmode; + /* NOTE: 8-bit values must not be disallowed for R28 or R29. Disallowing QI et al. in these regs might lead to code like (set (subreg:QI (reg:HI 28) n) ...) @@ -14575,6 +14493,21 @@ avr_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *arg, return NULL_TREE; } +/* Prepend to CLOBBERS hard registers that are automatically clobbered + for an asm. We do this for CC_REGNUM to maintain source compatibility + with the original cc0-based compiler. */ + +static rtx_insn * +avr_md_asm_adjust (vec &/*outputs*/, vec &/*inputs*/, + vec & /*input_modes*/, + vec &/*constraints*/, + vec &clobbers, HARD_REG_SET &clobbered_regs) +{ + clobbers.safe_push (cc_reg_rtx); + SET_HARD_REG_BIT (clobbered_regs, REG_CC); + return NULL; +} + /* Worker function for `FLOAT_LIB_COMPARE_RETURNS_BOOL'. */ @@ -14669,6 +14602,9 @@ avr_float_lib_compare_returns_bool (machine_mode mode, enum rtx_code) #undef TARGET_CONDITIONAL_REGISTER_USAGE #define TARGET_CONDITIONAL_REGISTER_USAGE avr_conditional_register_usage +#undef TARGET_HARD_REGNO_NREGS +#define TARGET_HARD_REGNO_NREGS avr_hard_regno_nregs + #undef TARGET_HARD_REGNO_MODE_OK #define TARGET_HARD_REGNO_MODE_OK avr_hard_regno_mode_ok #undef TARGET_HARD_REGNO_SCRATCH_OK @@ -14694,6 +14630,9 @@ avr_float_lib_compare_returns_bool (machine_mode mode, enum rtx_code) #undef TARGET_CLASS_LIKELY_SPILLED_P #define TARGET_CLASS_LIKELY_SPILLED_P avr_class_likely_spilled_p +#undef TARGET_CLASS_MAX_NREGS +#define TARGET_CLASS_MAX_NREGS avr_class_max_nregs + #undef TARGET_OPTION_OVERRIDE #define TARGET_OPTION_OVERRIDE avr_option_override @@ -14772,6 +14711,9 @@ avr_float_lib_compare_returns_bool (machine_mode mode, enum rtx_code) #undef TARGET_STARTING_FRAME_OFFSET #define TARGET_STARTING_FRAME_OFFSET avr_starting_frame_offset +#undef TARGET_MD_ASM_ADJUST +#define TARGET_MD_ASM_ADJUST avr_md_asm_adjust + struct gcc_target targetm = TARGET_INITIALIZER; diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 0026a66..30ce2ba 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -155,7 +155,7 @@ FIXME: DRIVER_SELF_SPECS has changed. #define WCHAR_TYPE_SIZE 16 -#define FIRST_PSEUDO_REGISTER 36 +#define FIRST_PSEUDO_REGISTER 37 #define GENERAL_REGNO_P(N) IN_RANGE (N, 2, 31) #define GENERAL_REG_P(X) (REG_P (X) && GENERAL_REGNO_P (REGNO (X))) @@ -178,7 +178,8 @@ FIXME: DRIVER_SELF_SPECS has changed. 0,0,/* r28 r29 */\ 0,0,/* r30 r31 */\ 1,1,/* STACK */\ - 1,1 /* arg pointer */ } + 1,1, /* arg pointer */ \ + 1 /* CC */ } #define CALL_USED_REGISTERS { \ 1,1,/* r0 r1 */ \ @@ -198,7 +199,8 @@ FIXME: DRIVER_SELF_SPECS has changed. 0,0,/* r28 r29 */ \ 1,1,/* r30 r31 */ \ 1,1,/* STACK */ \ - 1,1 /* arg pointer */ } + 1,1, /* arg pointer */ \ + 1 /* CC */ } #define REG_ALLOC_ORDER { \ 24,25, \ @@ -210,7 +212,7 @@ FIXME: DRIVER_SELF_SPECS has changed. 28,29, \ 17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2, \ 0,1, \ - 32,33,34,35 \ + 32,33,34,35,36 \ } #define ADJUST_REG_ALLOC_ORDER avr_adjust_reg_alloc_order() @@ -230,6 +232,7 @@ enum reg_class { LD_REGS, /* r16 - r31 */ NO_LD_REGS, /* r0 - r15 */ GENERAL_REGS, /* r0 - r31 */ + CC_REG, /* CC */ ALL_REGS, LIM_REG_CLASSES }; @@ -250,6 +253,7 @@ enum reg_class { "LD_REGS", /* r16 - r31 */ \ "NO_LD_REGS", /* r0 - r15 */ \ "GENERAL_REGS", /* r0 - r31 */ \ + "CC_REG", /* CC */ \ "ALL_REGS" } #define REG_CLASS_CONTENTS { \ @@ -270,7 +274,8 @@ enum reg_class { 0x00000000}, /* LD_REGS, r16 - r31 */ \ {0x0000ffff,0x00000000}, /* NO_LD_REGS r0 - r15 */ \ {0xffffffff,0x00000000}, /* GENERAL_REGS, r0 - r31 */ \ - {0xffffffff,0x00000003} /* ALL_REGS */ \ + {0x00000000,0x00000010}, /* CC */ \ + {0xffffffff,0x00000013} /* ALL_REGS */ \ } #define REGNO_REG_CLASS(R) avr_regno_reg_class(R) @@ -429,7 +434,7 @@ typedef struct avr_args "r8","r9","r10","r11","r12","r13","r14","r15", \ "r16","r17","r18","r19","r20","r21","r22","r23", \ "r24","r25","r26","r27","r28","r29","r30","r31", \ - "__SP_L__","__SP_H__","argL","argH"} + "__SP_L__","__SP_H__","argL","argH", "cc"} #define FINAL_PRESCAN_INSN(insn, operand, nop) \ avr_final_prescan_insn (insn, operand,nop) @@ -484,23 +489,6 @@ typedef struct avr_args #define TRAMPOLINE_SIZE 4 -/* Store in cc_status the expressions - that the condition codes will describe - after execution of an instruction whose pattern is EXP. - Do not alter them if the instruction would not alter the cc's. */ - -#define NOTICE_UPDATE_CC(EXP, INSN) avr_notice_update_cc (EXP, INSN) - -/* The add insns don't set overflow in a usable way. */ -#define CC_OVERFLOW_UNUSABLE 01000 -/* The mov,and,or,xor insns don't set carry. That's ok though as the - Z bit is all we need when doing unsigned comparisons on the result of - these insns (since they're always with 0). However, conditions.h has - CC_NO_OVERFLOW defined for this purpose. Rename it to something more - understandable. */ -#define CC_NO_CARRY CC_NO_OVERFLOW - - /* Output assembler code to FILE to increment profiler label # LABELNO for profiling a function entry. */ diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md index 478abc1..2206fa1 100644 --- a/gcc/config/avr/avr.md +++ b/gcc/config/avr/avr.md @@ -58,6 +58,7 @@ (REG_Z 30) (REG_W 24) (REG_SP 32) + (REG_CC 36) (LPM_REGNO 0) ; implicit target register of LPM (TMP_REGNO 0) ; temporary register r0 (ZERO_REGNO 1) ; zero register r1 @@ -459,7 +460,8 @@ "reload_completed && frame_pointer_needed && !cfun->calls_alloca - && find_reg_note (insn, REG_ARGS_SIZE, const0_rtx)" + && find_reg_note (insn, REG_ARGS_SIZE, const0_rtx) + && REGNO (operands[0]) != REG_Y" [(set (reg:HI REG_SP) (reg:HI REG_Y))]) @@ -491,19 +493,34 @@ ;; "load_psi_libgcc" ;; "load_si_libgcc" ;; "load_sf_libgcc" -(define_insn "load__libgcc" +(define_insn_and_split "load__libgcc" [(set (reg:MOVMODE 22) (match_operand:MOVMODE 0 "memory_operand" "m,m"))] "avr_load_libgcc_p (operands[0]) && REG_P (XEXP (operands[0], 0)) && REG_Z == REGNO (XEXP (operands[0], 0))" + "#" + "&& reload_completed" + [(parallel [(set (reg:MOVMODE 22) + (match_dup 0)) + (clobber (reg:CC REG_CC))])] + "" + [(set_attr "isa" "rjmp,jmp")]) + +(define_insn "*load__libgcc" + [(set (reg:MOVMODE 22) + (match_operand:MOVMODE 0 "memory_operand" "m,m")) + (clobber (reg:CC REG_CC))] + "avr_load_libgcc_p (operands[0]) + && REG_P (XEXP (operands[0], 0)) + && REG_Z == REGNO (XEXP (operands[0], 0)) + && reload_completed" { operands[0] = GEN_INT (GET_MODE_SIZE (mode)); return "%~call __load_%0"; } [(set_attr "length" "1,2") - (set_attr "isa" "rjmp,jmp") - (set_attr "cc" "clobber")]) + (set_attr "isa" "rjmp,jmp")]) ;; "xload8qi_A" @@ -591,8 +608,7 @@ } [(set_attr "length" "4,4") (set_attr "adjust_len" "*,xload") - (set_attr "isa" "lpmx,lpm") - (set_attr "cc" "none")]) + (set_attr "isa" "lpmx,lpm")]) ;; R21:Z : 24-bit source address ;; R22 : 1-4 byte output @@ -602,21 +618,35 @@ ;; "xload_si_libgcc" "xload_sq_libgcc" "xload_usq_libgcc" "xload_sa_libgcc" "xload_usa_libgcc" ;; "xload_sf_libgcc" ;; "xload_psi_libgcc" -(define_insn "xload__libgcc" + +(define_insn_and_split "xload__libgcc" [(set (reg:MOVMODE 22) (mem:MOVMODE (lo_sum:PSI (reg:QI 21) (reg:HI REG_Z)))) (clobber (reg:QI 21)) (clobber (reg:HI REG_Z))] "avr_xload_libgcc_p (mode)" + "#" + "&& reload_completed" + [(parallel [(set (reg:MOVMODE 22) + (mem:MOVMODE (lo_sum:PSI (reg:QI 21) + (reg:HI REG_Z)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*xload__libgcc" + [(set (reg:MOVMODE 22) + (mem:MOVMODE (lo_sum:PSI (reg:QI 21) + (reg:HI REG_Z)))) + (clobber (reg:CC REG_CC))] + "avr_xload_libgcc_p (mode) + && reload_completed" { rtx x_bytes = GEN_INT (GET_MODE_SIZE (mode)); output_asm_insn ("%~call __xload_%0", &x_bytes); return ""; } - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; General move expanders @@ -696,17 +726,29 @@ ;; "movqi_insn" ;; "movqq_insn" "movuqq_insn" -(define_insn "mov_insn" +(define_insn_and_split "mov_insn" [(set (match_operand:ALL1 0 "nonimmediate_operand" "=r ,d ,Qm ,r ,q,r,*r") (match_operand:ALL1 1 "nox_general_operand" "r Y00,n Ynn,r Y00,Qm,r,q,i"))] "register_operand (operands[0], mode) || reg_or_0_operand (operands[1], mode)" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (match_dup 1)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mov_insn" + [(set (match_operand:ALL1 0 "nonimmediate_operand" "=r ,d ,Qm ,r ,q,r,*r") + (match_operand:ALL1 1 "nox_general_operand" "r Y00,n Ynn,r Y00,Qm,r,q,i")) + (clobber (reg:CC REG_CC))] + "(register_operand (operands[0], mode) + || reg_or_0_operand (operands[1], mode)) + && reload_completed" { return output_movqi (insn, operands, NULL); } [(set_attr "length" "1,1,5,5,1,1,4") - (set_attr "adjust_len" "mov8") - (set_attr "cc" "ldi,none,clobber,clobber,none,none,clobber")]) + (set_attr "adjust_len" "mov8")]) ;; This is used in peephole2 to optimize loading immediate constants ;; if a scratch register from LD_REGS happens to be available. @@ -720,8 +762,7 @@ "reload_completed" "ldi %2,lo8(%1) mov %0,%2" - [(set_attr "length" "2") - (set_attr "cc" "none")]) + [(set_attr "length" "2")]) (define_peephole2 [(match_scratch:QI 2 "d") @@ -759,8 +800,7 @@ out %A0,%A1 out %A0,%A1\;out %B0,%B1" [(set_attr "length" "2,4,5,1,2") - (set_attr "isa" "no_xmega,no_xmega,no_xmega,*,xmega") - (set_attr "cc" "none")]) + (set_attr "isa" "no_xmega,no_xmega,no_xmega,*,xmega")]) (define_peephole2 [(match_scratch:QI 2 "d") @@ -778,29 +818,41 @@ (define_insn "*reload_in" [(set (match_operand:ALL2 0 "l_register_operand" "=l") (match_operand:ALL2 1 "immediate_operand" "i")) - (clobber (match_operand:QI 2 "register_operand" "=&d"))] + (clobber (match_operand:QI 2 "register_operand" "=&d")) + (clobber (reg:CC REG_CC))] "reload_completed" { return output_reload_inhi (operands, operands[2], NULL); } [(set_attr "length" "4") - (set_attr "adjust_len" "reload_in16") - (set_attr "cc" "clobber")]) + (set_attr "adjust_len" "reload_in16")]) ;; "*movhi" ;; "*movhq" "*movuhq" ;; "*movha" "*movuha" -(define_insn "*mov" +(define_insn_and_split "*mov_split" [(set (match_operand:ALL2 0 "nonimmediate_operand" "=r,r ,r,m ,d,*r,q,r") (match_operand:ALL2 1 "nox_general_operand" "r,Y00,m,r Y00,i,i ,r,q"))] "register_operand (operands[0], mode) || reg_or_0_operand (operands[1], mode)" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (match_dup 1)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mov" + [(set (match_operand:ALL2 0 "nonimmediate_operand" "=r,r ,r,m ,d,*r,q,r") + (match_operand:ALL2 1 "nox_general_operand" "r,Y00,m,r Y00,i,i ,r,q")) + (clobber (reg:CC REG_CC))] + "(register_operand (operands[0], mode) + || reg_or_0_operand (operands[1], mode)) + && reload_completed" { return output_movhi (insn, operands, NULL); } [(set_attr "length" "2,2,6,7,2,6,5,2") - (set_attr "adjust_len" "mov16") - (set_attr "cc" "none,none,clobber,clobber,none,clobber,none,none")]) + (set_attr "adjust_len" "mov16")]) (define_peephole2 ; movw [(set (match_operand:ALL1 0 "even_register_operand" "") @@ -844,7 +896,10 @@ [(set (match_operand:HISI 0 "register_operand" "") (match_operand:HISI 1 "memory_operand" ""))] "reload_completed - && AVR_HAVE_LPMX" + && AVR_HAVE_LPMX + && avr_mem_flash_p (operands[1]) + && REG_P (XEXP (operands[1], 0)) + && !reg_overlap_mentioned_p (XEXP (operands[1], 0), operands[0])" [(set (match_dup 0) (match_dup 2)) (set (match_dup 3) @@ -853,13 +908,6 @@ { rtx addr = XEXP (operands[1], 0); - if (!avr_mem_flash_p (operands[1]) - || !REG_P (addr) - || reg_overlap_mentioned_p (addr, operands[0])) - { - FAIL; - } - operands[2] = replace_equiv_address (operands[1], gen_rtx_POST_INC (Pmode, addr)); operands[3] = addr; @@ -878,33 +926,47 @@ && operands[1] != constm1_rtx" [(parallel [(set (match_dup 0) (match_dup 1)) - (clobber (match_dup 2))])]) + (clobber (match_dup 2)) + (clobber (reg:CC REG_CC))])]) ;; '*' because it is not used in rtl generation. (define_insn "*reload_inpsi" [(set (match_operand:PSI 0 "register_operand" "=r") (match_operand:PSI 1 "immediate_operand" "i")) - (clobber (match_operand:QI 2 "register_operand" "=&d"))] + (clobber (match_operand:QI 2 "register_operand" "=&d")) + (clobber (reg:CC REG_CC))] "reload_completed" { return avr_out_reload_inpsi (operands, operands[2], NULL); } [(set_attr "length" "6") - (set_attr "adjust_len" "reload_in24") - (set_attr "cc" "clobber")]) + (set_attr "adjust_len" "reload_in24")]) -(define_insn "*movpsi" +(define_insn_and_split "*movpsi_split" [(set (match_operand:PSI 0 "nonimmediate_operand" "=r,r,r ,Qm,!d,r") (match_operand:PSI 1 "nox_general_operand" "r,L,Qm,rL,i ,i"))] "register_operand (operands[0], PSImode) || register_operand (operands[1], PSImode) || const0_rtx == operands[1]" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (match_dup 1)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*movpsi" + [(set (match_operand:PSI 0 "nonimmediate_operand" "=r,r,r ,Qm,!d,r") + (match_operand:PSI 1 "nox_general_operand" "r,L,Qm,rL,i ,i")) + (clobber (reg:CC REG_CC))] + "(register_operand (operands[0], PSImode) + || register_operand (operands[1], PSImode) + || const0_rtx == operands[1]) + && reload_completed" { return avr_out_movpsi (insn, operands, NULL); } [(set_attr "length" "3,3,8,9,4,10") - (set_attr "adjust_len" "mov24") - (set_attr "cc" "none,none,clobber,clobber,none,clobber")]) + (set_attr "adjust_len" "mov24")]) ;;========================================================================== ;; move double word (32 bit) @@ -917,7 +979,8 @@ "operands[1] != CONST0_RTX (mode)" [(parallel [(set (match_dup 0) (match_dup 1)) - (clobber (match_dup 2))])]) + (clobber (match_dup 2)) + (clobber (reg:CC REG_CC))])]) ;; '*' because it is not used in rtl generation. ;; "*reload_insi" @@ -926,45 +989,69 @@ (define_insn "*reload_insi" [(set (match_operand:ALL4 0 "register_operand" "=r") (match_operand:ALL4 1 "immediate_operand" "n Ynn")) - (clobber (match_operand:QI 2 "register_operand" "=&d"))] + (clobber (match_operand:QI 2 "register_operand" "=&d")) + (clobber (reg:CC REG_CC))] "reload_completed" { return output_reload_insisf (operands, operands[2], NULL); } [(set_attr "length" "8") - (set_attr "adjust_len" "reload_in32") - (set_attr "cc" "clobber")]) + (set_attr "adjust_len" "reload_in32")]) ;; "*movsi" ;; "*movsq" "*movusq" ;; "*movsa" "*movusa" -(define_insn "*mov" +(define_insn_and_split "*mov_split" [(set (match_operand:ALL4 0 "nonimmediate_operand" "=r,r ,r ,Qm ,!d,r") (match_operand:ALL4 1 "nox_general_operand" "r,Y00,Qm,r Y00,i ,i"))] "register_operand (operands[0], mode) || reg_or_0_operand (operands[1], mode)" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (match_dup 1)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mov" + [(set (match_operand:ALL4 0 "nonimmediate_operand" "=r,r ,r ,Qm ,!d,r") + (match_operand:ALL4 1 "nox_general_operand" "r,Y00,Qm,r Y00,i ,i")) + (clobber (reg:CC REG_CC))] + "(register_operand (operands[0], mode) + || reg_or_0_operand (operands[1], mode)) + && reload_completed" { return output_movsisf (insn, operands, NULL); } [(set_attr "length" "4,4,8,9,4,10") - (set_attr "adjust_len" "mov32") - (set_attr "cc" "none,none,clobber,clobber,none,clobber")]) + (set_attr "adjust_len" "mov32")]) ;; fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ;; move floating point numbers (32 bit) -(define_insn "*movsf" +(define_insn_and_split "*movsf_split" [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r ,Qm,!d,r") (match_operand:SF 1 "nox_general_operand" "r,G,Qm,rG,F ,F"))] "register_operand (operands[0], SFmode) || reg_or_0_operand (operands[1], SFmode)" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (match_dup 1)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*movsf" + [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r ,Qm,!d,r") + (match_operand:SF 1 "nox_general_operand" "r,G,Qm,rG,F ,F")) + (clobber (reg:CC REG_CC))] + "(register_operand (operands[0], SFmode) + || reg_or_0_operand (operands[1], SFmode)) + && reload_completed" { return output_movsisf (insn, operands, NULL); } [(set_attr "length" "4,4,8,9,4,10") - (set_attr "adjust_len" "mov32") - (set_attr "cc" "none,none,clobber,clobber,none,clobber")]) + (set_attr "adjust_len" "mov32")]) (define_peephole2 ; *reload_insf [(match_scratch:QI 2 "d") @@ -974,20 +1061,21 @@ "operands[1] != CONST0_RTX (SFmode)" [(parallel [(set (match_dup 0) (match_dup 1)) - (clobber (match_dup 2))])]) + (clobber (match_dup 2)) + (clobber (reg:CC REG_CC))])]) ;; '*' because it is not used in rtl generation. (define_insn "*reload_insf" [(set (match_operand:SF 0 "register_operand" "=r") (match_operand:SF 1 "const_double_operand" "F")) - (clobber (match_operand:QI 2 "register_operand" "=&d"))] + (clobber (match_operand:QI 2 "register_operand" "=&d")) + (clobber (reg:CC REG_CC))] "reload_completed" { return output_reload_insisf (operands, operands[2], NULL); } [(set_attr "length" "8") - (set_attr "adjust_len" "reload_in32") - (set_attr "cc" "clobber")]) + (set_attr "adjust_len" "reload_in32")]) ;;========================================================================= ;; move string (like memcpy) @@ -1015,7 +1103,7 @@ ;; "cpymem_qi" ;; "cpymem_hi" -(define_insn "cpymem_" +(define_insn_and_split "cpymem_" [(set (mem:BLK (reg:HI REG_X)) (mem:BLK (reg:HI REG_Z))) (unspec [(match_operand:QI 0 "const_int_operand" "n")] @@ -1026,11 +1114,35 @@ (clobber (reg:QI LPM_REGNO)) (clobber (match_operand:QIHI 2 "register_operand" "=1"))] "" + "#" + "&& reload_completed" + [(parallel [(set (mem:BLK (reg:HI REG_X)) + (mem:BLK (reg:HI REG_Z))) + (unspec [(match_dup 0)] + UNSPEC_CPYMEM) + (use (match_dup 1)) + (clobber (reg:HI REG_X)) + (clobber (reg:HI REG_Z)) + (clobber (reg:QI LPM_REGNO)) + (clobber (match_dup 2)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*cpymem_" + [(set (mem:BLK (reg:HI REG_X)) + (mem:BLK (reg:HI REG_Z))) + (unspec [(match_operand:QI 0 "const_int_operand" "n")] + UNSPEC_CPYMEM) + (use (match_operand:QIHI 1 "register_operand" "")) + (clobber (reg:HI REG_X)) + (clobber (reg:HI REG_Z)) + (clobber (reg:QI LPM_REGNO)) + (clobber (match_operand:QIHI 2 "register_operand" "=1")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_cpymem (insn, operands, NULL); } - [(set_attr "adjust_len" "cpymem") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "cpymem")]) ;; $0 : Address Space @@ -1041,7 +1153,8 @@ ;; "cpymemx_qi" ;; "cpymemx_hi" -(define_insn "cpymemx_" + +(define_insn_and_split "cpymemx_" [(set (mem:BLK (reg:HI REG_X)) (mem:BLK (lo_sum:PSI (reg:QI 23) (reg:HI REG_Z)))) @@ -1055,9 +1168,39 @@ (clobber (reg:QI 23)) (clobber (mem:QI (match_operand:QI 1 "io_address_operand" "n")))] "" + "#" + "&& reload_completed" + [(parallel [(set (mem:BLK (reg:HI REG_X)) + (mem:BLK (lo_sum:PSI (reg:QI 23) + (reg:HI REG_Z)))) + (unspec [(match_dup 0)] + UNSPEC_CPYMEM) + (use (reg:QIHI 24)) + (clobber (reg:HI REG_X)) + (clobber (reg:HI REG_Z)) + (clobber (reg:QI LPM_REGNO)) + (clobber (reg:HI 24)) + (clobber (reg:QI 23)) + (clobber (mem:QI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*cpymemx_" + [(set (mem:BLK (reg:HI REG_X)) + (mem:BLK (lo_sum:PSI (reg:QI 23) + (reg:HI REG_Z)))) + (unspec [(match_operand:QI 0 "const_int_operand" "n")] + UNSPEC_CPYMEM) + (use (reg:QIHI 24)) + (clobber (reg:HI REG_X)) + (clobber (reg:HI REG_Z)) + (clobber (reg:QI LPM_REGNO)) + (clobber (reg:HI 24)) + (clobber (reg:QI 23)) + (clobber (mem:QI (match_operand:QI 1 "io_address_operand" "n"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __movmemx_" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 =%2 @@ -1091,7 +1234,7 @@ }) -(define_insn "*clrmemqi" +(define_insn_and_split "*clrmemqi_split" [(set (mem:BLK (match_operand:HI 0 "register_operand" "e")) (const_int 0)) (use (match_operand:QI 1 "register_operand" "r")) @@ -1099,12 +1242,30 @@ (clobber (match_scratch:HI 3 "=0")) (clobber (match_scratch:QI 4 "=&1"))] "" + "#" + "&& reload_completed" + [(parallel [(set (mem:BLK (match_dup 0)) + (const_int 0)) + (use (match_dup 1)) + (use (match_dup 2)) + (clobber (match_dup 3)) + (clobber (match_dup 4)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*clrmemqi" + [(set (mem:BLK (match_operand:HI 0 "register_operand" "e")) + (const_int 0)) + (use (match_operand:QI 1 "register_operand" "r")) + (use (match_operand:QI 2 "const_int_operand" "n")) + (clobber (match_scratch:HI 3 "=0")) + (clobber (match_scratch:QI 4 "=&1")) + (clobber (reg:CC REG_CC))] + "reload_completed" "0:\;st %a0+,__zero_reg__\;dec %1\;brne 0b" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) -(define_insn "*clrmemhi" +(define_insn_and_split "*clrmemhi_split" [(set (mem:BLK (match_operand:HI 0 "register_operand" "e,e")) (const_int 0)) (use (match_operand:HI 1 "register_operand" "!w,d")) @@ -1112,11 +1273,30 @@ (clobber (match_scratch:HI 3 "=0,0")) (clobber (match_scratch:HI 4 "=&1,&1"))] "" + "#" + "&& reload_completed" + [(parallel [(set (mem:BLK (match_dup 0)) + (const_int 0)) + (use (match_dup 1)) + (use (match_dup 2)) + (clobber (match_dup 3)) + (clobber (match_dup 4)) + (clobber (reg:CC REG_CC))])]) + + +(define_insn "*clrmemhi" + [(set (mem:BLK (match_operand:HI 0 "register_operand" "e,e")) + (const_int 0)) + (use (match_operand:HI 1 "register_operand" "!w,d")) + (use (match_operand:HI 2 "const_int_operand" "n,n")) + (clobber (match_scratch:HI 3 "=0,0")) + (clobber (match_scratch:HI 4 "=&1,&1")) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ 0:\;st %a0+,__zero_reg__\;sbiw %A1,1\;brne 0b 0:\;st %a0+,__zero_reg__\;subi %A1,1\;sbci %B1,0\;brne 0b" - [(set_attr "length" "3,4") - (set_attr "cc" "clobber,clobber")]) + [(set_attr "length" "3,4")]) (define_expand "strlenhi" [(set (match_dup 4) @@ -1142,27 +1322,57 @@ operands[4] = gen_reg_rtx (HImode); }) -(define_insn "*strlenhi" +(define_insn_and_split "*strlenhi_split" [(set (match_operand:HI 0 "register_operand" "=e") (unspec:HI [(mem:BLK (match_operand:HI 1 "register_operand" "0")) (const_int 0) (match_operand:HI 2 "immediate_operand" "i")] UNSPEC_STRLEN))] "" + "#" + "&& reload_completed" + [(parallel + [(set (match_dup 0) + (unspec:HI [(mem:BLK (match_dup 1)) + (const_int 0) + (match_dup 2)] + UNSPEC_STRLEN)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*strlenhi" + [(set (match_operand:HI 0 "register_operand" "=e") + (unspec:HI [(mem:BLK (match_operand:HI 1 "register_operand" "0")) + (const_int 0) + (match_operand:HI 2 "immediate_operand" "i")] + UNSPEC_STRLEN)) + (clobber (reg:CC REG_CC))] + "reload_completed" "0:\;ld __tmp_reg__,%a0+\;tst __tmp_reg__\;brne 0b" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; add bytes ;; "addqi3" ;; "addqq3" "adduqq3" -(define_insn "add3" +(define_insn_and_split "add3" [(set (match_operand:ALL1 0 "register_operand" "=r,d ,r ,r ,r ,r") (plus:ALL1 (match_operand:ALL1 1 "register_operand" "%0,0 ,0 ,0 ,0 ,0") (match_operand:ALL1 2 "nonmemory_operand" "r,n Ynn,Y01,Ym1,Y02,Ym2")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:ALL1 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*add3" + [(set (match_operand:ALL1 0 "register_operand" "=r,d ,r ,r ,r ,r") + (plus:ALL1 (match_operand:ALL1 1 "register_operand" "%0,0 ,0 ,0 ,0 ,0") + (match_operand:ALL1 2 "nonmemory_operand" "r,n Ynn,Y01,Ym1,Y02,Ym2"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ add %0,%2 subi %0,lo8(-(%2)) @@ -1170,8 +1380,7 @@ dec %0 inc %0\;inc %0 dec %0\;dec %0" - [(set_attr "length" "1,1,1,1,2,2") - (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")]) + [(set_attr "length" "1,1,1,1,2,2")]) ;; "addhi3" ;; "addhq3" "adduhq3" @@ -1205,67 +1414,144 @@ }) -(define_insn "*addhi3_zero_extend" +(define_insn_and_split "*addhi3_zero_extend_split" [(set (match_operand:HI 0 "register_operand" "=r,*?r") (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r ,0")) (match_operand:HI 2 "register_operand" "0 ,r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:HI (zero_extend:HI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addhi3_zero_extend" + [(set (match_operand:HI 0 "register_operand" "=r,*?r") + (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r ,0")) + (match_operand:HI 2 "register_operand" "0 ,r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ add %A0,%1\;adc %B0,__zero_reg__ add %A0,%A2\;mov %B0,%B2\;adc %B0,__zero_reg__" - [(set_attr "length" "2,3") - (set_attr "cc" "set_n")]) + [(set_attr "length" "2,3")]) -(define_insn "*addhi3_zero_extend1" +(define_insn_and_split "*addhi3_zero_extend1_split" [(set (match_operand:HI 0 "register_operand" "=r") (plus:HI (match_operand:HI 1 "register_operand" "0") (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:HI (match_dup 1) + (zero_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addhi3_zero_extend1" + [(set (match_operand:HI 0 "register_operand" "=r") + (plus:HI (match_operand:HI 1 "register_operand" "0") + (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "add %A0,%2\;adc %B0,__zero_reg__" - [(set_attr "length" "2") - (set_attr "cc" "set_n")]) + [(set_attr "length" "2")]) -(define_insn "*addhi3.sign_extend1" +(define_insn_and_split "*addhi3.sign_extend1_split" [(set (match_operand:HI 0 "register_operand" "=r") (plus:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "r")) (match_operand:HI 2 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel + [(set (match_dup 0) + (plus:HI + (sign_extend:HI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + + +(define_insn "*addhi3.sign_extend1" + [(set (match_operand:HI 0 "register_operand" "=r") + (plus:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "r")) + (match_operand:HI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return reg_overlap_mentioned_p (operands[0], operands[1]) ? "mov __tmp_reg__,%1\;add %A0,%1\;adc %B0,__zero_reg__\;sbrc __tmp_reg__,7\;dec %B0" : "add %A0,%1\;adc %B0,__zero_reg__\;sbrc %1,7\;dec %B0"; } - [(set_attr "length" "5") - (set_attr "cc" "clobber")]) + [(set_attr "length" "5")]) -(define_insn "*addhi3_zero_extend.const" +(define_insn_and_split "*addhi3_zero_extend.const_split" [(set (match_operand:HI 0 "register_operand" "=d") (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0")) (match_operand:HI 2 "const_m255_to_m1_operand" "Cn8")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:HI (zero_extend:HI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addhi3_zero_extend.const" + [(set (match_operand:HI 0 "register_operand" "=d") + (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0")) + (match_operand:HI 2 "const_m255_to_m1_operand" "Cn8"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "subi %A0,%n2\;sbc %B0,%B0" - [(set_attr "length" "2") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "2")]) -(define_insn "*usum_widenqihi3" +(define_insn_and_split "*usum_widenqihi3_split" [(set (match_operand:HI 0 "register_operand" "=r") (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0")) (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:HI + (zero_extend:HI (match_dup 1)) + (zero_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + + +(define_insn "*usum_widenqihi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (plus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0")) + (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "add %A0,%2\;clr %B0\;rol %B0" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) -(define_insn "*udiff_widenqihi3" +(define_insn_and_split "*udiff_widenqihi3_split" [(set (match_operand:HI 0 "register_operand" "=r") (minus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0")) (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:HI (zero_extend:HI (match_dup 1)) + (zero_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*udiff_widenqihi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (minus:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "0")) + (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sub %A0,%2\;sbc %B0,%B0" - [(set_attr "length" "2") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "2")]) -(define_insn "*addhi3_sp" +(define_insn_and_split "*addhi3_sp" [(set (match_operand:HI 1 "stack_register_operand" "=q") (plus:HI (match_operand:HI 2 "stack_register_operand" "q") (match_operand:HI 0 "avr_sp_immediate_operand" "Csp")))] @@ -1273,23 +1559,44 @@ { return avr_out_addto_sp (operands, NULL); } + "" + [(const_int 0)] + { + /* Do not attempt to split this pattern. This FAIL is necessary + to prevent the splitter from matching *add3_split, splitting + it, and then failing later because constraints don't match, as split + does not look at constraints. */ + FAIL; + } [(set_attr "length" "6") (set_attr "adjust_len" "addto_sp")]) ;; "*addhi3" ;; "*addhq3" "*adduhq3" ;; "*addha3" "*adduha3" -(define_insn "*add3" +(define_insn_and_split "*add3_split" [(set (match_operand:ALL2 0 "register_operand" "=??r,d,!w ,d") (plus:ALL2 (match_operand:ALL2 1 "register_operand" "%0,0,0 ,0") (match_operand:ALL2 2 "nonmemory_or_const_operand" "r,s,IJ YIJ,n Ynn")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:ALL2 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*add3" + [(set (match_operand:ALL2 0 "register_operand" "=??r,d,!w ,d") + (plus:ALL2 (match_operand:ALL2 1 "register_operand" "%0,0,0 ,0") + (match_operand:ALL2 2 "nonmemory_or_const_operand" "r,s,IJ YIJ,n Ynn"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_plus (insn, operands); } [(set_attr "length" "2") - (set_attr "adjust_len" "plus") - (set_attr "cc" "plus")]) + (set_attr "adjust_len" "plus")]) ;; Adding a constant to NO_LD_REGS might have lead to a reload of ;; that constant to LD_REGS. We don't add a scratch to *addhi3 @@ -1329,140 +1636,303 @@ ;; "addhi3_clobber" ;; "addhq3_clobber" "adduhq3_clobber" ;; "addha3_clobber" "adduha3_clobber" -(define_insn "add3_clobber" +(define_insn_and_split "add3_clobber" [(set (match_operand:ALL2 0 "register_operand" "=!w ,d ,r") (plus:ALL2 (match_operand:ALL2 1 "register_operand" "%0 ,0 ,0") (match_operand:ALL2 2 "const_operand" "IJ YIJ,n Ynn,n Ynn"))) (clobber (match_scratch:QI 3 "=X ,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:ALL2 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*add3_clobber" + [(set (match_operand:ALL2 0 "register_operand" "=!w ,d ,r") + (plus:ALL2 (match_operand:ALL2 1 "register_operand" "%0 ,0 ,0") + (match_operand:ALL2 2 "const_operand" "IJ YIJ,n Ynn,n Ynn"))) + (clobber (match_scratch:QI 3 "=X ,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_plus (insn, operands); } [(set_attr "length" "4") - (set_attr "adjust_len" "plus") - (set_attr "cc" "plus")]) + (set_attr "adjust_len" "plus")]) ;; "addsi3" ;; "addsq3" "addusq3" ;; "addsa3" "addusa3" -(define_insn "add3" +(define_insn_and_split "add3" [(set (match_operand:ALL4 0 "register_operand" "=??r,d ,r") (plus:ALL4 (match_operand:ALL4 1 "register_operand" "%0,0 ,0") (match_operand:ALL4 2 "nonmemory_operand" "r,i ,n Ynn"))) (clobber (match_scratch:QI 3 "=X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:ALL4 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*add3" + [(set (match_operand:ALL4 0 "register_operand" "=??r,d ,r") + (plus:ALL4 (match_operand:ALL4 1 "register_operand" "%0,0 ,0") + (match_operand:ALL4 2 "nonmemory_operand" "r,i ,n Ynn"))) + (clobber (match_scratch:QI 3 "=X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_plus (insn, operands); } [(set_attr "length" "4") - (set_attr "adjust_len" "plus") - (set_attr "cc" "plus")]) + (set_attr "adjust_len" "plus")]) -(define_insn "*addpsi3_zero_extend.qi" +(define_insn_and_split "*addpsi3_zero_extend.qi_split" [(set (match_operand:PSI 0 "register_operand" "=r") (plus:PSI (zero_extend:PSI (match_operand:QI 1 "register_operand" "r")) (match_operand:PSI 2 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:PSI (zero_extend:PSI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addpsi3_zero_extend.qi" + [(set (match_operand:PSI 0 "register_operand" "=r") + (plus:PSI (zero_extend:PSI (match_operand:QI 1 "register_operand" "r")) + (match_operand:PSI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "add %A0,%A1\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "set_n")]) + [(set_attr "length" "3")]) -(define_insn "*addpsi3_zero_extend.hi" +(define_insn_and_split "*addpsi3_zero_extend.hi_split" [(set (match_operand:PSI 0 "register_operand" "=r") (plus:PSI (zero_extend:PSI (match_operand:HI 1 "register_operand" "r")) (match_operand:PSI 2 "register_operand" "0")))] "" - "add %A0,%A1\;adc %B0,%B1\;adc %C0,__zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "set_n")]) + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:PSI (zero_extend:PSI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) -(define_insn "*addpsi3_sign_extend.hi" +(define_insn "*addpsi3_zero_extend.hi" + [(set (match_operand:PSI 0 "register_operand" "=r") + (plus:PSI (zero_extend:PSI (match_operand:HI 1 "register_operand" "r")) + (match_operand:PSI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" + "add %A0,%A1\;adc %B0,%B1\;adc %C0,__zero_reg__" + [(set_attr "length" "3")]) + +(define_insn_and_split "*addpsi3_sign_extend.hi_split" [(set (match_operand:PSI 0 "register_operand" "=r") (plus:PSI (sign_extend:PSI (match_operand:HI 1 "register_operand" "r")) (match_operand:PSI 2 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:PSI (sign_extend:PSI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addpsi3_sign_extend.hi" + [(set (match_operand:PSI 0 "register_operand" "=r") + (plus:PSI (sign_extend:PSI (match_operand:HI 1 "register_operand" "r")) + (match_operand:PSI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "add %A0,%1\;adc %B0,%B1\;adc %C0,__zero_reg__\;sbrc %B1,7\;dec %C0" - [(set_attr "length" "5") - (set_attr "cc" "set_n")]) + [(set_attr "length" "5")]) -(define_insn "*addsi3_zero_extend" +(define_insn_and_split "*addsi3_zero_extend_split" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (zero_extend:SI (match_operand:QI 1 "register_operand" "r")) (match_operand:SI 2 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:SI (zero_extend:SI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addsi3_zero_extend" + [(set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (zero_extend:SI (match_operand:QI 1 "register_operand" "r")) + (match_operand:SI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "add %A0,%1\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "set_n")]) + [(set_attr "length" "4")]) -(define_insn "*addsi3_zero_extend.hi" +(define_insn_and_split "*addsi3_zero_extend.hi_split" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "r")) (match_operand:SI 2 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:SI (zero_extend:SI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addsi3_zero_extend.hi" + [(set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "r")) + (match_operand:SI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "add %A0,%1\;adc %B0,%B1\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "set_n")]) + [(set_attr "length" "4")]) -(define_insn "addpsi3" +(define_insn_and_split "addpsi3" [(set (match_operand:PSI 0 "register_operand" "=??r,d ,d,r") (plus:PSI (match_operand:PSI 1 "register_operand" "%0,0 ,0,0") (match_operand:PSI 2 "nonmemory_operand" "r,s ,n,n"))) (clobber (match_scratch:QI 3 "=X,X ,X,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:PSI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3 )) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addpsi3" + [(set (match_operand:PSI 0 "register_operand" "=??r,d ,d,r") + (plus:PSI (match_operand:PSI 1 "register_operand" "%0,0 ,0,0") + (match_operand:PSI 2 "nonmemory_operand" "r,s ,n,n"))) + (clobber (match_scratch:QI 3 "=X,X ,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_plus (insn, operands); } [(set_attr "length" "3") - (set_attr "adjust_len" "plus") - (set_attr "cc" "plus")]) + (set_attr "adjust_len" "plus")]) -(define_insn "subpsi3" +(define_insn_and_split "subpsi3" [(set (match_operand:PSI 0 "register_operand" "=r") (minus:PSI (match_operand:PSI 1 "register_operand" "0") (match_operand:PSI 2 "register_operand" "r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:PSI (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*subpsi3" + [(set (match_operand:PSI 0 "register_operand" "=r") + (minus:PSI (match_operand:PSI 1 "register_operand" "0") + (match_operand:PSI 2 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sub %0,%2\;sbc %B0,%B2\;sbc %C0,%C2" - [(set_attr "length" "3") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "3")]) -(define_insn "*subpsi3_zero_extend.qi" +(define_insn_and_split "*subpsi3_zero_extend.qi_split" [(set (match_operand:PSI 0 "register_operand" "=r") (minus:PSI (match_operand:SI 1 "register_operand" "0") (zero_extend:PSI (match_operand:QI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:PSI (match_dup 1) + (zero_extend:PSI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*subpsi3_zero_extend.qi" + [(set (match_operand:PSI 0 "register_operand" "=r") + (minus:PSI (match_operand:SI 1 "register_operand" "0") + (zero_extend:PSI (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sub %A0,%2\;sbc %B0,__zero_reg__\;sbc %C0,__zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "3")]) -(define_insn "*subpsi3_zero_extend.hi" +(define_insn_and_split "*subpsi3_zero_extend.hi_split" [(set (match_operand:PSI 0 "register_operand" "=r") (minus:PSI (match_operand:PSI 1 "register_operand" "0") (zero_extend:PSI (match_operand:HI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:PSI (match_dup 1) + (zero_extend:PSI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*subpsi3_zero_extend.hi" + [(set (match_operand:PSI 0 "register_operand" "=r") + (minus:PSI (match_operand:PSI 1 "register_operand" "0") + (zero_extend:PSI (match_operand:HI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sub %A0,%2\;sbc %B0,%B2\;sbc %C0,__zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "3")]) -(define_insn "*subpsi3_sign_extend.hi" +(define_insn_and_split "*subpsi3_sign_extend.hi_split" [(set (match_operand:PSI 0 "register_operand" "=r") (minus:PSI (match_operand:PSI 1 "register_operand" "0") (sign_extend:PSI (match_operand:HI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:PSI (match_dup 1) + (sign_extend:PSI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*subpsi3_sign_extend.hi" + [(set (match_operand:PSI 0 "register_operand" "=r") + (minus:PSI (match_operand:PSI 1 "register_operand" "0") + (sign_extend:PSI (match_operand:HI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sub %A0,%A2\;sbc %B0,%B2\;sbc %C0,__zero_reg__\;sbrc %B2,7\;inc %C0" - [(set_attr "length" "5") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "5")]) ;----------------------------------------------------------------------------- ; sub bytes ;; "subqi3" ;; "subqq3" "subuqq3" -(define_insn "sub3" +(define_insn_and_split "sub3" [(set (match_operand:ALL1 0 "register_operand" "=??r,d ,r ,r ,r ,r") (minus:ALL1 (match_operand:ALL1 1 "register_operand" "0,0 ,0 ,0 ,0 ,0") (match_operand:ALL1 2 "nonmemory_or_const_operand" "r,n Ynn,Y01,Ym1,Y02,Ym2")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:ALL1 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sub3" + [(set (match_operand:ALL1 0 "register_operand" "=??r,d ,r ,r ,r ,r") + (minus:ALL1 (match_operand:ALL1 1 "register_operand" "0,0 ,0 ,0 ,0 ,0") + (match_operand:ALL1 2 "nonmemory_or_const_operand" "r,n Ynn,Y01,Ym1,Y02,Ym2"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ sub %0,%2 subi %0,lo8(%2) @@ -1470,78 +1940,155 @@ inc %0 dec %0\;dec %0 inc %0\;inc %0" - [(set_attr "length" "1,1,1,1,2,2") - (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")]) + [(set_attr "length" "1,1,1,1,2,2")]) ;; "subhi3" ;; "subhq3" "subuhq3" ;; "subha3" "subuha3" -(define_insn "sub3" +(define_insn_and_split "sub3" [(set (match_operand:ALL2 0 "register_operand" "=??r,d ,*r") (minus:ALL2 (match_operand:ALL2 1 "register_operand" "0,0 ,0") (match_operand:ALL2 2 "nonmemory_or_const_operand" "r,i Ynn,Ynn"))) (clobber (match_scratch:QI 3 "=X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:ALL2 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sub3" + [(set (match_operand:ALL2 0 "register_operand" "=??r,d ,*r") + (minus:ALL2 (match_operand:ALL2 1 "register_operand" "0,0 ,0") + (match_operand:ALL2 2 "nonmemory_or_const_operand" "r,i Ynn,Ynn"))) + (clobber (match_scratch:QI 3 "=X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_plus (insn, operands); } - [(set_attr "adjust_len" "plus") - (set_attr "cc" "plus")]) + [(set_attr "adjust_len" "plus")]) -(define_insn "*subhi3_zero_extend1" +(define_insn_and_split "*subhi3_zero_extend1_split" [(set (match_operand:HI 0 "register_operand" "=r") (minus:HI (match_operand:HI 1 "register_operand" "0") (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:HI (match_dup 1) + (zero_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*subhi3_zero_extend1" + [(set (match_operand:HI 0 "register_operand" "=r") + (minus:HI (match_operand:HI 1 "register_operand" "0") + (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sub %A0,%2\;sbc %B0,__zero_reg__" - [(set_attr "length" "2") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "2")]) -(define_insn "*subhi3.sign_extend2" +(define_insn_and_split "*subhi3.sign_extend2_split" [(set (match_operand:HI 0 "register_operand" "=r") (minus:HI (match_operand:HI 1 "register_operand" "0") (sign_extend:HI (match_operand:QI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:HI (match_dup 1) + (sign_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + + +(define_insn "*subhi3.sign_extend2" + [(set (match_operand:HI 0 "register_operand" "=r") + (minus:HI (match_operand:HI 1 "register_operand" "0") + (sign_extend:HI (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return reg_overlap_mentioned_p (operands[0], operands[2]) ? "mov __tmp_reg__,%2\;sub %A0,%2\;sbc %B0,__zero_reg__\;sbrc __tmp_reg__,7\;inc %B0" : "sub %A0,%2\;sbc %B0,__zero_reg__\;sbrc %2,7\;inc %B0"; } - [(set_attr "length" "5") - (set_attr "cc" "clobber")]) + [(set_attr "length" "5")]) ;; "subsi3" ;; "subsq3" "subusq3" ;; "subsa3" "subusa3" -(define_insn "sub3" +(define_insn_and_split "sub3" [(set (match_operand:ALL4 0 "register_operand" "=??r,d ,r") (minus:ALL4 (match_operand:ALL4 1 "register_operand" "0,0 ,0") (match_operand:ALL4 2 "nonmemory_or_const_operand" "r,n Ynn,Ynn"))) (clobber (match_scratch:QI 3 "=X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:ALL4 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sub3" + [(set (match_operand:ALL4 0 "register_operand" "=??r,d ,r") + (minus:ALL4 (match_operand:ALL4 1 "register_operand" "0,0 ,0") + (match_operand:ALL4 2 "nonmemory_or_const_operand" "r,n Ynn,Ynn"))) + (clobber (match_scratch:QI 3 "=X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_plus (insn, operands); } - [(set_attr "adjust_len" "plus") - (set_attr "cc" "plus")]) + [(set_attr "adjust_len" "plus")]) -(define_insn "*subsi3_zero_extend" +(define_insn_and_split "*subsi3_zero_extend_split" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "0") (zero_extend:SI (match_operand:QI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:SI (match_dup 1) + (zero_extend:SI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*subsi3_zero_extend" + [(set (match_operand:SI 0 "register_operand" "=r") + (minus:SI (match_operand:SI 1 "register_operand" "0") + (zero_extend:SI (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sub %A0,%2\;sbc %B0,__zero_reg__\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__" [(set_attr "length" "4") - (set_attr "cc" "set_czn")]) + ]) -(define_insn "*subsi3_zero_extend.hi" +(define_insn_and_split "*subsi3_zero_extend.hi_split" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "0") (zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:SI (match_dup 1) + (zero_extend:SI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*subsi3_zero_extend.hi" + [(set (match_operand:SI 0 "register_operand" "=r") + (minus:SI (match_operand:SI 1 "register_operand" "0") + (zero_extend:SI (match_operand:HI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sub %A0,%2\;sbc %B0,%B2\;sbc %C0,__zero_reg__\;sbc %D0,__zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "4")]) ;****************************************************************************** ; mul @@ -1559,16 +2106,28 @@ } }) -(define_insn "*mulqi3_enh" +(define_insn_and_split "*mulqi3_enh_split" [(set (match_operand:QI 0 "register_operand" "=r") (mult:QI (match_operand:QI 1 "register_operand" "r") (match_operand:QI 2 "register_operand" "r")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:QI (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulqi3_enh" + [(set (match_operand:QI 0 "register_operand" "=r") + (mult:QI (match_operand:QI 1 "register_operand" "r") + (match_operand:QI 2 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%2 mov %0,r0 clr r1" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) (define_expand "mulqi3_call" [(set (reg:QI 24) (match_operand:QI 1 "register_operand" "")) @@ -1581,189 +2140,392 @@ avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24)); }) -(define_insn "*mulqi3_call" +(define_insn_and_split "*mulqi3_call_split" [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22))) (clobber (reg:QI 22))] "!AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22))) + (clobber (reg:QI 22)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulqi3_call" + [(set (reg:QI 24) (mult:QI (reg:QI 24) (reg:QI 22))) + (clobber (reg:QI 22)) + (clobber (reg:CC REG_CC))] + "!AVR_HAVE_MUL && reload_completed" "%~call __mulqi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "umulqi3_highpart" ;; "smulqi3_highpart" -(define_insn "mulqi3_highpart" + +(define_insn_and_split "mulqi3_highpart" [(set (match_operand:QI 0 "register_operand" "=r") (truncate:QI (lshiftrt:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "")) (any_extend:HI (match_operand:QI 2 "register_operand" ""))) (const_int 8))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (truncate:QI + (lshiftrt:HI (mult:HI (any_extend:HI (match_dup 1)) + (any_extend:HI (match_dup 2))) + (const_int 8)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulqi3_highpart" + [(set (match_operand:QI 0 "register_operand" "=r") + (truncate:QI + (lshiftrt:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "")) + (any_extend:HI (match_operand:QI 2 "register_operand" ""))) + (const_int 8)))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%2 mov %0,r1 clr __zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) ;; Used when expanding div or mod inline for some special values -(define_insn "*subqi3.ashiftrt7" +(define_insn_and_split "*subqi3.ashiftrt7_split" [(set (match_operand:QI 0 "register_operand" "=r") (minus:QI (match_operand:QI 1 "register_operand" "0") (ashiftrt:QI (match_operand:QI 2 "register_operand" "r") (const_int 7))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:QI (match_dup 1) + (ashiftrt:QI (match_dup 2) + (const_int 7)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*subqi3.ashiftrt7" + [(set (match_operand:QI 0 "register_operand" "=r") + (minus:QI (match_operand:QI 1 "register_operand" "0") + (ashiftrt:QI (match_operand:QI 2 "register_operand" "r") + (const_int 7)))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sbrc %2,7\;inc %0" - [(set_attr "length" "2") - (set_attr "cc" "clobber")]) + [(set_attr "length" "2")]) -(define_insn "*addqi3.lt0" +(define_insn_and_split "*addqi3.lt0_split" [(set (match_operand:QI 0 "register_operand" "=r") (plus:QI (lt:QI (match_operand:QI 1 "register_operand" "r") (const_int 0)) (match_operand:QI 2 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:QI (lt:QI (match_dup 1) + (const_int 0)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addqi3.lt0" + [(set (match_operand:QI 0 "register_operand" "=r") + (plus:QI (lt:QI (match_operand:QI 1 "register_operand" "r") + (const_int 0)) + (match_operand:QI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sbrc %1,7\;inc %0" - [(set_attr "length" "2") - (set_attr "cc" "clobber")]) + [(set_attr "length" "2")]) -(define_insn "*addhi3.lt0" +(define_insn_and_split "*addhi3.lt0_split" [(set (match_operand:HI 0 "register_operand" "=w,r") (plus:HI (lt:HI (match_operand:QI 1 "register_operand" "r,r") (const_int 0)) (match_operand:HI 2 "register_operand" "0,0"))) (clobber (match_scratch:QI 3 "=X,&1"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:HI (lt:HI (match_dup 1) + (const_int 0)) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addhi3.lt0" + [(set (match_operand:HI 0 "register_operand" "=w,r") + (plus:HI (lt:HI (match_operand:QI 1 "register_operand" "r,r") + (const_int 0)) + (match_operand:HI 2 "register_operand" "0,0"))) + (clobber (match_scratch:QI 3 "=X,&1")) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ sbrc %1,7\;adiw %0,1 lsl %1\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__" - [(set_attr "length" "2,3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "2,3")]) -(define_insn "*addpsi3.lt0" +(define_insn_and_split "*addpsi3.lt0_split" [(set (match_operand:PSI 0 "register_operand" "=r") (plus:PSI (lshiftrt:PSI (match_operand:PSI 1 "register_operand" "r") (const_int 23)) (match_operand:PSI 2 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:PSI (lshiftrt:PSI (match_dup 1) + (const_int 23)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addpsi3.lt0" + [(set (match_operand:PSI 0 "register_operand" "=r") + (plus:PSI (lshiftrt:PSI (match_operand:PSI 1 "register_operand" "r") + (const_int 23)) + (match_operand:PSI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "mov __tmp_reg__,%C1\;lsl __tmp_reg__ adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__" - [(set_attr "length" "5") - (set_attr "cc" "clobber")]) + [(set_attr "length" "5")]) -(define_insn "*addsi3.lt0" +(define_insn_and_split "*addsi3.lt0_split" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (lshiftrt:SI (match_operand:SI 1 "register_operand" "r") (const_int 31)) (match_operand:SI 2 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:SI (lshiftrt:SI (match_dup 1) + (const_int 31)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*addsi3.lt0" + [(set (match_operand:SI 0 "register_operand" "=r") + (plus:SI (lshiftrt:SI (match_operand:SI 1 "register_operand" "r") + (const_int 31)) + (match_operand:SI 2 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "mov __tmp_reg__,%D1\;lsl __tmp_reg__ adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__" - [(set_attr "length" "6") - (set_attr "cc" "clobber")]) + [(set_attr "length" "6")]) -(define_insn "*umulqihi3.call" +(define_insn_and_split "*umulqihi3.call_split" [(set (reg:HI 24) (mult:HI (zero_extend:HI (reg:QI 22)) (zero_extend:HI (reg:QI 24)))) (clobber (reg:QI 21)) (clobber (reg:HI 22))] "!AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (mult:HI (zero_extend:HI (reg:QI 22)) + (zero_extend:HI (reg:QI 24)))) + (clobber (reg:QI 21)) + (clobber (reg:HI 22)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*umulqihi3.call" + [(set (reg:HI 24) + (mult:HI (zero_extend:HI (reg:QI 22)) + (zero_extend:HI (reg:QI 24)))) + (clobber (reg:QI 21)) + (clobber (reg:HI 22)) + (clobber (reg:CC REG_CC))] + "!AVR_HAVE_MUL && reload_completed" "%~call __umulqihi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "umulqihi3" ;; "mulqihi3" -(define_insn "mulqihi3" + +(define_insn_and_split "mulqihi3_split" [(set (match_operand:HI 0 "register_operand" "=r") (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "")) (any_extend:HI (match_operand:QI 2 "register_operand" ""))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (any_extend:HI (match_dup 1)) + (any_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "mulqihi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "")) + (any_extend:HI (match_operand:QI 2 "register_operand" "")))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%2 movw %0,r0 clr __zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) -(define_insn "usmulqihi3" +(define_insn_and_split "usmulqihi3" [(set (match_operand:HI 0 "register_operand" "=r") (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "a")) (sign_extend:HI (match_operand:QI 2 "register_operand" "a"))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (zero_extend:HI (match_dup 1)) + (sign_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*usmulqihi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "a")) + (sign_extend:HI (match_operand:QI 2 "register_operand" "a")))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mulsu %2,%1 movw %0,r0 clr __zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) ;; Above insn is not canonicalized by insn combine, so here is a version with ;; operands swapped. - -(define_insn "*sumulqihi3" +(define_insn_and_split "*sumulqihi3_split" [(set (match_operand:HI 0 "register_operand" "=r") (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a")) (zero_extend:HI (match_operand:QI 2 "register_operand" "a"))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (sign_extend:HI (match_dup 1)) + (zero_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sumulqihi3" + [(set (match_operand:HI 0 "register_operand" "=r") + (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a")) + (zero_extend:HI (match_operand:QI 2 "register_operand" "a")))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mulsu %1,%2 movw %0,r0 clr __zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) ;; One-extend operand 1 -(define_insn "*osmulqihi3" +(define_insn_and_split "*osmulqihi3_split" [(set (match_operand:HI 0 "register_operand" "=&r") (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "a")))) (sign_extend:HI (match_operand:QI 2 "register_operand" "a"))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (not:HI (zero_extend:HI (not:QI (match_dup 1)))) + (sign_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*osmulqihi3" + [(set (match_operand:HI 0 "register_operand" "=&r") + (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "a")))) + (sign_extend:HI (match_operand:QI 2 "register_operand" "a")))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mulsu %2,%1 movw %0,r0 sub %B0,%2 clr __zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) -(define_insn "*oumulqihi3" +(define_insn_and_split "*oumulqihi3_split" [(set (match_operand:HI 0 "register_operand" "=&r") (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "r")))) (zero_extend:HI (match_operand:QI 2 "register_operand" "r"))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (not:HI (zero_extend:HI (not:QI (match_dup 1)))) + (zero_extend:HI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*oumulqihi3" + [(set (match_operand:HI 0 "register_operand" "=&r") + (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "r")))) + (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %2,%1 movw %0,r0 sub %B0,%2 clr __zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) ;****************************************************************************** ; multiply-add/sub QI: $0 = $3 +/- $1*$2 ;****************************************************************************** -(define_insn "*maddqi4" +(define_insn_and_split "*maddqi4_split" [(set (match_operand:QI 0 "register_operand" "=r") (plus:QI (mult:QI (match_operand:QI 1 "register_operand" "r") (match_operand:QI 2 "register_operand" "r")) (match_operand:QI 3 "register_operand" "0")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:QI (mult:QI (match_dup 1) + (match_dup 2)) + (match_dup 3))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*maddqi4" + [(set (match_operand:QI 0 "register_operand" "=r") + (plus:QI (mult:QI (match_operand:QI 1 "register_operand" "r") + (match_operand:QI 2 "register_operand" "r")) + (match_operand:QI 3 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%2 add %A0,r0 clr __zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) -(define_insn "*msubqi4" +(define_insn_and_split "*msubqi4_split" [(set (match_operand:QI 0 "register_operand" "=r") (minus:QI (match_operand:QI 3 "register_operand" "0") (mult:QI (match_operand:QI 1 "register_operand" "r") (match_operand:QI 2 "register_operand" "r"))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:QI (match_dup 3) + (mult:QI (match_dup 1) + (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*msubqi4" + [(set (match_operand:QI 0 "register_operand" "=r") + (minus:QI (match_operand:QI 3 "register_operand" "0") + (mult:QI (match_operand:QI 1 "register_operand" "r") + (match_operand:QI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%2 sub %A0,r0 clr __zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) (define_insn_and_split "*maddqi4.const" [(set (match_operand:QI 0 "register_operand" "=r") @@ -1821,38 +2583,66 @@ ;; "*maddqihi4" ;; "*umaddqihi4" -(define_insn "*maddqihi4" +(define_insn_and_split "*maddqihi4_split" [(set (match_operand:HI 0 "register_operand" "=r") (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "")) (any_extend:HI (match_operand:QI 2 "register_operand" ""))) (match_operand:HI 3 "register_operand" "0")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:HI (mult:HI (any_extend:HI (match_dup 1)) + (any_extend:HI (match_dup 2))) + (match_dup 3))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*maddqihi4" + [(set (match_operand:HI 0 "register_operand" "=r") + (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "")) + (any_extend:HI (match_operand:QI 2 "register_operand" ""))) + (match_operand:HI 3 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%2 add %A0,r0 adc %B0,r1 clr __zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) ;; "*msubqihi4" ;; "*umsubqihi4" -(define_insn "*msubqihi4" +(define_insn_and_split "*msubqihi4_split" [(set (match_operand:HI 0 "register_operand" "=r") (minus:HI (match_operand:HI 3 "register_operand" "0") (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "")) (any_extend:HI (match_operand:QI 2 "register_operand" "")))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:HI (match_dup 3) + (mult:HI (any_extend:HI (match_dup 1)) + (any_extend:HI (match_dup 2))))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*msubqihi4" + [(set (match_operand:HI 0 "register_operand" "=r") + (minus:HI (match_operand:HI 3 "register_operand" "0") + (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "")) + (any_extend:HI (match_operand:QI 2 "register_operand" ""))))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%2 sub %A0,r0 sbc %B0,r1 clr __zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) ;; "*usmaddqihi4" ;; "*sumaddqihi4" -(define_insn "*msubqihi4" +(define_insn_and_split "*msubqihi4_split" [(set (match_operand:HI 0 "register_operand" "=r") (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "a")) (any_extend2:HI (match_operand:QI 2 "register_operand" "a"))) @@ -1860,18 +2650,34 @@ "AVR_HAVE_MUL && reload_completed && != " + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (plus:HI (mult:HI (any_extend:HI (match_dup 1)) + (any_extend2:HI (match_dup 2))) + (match_dup 3))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*msubqihi4" + [(set (match_operand:HI 0 "register_operand" "=r") + (plus:HI (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "a")) + (any_extend2:HI (match_operand:QI 2 "register_operand" "a"))) + (match_operand:HI 3 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL + && reload_completed + && != " { output_asm_insn ( == SIGN_EXTEND ? "mulsu %1,%2" : "mulsu %2,%1", operands); return "add %A0,r0\;adc %B0,r1\;clr __zero_reg__"; } - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) ;; "*usmsubqihi4" ;; "*sumsubqihi4" -(define_insn "*msubqihi4" +(define_insn_and_split "*msubqihi4_split" [(set (match_operand:HI 0 "register_operand" "=r") (minus:HI (match_operand:HI 3 "register_operand" "0") (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "a")) @@ -1879,14 +2685,30 @@ "AVR_HAVE_MUL && reload_completed && != " + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (minus:HI (match_dup 3) + (mult:HI (any_extend:HI (match_dup 1)) + (any_extend2:HI (match_dup 2))))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*msubqihi4" + [(set (match_operand:HI 0 "register_operand" "=r") + (minus:HI (match_operand:HI 3 "register_operand" "0") + (mult:HI (any_extend:HI (match_operand:QI 1 "register_operand" "a")) + (any_extend2:HI (match_operand:QI 2 "register_operand" "a"))))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL + && reload_completed + && != " { output_asm_insn ( == SIGN_EXTEND ? "mulsu %1,%2" : "mulsu %2,%1", operands); return "sub %A0,r0\;sbc %B0,r1\;clr __zero_reg__"; } - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) ;; Handle small constants @@ -2130,17 +2952,28 @@ ;; The EXTEND of $1 only appears in combine, we don't see it in expand so that ;; expand decides to use ASHIFT instead of MUL because ASHIFT costs are cheaper ;; at that time. Fix that. - -(define_insn "*ashiftqihi2.signx.1" +(define_insn_and_split "*ashiftqihi2.signx.1_split" [(set (match_operand:HI 0 "register_operand" "=r,*r") (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "0,r")) (const_int 1)))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashift:HI (sign_extend:HI (match_dup 1)) + (const_int 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashiftqihi2.signx.1" + [(set (match_operand:HI 0 "register_operand" "=r,*r") + (ashift:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "0,r")) + (const_int 1))) + (clobber (reg:CC REG_CC)) ] + "reload_completed" "@ lsl %A0\;sbc %B0,%B0 mov %A0,%1\;lsl %A0\;sbc %B0,%B0" - [(set_attr "length" "2,3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "2,3")]) (define_insn_and_split "*ashifthi3.signx.const" [(set (match_operand:HI 0 "register_operand" "=r") @@ -2200,47 +3033,83 @@ ; mul HI: $1 = sign-/zero-/one-extend, $2 = reg ;****************************************************************************** -(define_insn "mulsqihi3" +(define_insn_and_split "mulsqihi3" [(set (match_operand:HI 0 "register_operand" "=&r") (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a")) (match_operand:HI 2 "register_operand" "a")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (sign_extend:HI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulsqihi3" + [(set (match_operand:HI 0 "register_operand" "=&r") + (mult:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "a")) + (match_operand:HI 2 "register_operand" "a"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mulsu %1,%A2 movw %0,r0 mul %1,%B2 add %B0,r0 clr __zero_reg__" - [(set_attr "length" "5") - (set_attr "cc" "clobber")]) + [(set_attr "length" "5")]) -(define_insn "muluqihi3" +(define_insn_and_split "muluqihi3" [(set (match_operand:HI 0 "register_operand" "=&r") (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r")) (match_operand:HI 2 "register_operand" "r")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (zero_extend:HI (match_dup 1)) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*muluqihi3" + [(set (match_operand:HI 0 "register_operand" "=&r") + (mult:HI (zero_extend:HI (match_operand:QI 1 "register_operand" "r")) + (match_operand:HI 2 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%A2 movw %0,r0 mul %1,%B2 add %B0,r0 clr __zero_reg__" - [(set_attr "length" "5") - (set_attr "cc" "clobber")]) + [(set_attr "length" "5")]) ;; one-extend operand 1 -(define_insn "muloqihi3" +(define_insn_and_split "muloqihi3" [(set (match_operand:HI 0 "register_operand" "=&r") (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "r")))) (match_operand:HI 2 "register_operand" "r")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (not:HI (zero_extend:HI (not:QI (match_dup 1)))) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*muloqihi3" + [(set (match_operand:HI 0 "register_operand" "=&r") + (mult:HI (not:HI (zero_extend:HI (not:QI (match_operand:QI 1 "register_operand" "r")))) + (match_operand:HI 2 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%A2 movw %0,r0 mul %1,%B2 add %B0,r0 sub %B0,%A2 clr __zero_reg__" - [(set_attr "length" "6") - (set_attr "cc" "clobber")]) + [(set_attr "length" "6")]) ;****************************************************************************** @@ -2288,18 +3157,30 @@ operands[2] = force_reg (HImode, operands[2]); }) -(define_insn "*mulhi3_enh" +(define_insn_and_split "*mulhi3_enh_split" [(set (match_operand:HI 0 "register_operand" "=&r") (mult:HI (match_operand:HI 1 "register_operand" "r") (match_operand:HI 2 "register_operand" "r")))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:HI (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulhi3_enh" + [(set (match_operand:HI 0 "register_operand" "=&r") + (mult:HI (match_operand:HI 1 "register_operand" "r") + (match_operand:HI 2 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" { return REGNO (operands[1]) == REGNO (operands[2]) ? "mul %A1,%A1\;movw %0,r0\;mul %A1,%B1\;add %B0,r0\;add %B0,r0\;clr r1" : "mul %A1,%A2\;movw %0,r0\;mul %A1,%B2\;add %B0,r0\;mul %B1,%A2\;add %B0,r0\;clr r1"; } - [(set_attr "length" "7") - (set_attr "cc" "clobber")]) + [(set_attr "length" "7")]) (define_expand "mulhi3_call" [(set (reg:HI 24) (match_operand:HI 1 "register_operand" "")) @@ -2315,14 +3196,26 @@ }) -(define_insn "*mulhi3_call" +(define_insn_and_split "*mulhi3_call_split" [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22))) (clobber (reg:HI 22)) (clobber (reg:QI 21))] "!AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22))) + (clobber (reg:HI 22)) + (clobber (reg:QI 21)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulhi3_call" + [(set (reg:HI 24) (mult:HI (reg:HI 24) (reg:HI 22))) + (clobber (reg:HI 22)) + (clobber (reg:QI 21)) + (clobber (reg:CC REG_CC))] + "!AVR_HAVE_MUL && reload_completed" "%~call __mulhi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; To support widening multiplication with constant we postpone ;; expanding to the implicit library call until post combine and @@ -2643,67 +3536,144 @@ avr_fix_inputs (operands, 1 << 2, regmask (HImode, 18)); }) - -(define_insn "*mulsi3_call" +(define_insn_and_split "*mulsi3_call_split" [(set (reg:SI 22) (mult:SI (reg:SI 22) (reg:SI 18))) (clobber (reg:HI 26))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:SI 22) + (mult:SI (reg:SI 22) + (reg:SI 18))) + (clobber (reg:HI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulsi3_call" + [(set (reg:SI 22) + (mult:SI (reg:SI 22) + (reg:SI 18))) + (clobber (reg:HI 26)) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mulsi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "*mulhisi3_call" ;; "*umulhisi3_call" -(define_insn "*mulhisi3_call" +(define_insn_and_split "*mulhisi3_call_split" [(set (reg:SI 22) (mult:SI (any_extend:SI (reg:HI 18)) (any_extend:SI (reg:HI 26))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:SI 22) + (mult:SI (any_extend:SI (reg:HI 18)) + (any_extend:SI (reg:HI 26)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulhisi3_call" + [(set (reg:SI 22) + (mult:SI (any_extend:SI (reg:HI 18)) + (any_extend:SI (reg:HI 26)))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mulhisi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; "*umulhi3_highpart_call" ;; "*smulhi3_highpart_call" -(define_insn "*mulhi3_highpart_call" +(define_insn_and_split "*mulhi3_highpart_call_split" [(set (reg:HI 24) (truncate:HI (lshiftrt:SI (mult:SI (any_extend:SI (reg:HI 18)) (any_extend:SI (reg:HI 26))) (const_int 16)))) (clobber (reg:HI 22))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (truncate:HI (lshiftrt:SI (mult:SI (any_extend:SI (reg:HI 18)) + (any_extend:SI (reg:HI 26))) + (const_int 16)))) + (clobber (reg:HI 22)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulhi3_highpart_call" + [(set (reg:HI 24) + (truncate:HI (lshiftrt:SI (mult:SI (any_extend:SI (reg:HI 18)) + (any_extend:SI (reg:HI 26))) + (const_int 16)))) + (clobber (reg:HI 22)) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mulhisi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*usmulhisi3_call" +(define_insn_and_split "*usmulhisi3_call_split" [(set (reg:SI 22) (mult:SI (zero_extend:SI (reg:HI 18)) (sign_extend:SI (reg:HI 26))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:SI 22) + (mult:SI (zero_extend:SI (reg:HI 18)) + (sign_extend:SI (reg:HI 26)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*usmulhisi3_call" + [(set (reg:SI 22) + (mult:SI (zero_extend:SI (reg:HI 18)) + (sign_extend:SI (reg:HI 26)))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __usmulhisi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*mulhisi3_call" +(define_insn_and_split "*mulhisi3_call_split" [(set (reg:SI 22) (mult:SI (any_extend:SI (reg:HI 26)) (reg:SI 18)))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:SI 22) + (mult:SI (any_extend:SI (reg:HI 26)) + (reg:SI 18))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulhisi3_call" + [(set (reg:SI 22) + (mult:SI (any_extend:SI (reg:HI 26)) + (reg:SI 18))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mulhisi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*mulohisi3_call" +(define_insn_and_split "*mulohisi3_call_split" [(set (reg:SI 22) (mult:SI (not:SI (zero_extend:SI (not:HI (reg:HI 26)))) (reg:SI 18)))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:SI 22) + (mult:SI (not:SI (zero_extend:SI (not:HI (reg:HI 26)))) + (reg:SI 18))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulohisi3_call" + [(set (reg:SI 22) + (mult:SI (not:SI (zero_extend:SI (not:HI (reg:HI 26)))) + (reg:SI 18))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mulohisi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ; / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % / % ; divmod @@ -2716,15 +3686,15 @@ ;; CSE has problems to operate on hard regs. ;; (define_insn_and_split "divmodqi4" - [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "") - (div:QI (match_operand:QI 1 "pseudo_register_operand" "") - (match_operand:QI 2 "pseudo_register_operand" ""))) - (set (match_operand:QI 3 "pseudo_register_operand" "") - (mod:QI (match_dup 1) (match_dup 2))) - (clobber (reg:QI 22)) - (clobber (reg:QI 23)) - (clobber (reg:QI 24)) - (clobber (reg:QI 25))])] + [(set (match_operand:QI 0 "pseudo_register_operand" "") + (div:QI (match_operand:QI 1 "pseudo_register_operand" "") + (match_operand:QI 2 "pseudo_register_operand" ""))) + (set (match_operand:QI 3 "pseudo_register_operand" "") + (mod:QI (match_dup 1) (match_dup 2))) + (clobber (reg:QI 22)) + (clobber (reg:QI 23)) + (clobber (reg:QI 24)) + (clobber (reg:QI 25))] "" "this divmodqi4 pattern should have been splitted;" "" @@ -2737,26 +3707,40 @@ (set (match_dup 0) (reg:QI 24)) (set (match_dup 3) (reg:QI 25))]) -(define_insn "*divmodqi4_call" +(define_insn_and_split "*divmodqi4_call_split" [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22))) (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22))) (clobber (reg:QI 22)) (clobber (reg:QI 23))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22))) + (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22))) + (clobber (reg:QI 22)) + (clobber (reg:QI 23)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*divmodqi4_call" + [(set (reg:QI 24) (div:QI (reg:QI 24) (reg:QI 22))) + (set (reg:QI 25) (mod:QI (reg:QI 24) (reg:QI 22))) + (clobber (reg:QI 22)) + (clobber (reg:QI 23)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __divmodqi4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) (define_insn_and_split "udivmodqi4" - [(parallel [(set (match_operand:QI 0 "pseudo_register_operand" "") - (udiv:QI (match_operand:QI 1 "pseudo_register_operand" "") - (match_operand:QI 2 "pseudo_register_operand" ""))) - (set (match_operand:QI 3 "pseudo_register_operand" "") - (umod:QI (match_dup 1) (match_dup 2))) - (clobber (reg:QI 22)) - (clobber (reg:QI 23)) - (clobber (reg:QI 24)) - (clobber (reg:QI 25))])] + [(set (match_operand:QI 0 "pseudo_register_operand" "") + (udiv:QI (match_operand:QI 1 "pseudo_register_operand" "") + (match_operand:QI 2 "pseudo_register_operand" ""))) + (set (match_operand:QI 3 "pseudo_register_operand" "") + (umod:QI (match_dup 1) (match_dup 2))) + (clobber (reg:QI 22)) + (clobber (reg:QI 23)) + (clobber (reg:QI 24)) + (clobber (reg:QI 25))] "" "this udivmodqi4 pattern should have been splitted;" "" @@ -2768,25 +3752,37 @@ (set (match_dup 0) (reg:QI 24)) (set (match_dup 3) (reg:QI 25))]) -(define_insn "*udivmodqi4_call" +(define_insn_and_split "*udivmodqi4_call_split" [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22))) (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22))) (clobber (reg:QI 23))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22))) + (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22))) + (clobber (reg:QI 23)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*udivmodqi4_call" + [(set (reg:QI 24) (udiv:QI (reg:QI 24) (reg:QI 22))) + (set (reg:QI 25) (umod:QI (reg:QI 24) (reg:QI 22))) + (clobber (reg:QI 23)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __udivmodqi4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) (define_insn_and_split "divmodhi4" - [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "") - (div:HI (match_operand:HI 1 "pseudo_register_operand" "") - (match_operand:HI 2 "pseudo_register_operand" ""))) - (set (match_operand:HI 3 "pseudo_register_operand" "") - (mod:HI (match_dup 1) (match_dup 2))) - (clobber (reg:QI 21)) - (clobber (reg:HI 22)) - (clobber (reg:HI 24)) - (clobber (reg:HI 26))])] + [(set (match_operand:HI 0 "pseudo_register_operand" "") + (div:HI (match_operand:HI 1 "pseudo_register_operand" "") + (match_operand:HI 2 "pseudo_register_operand" ""))) + (set (match_operand:HI 3 "pseudo_register_operand" "") + (mod:HI (match_dup 1) (match_dup 2))) + (clobber (reg:QI 21)) + (clobber (reg:HI 22)) + (clobber (reg:HI 24)) + (clobber (reg:HI 26))] "" "this should have been splitted;" "" @@ -2799,26 +3795,40 @@ (set (match_dup 0) (reg:HI 22)) (set (match_dup 3) (reg:HI 24))]) -(define_insn "*divmodhi4_call" +(define_insn_and_split "*divmodhi4_call_split" [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22))) (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22))) (clobber (reg:HI 26)) (clobber (reg:QI 21))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22))) + (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22))) + (clobber (reg:HI 26)) + (clobber (reg:QI 21)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*divmodhi4_call" + [(set (reg:HI 22) (div:HI (reg:HI 24) (reg:HI 22))) + (set (reg:HI 24) (mod:HI (reg:HI 24) (reg:HI 22))) + (clobber (reg:HI 26)) + (clobber (reg:QI 21)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __divmodhi4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) (define_insn_and_split "udivmodhi4" - [(parallel [(set (match_operand:HI 0 "pseudo_register_operand" "") - (udiv:HI (match_operand:HI 1 "pseudo_register_operand" "") - (match_operand:HI 2 "pseudo_register_operand" ""))) - (set (match_operand:HI 3 "pseudo_register_operand" "") - (umod:HI (match_dup 1) (match_dup 2))) - (clobber (reg:QI 21)) - (clobber (reg:HI 22)) - (clobber (reg:HI 24)) - (clobber (reg:HI 26))])] + [(set (match_operand:HI 0 "pseudo_register_operand" "") + (udiv:HI (match_operand:HI 1 "pseudo_register_operand" "") + (match_operand:HI 2 "pseudo_register_operand" ""))) + (set (match_operand:HI 3 "pseudo_register_operand" "") + (umod:HI (match_dup 1) (match_dup 2))) + (clobber (reg:QI 21)) + (clobber (reg:HI 22)) + (clobber (reg:HI 24)) + (clobber (reg:HI 26))] "" "this udivmodhi4 pattern should have been splitted.;" "" @@ -2831,15 +3841,30 @@ (set (match_dup 0) (reg:HI 22)) (set (match_dup 3) (reg:HI 24))]) -(define_insn "*udivmodhi4_call" +(define_insn_and_split "*udivmodhi4_call_split" [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22))) (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22))) (clobber (reg:HI 26)) (clobber (reg:QI 21))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22))) + (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22))) + (clobber (reg:HI 26)) + (clobber (reg:QI 21)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*udivmodhi4_call" + [(set (reg:HI 22) (udiv:HI (reg:HI 24) (reg:HI 22))) + (set (reg:HI 24) (umod:HI (reg:HI 24) (reg:HI 22))) + (clobber (reg:HI 26)) + (clobber (reg:QI 21)) + (clobber (reg:CC REG_CC)) + ] + "reload_completed" "%~call __udivmodhi4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 24-bit multiply @@ -2870,11 +3895,24 @@ DONE; }) -(define_insn "*umulqihipsi3" +(define_insn_and_split "*umulqihipsi3_split" [(set (match_operand:PSI 0 "register_operand" "=&r") (mult:PSI (zero_extend:PSI (match_operand:QI 1 "register_operand" "r")) (zero_extend:PSI (match_operand:HI 2 "register_operand" "r"))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:PSI (zero_extend:PSI (match_dup 1)) + (zero_extend:PSI (match_dup 2)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*umulqihipsi3" + [(set (match_operand:PSI 0 "register_operand" "=&r") + (mult:PSI (zero_extend:PSI (match_operand:QI 1 "register_operand" "r")) + (zero_extend:PSI (match_operand:HI 2 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%A2 movw %A0,r0 mul %1,%B2 @@ -2882,14 +3920,26 @@ add %B0,r0 adc %C0,r1 clr __zero_reg__" - [(set_attr "length" "7") - (set_attr "cc" "clobber")]) + [(set_attr "length" "7")]) -(define_insn "*umulhiqipsi3" +(define_insn_and_split "*umulhiqipsi3_split" [(set (match_operand:PSI 0 "register_operand" "=&r") (mult:PSI (zero_extend:PSI (match_operand:HI 2 "register_operand" "r")) (zero_extend:PSI (match_operand:QI 1 "register_operand" "r"))))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (mult:PSI (zero_extend:PSI (match_dup 2)) + (zero_extend:PSI (match_dup 1)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*umulhiqipsi3" + [(set (match_operand:PSI 0 "register_operand" "=&r") + (mult:PSI (zero_extend:PSI (match_operand:HI 2 "register_operand" "r")) + (zero_extend:PSI (match_operand:QI 1 "register_operand" "r")))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "mul %1,%A2 movw %A0,r0 mul %1,%B2 @@ -2897,8 +3947,7 @@ mov %C0,r1 clr __zero_reg__ adc %C0,__zero_reg__" - [(set_attr "length" "7") - (set_attr "cc" "clobber")]) + [(set_attr "length" "7")]) (define_expand "mulsqipsi3" [(parallel [(set (match_operand:PSI 0 "pseudo_register_operand" "") @@ -2963,16 +4012,28 @@ } }) -(define_insn "*mulsqipsi3.libgcc" +(define_insn_and_split "*mulsqipsi3.libgcc_split" [(set (reg:PSI 18) (mult:PSI (sign_extend:PSI (reg:QI 25)) (reg:PSI 22)))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:PSI 18) + (mult:PSI (sign_extend:PSI (reg:QI 25)) + (reg:PSI 22))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulsqipsi3.libgcc" + [(set (reg:PSI 18) + (mult:PSI (sign_extend:PSI (reg:QI 25)) + (reg:PSI 22))) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mulsqipsi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*mulpsi3.libgcc" +(define_insn_and_split "*mulpsi3.libgcc_split" [(set (reg:PSI 22) (mult:PSI (reg:PSI 22) (reg:PSI 18))) @@ -2980,9 +4041,27 @@ (clobber (reg:QI 25)) (clobber (reg:HI 26))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:PSI 22) + (mult:PSI (reg:PSI 22) + (reg:PSI 18))) + (clobber (reg:QI 21)) + (clobber (reg:QI 25)) + (clobber (reg:HI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*mulpsi3.libgcc" + [(set (reg:PSI 22) + (mult:PSI (reg:PSI 22) + (reg:PSI 18))) + (clobber (reg:QI 21)) + (clobber (reg:QI 25)) + (clobber (reg:HI 26)) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "%~call __mulpsi3" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -3013,16 +4092,32 @@ (set (match_dup 0) (reg:PSI 22)) (set (match_dup 3) (reg:PSI 18))]) -(define_insn "*divmodpsi4_call" +(define_insn_and_split "*divmodpsi4_call_split" [(set (reg:PSI 22) (div:PSI (reg:PSI 22) (reg:PSI 18))) (set (reg:PSI 18) (mod:PSI (reg:PSI 22) (reg:PSI 18))) (clobber (reg:QI 21)) (clobber (reg:QI 25)) (clobber (reg:QI 26))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:PSI 22) (div:PSI (reg:PSI 22) (reg:PSI 18))) + (set (reg:PSI 18) (mod:PSI (reg:PSI 22) (reg:PSI 18))) + (clobber (reg:QI 21)) + (clobber (reg:QI 25)) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*divmodpsi4_call" + [(set (reg:PSI 22) (div:PSI (reg:PSI 22) (reg:PSI 18))) + (set (reg:PSI 18) (mod:PSI (reg:PSI 22) (reg:PSI 18))) + (clobber (reg:QI 21)) + (clobber (reg:QI 25)) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __divmodpsi4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) (define_insn_and_split "udivmodpsi4" [(parallel [(set (match_operand:PSI 0 "pseudo_register_operand" "") @@ -3046,16 +4141,32 @@ (set (match_dup 0) (reg:PSI 22)) (set (match_dup 3) (reg:PSI 18))]) -(define_insn "*udivmodpsi4_call" +(define_insn_and_split "*udivmodpsi4_call_split" [(set (reg:PSI 22) (udiv:PSI (reg:PSI 22) (reg:PSI 18))) (set (reg:PSI 18) (umod:PSI (reg:PSI 22) (reg:PSI 18))) (clobber (reg:QI 21)) (clobber (reg:QI 25)) (clobber (reg:QI 26))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:PSI 22) (udiv:PSI (reg:PSI 22) (reg:PSI 18))) + (set (reg:PSI 18) (umod:PSI (reg:PSI 22) (reg:PSI 18))) + (clobber (reg:QI 21)) + (clobber (reg:QI 25)) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*udivmodpsi4_call" + [(set (reg:PSI 22) (udiv:PSI (reg:PSI 22) (reg:PSI 18))) + (set (reg:PSI 18) (umod:PSI (reg:PSI 22) (reg:PSI 18))) + (clobber (reg:QI 21)) + (clobber (reg:QI 25)) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __udivmodpsi4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -3081,15 +4192,29 @@ (set (match_dup 0) (reg:SI 18)) (set (match_dup 3) (reg:SI 22))]) -(define_insn "*divmodsi4_call" +(define_insn_and_split "*divmodsi4_call_split" [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18))) (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18))) (clobber (reg:HI 26)) (clobber (reg:HI 30))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18))) + (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18))) + (clobber (reg:HI 26)) + (clobber (reg:HI 30)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*divmodsi4_call" + [(set (reg:SI 18) (div:SI (reg:SI 22) (reg:SI 18))) + (set (reg:SI 22) (mod:SI (reg:SI 22) (reg:SI 18))) + (clobber (reg:HI 26)) + (clobber (reg:HI 30)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __divmodsi4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) (define_insn_and_split "udivmodsi4" [(parallel [(set (match_operand:SI 0 "pseudo_register_operand" "") @@ -3113,37 +4238,78 @@ (set (match_dup 0) (reg:SI 18)) (set (match_dup 3) (reg:SI 22))]) -(define_insn "*udivmodsi4_call" +(define_insn_and_split "*udivmodsi4_call_split" [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18))) (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18))) (clobber (reg:HI 26)) (clobber (reg:HI 30))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18))) + (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18))) + (clobber (reg:HI 26)) + (clobber (reg:HI 30)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*udivmodsi4_call" + [(set (reg:SI 18) (udiv:SI (reg:SI 22) (reg:SI 18))) + (set (reg:SI 22) (umod:SI (reg:SI 22) (reg:SI 18))) + (clobber (reg:HI 26)) + (clobber (reg:HI 30)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __udivmodsi4" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; and -(define_insn "andqi3" +(define_insn_and_split "andqi3" + [(set (match_operand:QI 0 "register_operand" "=??r,d,*l") + (and:QI (match_operand:QI 1 "register_operand" "%0,0,0") + (match_operand:QI 2 "nonmemory_operand" "r,i,Ca1")))] + "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (and:QI (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*andqi3" [(set (match_operand:QI 0 "register_operand" "=??r,d,*l") (and:QI (match_operand:QI 1 "register_operand" "%0,0,0") - (match_operand:QI 2 "nonmemory_operand" "r,i,Ca1")))] - "" + (match_operand:QI 2 "nonmemory_operand" "r,i,Ca1"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ and %0,%2 andi %0,lo8(%2) * return avr_out_bitop (insn, operands, NULL);" - [(set_attr "length" "1,1,2") - (set_attr "cc" "set_zn,set_zn,none")]) + [(set_attr "length" "1,1,2")]) -(define_insn "andhi3" +(define_insn_and_split "andhi3" [(set (match_operand:HI 0 "register_operand" "=??r,d,d,r ,r") (and:HI (match_operand:HI 1 "register_operand" "%0,0,0,0 ,0") (match_operand:HI 2 "nonmemory_operand" "r,s,n,Ca2,n"))) (clobber (match_scratch:QI 3 "=X,X,X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (and:HI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*andhi3" + [(set (match_operand:HI 0 "register_operand" "=??r,d,d,r ,r") + (and:HI (match_operand:HI 1 "register_operand" "%0,0,0,0 ,0") + (match_operand:HI 2 "nonmemory_operand" "r,s,n,Ca2,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "and %A0,%A2\;and %B0,%B2"; @@ -3153,15 +4319,29 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "2,2,2,4,4") - (set_attr "adjust_len" "*,*,out_bitop,out_bitop,out_bitop") - (set_attr "cc" "set_n,set_n,clobber,clobber,clobber")]) + (set_attr "adjust_len" "*,*,out_bitop,out_bitop,out_bitop")]) -(define_insn "andpsi3" +(define_insn_and_split "andpsi3" [(set (match_operand:PSI 0 "register_operand" "=??r,d,r ,r") (and:PSI (match_operand:PSI 1 "register_operand" "%0,0,0 ,0") (match_operand:PSI 2 "nonmemory_operand" "r,n,Ca3,n"))) (clobber (match_scratch:QI 3 "=X,X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (and:PSI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*andpsi3" + [(set (match_operand:PSI 0 "register_operand" "=??r,d,r ,r") + (and:PSI (match_operand:PSI 1 "register_operand" "%0,0,0 ,0") + (match_operand:PSI 2 "nonmemory_operand" "r,n,Ca3,n"))) + (clobber (match_scratch:QI 3 "=X,X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "and %A0,%A2" CR_TAB @@ -3171,15 +4351,29 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "3,3,6,6") - (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop") - (set_attr "cc" "set_n,clobber,clobber,clobber")]) + (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")]) -(define_insn "andsi3" +(define_insn_and_split "andsi3" [(set (match_operand:SI 0 "register_operand" "=??r,d,r ,r") (and:SI (match_operand:SI 1 "register_operand" "%0,0,0 ,0") (match_operand:SI 2 "nonmemory_operand" "r,n,Ca4,n"))) (clobber (match_scratch:QI 3 "=X,X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (and:SI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*andsi3" + [(set (match_operand:SI 0 "register_operand" "=??r,d,r ,r") + (and:SI (match_operand:SI 1 "register_operand" "%0,0,0 ,0") + (match_operand:SI 2 "nonmemory_operand" "r,n,Ca4,n"))) + (clobber (match_scratch:QI 3 "=X,X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "and %0,%2" CR_TAB @@ -3190,8 +4384,7 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "4,4,8,8") - (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop") - (set_attr "cc" "set_n,clobber,clobber,clobber")]) + (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")]) (define_peephole2 ; andi [(set (match_operand:QI 0 "d_register_operand" "") @@ -3209,24 +4402,51 @@ ;;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ;; ior -(define_insn "iorqi3" +(define_insn_and_split "iorqi3" [(set (match_operand:QI 0 "register_operand" "=??r,d,*l") (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0") (match_operand:QI 2 "nonmemory_operand" "r,i,Co1")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ior:QI (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*iorqi3" + [(set (match_operand:QI 0 "register_operand" "=??r,d,*l") + (ior:QI (match_operand:QI 1 "register_operand" "%0,0,0") + (match_operand:QI 2 "nonmemory_operand" "r,i,Co1"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ or %0,%2 ori %0,lo8(%2) * return avr_out_bitop (insn, operands, NULL);" - [(set_attr "length" "1,1,2") - (set_attr "cc" "set_zn,set_zn,none")]) + [(set_attr "length" "1,1,2")]) -(define_insn "iorhi3" +(define_insn_and_split "iorhi3" [(set (match_operand:HI 0 "register_operand" "=??r,d,d,r ,r") (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0,0 ,0") (match_operand:HI 2 "nonmemory_operand" "r,s,n,Co2,n"))) (clobber (match_scratch:QI 3 "=X,X,X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ior:HI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*iorhi3" + [(set (match_operand:HI 0 "register_operand" "=??r,d,d,r ,r") + (ior:HI (match_operand:HI 1 "register_operand" "%0,0,0,0 ,0") + (match_operand:HI 2 "nonmemory_operand" "r,s,n,Co2,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "or %A0,%A2\;or %B0,%B2"; @@ -3236,15 +4456,29 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "2,2,2,4,4") - (set_attr "adjust_len" "*,*,out_bitop,out_bitop,out_bitop") - (set_attr "cc" "set_n,set_n,clobber,clobber,clobber")]) + (set_attr "adjust_len" "*,*,out_bitop,out_bitop,out_bitop")]) -(define_insn "iorpsi3" +(define_insn_and_split "iorpsi3" [(set (match_operand:PSI 0 "register_operand" "=??r,d,r ,r") (ior:PSI (match_operand:PSI 1 "register_operand" "%0,0,0 ,0") (match_operand:PSI 2 "nonmemory_operand" "r,n,Co3,n"))) (clobber (match_scratch:QI 3 "=X,X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ior:PSI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*iorpsi3" + [(set (match_operand:PSI 0 "register_operand" "=??r,d,r ,r") + (ior:PSI (match_operand:PSI 1 "register_operand" "%0,0,0 ,0") + (match_operand:PSI 2 "nonmemory_operand" "r,n,Co3,n"))) + (clobber (match_scratch:QI 3 "=X,X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "or %A0,%A2" CR_TAB @@ -3254,15 +4488,29 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "3,3,6,6") - (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop") - (set_attr "cc" "set_n,clobber,clobber,clobber")]) + (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")]) -(define_insn "iorsi3" +(define_insn_and_split "iorsi3" [(set (match_operand:SI 0 "register_operand" "=??r,d,r ,r") (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0 ,0") (match_operand:SI 2 "nonmemory_operand" "r,n,Co4,n"))) (clobber (match_scratch:QI 3 "=X,X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ior:SI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*iorsi3" + [(set (match_operand:SI 0 "register_operand" "=??r,d,r ,r") + (ior:SI (match_operand:SI 1 "register_operand" "%0,0,0 ,0") + (match_operand:SI 2 "nonmemory_operand" "r,n,Co4,n"))) + (clobber (match_scratch:QI 3 "=X,X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "or %0,%2" CR_TAB @@ -3273,27 +4521,53 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "4,4,8,8") - (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop") - (set_attr "cc" "set_n,clobber,clobber,clobber")]) + (set_attr "adjust_len" "*,out_bitop,out_bitop,out_bitop")]) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; xor -(define_insn "xorqi3" +(define_insn_and_split "xorqi3" [(set (match_operand:QI 0 "register_operand" "=r") (xor:QI (match_operand:QI 1 "register_operand" "%0") (match_operand:QI 2 "register_operand" "r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (xor:QI (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*xorqi3" + [(set (match_operand:QI 0 "register_operand" "=r") + (xor:QI (match_operand:QI 1 "register_operand" "%0") + (match_operand:QI 2 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "eor %0,%2" - [(set_attr "length" "1") - (set_attr "cc" "set_zn")]) + [(set_attr "length" "1")]) -(define_insn "xorhi3" +(define_insn_and_split "xorhi3" [(set (match_operand:HI 0 "register_operand" "=??r,r ,r") (xor:HI (match_operand:HI 1 "register_operand" "%0,0 ,0") (match_operand:HI 2 "nonmemory_operand" "r,Cx2,n"))) (clobber (match_scratch:QI 3 "=X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (xor:HI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*xorhi3" + [(set (match_operand:HI 0 "register_operand" "=??r,r ,r") + (xor:HI (match_operand:HI 1 "register_operand" "%0,0 ,0") + (match_operand:HI 2 "nonmemory_operand" "r,Cx2,n"))) + (clobber (match_scratch:QI 3 "=X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "eor %A0,%A2\;eor %B0,%B2"; @@ -3301,15 +4575,29 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "2,2,4") - (set_attr "adjust_len" "*,out_bitop,out_bitop") - (set_attr "cc" "set_n,clobber,clobber")]) + (set_attr "adjust_len" "*,out_bitop,out_bitop")]) -(define_insn "xorpsi3" +(define_insn_and_split "xorpsi3" [(set (match_operand:PSI 0 "register_operand" "=??r,r ,r") (xor:PSI (match_operand:PSI 1 "register_operand" "%0,0 ,0") (match_operand:PSI 2 "nonmemory_operand" "r,Cx3,n"))) (clobber (match_scratch:QI 3 "=X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (xor:PSI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*xorpsi3" + [(set (match_operand:PSI 0 "register_operand" "=??r,r ,r") + (xor:PSI (match_operand:PSI 1 "register_operand" "%0,0 ,0") + (match_operand:PSI 2 "nonmemory_operand" "r,Cx3,n"))) + (clobber (match_scratch:QI 3 "=X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "eor %A0,%A2" CR_TAB @@ -3319,15 +4607,29 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "3,6,6") - (set_attr "adjust_len" "*,out_bitop,out_bitop") - (set_attr "cc" "set_n,clobber,clobber")]) + (set_attr "adjust_len" "*,out_bitop,out_bitop")]) -(define_insn "xorsi3" +(define_insn_and_split "xorsi3" [(set (match_operand:SI 0 "register_operand" "=??r,r ,r") (xor:SI (match_operand:SI 1 "register_operand" "%0,0 ,0") (match_operand:SI 2 "nonmemory_operand" "r,Cx4,n"))) (clobber (match_scratch:QI 3 "=X,X ,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (xor:SI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*xorsi3" + [(set (match_operand:SI 0 "register_operand" "=??r,r ,r") + (xor:SI (match_operand:SI 1 "register_operand" "%0,0 ,0") + (match_operand:SI 2 "nonmemory_operand" "r,Cx4,n"))) + (clobber (match_scratch:QI 3 "=X,X ,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { if (which_alternative == 0) return "eor %0,%2" CR_TAB @@ -3338,8 +4640,7 @@ return avr_out_bitop (insn, operands, NULL); } [(set_attr "length" "4,8,8") - (set_attr "adjust_len" "*,out_bitop,out_bitop") - (set_attr "cc" "set_n,clobber,clobber")]) + (set_attr "adjust_len" "*,out_bitop,out_bitop")]) (define_split @@ -3424,11 +4725,24 @@ (rotate:QI (match_operand:QI 1 "register_operand" "") (const_int 4)))]) -(define_insn "*rotlqi3" +(define_insn_and_split "*rotlqi3_split" [(set (match_operand:QI 0 "register_operand" "=r,r,r ,r ,r ,r ,r ,r") (rotate:QI (match_operand:QI 1 "register_operand" "0,0,0 ,0 ,0 ,0 ,0 ,0") (match_operand:QI 2 "const_0_to_7_operand" "P,K,C03,C04,C05,C06,C07,L")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (rotate:QI (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*rotlqi3" + [(set (match_operand:QI 0 "register_operand" "=r,r,r ,r ,r ,r ,r ,r") + (rotate:QI (match_operand:QI 1 "register_operand" "0,0,0 ,0 ,0 ,0 ,0 ,0") + (match_operand:QI 2 "const_0_to_7_operand" "P,K,C03,C04,C05,C06,C07,L"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ lsl %0\;adc %0,__zero_reg__ lsl %0\;adc %0,__zero_reg__\;lsl %0\;adc %0,__zero_reg__ @@ -3438,8 +4752,7 @@ swap %0\;lsl %0\;adc %0,__zero_reg__\;lsl %0\;adc %0,__zero_reg__ bst %0,0\;ror %0\;bld %0,7 " ; empty - [(set_attr "length" "2,4,4,1,3,5,3,0") - (set_attr "cc" "set_n,set_n,clobber,none,set_n,set_n,clobber,none")]) + [(set_attr "length" "2,4,4,1,3,5,3,0")]) ;; Split all rotates of HI,SI and PSImode registers where rotation is by ;; a whole number of bytes. The split creates the appropriate moves and @@ -3487,59 +4800,131 @@ FAIL; }) -(define_insn "*rotlhi2.1" +(define_insn_and_split "*rotlhi2.1_split" [(set (match_operand:HI 0 "register_operand" "=r") (rotate:HI (match_operand:HI 1 "register_operand" "0") (const_int 1)))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (rotate:HI (match_dup 1) + (const_int 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*rotlhi2.1" + [(set (match_operand:HI 0 "register_operand" "=r") + (rotate:HI (match_operand:HI 1 "register_operand" "0") + (const_int 1))) + (clobber (reg:CC REG_CC))] + "reload_completed" "lsl %A0\;rol %B0\;adc %A0,__zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) -(define_insn "*rotlhi2.15" +(define_insn_and_split "*rotlhi2.15_split" [(set (match_operand:HI 0 "register_operand" "=r") (rotate:HI (match_operand:HI 1 "register_operand" "0") (const_int 15)))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (rotate:HI (match_dup 1) + (const_int 15))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*rotlhi2.15" + [(set (match_operand:HI 0 "register_operand" "=r") + (rotate:HI (match_operand:HI 1 "register_operand" "0") + (const_int 15))) + (clobber (reg:CC REG_CC))] + "reload_completed" "bst %A0,0\;ror %B0\;ror %A0\;bld %B0,7" - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) -(define_insn "*rotlpsi2.1" +(define_insn_and_split "*rotlpsi2.1_split" [(set (match_operand:PSI 0 "register_operand" "=r") (rotate:PSI (match_operand:PSI 1 "register_operand" "0") (const_int 1)))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (rotate:PSI (match_dup 1) + (const_int 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*rotlpsi2.1" + [(set (match_operand:PSI 0 "register_operand" "=r") + (rotate:PSI (match_operand:PSI 1 "register_operand" "0") + (const_int 1))) + (clobber (reg:CC REG_CC))] + "reload_completed" "lsl %A0\;rol %B0\;rol %C0\;adc %A0,__zero_reg__" - [(set_attr "length" "4") - (set_attr "cc" "clobber")]) + [(set_attr "length" "4")]) -(define_insn "*rotlpsi2.23" +(define_insn_and_split "*rotlpsi2.23_split" [(set (match_operand:PSI 0 "register_operand" "=r") (rotate:PSI (match_operand:PSI 1 "register_operand" "0") (const_int 23)))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (rotate:PSI (match_dup 1) + (const_int 23))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*rotlpsi2.23" + [(set (match_operand:PSI 0 "register_operand" "=r") + (rotate:PSI (match_operand:PSI 1 "register_operand" "0") + (const_int 23))) + (clobber (reg:CC REG_CC))] + "reload_completed" "bst %A0,0\;ror %C0\;ror %B0\;ror %A0\;bld %C0,7" - [(set_attr "length" "5") - (set_attr "cc" "clobber")]) + [(set_attr "length" "5")]) -(define_insn "*rotlsi2.1" +(define_insn_and_split "*rotlsi2.1_split" [(set (match_operand:SI 0 "register_operand" "=r") (rotate:SI (match_operand:SI 1 "register_operand" "0") (const_int 1)))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (rotate:SI (match_dup 1) + (const_int 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*rotlsi2.1" + [(set (match_operand:SI 0 "register_operand" "=r") + (rotate:SI (match_operand:SI 1 "register_operand" "0") + (const_int 1))) + (clobber (reg:CC REG_CC))] + "reload_completed" "lsl %A0\;rol %B0\;rol %C0\;rol %D0\;adc %A0,__zero_reg__" - [(set_attr "length" "5") - (set_attr "cc" "clobber")]) + [(set_attr "length" "5")]) -(define_insn "*rotlsi2.31" +(define_insn_and_split "*rotlsi2.31_split" [(set (match_operand:SI 0 "register_operand" "=r") (rotate:SI (match_operand:SI 1 "register_operand" "0") (const_int 31)))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (rotate:SI (match_dup 1) + (const_int 31))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*rotlsi2.31" + [(set (match_operand:SI 0 "register_operand" "=r") + (rotate:SI (match_operand:SI 1 "register_operand" "0") + (const_int 31))) + (clobber (reg:CC REG_CC))] + "reload_completed" "bst %A0,0\;ror %D0\;ror %C0\;ror %B0\;ror %A0\;bld %D0,7" - [(set_attr "length" "6") - (set_attr "cc" "clobber")]) + [(set_attr "length" "6")]) ;; Overlapping non-HImode registers often (but not always) need a scratch. ;; The best we can do is use early clobber alternative "#&r" so that @@ -3644,29 +5029,53 @@ ;; "*ashlqi3" ;; "*ashlqq3" "*ashluqq3" -(define_insn "*ashl3" +(define_insn_and_split "*ashl3_split" [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,!d,r,r") (ashift:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0,0") (match_operand:QI 2 "nop_general_operand" "r,L,P,K,n ,n,Qm")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashift:ALL1 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashl3" + [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,!d,r,r") + (ashift:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,K,n ,n,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashlqi3_out (insn, operands, NULL); } [(set_attr "length" "5,0,1,2,4,6,9") - (set_attr "adjust_len" "ashlqi") - (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")]) + (set_attr "adjust_len" "ashlqi")]) -(define_insn "ashl3" +(define_insn_and_split "ashl3" [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r") (ashift:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0") (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashift:ALL2 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashl3" + [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r") + (ashift:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashlhi3_out (insn, operands, NULL); } [(set_attr "length" "6,0,2,2,4,10,10") - (set_attr "adjust_len" "ashlhi") - (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")]) + (set_attr "adjust_len" "ashlhi")]) ;; Insns like the following are generated when (implicitly) extending 8-bit shifts @@ -3752,17 +5161,29 @@ ;; "ashlsi3" ;; "ashlsq3" "ashlusq3" ;; "ashlsa3" "ashlusa3" -(define_insn "ashl3" +(define_insn_and_split "ashl3" [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r") (ashift:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0") (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashift:ALL4 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashl3" + [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r") + (ashift:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashlsi3_out (insn, operands, NULL); } [(set_attr "length" "8,0,4,4,8,10,12") - (set_attr "adjust_len" "ashlsi") - (set_attr "cc" "clobber,none,set_n,clobber,set_n,clobber,clobber")]) + (set_attr "adjust_len" "ashlsi")]) ;; Optimize if a scratch register from LD_REGS happens to be available. @@ -3821,18 +5242,32 @@ ;; "*ashlhi3_const" ;; "*ashlhq3_const" "*ashluhq3_const" ;; "*ashlha3_const" "*ashluha3_const" -(define_insn "*ashl3_const" +(define_insn_and_split "*ashl3_const_split" [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r") (ashift:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0") (match_operand:QI 2 "const_int_operand" "L,P,O,K,n"))) (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))] "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashift:ALL2 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashl3_const" + [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r") + (ashift:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0") + (match_operand:QI 2 "const_int_operand" "L,P,O,K,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashlhi3_out (insn, operands, NULL); } [(set_attr "length" "0,2,2,4,10") - (set_attr "adjust_len" "ashlhi") - (set_attr "cc" "none,set_n,clobber,set_n,clobber")]) + (set_attr "adjust_len" "ashlhi")]) (define_peephole2 [(match_scratch:QI 3 "d") @@ -3848,18 +5283,32 @@ ;; "*ashlsi3_const" ;; "*ashlsq3_const" "*ashlusq3_const" ;; "*ashlsa3_const" "*ashlusa3_const" -(define_insn "*ashl3_const" +(define_insn_and_split "*ashl3_const_split" [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r") (ashift:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0") (match_operand:QI 2 "const_int_operand" "L,P,O,n"))) (clobber (match_scratch:QI 3 "=X,X,X,&d"))] "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashift:ALL4 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashl3_const" + [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r") + (ashift:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0") + (match_operand:QI 2 "const_int_operand" "L,P,O,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashlsi3_out (insn, operands, NULL); } [(set_attr "length" "0,4,4,10") - (set_attr "adjust_len" "ashlsi") - (set_attr "cc" "none,set_n,clobber,clobber")]) + (set_attr "adjust_len" "ashlsi")]) (define_expand "ashlpsi3" [(parallel [(set (match_operand:PSI 0 "register_operand" "") @@ -3888,76 +5337,140 @@ } }) -(define_insn "*ashlpsi3" +(define_insn_and_split "*ashlpsi3_split" [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r") (ashift:PSI (match_operand:PSI 1 "register_operand" "0,0,r,0") (match_operand:QI 2 "nonmemory_operand" "r,P,O,n"))) (clobber (match_scratch:QI 3 "=X,X,X,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashift:PSI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashlpsi3" + [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r") + (ashift:PSI (match_operand:PSI 1 "register_operand" "0,0,r,0") + (match_operand:QI 2 "nonmemory_operand" "r,P,O,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_ashlpsi3 (insn, operands, NULL); } - [(set_attr "adjust_len" "ashlpsi") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "ashlpsi")]) ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> ;; arithmetic shift right ;; "ashrqi3" ;; "ashrqq3" "ashruqq3" -(define_insn "ashr3" +(define_insn_and_split "ashr3" [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,r ,r ,r") (ashiftrt:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0 ,0") (match_operand:QI 2 "nop_general_operand" "r,L,P,K,C03 C04 C05,C06 C07,Qm")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashiftrt:ALL1 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashr3" + [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,r ,r ,r") + (ashiftrt:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0 ,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,K,C03 C04 C05,C06 C07,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashrqi3_out (insn, operands, NULL); } [(set_attr "length" "5,0,1,2,5,4,9") - (set_attr "adjust_len" "ashrqi") - (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,clobber,clobber")]) + (set_attr "adjust_len" "ashrqi")]) ;; "ashrhi3" ;; "ashrhq3" "ashruhq3" ;; "ashrha3" "ashruha3" -(define_insn "ashr3" +(define_insn_and_split "ashr3" [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r") (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0") (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r") + (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm"))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashr3" + [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r") + (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashrhi3_out (insn, operands, NULL); } [(set_attr "length" "6,0,2,4,4,10,10") - (set_attr "adjust_len" "ashrhi") - (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")]) + (set_attr "adjust_len" "ashrhi")]) -(define_insn "ashrpsi3" +(define_insn_and_split "ashrpsi3" [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r,r") (ashiftrt:PSI (match_operand:PSI 1 "register_operand" "0,0,0,r,0") (match_operand:QI 2 "nonmemory_operand" "r,P,K,O,n"))) (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashiftrt:PSI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashrpsi3" + [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r,r") + (ashiftrt:PSI (match_operand:PSI 1 "register_operand" "0,0,0,r,0") + (match_operand:QI 2 "nonmemory_operand" "r,P,K,O,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_ashrpsi3 (insn, operands, NULL); } - [(set_attr "adjust_len" "ashrpsi") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "ashrpsi")]) ;; "ashrsi3" ;; "ashrsq3" "ashrusq3" ;; "ashrsa3" "ashrusa3" -(define_insn "ashr3" +(define_insn_and_split "ashr3" + [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r") + (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))] + "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashiftrt:ALL4 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashr3" [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r") (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0") - (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))] - "" + (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashrsi3_out (insn, operands, NULL); } [(set_attr "length" "8,0,4,6,8,10,12") - (set_attr "adjust_len" "ashrsi") - (set_attr "cc" "clobber,none,clobber,set_n,clobber,clobber,clobber")]) + (set_attr "adjust_len" "ashrsi")]) ;; Optimize if a scratch register from LD_REGS happens to be available. @@ -3975,18 +5488,32 @@ ;; "*ashrhi3_const" ;; "*ashrhq3_const" "*ashruhq3_const" ;; "*ashrha3_const" "*ashruha3_const" -(define_insn "*ashr3_const" +(define_insn_and_split "*ashr3_const_split" [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r") (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0") (match_operand:QI 2 "const_int_operand" "L,P,O,K,n"))) (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))] "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashiftrt:ALL2 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashr3_const" + [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r") + (ashiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0") + (match_operand:QI 2 "const_int_operand" "L,P,O,K,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashrhi3_out (insn, operands, NULL); } [(set_attr "length" "0,2,4,4,10") - (set_attr "adjust_len" "ashrhi") - (set_attr "cc" "none,clobber,set_n,clobber,clobber")]) + (set_attr "adjust_len" "ashrhi")]) (define_peephole2 [(match_scratch:QI 3 "d") @@ -4002,18 +5529,32 @@ ;; "*ashrsi3_const" ;; "*ashrsq3_const" "*ashrusq3_const" ;; "*ashrsa3_const" "*ashrusa3_const" -(define_insn "*ashr3_const" +(define_insn_and_split "*ashr3_const_split" [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r") (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0") (match_operand:QI 2 "const_int_operand" "L,P,O,n"))) (clobber (match_scratch:QI 3 "=X,X,X,&d"))] "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (ashiftrt:ALL4 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ashr3_const" + [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r") + (ashiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0") + (match_operand:QI 2 "const_int_operand" "L,P,O,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ashrsi3_out (insn, operands, NULL); } [(set_attr "length" "0,4,4,10") - (set_attr "adjust_len" "ashrsi") - (set_attr "cc" "none,clobber,set_n,clobber")]) + (set_attr "adjust_len" "ashrsi")]) ;; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> ;; logical shift right @@ -4067,59 +5608,109 @@ ;; "*lshrqi3" ;; "*lshrqq3" ;; "*lshruqq3" -(define_insn "*lshr3" +(define_insn_and_split "*lshr3_split" [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,!d,r,r") (lshiftrt:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0,0") (match_operand:QI 2 "nop_general_operand" "r,L,P,K,n ,n,Qm")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (lshiftrt:ALL1 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*lshr3" + [(set (match_operand:ALL1 0 "register_operand" "=r,r,r,r,!d,r,r") + (lshiftrt:ALL1 (match_operand:ALL1 1 "register_operand" "0,0,0,0,0 ,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,K,n ,n,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return lshrqi3_out (insn, operands, NULL); } [(set_attr "length" "5,0,1,2,4,6,9") - (set_attr "adjust_len" "lshrqi") - (set_attr "cc" "clobber,none,set_czn,set_czn,set_czn,set_czn,clobber")]) + (set_attr "adjust_len" "lshrqi")]) ;; "lshrhi3" ;; "lshrhq3" "lshruhq3" ;; "lshrha3" "lshruha3" -(define_insn "lshr3" +(define_insn_and_split "lshr3" [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r") (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0") (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (lshiftrt:ALL2 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*lshr3" + [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r,r,r") + (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,0,r,0,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return lshrhi3_out (insn, operands, NULL); } [(set_attr "length" "6,0,2,2,4,10,10") - (set_attr "adjust_len" "lshrhi") - (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")]) + (set_attr "adjust_len" "lshrhi")]) -(define_insn "lshrpsi3" +(define_insn_and_split "lshrpsi3" [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r,r") (lshiftrt:PSI (match_operand:PSI 1 "register_operand" "0,0,r,0,0") (match_operand:QI 2 "nonmemory_operand" "r,P,O,K,n"))) (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (lshiftrt:PSI (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*lshrpsi3" + [(set (match_operand:PSI 0 "register_operand" "=r,r,r,r,r") + (lshiftrt:PSI (match_operand:PSI 1 "register_operand" "0,0,r,0,0") + (match_operand:QI 2 "nonmemory_operand" "r,P,O,K,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_lshrpsi3 (insn, operands, NULL); } - [(set_attr "adjust_len" "lshrpsi") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "lshrpsi")]) ;; "lshrsi3" ;; "lshrsq3" "lshrusq3" ;; "lshrsa3" "lshrusa3" -(define_insn "lshr3" +(define_insn_and_split "lshr3" [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r") (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0") (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (lshiftrt:ALL4 (match_dup 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*lshr3" + [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r,r,r,r") + (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,0,r,0,0,0") + (match_operand:QI 2 "nop_general_operand" "r,L,P,O,K,n,Qm"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return lshrsi3_out (insn, operands, NULL); } [(set_attr "length" "8,0,4,4,8,10,12") - (set_attr "adjust_len" "lshrsi") - (set_attr "cc" "clobber,none,clobber,clobber,clobber,clobber,clobber")]) + (set_attr "adjust_len" "lshrsi")]) ;; Optimize if a scratch register from LD_REGS happens to be available. @@ -4178,18 +5769,32 @@ ;; "*lshrhi3_const" ;; "*lshrhq3_const" "*lshruhq3_const" ;; "*lshrha3_const" "*lshruha3_const" -(define_insn "*lshr3_const" +(define_insn_and_split "*lshr3_const_split" [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r") (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0") (match_operand:QI 2 "const_int_operand" "L,P,O,K,n"))) (clobber (match_scratch:QI 3 "=X,X,X,X,&d"))] "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (lshiftrt:ALL2 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*lshr3_const" + [(set (match_operand:ALL2 0 "register_operand" "=r,r,r,r,r") + (lshiftrt:ALL2 (match_operand:ALL2 1 "register_operand" "0,0,r,0,0") + (match_operand:QI 2 "const_int_operand" "L,P,O,K,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return lshrhi3_out (insn, operands, NULL); } [(set_attr "length" "0,2,2,4,10") - (set_attr "adjust_len" "lshrhi") - (set_attr "cc" "none,clobber,clobber,clobber,clobber")]) + (set_attr "adjust_len" "lshrhi")]) (define_peephole2 [(match_scratch:QI 3 "d") @@ -4205,143 +5810,279 @@ ;; "*lshrsi3_const" ;; "*lshrsq3_const" "*lshrusq3_const" ;; "*lshrsa3_const" "*lshrusa3_const" -(define_insn "*lshr3_const" +(define_insn_and_split "*lshr3_const_split" [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r") (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0") (match_operand:QI 2 "const_int_operand" "L,P,O,n"))) (clobber (match_scratch:QI 3 "=X,X,X,&d"))] "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (lshiftrt:ALL4 (match_dup 1) + (match_dup 2))) + (clobber (match_dup 3)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*lshr3_const" + [(set (match_operand:ALL4 0 "register_operand" "=r,r,r,r") + (lshiftrt:ALL4 (match_operand:ALL4 1 "register_operand" "0,0,r,0") + (match_operand:QI 2 "const_int_operand" "L,P,O,n"))) + (clobber (match_scratch:QI 3 "=X,X,X,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" { return lshrsi3_out (insn, operands, NULL); } [(set_attr "length" "0,4,4,10") - (set_attr "adjust_len" "lshrsi") - (set_attr "cc" "none,clobber,clobber,clobber")]) + (set_attr "adjust_len" "lshrsi")]) ;; abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) abs(x) ;; abs -(define_insn "absqi2" +(define_insn_and_split "absqi2" [(set (match_operand:QI 0 "register_operand" "=r") (abs:QI (match_operand:QI 1 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (abs:QI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*absqi2" + [(set (match_operand:QI 0 "register_operand" "=r") + (abs:QI (match_operand:QI 1 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "sbrc %0,7 neg %0" - [(set_attr "length" "2") - (set_attr "cc" "clobber")]) + [(set_attr "length" "2")]) -(define_insn "abssf2" +(define_insn_and_split "abssf2" [(set (match_operand:SF 0 "register_operand" "=d,r") (abs:SF (match_operand:SF 1 "register_operand" "0,0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (abs:SF (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*abssf2" + [(set (match_operand:SF 0 "register_operand" "=d,r") + (abs:SF (match_operand:SF 1 "register_operand" "0,0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ andi %D0,0x7f clt\;bld %D0,7" - [(set_attr "length" "1,2") - (set_attr "cc" "set_n,clobber")]) + [(set_attr "length" "1,2")]) ;; 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x 0 - x ;; neg -(define_insn "negqi2" +(define_insn_and_split "negqi2" [(set (match_operand:QI 0 "register_operand" "=r") (neg:QI (match_operand:QI 1 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (neg:QI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*negqi2" + [(set (match_operand:QI 0 "register_operand" "=r") + (neg:QI (match_operand:QI 1 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "neg %0" - [(set_attr "length" "1") - (set_attr "cc" "set_vzn")]) + [(set_attr "length" "1")]) -(define_insn "*negqihi2" +(define_insn_and_split "*negqihi2_split" [(set (match_operand:HI 0 "register_operand" "=r") (neg:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "0"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (neg:HI (sign_extend:HI (match_dup 1)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*negqihi2" + [(set (match_operand:HI 0 "register_operand" "=r") + (neg:HI (sign_extend:HI (match_operand:QI 1 "register_operand" "0")))) + (clobber (reg:CC REG_CC))] + "reload_completed" "clr %B0\;neg %A0\;brge .+2\;com %B0" - [(set_attr "length" "4") - (set_attr "cc" "set_n")]) + [(set_attr "length" "4")]) -(define_insn "neghi2" +(define_insn_and_split "neghi2" [(set (match_operand:HI 0 "register_operand" "=r,&r") (neg:HI (match_operand:HI 1 "register_operand" "0,r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (neg:HI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*neghi2" + [(set (match_operand:HI 0 "register_operand" "=r,&r") + (neg:HI (match_operand:HI 1 "register_operand" "0,r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ neg %B0\;neg %A0\;sbc %B0,__zero_reg__ clr %A0\;clr %B0\;sub %A0,%A1\;sbc %B0,%B1" - [(set_attr "length" "3,4") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "3,4")]) -(define_insn "negpsi2" +(define_insn_and_split "negpsi2" [(set (match_operand:PSI 0 "register_operand" "=!d,r,&r") (neg:PSI (match_operand:PSI 1 "register_operand" "0,0,r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (neg:PSI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*negpsi2" + [(set (match_operand:PSI 0 "register_operand" "=!d,r,&r") + (neg:PSI (match_operand:PSI 1 "register_operand" "0,0,r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ com %C0\;com %B0\;neg %A0\;sbci %B0,-1\;sbci %C0,-1 com %C0\;com %B0\;com %A0\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__ clr %A0\;clr %B0\;clr %C0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1" - [(set_attr "length" "5,6,6") - (set_attr "cc" "set_czn,set_n,set_czn")]) + [(set_attr "length" "5,6,6")]) -(define_insn "negsi2" +(define_insn_and_split "negsi2" [(set (match_operand:SI 0 "register_operand" "=!d,r,&r,&r") (neg:SI (match_operand:SI 1 "register_operand" "0,0,r ,r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (neg:SI (match_dup 1))) + (clobber (reg:CC REG_CC))])] + "" + [(set_attr "isa" "*,*,mov,movw")]) + +(define_insn "*negsi2" + [(set (match_operand:SI 0 "register_operand" "=!d,r,&r,&r") + (neg:SI (match_operand:SI 1 "register_operand" "0,0,r ,r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ com %D0\;com %C0\;com %B0\;neg %A0\;sbci %B0,lo8(-1)\;sbci %C0,lo8(-1)\;sbci %D0,lo8(-1) com %D0\;com %C0\;com %B0\;com %A0\;adc %A0,__zero_reg__\;adc %B0,__zero_reg__\;adc %C0,__zero_reg__\;adc %D0,__zero_reg__ clr %A0\;clr %B0\;clr %C0\;clr %D0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1\;sbc %D0,%D1 clr %A0\;clr %B0\;movw %C0,%A0\;sub %A0,%A1\;sbc %B0,%B1\;sbc %C0,%C1\;sbc %D0,%D1" [(set_attr "length" "7,8,8,7") - (set_attr "isa" "*,*,mov,movw") - (set_attr "cc" "set_czn,set_n,set_czn,set_czn")]) + (set_attr "isa" "*,*,mov,movw")]) -(define_insn "negsf2" +(define_insn_and_split "negsf2" [(set (match_operand:SF 0 "register_operand" "=d,r") (neg:SF (match_operand:SF 1 "register_operand" "0,0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (neg:SF (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*negsf2" + [(set (match_operand:SF 0 "register_operand" "=d,r") + (neg:SF (match_operand:SF 1 "register_operand" "0,0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ subi %D0,0x80 bst %D0,7\;com %D0\;bld %D0,7\;com %D0" - [(set_attr "length" "1,4") - (set_attr "cc" "set_n,set_n")]) + [(set_attr "length" "1,4")]) ;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;; not -(define_insn "one_cmplqi2" +(define_insn_and_split "one_cmplqi2" [(set (match_operand:QI 0 "register_operand" "=r") (not:QI (match_operand:QI 1 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (not:QI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*one_cmplqi2" + [(set (match_operand:QI 0 "register_operand" "=r") + (not:QI (match_operand:QI 1 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "com %0" - [(set_attr "length" "1") - (set_attr "cc" "set_czn")]) + [(set_attr "length" "1")]) -(define_insn "one_cmplhi2" +(define_insn_and_split "one_cmplhi2" [(set (match_operand:HI 0 "register_operand" "=r") (not:HI (match_operand:HI 1 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (not:HI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*one_cmplhi2" + [(set (match_operand:HI 0 "register_operand" "=r") + (not:HI (match_operand:HI 1 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "com %0 com %B0" - [(set_attr "length" "2") - (set_attr "cc" "set_n")]) + [(set_attr "length" "2")]) -(define_insn "one_cmplpsi2" +(define_insn_and_split "one_cmplpsi2" [(set (match_operand:PSI 0 "register_operand" "=r") (not:PSI (match_operand:PSI 1 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (not:PSI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*one_cmplpsi2" + [(set (match_operand:PSI 0 "register_operand" "=r") + (not:PSI (match_operand:PSI 1 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "com %0\;com %B0\;com %C0" - [(set_attr "length" "3") - (set_attr "cc" "set_n")]) + [(set_attr "length" "3")]) -(define_insn "one_cmplsi2" +(define_insn_and_split "one_cmplsi2" [(set (match_operand:SI 0 "register_operand" "=r") (not:SI (match_operand:SI 1 "register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (not:SI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*one_cmplsi2" + [(set (match_operand:SI 0 "register_operand" "=r") + (not:SI (match_operand:SI 1 "register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "com %0 com %B0 com %C0 com %D0" - [(set_attr "length" "4") - (set_attr "cc" "set_n")]) + [(set_attr "length" "4")]) ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x ;; sign extend @@ -4353,71 +6094,131 @@ ;; multiplication. There is no need for combine to propagate hard registers, ;; register allocation can do it just as well. -(define_insn "extendqihi2" +(define_insn_and_split "extendqihi2" [(set (match_operand:HI 0 "register_operand" "=r,r") (sign_extend:HI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (sign_extend:HI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*extendqihi2" + [(set (match_operand:HI 0 "register_operand" "=r,r") + (sign_extend:HI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sign_extend (insn, operands, NULL); } [(set_attr "length" "3,4") - (set_attr "adjust_len" "sext") - (set_attr "cc" "set_n")]) + (set_attr "adjust_len" "sext")]) -(define_insn "extendqipsi2" +(define_insn_and_split "extendqipsi2" [(set (match_operand:PSI 0 "register_operand" "=r,r") (sign_extend:PSI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (sign_extend:PSI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*extendqipsi2" + [(set (match_operand:PSI 0 "register_operand" "=r,r") + (sign_extend:PSI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sign_extend (insn, operands, NULL); } [(set_attr "length" "4,5") - (set_attr "adjust_len" "sext") - (set_attr "cc" "set_n")]) + (set_attr "adjust_len" "sext")]) -(define_insn "extendqisi2" +(define_insn_and_split "extendqisi2" [(set (match_operand:SI 0 "register_operand" "=r,r") (sign_extend:SI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (sign_extend:SI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*extendqisi2" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (sign_extend:SI (match_operand:QI 1 "combine_pseudo_register_operand" "0,*r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sign_extend (insn, operands, NULL); } [(set_attr "length" "5,6") - (set_attr "adjust_len" "sext") - (set_attr "cc" "set_n")]) + (set_attr "adjust_len" "sext")]) -(define_insn "extendhipsi2" +(define_insn_and_split "extendhipsi2" [(set (match_operand:PSI 0 "register_operand" "=r,r") (sign_extend:PSI (match_operand:HI 1 "combine_pseudo_register_operand" "0,*r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (sign_extend:PSI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*extendhipsi2" + [(set (match_operand:PSI 0 "register_operand" "=r,r") + (sign_extend:PSI (match_operand:HI 1 "combine_pseudo_register_operand" "0,*r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sign_extend (insn, operands, NULL); } [(set_attr "length" "3,5") - (set_attr "adjust_len" "sext") - (set_attr "cc" "set_n")]) + (set_attr "adjust_len" "sext")]) -(define_insn "extendhisi2" +(define_insn_and_split "extendhisi2" [(set (match_operand:SI 0 "register_operand" "=r,r") (sign_extend:SI (match_operand:HI 1 "combine_pseudo_register_operand" "0,*r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (sign_extend:SI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*extendhisi2" + [(set (match_operand:SI 0 "register_operand" "=r,r") + (sign_extend:SI (match_operand:HI 1 "combine_pseudo_register_operand" "0,*r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sign_extend (insn, operands, NULL); } [(set_attr "length" "4,6") - (set_attr "adjust_len" "sext") - (set_attr "cc" "set_n")]) + (set_attr "adjust_len" "sext")]) -(define_insn "extendpsisi2" +(define_insn_and_split "extendpsisi2" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:PSI 1 "combine_pseudo_register_operand" "0")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (sign_extend:SI (match_dup 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*extendpsisi2" + [(set (match_operand:SI 0 "register_operand" "=r") + (sign_extend:SI (match_operand:PSI 1 "combine_pseudo_register_operand" "0"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sign_extend (insn, operands, NULL); } [(set_attr "length" "3") - (set_attr "adjust_len" "sext") - (set_attr "cc" "set_n")]) + (set_attr "adjust_len" "sext")]) ;; xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x xx<---x ;; zero extend @@ -4585,145 +6386,133 @@ ; Optimize negated tests into reverse compare if overflow is undefined. (define_insn "*negated_tstqi" - [(set (cc0) - (compare (neg:QI (match_operand:QI 0 "register_operand" "r")) + [(set (reg:CC REG_CC) + (compare:CC (neg:QI (match_operand:QI 0 "register_operand" "r")) (const_int 0)))] - "!flag_wrapv && !flag_trapv" + "reload_completed && !flag_wrapv && !flag_trapv" "cp __zero_reg__,%0" - [(set_attr "cc" "compare") - (set_attr "length" "1")]) + [(set_attr "length" "1")]) (define_insn "*reversed_tstqi" - [(set (cc0) - (compare (const_int 0) + [(set (reg:CC REG_CC) + (compare:CC (const_int 0) (match_operand:QI 0 "register_operand" "r")))] - "" + "reload_completed" "cp __zero_reg__,%0" -[(set_attr "cc" "compare") - (set_attr "length" "2")]) +[(set_attr "length" "2")]) (define_insn "*negated_tsthi" - [(set (cc0) - (compare (neg:HI (match_operand:HI 0 "register_operand" "r")) + [(set (reg:CC REG_CC) + (compare:CC (neg:HI (match_operand:HI 0 "register_operand" "r")) (const_int 0)))] - "!flag_wrapv && !flag_trapv" + "reload_completed && !flag_wrapv && !flag_trapv" "cp __zero_reg__,%A0 cpc __zero_reg__,%B0" -[(set_attr "cc" "compare") - (set_attr "length" "2")]) +[(set_attr "length" "2")]) ;; Leave here the clobber used by the cmphi pattern for simplicity, even ;; though it is unused, because this pattern is synthesized by avr_reorg. (define_insn "*reversed_tsthi" - [(set (cc0) - (compare (const_int 0) + [(set (reg:CC REG_CC) + (compare:CC (const_int 0) (match_operand:HI 0 "register_operand" "r"))) (clobber (match_scratch:QI 1 "=X"))] - "" + "reload_completed" "cp __zero_reg__,%A0 cpc __zero_reg__,%B0" -[(set_attr "cc" "compare") - (set_attr "length" "2")]) +[(set_attr "length" "2")]) (define_insn "*negated_tstpsi" - [(set (cc0) - (compare (neg:PSI (match_operand:PSI 0 "register_operand" "r")) + [(set (reg:CC REG_CC) + (compare:CC (neg:PSI (match_operand:PSI 0 "register_operand" "r")) (const_int 0)))] - "!flag_wrapv && !flag_trapv" + "reload_completed && !flag_wrapv && !flag_trapv" "cp __zero_reg__,%A0\;cpc __zero_reg__,%B0\;cpc __zero_reg__,%C0" - [(set_attr "cc" "compare") - (set_attr "length" "3")]) + [(set_attr "length" "3")]) (define_insn "*reversed_tstpsi" - [(set (cc0) - (compare (const_int 0) + [(set (reg:CC REG_CC) + (compare:CC (const_int 0) (match_operand:PSI 0 "register_operand" "r"))) (clobber (match_scratch:QI 1 "=X"))] - "" + "reload_completed" "cp __zero_reg__,%A0\;cpc __zero_reg__,%B0\;cpc __zero_reg__,%C0" - [(set_attr "cc" "compare") - (set_attr "length" "3")]) + [(set_attr "length" "3")]) (define_insn "*negated_tstsi" - [(set (cc0) - (compare (neg:SI (match_operand:SI 0 "register_operand" "r")) + [(set (reg:CC REG_CC) + (compare:CC (neg:SI (match_operand:SI 0 "register_operand" "r")) (const_int 0)))] - "!flag_wrapv && !flag_trapv" + "reload_completed && !flag_wrapv && !flag_trapv" "cp __zero_reg__,%A0 cpc __zero_reg__,%B0 cpc __zero_reg__,%C0 cpc __zero_reg__,%D0" - [(set_attr "cc" "compare") - (set_attr "length" "4")]) + [(set_attr "length" "4")]) ;; "*reversed_tstsi" ;; "*reversed_tstsq" "*reversed_tstusq" ;; "*reversed_tstsa" "*reversed_tstusa" (define_insn "*reversed_tst" - [(set (cc0) - (compare (match_operand:ALL4 0 "const0_operand" "Y00") + [(set (reg:CC REG_CC) + (compare:CC (match_operand:ALL4 0 "const0_operand" "Y00") (match_operand:ALL4 1 "register_operand" "r"))) (clobber (match_scratch:QI 2 "=X"))] - "" + "reload_completed" "cp __zero_reg__,%A1 cpc __zero_reg__,%B1 cpc __zero_reg__,%C1 cpc __zero_reg__,%D1" - [(set_attr "cc" "compare") - (set_attr "length" "4")]) + [(set_attr "length" "4")]) ;; "cmpqi3" ;; "cmpqq3" "cmpuqq3" (define_insn "cmp3" - [(set (cc0) - (compare (match_operand:ALL1 0 "register_operand" "r ,r,d") + [(set (reg:CC REG_CC) + (compare:CC (match_operand:ALL1 0 "register_operand" "r ,r,d") (match_operand:ALL1 1 "nonmemory_operand" "Y00,r,i")))] - "" + "reload_completed" "@ tst %0 cp %0,%1 cpi %0,lo8(%1)" - [(set_attr "cc" "compare,compare,compare") - (set_attr "length" "1,1,1")]) + [(set_attr "length" "1,1,1")]) (define_insn "*cmpqi_sign_extend" - [(set (cc0) - (compare (sign_extend:HI (match_operand:QI 0 "register_operand" "d")) + [(set (reg:CC REG_CC) + (compare:CC (sign_extend:HI (match_operand:QI 0 "register_operand" "d")) (match_operand:HI 1 "s8_operand" "n")))] - "" + "reload_completed" "cpi %0,lo8(%1)" - [(set_attr "cc" "compare") - (set_attr "length" "1")]) + [(set_attr "length" "1")]) (define_insn "*cmphi.zero-extend.0" - [(set (cc0) - (compare (zero_extend:HI (match_operand:QI 0 "register_operand" "r")) + [(set (reg:CC REG_CC) + (compare:CC (zero_extend:HI (match_operand:QI 0 "register_operand" "r")) (match_operand:HI 1 "register_operand" "r")))] - "" + "reload_completed" "cp %0,%A1\;cpc __zero_reg__,%B1" - [(set_attr "cc" "compare") - (set_attr "length" "2")]) + [(set_attr "length" "2")]) (define_insn "*cmphi.zero-extend.1" - [(set (cc0) - (compare (match_operand:HI 0 "register_operand" "r") + [(set (reg:CC REG_CC) + (compare:CC (match_operand:HI 0 "register_operand" "r") (zero_extend:HI (match_operand:QI 1 "register_operand" "r"))))] - "" + "reload_completed" "cp %A0,%1\;cpc %B0,__zero_reg__" - [(set_attr "cc" "compare") - (set_attr "length" "2")]) + [(set_attr "length" "2")]) ;; "cmphi3" ;; "cmphq3" "cmpuhq3" ;; "cmpha3" "cmpuha3" (define_insn "cmp3" - [(set (cc0) - (compare (match_operand:ALL2 0 "register_operand" "!w ,r ,r,d ,r ,d,r") + [(set (reg:CC REG_CC) + (compare:CC (match_operand:ALL2 0 "register_operand" "!w ,r ,r,d ,r ,d,r") (match_operand:ALL2 1 "nonmemory_operand" "Y00,Y00,r,s ,s ,M,n Ynn"))) (clobber (match_scratch:QI 2 "=X ,X ,X,&d,&d ,X,&d"))] - "" + "reload_completed" { switch (which_alternative) { @@ -4749,16 +6538,15 @@ return avr_out_compare (insn, operands, NULL); } - [(set_attr "cc" "compare") - (set_attr "length" "1,2,2,3,4,2,4") + [(set_attr "length" "1,2,2,3,4,2,4") (set_attr "adjust_len" "tsthi,tsthi,*,*,*,compare,compare")]) (define_insn "*cmppsi" - [(set (cc0) - (compare (match_operand:PSI 0 "register_operand" "r,r,d ,r ,d,r") + [(set (reg:CC REG_CC) + (compare:CC (match_operand:PSI 0 "register_operand" "r,r,d ,r ,d,r") (match_operand:PSI 1 "nonmemory_operand" "L,r,s ,s ,M,n"))) (clobber (match_scratch:QI 2 "=X,X,&d,&d ,X,&d"))] - "" + "reload_completed" { switch (which_alternative) { @@ -4779,19 +6567,18 @@ return avr_out_compare (insn, operands, NULL); } - [(set_attr "cc" "compare") - (set_attr "length" "3,3,5,6,3,7") + [(set_attr "length" "3,3,5,6,3,7") (set_attr "adjust_len" "tstpsi,*,*,*,compare,compare")]) ;; "*cmpsi" ;; "*cmpsq" "*cmpusq" ;; "*cmpsa" "*cmpusa" (define_insn "*cmp" - [(set (cc0) - (compare (match_operand:ALL4 0 "register_operand" "r ,r ,d,r ,r") + [(set (reg:CC REG_CC) + (compare:CC (match_operand:ALL4 0 "register_operand" "r ,r ,d,r ,r") (match_operand:ALL4 1 "nonmemory_operand" "Y00,r ,M,M ,n Ynn"))) (clobber (match_scratch:QI 2 "=X ,X ,X,&d,&d"))] - "" + "reload_completed" { if (0 == which_alternative) return avr_out_tstsi (insn, operands, NULL); @@ -4800,8 +6587,7 @@ return avr_out_compare (insn, operands, NULL); } - [(set_attr "cc" "compare") - (set_attr "length" "4,4,4,5,8") + [(set_attr "length" "4,4,4,5,8") (set_attr "adjust_len" "tstsi,*,compare,compare,compare")]) @@ -4810,38 +6596,144 @@ ;; ---------------------------------------------------------------------- ;; Conditional jump instructions -;; "cbranchqi4" -;; "cbranchqq4" "cbranchuqq4" (define_expand "cbranch4" - [(set (cc0) - (compare (match_operand:ALL1 1 "register_operand" "") - (match_operand:ALL1 2 "nonmemory_operand" ""))) - (set (pc) - (if_then_else - (match_operator 0 "ordered_comparison_operator" [(cc0) - (const_int 0)]) + [(set (pc) + (if_then_else (match_operator 0 "ordered_comparison_operator" + [(match_operand:ALL1 1 "register_operand" "") + (match_operand:ALL1 2 "nonmemory_operand" "")]) (label_ref (match_operand 3 "" "")) (pc)))]) -;; "cbranchhi4" "cbranchhq4" "cbranchuhq4" "cbranchha4" "cbranchuha4" -;; "cbranchsi4" "cbranchsq4" "cbranchusq4" "cbranchsa4" "cbranchusa4" -;; "cbranchpsi4" (define_expand "cbranch4" - [(parallel [(set (cc0) - (compare (match_operand:ORDERED234 1 "register_operand" "") - (match_operand:ORDERED234 2 "nonmemory_operand" ""))) - (clobber (match_scratch:QI 4 ""))]) - (set (pc) + [(parallel + [(set (pc) + (if_then_else + (match_operator 0 "ordered_comparison_operator" + [(match_operand:ORDERED234 1 "register_operand" "") + (match_operand:ORDERED234 2 "nonmemory_operand" "")]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (match_scratch:QI 4 ""))])]) + +;; "*cbranchqi4" +;; "*cbranchqq4" "*cbranchuqq4" +(define_insn_and_split "*cbranch4" + [(set (pc) + (if_then_else (match_operator 0 "ordered_comparison_operator" + [(match_operand:ALL1 1 "register_operand" "r ,r,d") + (match_operand:ALL1 2 "nonmemory_operand" "Y00,r,i")]) + (label_ref (match_operand 3 "" "")) + (pc)))] + "" + "#" + "reload_completed" + [(set (reg:CC REG_CC) + (compare:CC (match_dup 1) (match_dup 2))) + (set (pc) + (if_then_else (match_op_dup 0 + [(reg:CC REG_CC) (const_int 0)]) + (label_ref (match_dup 3)) + (pc)))] + "") + +;; "*cbranchsi4" "*cbranchsq4" "*cbranchusq4" "*cbranchsa4" "*cbranchusa4" +(define_insn_and_split "*cbranch4" + [(set (pc) + (if_then_else + (match_operator 0 "ordered_comparison_operator" + [(match_operand:ALL4 1 "register_operand" "r ,r ,d,r ,r") + (match_operand:ALL4 2 "nonmemory_operand" "Y00,r ,M,M ,n Ynn")]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (match_scratch:QI 4 "=X ,X ,X,&d,&d"))] + "" + "#" + "reload_completed" + [(parallel [(set (reg:CC REG_CC) + (compare:CC (match_dup 1) (match_dup 2))) + (clobber (match_dup 4))]) + (set (pc) + (if_then_else (match_op_dup 0 + [(reg:CC REG_CC) (const_int 0)]) + (label_ref (match_dup 3)) + (pc)))] + "") + +;; "*cbranchpsi4" +(define_insn_and_split "*cbranchpsi4" + [(set (pc) + (if_then_else + (match_operator 0 "ordered_comparison_operator" + [(match_operand:PSI 1 "register_operand" "r,r,d ,r ,d,r") + (match_operand:PSI 2 "nonmemory_operand" "L,r,s ,s ,M,n")]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (match_scratch:QI 4 "=X,X,&d,&d ,X,&d"))] + "" + "#" + "reload_completed" + [(parallel [(set (reg:CC REG_CC) + (compare:CC (match_dup 1) (match_dup 2))) + (clobber (match_dup 4))]) + (set (pc) + (if_then_else (match_op_dup 0 + [(reg:CC REG_CC) (const_int 0)]) + (label_ref (match_dup 3)) + (pc)))] + "") + +;; "*cbranchhi4" "*cbranchhq4" "*cbranchuhq4" "*cbranchha4" "*cbranchuha4" +(define_insn_and_split "*cbranch4" + [(set (pc) + (if_then_else + (match_operator 0 "ordered_comparison_operator" + [(match_operand:ALL2 1 "register_operand" "!w ,r ,r,d ,r ,d,r") + (match_operand:ALL2 2 "nonmemory_operand" "Y00,Y00,r,s ,s ,M,n Ynn")]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (match_scratch:QI 4 "=X ,X ,X,&d,&d ,X,&d"))] + "" + "#" + "reload_completed" + [(parallel [(set (reg:CC REG_CC) + (compare:CC (match_dup 1) (match_dup 2))) + (clobber (match_dup 4))]) + (set (pc) + (if_then_else (match_op_dup 0 + [(reg:CC REG_CC) (const_int 0)]) + (label_ref (match_dup 3)) + (pc)))] + "") + +;; Test a single bit in a QI/HI/SImode register. +;; Combine will create zero extract patterns for single bit tests. +;; permit any mode in source pattern by using VOIDmode. + +(define_insn_and_split "*sbrx_branch_split" + [(set (pc) (if_then_else - (match_operator 0 "ordered_comparison_operator" [(cc0) - (const_int 0)]) + (match_operator 0 "eqne_operator" + [(zero_extract:QIDI + (match_operand:VOID 1 "register_operand" "r") + (const_int 1) + (match_operand 2 "const_int_operand" "n")) + (const_int 0)]) (label_ref (match_operand 3 "" "")) - (pc)))]) - - -;; Test a single bit in a QI/HI/SImode register. -;; Combine will create zero extract patterns for single bit tests. -;; permit any mode in source pattern by using VOIDmode. + (pc)))] + "" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else + (match_op_dup 0 + [(zero_extract:QIDI + (match_dup 1) + (const_int 1) + (match_dup 2)) + (const_int 0)]) + (label_ref (match_dup 3)) + (pc))) + (clobber (reg:CC REG_CC))])]) (define_insn "*sbrx_branch" [(set (pc) @@ -4853,8 +6745,9 @@ (match_operand 2 "const_int_operand" "n")) (const_int 0)]) (label_ref (match_operand 3 "" "")) - (pc)))] - "" + (pc))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sbxx_branch (insn, operands); } @@ -4864,14 +6757,13 @@ (const_int 2) (if_then_else (match_test "!AVR_HAVE_JMP_CALL") (const_int 2) - (const_int 4)))) - (set_attr "cc" "clobber")]) + (const_int 4))))]) ;; Same test based on bitwise AND. Keep this in case gcc changes patterns. ;; or for old peepholes. ;; Fixme - bitwise Mask will not work for DImode -(define_insn "*sbrx_and_branch" +(define_insn_and_split "*sbrx_and_branch_split" [(set (pc) (if_then_else (match_operator 0 "eqne_operator" @@ -4882,6 +6774,31 @@ (label_ref (match_operand 3 "" "")) (pc)))] "" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else + (match_op_dup 0 + [(and:QISI + (match_dup 1) + (match_dup 2)) + (const_int 0)]) + (label_ref (match_dup 3)) + (pc))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sbrx_and_branch" + [(set (pc) + (if_then_else + (match_operator 0 "eqne_operator" + [(and:QISI + (match_operand:QISI 1 "register_operand" "r") + (match_operand:QISI 2 "single_one_operand" "n")) + (const_int 0)]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (reg:CC REG_CC))] + "reload_completed" { HOST_WIDE_INT bitnumber; bitnumber = exact_log2 (GET_MODE_MASK (mode) & INTVAL (operands[2])); @@ -4894,14 +6811,13 @@ (const_int 2) (if_then_else (match_test "!AVR_HAVE_JMP_CALL") (const_int 2) - (const_int 4)))) - (set_attr "cc" "clobber")]) + (const_int 4))))]) ;; Convert sign tests to bit 7/15/31 tests that match the above insns. (define_peephole2 - [(set (cc0) (compare (match_operand:QI 0 "register_operand" "") + [(set (reg:CC REG_CC) (compare:CC (match_operand:QI 0 "register_operand" "") (const_int 0))) - (set (pc) (if_then_else (ge (cc0) (const_int 0)) + (set (pc) (if_then_else (ge (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" @@ -4913,9 +6829,9 @@ (pc)))]) (define_peephole2 - [(set (cc0) (compare (match_operand:QI 0 "register_operand" "") + [(set (reg:CC REG_CC) (compare:CC (match_operand:QI 0 "register_operand" "") (const_int 0))) - (set (pc) (if_then_else (lt (cc0) (const_int 0)) + (set (pc) (if_then_else (lt (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" @@ -4927,10 +6843,10 @@ (pc)))]) (define_peephole2 - [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "") + [(parallel [(set (reg:CC REG_CC) (compare:CC (match_operand:HI 0 "register_operand" "") (const_int 0))) (clobber (match_operand:HI 2 ""))]) - (set (pc) (if_then_else (ge (cc0) (const_int 0)) + (set (pc) (if_then_else (ge (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" @@ -4940,10 +6856,10 @@ (pc)))]) (define_peephole2 - [(parallel [(set (cc0) (compare (match_operand:HI 0 "register_operand" "") + [(parallel [(set (reg:CC REG_CC) (compare:CC (match_operand:HI 0 "register_operand" "") (const_int 0))) (clobber (match_operand:HI 2 ""))]) - (set (pc) (if_then_else (lt (cc0) (const_int 0)) + (set (pc) (if_then_else (lt (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" @@ -4953,10 +6869,10 @@ (pc)))]) (define_peephole2 - [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "") + [(parallel [(set (reg:CC REG_CC) (compare:CC (match_operand:SI 0 "register_operand" "") (const_int 0))) (clobber (match_operand:SI 2 ""))]) - (set (pc) (if_then_else (ge (cc0) (const_int 0)) + (set (pc) (if_then_else (ge (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" @@ -4967,10 +6883,10 @@ "operands[2] = gen_int_mode (-2147483647 - 1, SImode);") (define_peephole2 - [(parallel [(set (cc0) (compare (match_operand:SI 0 "register_operand" "") + [(parallel [(set (reg:CC REG_CC) (compare:CC (match_operand:SI 0 "register_operand" "") (const_int 0))) (clobber (match_operand:SI 2 ""))]) - (set (pc) (if_then_else (lt (cc0) (const_int 0)) + (set (pc) (if_then_else (lt (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" @@ -4985,19 +6901,37 @@ ;; Compare with 0 (test) jumps ;; ************************************************************************ -(define_insn "branch" +(define_insn_and_split "branch" [(set (pc) (if_then_else (match_operator 1 "simple_comparison_operator" - [(cc0) + [(reg:CC REG_CC) (const_int 0)]) (label_ref (match_operand 0 "" "")) (pc)))] - "" + "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else (match_op_dup 1 + [(reg:CC REG_CC) + (const_int 0)]) + (label_ref (match_dup 0)) + (pc))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*branch" + [(set (pc) + (if_then_else (match_operator 1 "simple_comparison_operator" + [(reg:CC REG_CC) + (const_int 0)]) + (label_ref (match_operand 0 "" "")) + (pc))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0); } - [(set_attr "type" "branch") - (set_attr "cc" "clobber")]) + [(set_attr "type" "branch")]) ;; Same as above but wrap SET_SRC so that this branch won't be transformed @@ -5006,66 +6940,120 @@ (define_insn "branch_unspec" [(set (pc) (unspec [(if_then_else (match_operator 1 "simple_comparison_operator" - [(cc0) + [(reg:CC REG_CC) (const_int 0)]) (label_ref (match_operand 0 "" "")) (pc)) - ] UNSPEC_IDENTITY))] - "" + ] UNSPEC_IDENTITY)) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0); } - [(set_attr "type" "branch") - (set_attr "cc" "none")]) + [(set_attr "type" "branch")]) ;; **************************************************************** ;; AVR does not have following conditional jumps: LE,LEU,GT,GTU. ;; Convert them all to proper jumps. ;; ****************************************************************/ -(define_insn "difficult_branch" +(define_insn_and_split "difficult_branch" [(set (pc) (if_then_else (match_operator 1 "difficult_comparison_operator" - [(cc0) + [(reg:CC REG_CC) (const_int 0)]) (label_ref (match_operand 0 "" "")) (pc)))] - "" + "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else (match_op_dup 1 + [(reg:CC REG_CC) + (const_int 0)]) + (label_ref (match_dup 0)) + (pc))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*difficult_branch" + [(set (pc) + (if_then_else (match_operator 1 "difficult_comparison_operator" + [(reg:CC REG_CC) + (const_int 0)]) + (label_ref (match_operand 0 "" "")) + (pc))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 0); } - [(set_attr "type" "branch1") - (set_attr "cc" "clobber")]) + [(set_attr "type" "branch1")]) ;; revers branch -(define_insn "rvbranch" +(define_insn_and_split "rvbranch" [(set (pc) (if_then_else (match_operator 1 "simple_comparison_operator" - [(cc0) + [(reg:CC REG_CC) (const_int 0)]) (pc) (label_ref (match_operand 0 "" ""))))] - "" + "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else (match_op_dup 1 + [(reg:CC REG_CC) + (const_int 0)]) + (pc) + (label_ref (match_dup 0)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*rvbranch" + [(set (pc) + (if_then_else (match_operator 1 "simple_comparison_operator" + [(reg:CC REG_CC) + (const_int 0)]) + (pc) + (label_ref (match_operand 0 "" "")))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1); } - [(set_attr "type" "branch1") - (set_attr "cc" "clobber")]) + [(set_attr "type" "branch1")]) -(define_insn "difficult_rvbranch" +(define_insn_and_split "difficult_rvbranch" [(set (pc) (if_then_else (match_operator 1 "difficult_comparison_operator" - [(cc0) + [(reg:CC REG_CC) (const_int 0)]) (pc) (label_ref (match_operand 0 "" ""))))] - "" + "reload_completed" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else (match_op_dup 1 + [(reg:CC REG_CC) + (const_int 0)]) + (pc) + (label_ref (match_dup 0)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*difficult_rvbranch" + [(set (pc) + (if_then_else (match_operator 1 "difficult_comparison_operator" + [(reg:CC REG_CC) + (const_int 0)]) + (pc) + (label_ref (match_operand 0 "" "")))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return ret_cond_branch (operands[1], avr_jump_mode (operands[0], insn), 1); } - [(set_attr "type" "branch") - (set_attr "cc" "clobber")]) + [(set_attr "type" "branch")]) ;; ************************************************************************** ;; Unconditional and other jump instructions. @@ -5087,8 +7075,7 @@ (if_then_else (and (ge (minus (pc) (match_dup 0)) (const_int -2047)) (le (minus (pc) (match_dup 0)) (const_int 2047))) (const_int 1) - (const_int 2)))) - (set_attr "cc" "none")]) + (const_int 2))))]) ;; call @@ -5136,8 +7123,7 @@ %~call %x0 %!ijmp %~jmp %x0" - [(set_attr "cc" "clobber") - (set_attr "length" "1,*,1,*") + [(set_attr "length" "1,*,1,*") (set_attr "adjust_len" "*,call,*,call")]) (define_insn "call_value_insn" @@ -5153,16 +7139,14 @@ %~call %x1 %!ijmp %~jmp %x1" - [(set_attr "cc" "clobber") - (set_attr "length" "1,*,1,*") + [(set_attr "length" "1,*,1,*") (set_attr "adjust_len" "*,call,*,call")]) (define_insn "nop" [(const_int 0)] "" "nop" - [(set_attr "cc" "none") - (set_attr "length" "1")]) + [(set_attr "length" "1")]) ; indirect jump @@ -5189,8 +7173,7 @@ push %A0\;push %B0\;ret eijmp" [(set_attr "length" "1,2,1,3,1") - (set_attr "isa" "rjmp,jmp,ijmp,ijmp,eijmp") - (set_attr "cc" "none")]) + (set_attr "isa" "rjmp,jmp,ijmp,ijmp,eijmp")]) ;; table jump ;; For entries in jump table see avr_output_addr_vec. @@ -5198,7 +7181,7 @@ ;; Table made from ;; "rjmp .L" instructions for <= 8K devices ;; ".word gs(.L)" addresses for > 8K devices -(define_insn "*tablejump" +(define_insn_and_split "*tablejump_split" [(set (pc) (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r,z")] UNSPEC_INDEX_JMP)) @@ -5206,15 +7189,35 @@ (clobber (match_dup 0)) (clobber (const_int 0))] "!AVR_HAVE_EIJMP_EICALL" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (unspec:HI [(match_dup 0)] + UNSPEC_INDEX_JMP)) + (use (label_ref (match_dup 1))) + (clobber (match_dup 0)) + (clobber (const_int 0)) + (clobber (reg:CC REG_CC))])] + "" + [(set_attr "isa" "rjmp,rjmp,jmp")]) + +(define_insn "*tablejump" + [(set (pc) + (unspec:HI [(match_operand:HI 0 "register_operand" "!z,*r,z")] + UNSPEC_INDEX_JMP)) + (use (label_ref (match_operand 1 "" ""))) + (clobber (match_dup 0)) + (clobber (const_int 0)) + (clobber (reg:CC REG_CC))] + "!AVR_HAVE_EIJMP_EICALL && reload_completed" "@ ijmp push %A0\;push %B0\;ret jmp __tablejump2__" [(set_attr "length" "1,3,2") - (set_attr "isa" "rjmp,rjmp,jmp") - (set_attr "cc" "none,none,clobber")]) + (set_attr "isa" "rjmp,rjmp,jmp")]) -(define_insn "*tablejump.3byte-pc" +(define_insn_and_split "*tablejump.3byte-pc_split" [(set (pc) (unspec:HI [(reg:HI REG_Z)] UNSPEC_INDEX_JMP)) @@ -5222,10 +7225,31 @@ (clobber (reg:HI REG_Z)) (clobber (reg:QI 24))] "AVR_HAVE_EIJMP_EICALL" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (unspec:HI [(reg:HI REG_Z)] + UNSPEC_INDEX_JMP)) + (use (label_ref (match_dup 0))) + (clobber (reg:HI REG_Z)) + (clobber (reg:QI 24)) + (clobber (reg:CC REG_CC))])] + "" + [(set_attr "isa" "eijmp")]) + + +(define_insn "*tablejump.3byte-pc" + [(set (pc) + (unspec:HI [(reg:HI REG_Z)] + UNSPEC_INDEX_JMP)) + (use (label_ref (match_operand 0 "" ""))) + (clobber (reg:HI REG_Z)) + (clobber (reg:QI 24)) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_EIJMP_EICALL && reload_completed" "clr r24\;subi r30,pm_lo8(-(%0))\;sbci r31,pm_hi8(-(%0))\;sbci r24,pm_hh8(-(%0))\;jmp __tablejump2__" [(set_attr "length" "6") - (set_attr "isa" "eijmp") - (set_attr "cc" "clobber")]) + (set_attr "isa" "eijmp")]) ;; FIXME: casesi comes up with an SImode switch value $0 which @@ -5254,16 +7278,13 @@ (plus:SI (match_operand:SI 0 "register_operand") (match_operand:SI 1 "const_int_operand"))) (clobber (scratch:QI))]) - (parallel [(set (cc0) - (compare (match_dup 5) - (match_operand:SI 2 "const_int_operand"))) - (clobber (scratch:QI))]) - (set (pc) - (if_then_else (gtu (cc0) - (const_int 0)) - (label_ref (match_operand 4)) - (pc))) + (parallel [(set (pc) + (if_then_else (gtu (match_dup 5) + (match_operand:SI 2 "const_int_operand")) + (label_ref (match_operand 4)) + (pc))) + (clobber (scratch:QI))]) (set (match_dup 7) (match_dup 6)) @@ -5312,16 +7333,13 @@ (plus:SI (match_dup 0) (match_operand:SI 1 "const_int_operand"))) (clobber (scratch:QI))]) - (parallel [(set (cc0) - (compare (match_dup 5) - (match_operand:SI 2 "const_int_operand"))) - (clobber (scratch:QI))]) - (set (pc) - (if_then_else (gtu (cc0) - (const_int 0)) - (label_ref (match_operand 4)) - (pc))) + (parallel [(set (pc) + (if_then_else (gtu (match_dup 5) + (match_operand:SI 2 "const_int_operand")) + (label_ref (match_operand 4)) + (pc))) + (clobber (scratch:QI))]) (set (match_operand:HI 7 "register_operand") (match_operand:HI 6)) @@ -5338,15 +7356,6 @@ ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -;; This instruction sets Z flag - -(define_insn "sez" - [(set (cc0) (const_int 0))] - "" - "sez" - [(set_attr "length" "1") - (set_attr "cc" "compare")]) - ;; Clear/set/test a single bit in I/O address space. (define_insn "*cbi" @@ -5358,8 +7367,7 @@ operands[2] = GEN_INT (exact_log2 (~INTVAL (operands[1]) & 0xff)); return "cbi %i0,%2"; } - [(set_attr "length" "1") - (set_attr "cc" "none")]) + [(set_attr "length" "1")]) (define_insn "*sbi" [(set (mem:QI (match_operand 0 "low_io_address_operand" "i")) @@ -5370,11 +7378,10 @@ operands[2] = GEN_INT (exact_log2 (INTVAL (operands[1]) & 0xff)); return "sbi %i0,%2"; } - [(set_attr "length" "1") - (set_attr "cc" "none")]) + [(set_attr "length" "1")]) ;; Lower half of the I/O space - use sbic/sbis directly. -(define_insn "*sbix_branch" +(define_insn_and_split "*sbix_branch_split" [(set (pc) (if_then_else (match_operator 0 "eqne_operator" @@ -5386,6 +7393,33 @@ (label_ref (match_operand 3 "" "")) (pc)))] "" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else + (match_operator 0 "eqne_operator" + [(zero_extract:QIHI + (mem:QI (match_dup 1)) + (const_int 1) + (match_dup 2)) + (const_int 0)]) + (label_ref (match_dup 3)) + (pc))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sbix_branch" + [(set (pc) + (if_then_else + (match_operator 0 "eqne_operator" + [(zero_extract:QIHI + (mem:QI (match_operand 1 "low_io_address_operand" "i")) + (const_int 1) + (match_operand 2 "const_int_operand" "n")) + (const_int 0)]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sbxx_branch (insn, operands); } @@ -5395,11 +7429,10 @@ (const_int 2) (if_then_else (match_test "!AVR_HAVE_JMP_CALL") (const_int 2) - (const_int 4)))) - (set_attr "cc" "clobber")]) + (const_int 4))))]) ;; Tests of bit 7 are pessimized to sign tests, so we need this too... -(define_insn "*sbix_branch_bit7" +(define_insn_and_split "*sbix_branch_bit7_split" [(set (pc) (if_then_else (match_operator 0 "gelt_operator" @@ -5408,6 +7441,27 @@ (label_ref (match_operand 2 "" "")) (pc)))] "" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else + (match_operator 0 "gelt_operator" + [(mem:QI (match_dup 1)) + (const_int 0)]) + (label_ref (match_dup 2)) + (pc))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sbix_branch_bit7" + [(set (pc) + (if_then_else + (match_operator 0 "gelt_operator" + [(mem:QI (match_operand 1 "low_io_address_operand" "i")) + (const_int 0)]) + (label_ref (match_operand 2 "" "")) + (pc))) + (clobber (reg:CC REG_CC))] + "reload_completed" { operands[3] = operands[2]; operands[2] = GEN_INT (7); @@ -5419,11 +7473,10 @@ (const_int 2) (if_then_else (match_test "!AVR_HAVE_JMP_CALL") (const_int 2) - (const_int 4)))) - (set_attr "cc" "clobber")]) + (const_int 4))))]) ;; Upper half of the I/O space - read port to __tmp_reg__ and use sbrc/sbrs. -(define_insn "*sbix_branch_tmp" +(define_insn_and_split "*sbix_branch_tmp_split" [(set (pc) (if_then_else (match_operator 0 "eqne_operator" @@ -5435,6 +7488,33 @@ (label_ref (match_operand 3 "" "")) (pc)))] "" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else + (match_operator 0 "eqne_operator" + [(zero_extract:QIHI + (mem:QI (match_dup 1)) + (const_int 1) + (match_dup 2)) + (const_int 0)]) + (label_ref (match_dup 3)) + (pc))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sbix_branch_tmp" + [(set (pc) + (if_then_else + (match_operator 0 "eqne_operator" + [(zero_extract:QIHI + (mem:QI (match_operand 1 "high_io_address_operand" "n")) + (const_int 1) + (match_operand 2 "const_int_operand" "n")) + (const_int 0)]) + (label_ref (match_operand 3 "" "")) + (pc))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_sbxx_branch (insn, operands); } @@ -5444,10 +7524,9 @@ (const_int 3) (if_then_else (match_test "!AVR_HAVE_JMP_CALL") (const_int 3) - (const_int 5)))) - (set_attr "cc" "clobber")]) + (const_int 5))))]) -(define_insn "*sbix_branch_tmp_bit7" +(define_insn_and_split "*sbix_branch_tmp_bit7_split" [(set (pc) (if_then_else (match_operator 0 "gelt_operator" @@ -5456,6 +7535,27 @@ (label_ref (match_operand 2 "" "")) (pc)))] "" + "#" + "&& reload_completed" + [(parallel [(set (pc) + (if_then_else + (match_operator 0 "gelt_operator" + [(mem:QI (match_dup 1)) + (const_int 0)]) + (label_ref (match_dup 2)) + (pc))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*sbix_branch_tmp_bit7" + [(set (pc) + (if_then_else + (match_operator 0 "gelt_operator" + [(mem:QI (match_operand 1 "high_io_address_operand" "n")) + (const_int 0)]) + (label_ref (match_operand 2 "" "")) + (pc))) + (clobber (reg:CC REG_CC))] + "reload_completed" { operands[3] = operands[2]; operands[2] = GEN_INT (7); @@ -5467,8 +7567,7 @@ (const_int 3) (if_then_else (match_test "!AVR_HAVE_JMP_CALL") (const_int 3) - (const_int 5)))) - (set_attr "cc" "clobber")]) + (const_int 5))))]) ;; ************************* Peepholes ******************************** @@ -5477,12 +7576,12 @@ (plus:SI (match_dup 0) (const_int -1))) (clobber (scratch:QI))]) - (parallel [(set (cc0) - (compare (match_dup 0) + (parallel [(set (reg:CC REG_CC) + (compare:CC (match_dup 0) (const_int -1))) (clobber (match_operand:QI 1 "d_register_operand" ""))]) (set (pc) - (if_then_else (eqne (cc0) + (if_then_else (eqne (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] @@ -5520,12 +7619,12 @@ [(set (match_operand:HI 0 "d_register_operand" "") (plus:HI (match_dup 0) (const_int -1))) - (parallel [(set (cc0) - (compare (match_dup 0) + (parallel [(set (reg:CC REG_CC) + (compare:CC (match_dup 0) (const_int -1))) (clobber (match_operand:QI 1 "d_register_operand" ""))]) (set (pc) - (if_then_else (eqne (cc0) + (if_then_else (eqne (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] @@ -5561,12 +7660,12 @@ (plus:HI (match_dup 0) (const_int -1))) (clobber (scratch:QI))]) - (parallel [(set (cc0) - (compare (match_dup 0) + (parallel [(set (reg:CC REG_CC) + (compare:CC (match_dup 0) (const_int -1))) (clobber (match_operand:QI 1 "d_register_operand" ""))]) (set (pc) - (if_then_else (eqne (cc0) + (if_then_else (eqne (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] @@ -5602,12 +7701,12 @@ (plus:HI (match_dup 0) (const_int -1))) (clobber (match_operand:QI 3 "d_register_operand" ""))]) - (parallel [(set (cc0) - (compare (match_dup 0) + (parallel [(set (reg:CC REG_CC) + (compare:CC (match_dup 0) (const_int -1))) (clobber (match_operand:QI 1 "d_register_operand" ""))]) (set (pc) - (if_then_else (eqne (cc0) + (if_then_else (eqne (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] @@ -5639,11 +7738,11 @@ [(set (match_operand:QI 0 "d_register_operand" "") (plus:QI (match_dup 0) (const_int -1))) - (set (cc0) - (compare (match_dup 0) + (set (reg:CC REG_CC) + (compare:CC (match_dup 0) (const_int -1))) (set (pc) - (if_then_else (eqne (cc0) + (if_then_else (eqne (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] @@ -5651,9 +7750,6 @@ { const char *op; int jump_mode; - CC_STATUS_INIT; - cc_status.value1 = operands[0]; - cc_status.flags |= CC_OVERFLOW_UNUSABLE; output_asm_insn ("subi %A0,1", operands); @@ -5674,11 +7770,11 @@ (define_peephole ; "*cpse.eq" - [(set (cc0) - (compare (match_operand:ALL1 1 "register_operand" "r,r") + [(set (reg:CC REG_CC) + (compare:CC (match_operand:ALL1 1 "register_operand" "r,r") (match_operand:ALL1 2 "reg_or_0_operand" "r,Y00"))) (set (pc) - (if_then_else (eq (cc0) + (if_then_else (eq (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] @@ -5709,11 +7805,11 @@ ;; and thus longer and slower and not easy to be rolled back. (define_peephole ; "*cpse.ne" - [(set (cc0) - (compare (match_operand:ALL1 1 "register_operand" "") + [(set (reg:CC REG_CC) + (compare:CC (match_operand:ALL1 1 "register_operand" "") (match_operand:ALL1 2 "reg_or_0_operand" ""))) (set (pc) - (if_then_else (ne (cc0) + (if_then_else (ne (reg:CC REG_CC) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] @@ -5736,8 +7832,7 @@ (mem:QI (pre_inc:HI (reg:HI REG_SP))))] "" "pop %0" - [(set_attr "cc" "none") - (set_attr "length" "1")]) + [(set_attr "length" "1")]) ;; Enable Interrupts (define_expand "enable_interrupt" @@ -5770,8 +7865,7 @@ "@ cli sei" - [(set_attr "length" "1") - (set_attr "cc" "none")]) + [(set_attr "length" "1")]) ;; Library prologue saves (define_insn "call_prologue_saves" @@ -5781,14 +7875,14 @@ (minus:HI (reg:HI REG_SP) (match_operand:HI 1 "immediate_operand" "i,i"))) (use (reg:HI REG_X)) - (clobber (reg:HI REG_Z))] + (clobber (reg:HI REG_Z)) + (clobber (reg:CC REG_CC))] "" "ldi r30,lo8(gs(1f)) ldi r31,hi8(gs(1f)) %~jmp __prologue_saves__+((18 - %0) * 2) 1:" [(set_attr "length" "5,6") - (set_attr "cc" "clobber") (set_attr "isa" "rjmp,jmp")]) ; epilogue restores using library @@ -5800,12 +7894,12 @@ (set (reg:HI REG_SP) (plus:HI (reg:HI REG_Y) (match_dup 0))) - (clobber (reg:QI REG_Z))] + (clobber (reg:QI REG_Z)) + (clobber (reg:CC REG_CC))] "" "ldi r30, lo8(%0) %~jmp __epilogue_restores__ + ((18 - %0) * 2)" [(set_attr "length" "2,3") - (set_attr "cc" "clobber") (set_attr "isa" "rjmp,jmp")]) @@ -5819,7 +7913,8 @@ (unspec_volatile:HI [(reg:HI REG_SP)] UNSPECV_GASISR)) (set (match_dup 2) (unspec_volatile:BLK [(match_dup 2)] - UNSPECV_MEMORY_BARRIER))])] + UNSPECV_MEMORY_BARRIER)) + (clobber (reg:CC REG_CC))])] "avr_gasisr_prologues" { operands[2] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode)); @@ -5833,11 +7928,11 @@ (set (reg:HI REG_SP) (unspec_volatile:HI [(reg:HI REG_SP)] UNSPECV_GASISR)) (set (match_operand:BLK 2) - (unspec_volatile:BLK [(match_dup 2)] UNSPECV_MEMORY_BARRIER))] + (unspec_volatile:BLK [(match_dup 2)] UNSPECV_MEMORY_BARRIER)) + (clobber (reg:CC REG_CC))] "avr_gasisr_prologues" "__gcc_isr %0" - [(set_attr "length" "6,5") - (set_attr "cc" "clobber")]) + [(set_attr "length" "6,5")]) ; return @@ -5845,8 +7940,7 @@ [(return)] "reload_completed && avr_simple_epilogue ()" "ret" - [(set_attr "cc" "none") - (set_attr "length" "1")]) + [(set_attr "length" "1")]) (define_insn "return_from_epilogue" [(return)] @@ -5855,8 +7949,7 @@ && !(cfun->machine->is_interrupt || cfun->machine->is_signal) && !cfun->machine->is_naked" "ret" - [(set_attr "cc" "none") - (set_attr "length" "1")]) + [(set_attr "length" "1")]) (define_insn "return_from_interrupt_epilogue" [(return)] @@ -5865,8 +7958,7 @@ && (cfun->machine->is_interrupt || cfun->machine->is_signal) && !cfun->machine->is_naked" "reti" - [(set_attr "cc" "none") - (set_attr "length" "1")]) + [(set_attr "length" "1")]) (define_insn "return_from_naked_epilogue" [(return)] @@ -5874,8 +7966,7 @@ && cfun->machine && cfun->machine->is_naked" "" - [(set_attr "cc" "none") - (set_attr "length" "0")]) + [(set_attr "length" "0")]) (define_expand "prologue" [(const_int 0)] @@ -5904,7 +7995,7 @@ ;; Some instructions resp. instruction sequences available ;; via builtins. -(define_insn "delay_cycles_1" +(define_insn_and_split "delay_cycles_1" [(unspec_volatile [(match_operand:QI 0 "const_int_operand" "n") (const_int 1)] UNSPECV_DELAY_CYCLES) @@ -5912,13 +8003,31 @@ (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) (clobber (match_scratch:QI 2 "=&d"))] "" + "#" + "&& reload_completed" + [(parallel [(unspec_volatile [(match_dup 0) + (const_int 1)] + UNSPECV_DELAY_CYCLES) + (set (match_dup 1) + (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) + (clobber (match_dup 2)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*delay_cycles_1" + [(unspec_volatile [(match_operand:QI 0 "const_int_operand" "n") + (const_int 1)] + UNSPECV_DELAY_CYCLES) + (set (match_operand:BLK 1 "" "") + (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) + (clobber (match_scratch:QI 2 "=&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" "ldi %2,lo8(%0) 1: dec %2 brne 1b" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) -(define_insn "delay_cycles_2" +(define_insn_and_split "delay_cycles_2" [(unspec_volatile [(match_operand:HI 0 "const_int_operand" "n,n") (const_int 2)] UNSPECV_DELAY_CYCLES) @@ -5926,14 +8035,34 @@ (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) (clobber (match_scratch:HI 2 "=&w,&d"))] "" + "#" + "&& reload_completed" + [(parallel [(unspec_volatile [(match_dup 0) + (const_int 2)] + UNSPECV_DELAY_CYCLES) + (set (match_dup 1) + (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) + (clobber (match_dup 2)) + (clobber (reg:CC REG_CC))])] + "" + [(set_attr "isa" "no_tiny,tiny")]) + +(define_insn "*delay_cycles_2" + [(unspec_volatile [(match_operand:HI 0 "const_int_operand" "n,n") + (const_int 2)] + UNSPECV_DELAY_CYCLES) + (set (match_operand:BLK 1 "" "") + (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) + (clobber (match_scratch:HI 2 "=&w,&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ ldi %A2,lo8(%0)\;ldi %B2,hi8(%0)\n1: sbiw %A2,1\;brne 1b ldi %A2,lo8(%0)\;ldi %B2,hi8(%0)\n1: subi %A2,1\;sbci %B2,0\;brne 1b" [(set_attr "length" "4,5") - (set_attr "isa" "no_tiny,tiny") - (set_attr "cc" "clobber")]) + (set_attr "isa" "no_tiny,tiny")]) -(define_insn "delay_cycles_3" +(define_insn_and_split "delay_cycles_3" [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "n") (const_int 3)] UNSPECV_DELAY_CYCLES) @@ -5943,6 +8072,29 @@ (clobber (match_scratch:QI 3 "=&d")) (clobber (match_scratch:QI 4 "=&d"))] "" + "#" + "&& reload_completed" + [(parallel [(unspec_volatile [(match_dup 0) + (const_int 3)] + UNSPECV_DELAY_CYCLES) + (set (match_dup 1) + (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) + (clobber (match_dup 2)) + (clobber (match_dup 3)) + (clobber (match_dup 4)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*delay_cycles_3" + [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "n") + (const_int 3)] + UNSPECV_DELAY_CYCLES) + (set (match_operand:BLK 1 "" "") + (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) + (clobber (match_scratch:QI 2 "=&d")) + (clobber (match_scratch:QI 3 "=&d")) + (clobber (match_scratch:QI 4 "=&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" "ldi %2,lo8(%0) ldi %3,hi8(%0) ldi %4,hlo8(%0) @@ -5950,10 +8102,9 @@ sbci %3,0 sbci %4,0 brne 1b" - [(set_attr "length" "7") - (set_attr "cc" "clobber")]) + [(set_attr "length" "7")]) -(define_insn "delay_cycles_4" +(define_insn_and_split "delay_cycles_4" [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "n") (const_int 4)] UNSPECV_DELAY_CYCLES) @@ -5964,6 +8115,31 @@ (clobber (match_scratch:QI 4 "=&d")) (clobber (match_scratch:QI 5 "=&d"))] "" + "#" + "&& reload_completed" + [(parallel [(unspec_volatile [(match_dup 0) + (const_int 4)] + UNSPECV_DELAY_CYCLES) + (set (match_dup 1) + (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) + (clobber (match_dup 2)) + (clobber (match_dup 3)) + (clobber (match_dup 4)) + (clobber (match_dup 5)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*delay_cycles_4" + [(unspec_volatile [(match_operand:SI 0 "const_int_operand" "n") + (const_int 4)] + UNSPECV_DELAY_CYCLES) + (set (match_operand:BLK 1 "" "") + (unspec_volatile:BLK [(match_dup 1)] UNSPECV_MEMORY_BARRIER)) + (clobber (match_scratch:QI 2 "=&d")) + (clobber (match_scratch:QI 3 "=&d")) + (clobber (match_scratch:QI 4 "=&d")) + (clobber (match_scratch:QI 5 "=&d")) + (clobber (reg:CC REG_CC))] + "reload_completed" "ldi %2,lo8(%0) ldi %3,hi8(%0) ldi %4,hlo8(%0) @@ -5973,24 +8149,39 @@ sbci %4,0 sbci %5,0 brne 1b" - [(set_attr "length" "9") - (set_attr "cc" "clobber")]) + [(set_attr "length" "9")]) ;; __builtin_avr_insert_bits -(define_insn "insert_bits" +(define_insn_and_split "insert_bits" [(set (match_operand:QI 0 "register_operand" "=r ,d ,r") (unspec:QI [(match_operand:SI 1 "const_int_operand" "C0f,Cxf,C0f") (match_operand:QI 2 "register_operand" "r ,r ,r") (match_operand:QI 3 "nonmemory_operand" "n ,0 ,0")] UNSPEC_INSERT_BITS))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (unspec:QI [(match_dup 1) + (match_dup 2) + (match_dup 3)] + UNSPEC_INSERT_BITS)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*insert_bits" + [(set (match_operand:QI 0 "register_operand" "=r ,d ,r") + (unspec:QI [(match_operand:SI 1 "const_int_operand" "C0f,Cxf,C0f") + (match_operand:QI 2 "register_operand" "r ,r ,r") + (match_operand:QI 3 "nonmemory_operand" "n ,0 ,0")] + UNSPEC_INSERT_BITS)) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_insert_bits (operands, NULL); } - [(set_attr "adjust_len" "insert_bits") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "insert_bits")]) ;; __builtin_avr_flash_segment @@ -6001,17 +8192,31 @@ [(set (match_operand:QI 0 "register_operand" "") (subreg:QI (match_operand:PSI 1 "register_operand" "") 2)) - (set (cc0) - (compare (match_dup 0) - (const_int 0))) (set (pc) - (if_then_else (ge (cc0) + (if_then_else (ge (match_dup 0) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc))) (set (match_dup 0) (const_int -1))]) +(define_insn_and_split "*flash_segment1" + [(set (pc) + (if_then_else (ge (match_operand:QI 0 "register_operand" "") + (const_int 0)) + (label_ref (match_operand 1 "" "")) + (pc)))] + "" + "#" + "reload_completed" + [(set (reg:CC REG_CC) + (compare:CC (match_dup 0) (const_int 0))) + (set (pc) + (if_then_else (ge (reg:CC REG_CC) (const_int 0)) + (label_ref (match_dup 1)) + (pc)))] + "") + (define_expand "flash_segment" [(parallel [(match_operand:QI 0 "register_operand" "") (match_operand:PSI 1 "register_operand" "")])] @@ -6092,29 +8297,59 @@ operands[2] = gen_reg_rtx (HImode); }) -(define_insn "*parityhi2.libgcc" +(define_insn_and_split "*parityhi2.libgcc_split" [(set (reg:HI 24) (parity:HI (reg:HI 24)))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (parity:HI (reg:HI 24))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*parityhi2.libgcc" + [(set (reg:HI 24) + (parity:HI (reg:HI 24))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __parityhi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*parityqihi2.libgcc" +(define_insn_and_split "*parityqihi2.libgcc_split" [(set (reg:HI 24) (zero_extend:HI (parity:QI (reg:QI 24))))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (zero_extend:HI (parity:QI (reg:QI 24)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*parityqihi2.libgcc" + [(set (reg:HI 24) + (zero_extend:HI (parity:QI (reg:QI 24)))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __parityqi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*paritysihi2.libgcc" +(define_insn_and_split "*paritysihi2.libgcc_split" [(set (reg:HI 24) (truncate:HI (parity:SI (reg:SI 22))))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (truncate:HI (parity:SI (reg:SI 22)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*paritysihi2.libgcc" + [(set (reg:HI 24) + (truncate:HI (parity:SI (reg:SI 22)))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __paritysi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; Popcount @@ -6143,29 +8378,59 @@ operands[2] = gen_reg_rtx (HImode); }) -(define_insn "*popcounthi2.libgcc" +(define_insn_and_split "*popcounthi2.libgcc_split" [(set (reg:HI 24) (popcount:HI (reg:HI 24)))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (popcount:HI (reg:HI 24))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*popcounthi2.libgcc" + [(set (reg:HI 24) + (popcount:HI (reg:HI 24))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __popcounthi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*popcountsi2.libgcc" +(define_insn_and_split "*popcountsi2.libgcc_split" [(set (reg:HI 24) (truncate:HI (popcount:SI (reg:SI 22))))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (truncate:HI (popcount:SI (reg:SI 22)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*popcountsi2.libgcc" + [(set (reg:HI 24) + (truncate:HI (popcount:SI (reg:SI 22)))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __popcountsi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*popcountqi2.libgcc" +(define_insn_and_split "*popcountqi2.libgcc_split" [(set (reg:QI 24) (popcount:QI (reg:QI 24)))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:QI 24) + (popcount:QI (reg:QI 24))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*popcountqi2.libgcc" + [(set (reg:QI 24) + (popcount:QI (reg:QI 24))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __popcountqi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) (define_insn_and_split "*popcountqihi2.libgcc" [(set (reg:HI 24) @@ -6204,23 +8469,47 @@ operands[2] = gen_reg_rtx (HImode); }) -(define_insn "*clzhi2.libgcc" +(define_insn_and_split "*clzhi2.libgcc_split" [(set (reg:HI 24) (clz:HI (reg:HI 24))) (clobber (reg:QI 26))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (clz:HI (reg:HI 24))) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*clzhi2.libgcc" + [(set (reg:HI 24) + (clz:HI (reg:HI 24))) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __clzhi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*clzsihi2.libgcc" +(define_insn_and_split "*clzsihi2.libgcc_split" [(set (reg:HI 24) (truncate:HI (clz:SI (reg:SI 22)))) (clobber (reg:QI 26))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (truncate:HI (clz:SI (reg:SI 22)))) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*clzsihi2.libgcc" + [(set (reg:HI 24) + (truncate:HI (clz:SI (reg:SI 22)))) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __clzsi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; Count Trailing Zeros @@ -6249,24 +8538,50 @@ operands[2] = gen_reg_rtx (HImode); }) -(define_insn "*ctzhi2.libgcc" +(define_insn_and_split "*ctzhi2.libgcc_split" [(set (reg:HI 24) (ctz:HI (reg:HI 24))) (clobber (reg:QI 26))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (ctz:HI (reg:HI 24))) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ctzhi2.libgcc" + [(set (reg:HI 24) + (ctz:HI (reg:HI 24))) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __ctzhi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*ctzsihi2.libgcc" +(define_insn_and_split "*ctzsihi2.libgcc_split" [(set (reg:HI 24) (truncate:HI (ctz:SI (reg:SI 22)))) (clobber (reg:QI 22)) (clobber (reg:QI 26))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (truncate:HI (ctz:SI (reg:SI 22)))) + (clobber (reg:QI 22)) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ctzsihi2.libgcc" + [(set (reg:HI 24) + (truncate:HI (ctz:SI (reg:SI 22)))) + (clobber (reg:QI 22)) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __ctzsi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; Find First Set @@ -6295,24 +8610,50 @@ operands[2] = gen_reg_rtx (HImode); }) -(define_insn "*ffshi2.libgcc" +(define_insn_and_split "*ffshi2.libgcc_split" [(set (reg:HI 24) (ffs:HI (reg:HI 24))) (clobber (reg:QI 26))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (ffs:HI (reg:HI 24))) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ffshi2.libgcc" + [(set (reg:HI 24) + (ffs:HI (reg:HI 24))) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __ffshi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) -(define_insn "*ffssihi2.libgcc" +(define_insn_and_split "*ffssihi2.libgcc_split" [(set (reg:HI 24) (truncate:HI (ffs:SI (reg:SI 22)))) (clobber (reg:QI 22)) (clobber (reg:QI 26))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 24) + (truncate:HI (ffs:SI (reg:SI 22)))) + (clobber (reg:QI 22)) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*ffssihi2.libgcc" + [(set (reg:HI 24) + (truncate:HI (ffs:SI (reg:SI 22)))) + (clobber (reg:QI 22)) + (clobber (reg:QI 26)) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __ffssi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; Copysign @@ -6323,8 +8664,7 @@ UNSPEC_COPYSIGN))] "" "bst %D2,7\;bld %D0,7" - [(set_attr "length" "2") - (set_attr "cc" "none")]) + [(set_attr "length" "2")]) ;; Swap Bytes (change byte-endianness) @@ -6336,13 +8676,23 @@ (set (match_operand:SI 0 "register_operand" "") (reg:SI 22))]) -(define_insn "*bswapsi2.libgcc" +(define_insn_and_split "*bswapsi2.libgcc_split" [(set (reg:SI 22) (bswap:SI (reg:SI 22)))] "" + "#" + "&& reload_completed" + [(parallel [(set (reg:SI 22) + (bswap:SI (reg:SI 22))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*bswapsi2.libgcc" + [(set (reg:SI 22) + (bswap:SI (reg:SI 22))) + (clobber (reg:CC REG_CC))] + "reload_completed" "%~call __bswapsi2" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; CPU instructions @@ -6369,8 +8719,7 @@ "@ nop rjmp ." - [(set_attr "length" "1") - (set_attr "cc" "none")]) + [(set_attr "length" "1")]) ;; SLEEP (define_expand "sleep" @@ -6390,8 +8739,7 @@ (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMORY_BARRIER))] "" "sleep" - [(set_attr "length" "1") - (set_attr "cc" "none")]) + [(set_attr "length" "1")]) ;; WDR (define_expand "wdr" @@ -6411,8 +8759,7 @@ (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMORY_BARRIER))] "" "wdr" - [(set_attr "length" "1") - (set_attr "cc" "none")]) + [(set_attr "length" "1")]) ;; FMUL (define_expand "fmul" @@ -6436,27 +8783,55 @@ avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24)); }) -(define_insn "fmul_insn" +(define_insn_and_split "fmul_insn" [(set (match_operand:HI 0 "register_operand" "=r") (unspec:HI [(match_operand:QI 1 "register_operand" "a") (match_operand:QI 2 "register_operand" "a")] UNSPEC_FMUL))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (unspec:HI [(match_dup 1) + (match_dup 2)] + UNSPEC_FMUL)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*fmul_insn" + [(set (match_operand:HI 0 "register_operand" "=r") + (unspec:HI [(match_operand:QI 1 "register_operand" "a") + (match_operand:QI 2 "register_operand" "a")] + UNSPEC_FMUL)) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "fmul %1,%2 movw %0,r0 clr __zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) -(define_insn "*fmul.call" +(define_insn_and_split "*fmul.call_split" [(set (reg:HI 22) (unspec:HI [(reg:QI 24) (reg:QI 25)] UNSPEC_FMUL)) (clobber (reg:HI 24))] "!AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 22) + (unspec:HI [(reg:QI 24) + (reg:QI 25)] UNSPEC_FMUL)) + (clobber (reg:HI 24)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*fmul.call" + [(set (reg:HI 22) + (unspec:HI [(reg:QI 24) + (reg:QI 25)] UNSPEC_FMUL)) + (clobber (reg:HI 24)) + (clobber (reg:CC REG_CC))] + "!AVR_HAVE_MUL && reload_completed" "%~call __fmul" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; FMULS (define_expand "fmuls" @@ -6480,27 +8855,55 @@ avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24)); }) -(define_insn "fmuls_insn" +(define_insn_and_split "fmuls_insn" [(set (match_operand:HI 0 "register_operand" "=r") (unspec:HI [(match_operand:QI 1 "register_operand" "a") (match_operand:QI 2 "register_operand" "a")] UNSPEC_FMULS))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (unspec:HI [(match_dup 1) + (match_dup 2)] + UNSPEC_FMULS)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*fmuls_insn" + [(set (match_operand:HI 0 "register_operand" "=r") + (unspec:HI [(match_operand:QI 1 "register_operand" "a") + (match_operand:QI 2 "register_operand" "a")] + UNSPEC_FMULS)) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "fmuls %1,%2 movw %0,r0 clr __zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) -(define_insn "*fmuls.call" +(define_insn_and_split "*fmuls.call_split" [(set (reg:HI 22) (unspec:HI [(reg:QI 24) (reg:QI 25)] UNSPEC_FMULS)) (clobber (reg:HI 24))] "!AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 22) + (unspec:HI [(reg:QI 24) + (reg:QI 25)] UNSPEC_FMULS)) + (clobber (reg:HI 24)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*fmuls.call" + [(set (reg:HI 22) + (unspec:HI [(reg:QI 24) + (reg:QI 25)] UNSPEC_FMULS)) + (clobber (reg:HI 24)) + (clobber (reg:CC REG_CC))] + "!AVR_HAVE_MUL && reload_completed" "%~call __fmuls" - [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + [(set_attr "type" "xcall")]) ;; FMULSU (define_expand "fmulsu" @@ -6524,27 +8927,56 @@ avr_fix_inputs (operands, 1 << 2, regmask (QImode, 24)); }) -(define_insn "fmulsu_insn" +(define_insn_and_split "fmulsu_insn" [(set (match_operand:HI 0 "register_operand" "=r") (unspec:HI [(match_operand:QI 1 "register_operand" "a") (match_operand:QI 2 "register_operand" "a")] UNSPEC_FMULSU))] "AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (unspec:HI [(match_dup 1) + (match_dup 2)] + UNSPEC_FMULSU)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*fmulsu_insn" + [(set (match_operand:HI 0 "register_operand" "=r") + (unspec:HI [(match_operand:QI 1 "register_operand" "a") + (match_operand:QI 2 "register_operand" "a")] + UNSPEC_FMULSU)) + (clobber (reg:CC REG_CC))] + "AVR_HAVE_MUL && reload_completed" "fmulsu %1,%2 movw %0,r0 clr __zero_reg__" - [(set_attr "length" "3") - (set_attr "cc" "clobber")]) + [(set_attr "length" "3")]) -(define_insn "*fmulsu.call" +(define_insn_and_split "*fmulsu.call_split" [(set (reg:HI 22) (unspec:HI [(reg:QI 24) (reg:QI 25)] UNSPEC_FMULSU)) (clobber (reg:HI 24))] "!AVR_HAVE_MUL" + "#" + "&& reload_completed" + [(parallel [(set (reg:HI 22) + (unspec:HI [(reg:QI 24) + (reg:QI 25)] UNSPEC_FMULSU)) + (clobber (reg:HI 24)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*fmulsu.call" + [(set (reg:HI 22) + (unspec:HI [(reg:QI 24) + (reg:QI 25)] UNSPEC_FMULSU)) + (clobber (reg:HI 24)) + (clobber (reg:CC REG_CC))] + "!AVR_HAVE_MUL && reload_completed" "%~call __fmulsu" [(set_attr "type" "xcall") - (set_attr "cc" "clobber")]) + ]) ;; Some combiner patterns dealing with bits. @@ -6561,8 +8993,7 @@ "INTVAL(operands[4]) == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode)) && INTVAL(operands[4]) == exact_log2 (INTVAL(operands[5]) & GET_MODE_MASK (QImode))" "bst %3,0\;bld %0,%4" - [(set_attr "length" "2") - (set_attr "cc" "none")]) + [(set_attr "length" "2")]) ;; Move bit $3.0 into bit $0.$4 ;; Variation of above. Unfortunately, there is no canonicalized representation @@ -6577,8 +9008,7 @@ (match_operand:QI 4 "const_0_to_7_operand" "n"))))] "INTVAL(operands[4]) == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode))" "bst %3,0\;bld %0,%4" - [(set_attr "length" "2") - (set_attr "cc" "none")]) + [(set_attr "length" "2")]) ;; Move bit $3.0 into bit $0.0. ;; For bit 0, combiner generates slightly different pattern. @@ -6590,8 +9020,7 @@ (const_int 1))))] "0 == exact_log2 (~INTVAL(operands[2]) & GET_MODE_MASK (QImode))" "bst %3,0\;bld %0,0" - [(set_attr "length" "2") - (set_attr "cc" "none")]) + [(set_attr "length" "2")]) ;; Move bit $2.0 into bit $0.7. ;; For bit 7, combiner generates slightly different pattern @@ -6603,8 +9032,7 @@ (const_int 7))))] "" "bst %2,0\;bld %0,7" - [(set_attr "length" "2") - (set_attr "cc" "none")]) + [(set_attr "length" "2")]) ;; Combiner transforms above four pattern into ZERO_EXTRACT if it sees MEM ;; and input/output match. We provide a special pattern for this, because @@ -6620,8 +9048,7 @@ cbi %i0,%1 sbi %i0,%1 sbrc %2,0\;sbi %i0,%1\;sbrs %2,0\;cbi %i0,%1" - [(set_attr "length" "1,1,4") - (set_attr "cc" "none")]) + [(set_attr "length" "1,1,4")]) (define_insn "*insv.not.io" [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "i")) @@ -6630,8 +9057,7 @@ (not:QI (match_operand:QI 2 "register_operand" "r")))] "" "sbrs %2,0\;sbi %i0,%1\;sbrc %2,0\;cbi %i0,%1" - [(set_attr "length" "4") - (set_attr "cc" "none")]) + [(set_attr "length" "4")]) ;; The insv expander. ;; We only support 1-bit inserts @@ -6648,20 +9074,34 @@ ;; complicated. ;; Insert bit $2.0 into $0.$1 -(define_insn "*insv.reg" +(define_insn_and_split "*insv.reg_split" [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r,d,d,l,l") (const_int 1) (match_operand:QI 1 "const_0_to_7_operand" "n,n,n,n,n")) (match_operand:QI 2 "nonmemory_operand" "r,L,P,L,P"))] "" + "#" + "&& reload_completed" + [(parallel [(set (zero_extract:QI (match_dup 0) + (const_int 1) + (match_dup 1)) + (match_dup 2)) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*insv.reg" + [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r,d,d,l,l") + (const_int 1) + (match_operand:QI 1 "const_0_to_7_operand" "n,n,n,n,n")) + (match_operand:QI 2 "nonmemory_operand" "r,L,P,L,P")) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ bst %2,0\;bld %0,%1 andi %0,lo8(~(1<<%1)) ori %0,lo8(1<<%1) clt\;bld %0,%1 set\;bld %0,%1" - [(set_attr "length" "2,1,1,2,2") - (set_attr "cc" "none,set_zn,set_zn,none,none")]) + [(set_attr "length" "2,1,1,2,2")]) ;; Insert bit $2.$3 into $0.$1 (define_insn "*insv.extract" @@ -6673,8 +9113,7 @@ (match_operand:QI 3 "const_0_to_7_operand" "n")))] "" "bst %2,%3\;bld %0,%1" - [(set_attr "length" "2") - (set_attr "cc" "none")]) + [(set_attr "length" "2")]) ;; Insert bit $2.$3 into $0.$1 (define_insn "*insv.shiftrt" @@ -6685,67 +9124,128 @@ (match_operand:QI 3 "const_0_to_7_operand" "n")))] "" "bst %2,%3\;bld %0,%1" - [(set_attr "length" "2") - (set_attr "cc" "none")]) + [(set_attr "length" "2")]) ;; Same, but with a NOT inverting the source bit. ;; Insert bit ~$2.$3 into $0.$1 -(define_insn "*insv.not-shiftrt" +(define_insn_and_split "*insv.not-shiftrt_split" [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") (const_int 1) (match_operand:QI 1 "const_0_to_7_operand" "n")) (not:QI (any_shiftrt:QI (match_operand:QI 2 "register_operand" "r") (match_operand:QI 3 "const_0_to_7_operand" "n"))))] "" + "#" + "&& reload_completed" + [(parallel [(set (zero_extract:QI (match_dup 0) + (const_int 1) + (match_dup 1)) + (not:QI (any_shiftrt:QI (match_dup 2) + (match_dup 3)))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*insv.not-shiftrt" + [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") + (const_int 1) + (match_operand:QI 1 "const_0_to_7_operand" "n")) + (not:QI (any_shiftrt:QI (match_operand:QI 2 "register_operand" "r") + (match_operand:QI 3 "const_0_to_7_operand" "n")))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_insert_notbit (insn, operands, NULL_RTX, NULL); } - [(set_attr "adjust_len" "insv_notbit") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "insv_notbit")]) ;; Insert bit ~$2.0 into $0.$1 -(define_insn "*insv.xor1-bit.0" +(define_insn_and_split "*insv.xor1-bit.0_split" [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") (const_int 1) (match_operand:QI 1 "const_0_to_7_operand" "n")) (xor:QI (match_operand:QI 2 "register_operand" "r") (const_int 1)))] "" + "#" + "&& reload_completed" + [(parallel [(set (zero_extract:QI (match_dup 0) + (const_int 1) + (match_dup 1)) + (xor:QI (match_dup 2) + (const_int 1))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*insv.xor1-bit.0" + [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") + (const_int 1) + (match_operand:QI 1 "const_0_to_7_operand" "n")) + (xor:QI (match_operand:QI 2 "register_operand" "r") + (const_int 1))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_insert_notbit (insn, operands, const0_rtx, NULL); } - [(set_attr "adjust_len" "insv_notbit_0") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "insv_notbit_0")]) ;; Insert bit ~$2.0 into $0.$1 -(define_insn "*insv.not-bit.0" +(define_insn_and_split "*insv.not-bit.0_split" [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") (const_int 1) (match_operand:QI 1 "const_0_to_7_operand" "n")) (not:QI (match_operand:QI 2 "register_operand" "r")))] "" + "#" + "&& reload_completed" + [(parallel [(set (zero_extract:QI (match_dup 0) + (const_int 1) + (match_dup 1)) + (not:QI (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*insv.not-bit.0" + [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") + (const_int 1) + (match_operand:QI 1 "const_0_to_7_operand" "n")) + (not:QI (match_operand:QI 2 "register_operand" "r"))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_insert_notbit (insn, operands, const0_rtx, NULL); } - [(set_attr "adjust_len" "insv_notbit_0") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "insv_notbit_0")]) ;; Insert bit ~$2.7 into $0.$1 -(define_insn "*insv.not-bit.7" +(define_insn_and_split "*insv.not-bit.7_split" [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") (const_int 1) (match_operand:QI 1 "const_0_to_7_operand" "n")) (ge:QI (match_operand:QI 2 "register_operand" "r") (const_int 0)))] "" + "#" + "&& reload_completed" + [(parallel [(set (zero_extract:QI (match_dup 0) + (const_int 1) + (match_dup 1)) + (ge:QI (match_dup 2) + (const_int 0))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*insv.not-bit.7" + [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") + (const_int 1) + (match_operand:QI 1 "const_0_to_7_operand" "n")) + (ge:QI (match_operand:QI 2 "register_operand" "r") + (const_int 0))) + (clobber (reg:CC REG_CC))] + "reload_completed" { return avr_out_insert_notbit (insn, operands, GEN_INT (7), NULL); } - [(set_attr "adjust_len" "insv_notbit_7") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "insv_notbit_7")]) ;; Insert bit ~$2.$3 into $0.$1 -(define_insn "*insv.xor-extract" +(define_insn_and_split "*insv.xor-extract_split" [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") (const_int 1) (match_operand:QI 1 "const_0_to_7_operand" "n")) @@ -6754,11 +9254,31 @@ (const_int 1) (match_operand:QI 3 "const_0_to_7_operand" "n")))] "INTVAL (operands[4]) & (1 << INTVAL (operands[3]))" + "#" + "&& reload_completed" + [(parallel [(set (zero_extract:QI (match_dup 0) + (const_int 1) + (match_dup 1)) + (any_extract:QI (xor:QI (match_dup 2) + (match_dup 4)) + (const_int 1) + (match_dup 3))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*insv.xor-extract" + [(set (zero_extract:QI (match_operand:QI 0 "register_operand" "+r") + (const_int 1) + (match_operand:QI 1 "const_0_to_7_operand" "n")) + (any_extract:QI (xor:QI (match_operand:QI 2 "register_operand" "r") + (match_operand:QI 4 "const_int_operand" "n")) + (const_int 1) + (match_operand:QI 3 "const_0_to_7_operand" "n"))) + (clobber (reg:CC REG_CC))] + "INTVAL (operands[4]) & (1 << INTVAL (operands[3])) && reload_completed" { return avr_out_insert_notbit (insn, operands, NULL_RTX, NULL); } - [(set_attr "adjust_len" "insv_notbit") - (set_attr "cc" "clobber")]) + [(set_attr "adjust_len" "insv_notbit")]) ;; Some combine patterns that try to fix bad code when a value is composed @@ -6887,20 +9407,34 @@ (match_operand:QI 2 "const1_operand" "") (match_operand:QI 3 "const_0_to_7_operand" "")))]) -(define_insn "*extzv" +(define_insn_and_split "*extzv_split" [(set (match_operand:QI 0 "register_operand" "=*d,*d,*d,*d,r") (zero_extract:QI (match_operand:QI 1 "register_operand" "0,r,0,0,r") (const_int 1) (match_operand:QI 2 "const_0_to_7_operand" "L,L,P,C04,n")))] "" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (zero_extract:QI (match_dup 1) + (const_int 1) + (match_dup 2))) + (clobber (reg:CC REG_CC))])]) + +(define_insn "*extzv" + [(set (match_operand:QI 0 "register_operand" "=*d,*d,*d,*d,r") + (zero_extract:QI (match_operand:QI 1 "register_operand" "0,r,0,0,r") + (const_int 1) + (match_operand:QI 2 "const_0_to_7_operand" "L,L,P,C04,n"))) + (clobber (reg:CC REG_CC))] + "reload_completed" "@ andi %0,1 mov %0,%1\;andi %0,1 lsr %0\;andi %0,1 swap %0\;andi %0,1 bst %1,%2\;clr %0\;bld %0,0" - [(set_attr "length" "1,2,2,2,3") - (set_attr "cc" "set_zn,set_zn,set_zn,set_zn,clobber")]) + [(set_attr "length" "1,2,2,2,3")]) (define_insn_and_split "*extzv.qihi1" [(set (match_operand:HI 0 "register_operand" "=r") -- cgit v1.1 From 4c84c45d8ab5ef55aabef18da17244dc13170f9c Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Wed, 28 Apr 2021 21:15:16 +0200 Subject: doc/install.texi: Document --enable-offload-defaulted config option Document configure --enable-offload-defaulted option added in commit r12-218-gfe5bfa6704179f8db7d1ae0b485439e9896df8eb gcc/ChangeLog: * doc/install.texi (--enable-offload-defaulted): Document. --- gcc/doc/install.texi | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'gcc') diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index 4c38244..d2cab15 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -2239,6 +2239,14 @@ specifying paths @var{path1}, @dots{}, @var{pathN}. --enable-offload-targets=x86_64-intelmicemul-linux-gnu=/path/to/x86_64/compiler,nvptx-none @end smallexample +@item --enable-offload-defaulted + +Tell GCC that configured but not installed offload compilers and libgomp +plugins are silently ignored. Useful for distribution compilers where +those are in separate optional packages and where the presence or absence +of those optional packages should determine the actual supported offloading +target set rather than the GCC configure-time selection. + @item --with-hsa-runtime=@var{pathname} @itemx --with-hsa-runtime-include=@var{pathname} @itemx --with-hsa-runtime-lib=@var{pathname} -- cgit v1.1 From 54f0224d55a1b56dde092460ddf76913670e6efc Mon Sep 17 00:00:00 2001 From: Patrick McGehearty Date: Wed, 28 Apr 2021 19:14:48 +0000 Subject: Practical improvement to libgcc complex divide Correctness and performance test programs used during development of this project may be found in the attachment to: https://www.mail-archive.com/gcc-patches@gcc.gnu.org/msg254210.html Summary of Purpose This patch to libgcc/libgcc2.c __divdc3 provides an opportunity to gain important improvements to the quality of answers for the default complex divide routine (half, float, double, extended, long double precisions) when dealing with very large or very small exponents. The current code correctly implements Smith's method (1962) [2] further modified by c99's requirements for dealing with NaN (not a number) results. When working with input values where the exponents are greater than *_MAX_EXP/2 or less than -(*_MAX_EXP)/2, results are substantially different from the answers provided by quad precision more than 1% of the time. This error rate may be unacceptable for many applications that cannot a priori restrict their computations to the safe range. The proposed method reduces the frequency of "substantially different" answers by more than 99% for double precision at a modest cost of performance. Differences between current gcc methods and the new method will be described. Then accuracy and performance differences will be discussed. Background This project started with an investigation related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59714. Study of Beebe[1] provided an overview of past and recent practice for computing complex divide. The current glibc implementation is based on Robert Smith's algorithm [2] from 1962. A google search found the paper by Baudin and Smith [3] (same Robert Smith) published in 2012. Elen Kalda's proposed patch [4] is based on that paper. I developed two sets of test data by randomly distributing values over a restricted range and the full range of input values. The current complex divide handled the restricted range well enough, but failed on the full range more than 1% of the time. Baudin and Smith's primary test for "ratio" equals zero reduced the cases with 16 or more error bits by a factor of 5, but still left too many flawed answers. Adding debug print out to cases with substantial errors allowed me to see the intermediate calculations for test values that failed. I noted that for many of the failures, "ratio" was a subnormal. Changing the "ratio" test from check for zero to check for subnormal reduced the 16 bit error rate by another factor of 12. This single modified test provides the greatest benefit for the least cost, but the percentage of cases with greater than 16 bit errors (double precision data) is still greater than 0.027% (2.7 in 10,000). Continued examination of remaining errors and their intermediate computations led to the various tests of input value tests and scaling to avoid under/overflow. The current patch does not handle some of the rare and most extreme combinations of input values, but the random test data is only showing 1 case in 10 million that has an error of greater than 12 bits. That case has 18 bits of error and is due to subtraction cancellation. These results are significantly better than the results reported by Baudin and Smith. Support for half, float, double, extended, and long double precision is included as all are handled with suitable preprocessor symbols in a single source routine. Since half precision is computed with float precision as per current libgcc practice, the enhanced algorithm provides no benefit for half precision and would cost performance. Further investigation showed changing the half precision algorithm to use the simple formula (real=a*c+b*d imag=b*c-a*d) caused no loss of precision and modest improvement in performance. The existing constants for each precision: float: FLT_MAX, FLT_MIN; double: DBL_MAX, DBL_MIN; extended and/or long double: LDBL_MAX, LDBL_MIN are used for avoiding the more common overflow/underflow cases. This use is made generic by defining appropriate __LIBGCC2_* macros in c-cppbuiltin.c. Tests are added for when both parts of the denominator have exponents small enough to allow shifting any subnormal values to normal values all input values could be scaled up without risking overflow. That gained a clear improvement in accuracy. Similarly, when either numerator was subnormal and the other numerator and both denominator values were not too large, scaling could be used to reduce risk of computing with subnormals. The test and scaling values used all fit within the allowed exponent range for each precision required by the C standard. Float precision has more difficulty with getting correct answers than double precision. When hardware for double precision floating point operations is available, float precision is now handled in double precision intermediate calculations with the simple algorithm the same as the half-precision method of using float precision for intermediate calculations. Using the higher precision yields exact results for all tested input values (64-bit double, 32-bit float) with the only performance cost being the requirement to convert the four input values from float to double. If double precision hardware is not available, then float complex divide will use the same improved algorithm as the other precisions with similar change in performance. Further Improvement The most common remaining substantial errors are due to accuracy loss when subtracting nearly equal values. This patch makes no attempt to improve that situation. NOTATION For all of the following, the notation is: Input complex values: a+bi (a= real part, b= imaginary part) c+di Output complex value: e+fi = (a+bi)/(c+di) For the result tables: current = current method (SMITH) b1div = method proposed by Elen Kalda b2div = alternate method considered by Elen Kalda new = new method proposed by this patch DESCRIPTIONS of different complex divide methods: NAIVE COMPUTATION (-fcx-limited-range): e = (a*c + b*d)/(c*c + d*d) f = (b*c - a*d)/(c*c + d*d) Note that c*c and d*d will overflow or underflow if either c or d is outside the range 2^-538 to 2^512. This method is available in gcc when the switch -fcx-limited-range is used. That switch is also enabled by -ffast-math. Only one who has a clear understanding of the maximum range of all intermediate values generated by an application should consider using this switch. SMITH's METHOD (current libgcc): if(fabs(c) RBIG) || (FABS (a) > RBIG) || (FABS (b) > RBIG) ) { a = a * 0.5; b = b * 0.5; c = c * 0.5; d = d * 0.5; } /* minimize overflow/underflow issues when c and d are small */ else if (FABS (d) < RMIN2) { a = a * RMINSCAL; b = b * RMINSCAL; c = c * RMINSCAL; d = d * RMINSCAL; } else { if(((FABS (a) < RMIN) && (FABS (b) < RMAX2) && (FABS (d) < RMAX2)) || ((FABS (b) < RMIN) && (FABS (a) < RMAX2) && (FABS (d) < RMAX2))) { a = a * RMINSCAL; b = b * RMINSCAL; c = c * RMINSCAL; d = d * RMINSCAL; } } r = c/d; denom = (c*r) + d; if( r > RMIN ) { e = (a*r + b) / denom ; f = (b*r - a) / denom } else { e = (c * (a/d) + b) / denom; f = (c * (b/d) - a) / denom; } } [ only presenting the fabs(c) < fabs(d) case here, full code in patch. ] Before any computation of the answer, the code checks for any input values near maximum to allow down scaling to avoid overflow. These scalings almost never harm the accuracy since they are by 2. Values that are over RBIG are relatively rare but it is easy to test for them and allow aviodance of overflows. Testing for RMIN2 reveals when both c and d are less than [FLT|DBL]_EPSILON. By scaling all values by 1/EPSILON, the code converts subnormals to normals, avoids loss of accuracy and underflows in intermediate computations that otherwise might occur. If scaling a and b by 1/EPSILON causes either to overflow, then the computation will overflow whatever method is used. Finally, we test for either a or b being subnormal (RMIN) and if so, for the other three values being small enough to allow scaling. We only need to test a single denominator value since we have already determined which of c and d is larger. Next, r (the ratio of c to d) is checked for being near zero. Baudin and Smith checked r for zero. This code improves that approach by checking for values less than DBL_MIN (subnormal) covers roughly 12 times as many cases and substantially improves overall accuracy. If r is too small, then when it is used in a multiplication, there is a high chance that the result will underflow to zero, losing significant accuracy. That underflow is avoided by reordering the computation. When r is subnormal, the code replaces a*r (= a*(c/d)) with ((a/d)*c) which is mathematically the same but avoids the unnecessary underflow. TEST Data Two sets of data are presented to test these methods. Both sets contain 10 million pairs of complex values. The exponents and mantissas are generated using multiple calls to random() and then combining the results. Only values which give results to complex divide that are representable in the appropriate precision after being computed in quad precision are used. The first data set is labeled "moderate exponents". The exponent range is limited to -DBL_MAX_EXP/2 to DBL_MAX_EXP/2 for Double Precision (use FLT_MAX_EXP or LDBL_MAX_EXP for the appropriate precisions. The second data set is labeled "full exponents". The exponent range for these cases is the full exponent range including subnormals for a given precision. ACCURACY Test results: Note: The following accuracy tests are based on IEEE-754 arithmetic. Note: All results reporteed are based on use of fused multiply-add. If fused multiply-add is not used, the error rate increases, giving more 1 and 2 bit errors for both current and new complex divide. Differences between using fused multiply and not using it that are greater than 2 bits are less than 1 in a million. The complex divide methods are evaluated by determining the percentage of values that exceed differences in low order bits. If a "2 bit" test results show 1%, that would mean that 1% of 10,000,000 values (100,000) have either a real or imaginary part that differs from the quad precision result by more than the last 2 bits. Results are reported for differences greater than or equal to 1 bit, 2 bits, 8 bits, 16 bits, 24 bits, and 52 bits for double precision. Even when the patch avoids overflows and underflows, some input values are expected to have errors due to the potential for catastrophic roundoff from floating point subtraction. For example, when b*c and a*d are nearly equal, the result of subtraction may lose several places of accuracy. This patch does not attempt to detect or minimize this type of error, but neither does it increase them. I only show the results for Elen Kalda's method (with both 1 and 2 divides) and the new method for only 1 divide in the double precision table. In the following charts, lower values are better. current - current complex divide in libgcc b1div - Elen Kalda's method from Baudin & Smith with one divide b2div - Elen Kalda's method from Baudin & Smith with two divides new - This patch which uses 2 divides =================================================== Errors Moderate Dataset gtr eq current b1div b2div new ====== ======== ======== ======== ======== 1 bit 0.24707% 0.92986% 0.24707% 0.24707% 2 bits 0.01762% 0.01770% 0.01762% 0.01762% 8 bits 0.00026% 0.00026% 0.00026% 0.00026% 16 bits 0.00000% 0.00000% 0.00000% 0.00000% 24 bits 0% 0% 0% 0% 52 bits 0% 0% 0% 0% =================================================== Table 1: Errors with Moderate Dataset (Double Precision) Note in Table 1 that both the old and new methods give identical error rates for data with moderate exponents. Errors exceeding 16 bits are exceedingly rare. There are substantial increases in the 1 bit error rates for b1div (the 1 divide/2 multiplys method) as compared to b2div (the 2 divides method). These differences are minimal for 2 bits and larger error measurements. =================================================== Errors Full Dataset gtr eq current b1div b2div new ====== ======== ======== ======== ======== 1 bit 2.05% 1.23842% 0.67130% 0.16664% 2 bits 1.88% 0.51615% 0.50354% 0.00900% 8 bits 1.77% 0.42856% 0.42168% 0.00011% 16 bits 1.63% 0.33840% 0.32879% 0.00001% 24 bits 1.51% 0.25583% 0.24405% 0.00000% 52 bits 1.13% 0.01886% 0.00350% 0.00000% =================================================== Table 2: Errors with Full Dataset (Double Precision) Table 2 shows significant differences in error rates. First, the difference between b1div and b2div show a significantly higher error rate for the b1div method both for single bit errros and well beyond. Even for 52 bits, we see the b1div method gets completely wrong answers more than 5 times as often as b2div. To retain comparable accuracy with current complex divide results for small exponents and due to the increase in errors for large exponents, I choose to use the more accurate method of two divides. The current method has more 1.6% of cases where it is getting results where the low 24 bits of the mantissa differ from the correct answer. More than 1.1% of cases where the answer is completely wrong. The new method shows less than one case in 10,000 with greater than two bits of error and only one case in 10 million with greater than 16 bits of errors. The new patch reduces 8 bit errors by a factor of 16,000 and virtually eliminates completely wrong answers. As noted above, for architectures with double precision hardware, the new method uses that hardware for the intermediate calculations before returning the result in float precision. Testing of the new patch has shown zero errors found as seen in Tables 3 and 4. Correctness for float ============================= Errors Moderate Dataset gtr eq current new ====== ======== ======== 1 bit 28.68070% 0% 2 bits 0.64386% 0% 8 bits 0.00401% 0% 16 bits 0.00001% 0% 24 bits 0% 0% ============================= Table 3: Errors with Moderate Dataset (float) ============================= Errors Full Dataset gtr eq current new ====== ======== ======== 1 bit 19.98% 0% 2 bits 3.20% 0% 8 bits 1.97% 0% 16 bits 1.08% 0% 24 bits 0.55% 0% ============================= Table 4: Errors with Full Dataset (float) As before, the current method shows an troubling rate of extreme errors. There very minor changes in accuracy for half-precision since the code changes from Smith's method to the simple method. 5 out of 1 million test cases show correct answers instead of 1 or 2 bit errors. libgcc computes half-precision functions in float precision allowing the existing methods to avoid overflow/underflow issues for the allowed range of exponents for half-precision. Extended precision (using x87 80-bit format on x86) and Long double (using IEEE-754 128-bit on x86 and aarch64) both have 15-bit exponents as compared to 11-bit exponents in double precision. We note that the C standard also allows Long Double to be implemented in the equivalent range of Double. The RMIN2 and RMINSCAL constants are selected to work within the Double range as well as with extended and 128-bit ranges. We will limit our performance and accurancy discussions to the 80-bit and 128-bit formats as seen on x86 here. The extended and long double precision investigations were more limited. Aarch64 does not support extended precision but does support the software implementation of 128-bit long double precision. For x86, long double defaults to the 80-bit precision but using the -mlong-double-128 flag switches to using the software implementation of 128-bit precision. Both 80-bit and 128-bit precisions have the same exponent range, with the 128-bit precision has extended mantissas. Since this change is only aimed at avoiding underflow/overflow for extreme exponents, I studied the extended precision results on x86 for 100,000 values. The limited exponent dataset showed no differences. For the dataset with full exponent range, the current and new values showed major differences (greater than 32 bits) in 567 cases out of 100,000 (0.56%). In every one of these cases, the ratio of c/d or d/c (as appropriate) was zero or subnormal, indicating the advantage of the new method and its continued correctness where needed. PERFORMANCE Test results In order for a library change to be practical, it is necessary to show the slowdown is tolerable. The slowdowns observed are much less than would be seen by (for example) switching from hardware double precison to a software quad precision, which on the tested machines causes a slowdown of around 100x). The actual slowdown depends on the machine architecture. It also depends on the nature of the input data. If underflow/overflow is rare, then implementations that have strong branch prediction will only slowdown by a few cycles. If underflow/overflow is common, then the branch predictors will be less accurate and the cost will be higher. Results from two machines are presented as examples of the overhead for the new method. The one labeled x86 is a 5 year old Intel x86 processor and the one labeled aarch64 is a 3 year old arm64 processor. In the following chart, the times are averaged over a one million value data set. All values are scaled to set the time of the current method to be 1.0. Lower values are better. A value of less than 1.0 would be faster than the current method and a value greater than 1.0 would be slower than the current method. ================================================ Moderate set full set x86 aarch64 x86 aarch64 ======== =============== =============== float 0.59 0.79 0.45 0.81 double 1.04 1.24 1.38 1.56 long double 1.13 1.24 1.29 1.25 ================================================ Table 5: Performance Comparisons (ratio new/current) The above tables omit the timing for the 1 divide and 2 multiply comparison with the 2 divide approach. The float results show clear performance improvement due to using the simple method with double precision for intermediate calculations. The double results with the newer method show less overhead for the moderate dataset than for the full dataset. That's because the moderate dataset does not ever take the new branches which protect from under/overflow. The better the branch predictor, the lower the cost for these untaken branches. Both platforms are somewhat dated, with the x86 having a better branch predictor which reduces the cost of the additional branches in the new code. Of course, the relative slowdown may be greater for some architectures, especially those with limited branch prediction combined with a high cost of misprediction. The long double results are fairly consistent in showing the moderate additional cost of the extra branches and calculations for all cases. The observed cost for all precisions is claimed to be tolerable on the grounds that: (a) the cost is worthwhile considering the accuracy improvement shown. (b) most applications will only spend a small fraction of their time calculating complex divide. (c) it is much less than the cost of extended precision (d) users are not forced to use it (as described below) Those users who find this degree of slowdown unsatisfactory may use the gcc switch -fcx-fortran-rules which does not use the library routine, instead inlining Smith's method without the C99 requirement for dealing with NaN results. The proposed patch for libgcc complex divide does not affect the code generated by -fcx-fortran-rules. SUMMARY When input data to complex divide has exponents whose absolute value is less than half of *_MAX_EXP, this patch makes no changes in accuracy and has only a modest effect on performance. When input data contains values outside those ranges, the patch eliminates more than 99.9% of major errors with a tolerable cost in performance. In comparison to Elen Kalda's method, this patch introduces more performance overhead but reduces major errors by a factor of greater than 4000. REFERENCES [1] Nelson H.F. Beebe, "The Mathematical-Function Computation Handbook. Springer International Publishing AG, 2017. [2] Robert L. Smith. Algorithm 116: Complex division. Commun. ACM, 5(8):435, 1962. [3] Michael Baudin and Robert L. Smith. "A robust complex division in Scilab," October 2012, available at http://arxiv.org/abs/1210.4539. [4] Elen Kalda: Complex division improvements in libgcc https://gcc.gnu.org/legacy-ml/gcc-patches/2019-08/msg01629.html 2020-12-08 Patrick McGehearty gcc/c-family/ * c-cppbuiltin.c (c_cpp_builtins): Add supporting macros for new complex divide libgcc/ * libgcc2.c (XMTYPE, XCTYPE, RBIG, RMIN, RMIN2, RMINSCAL, RMAX2): Define. (__divsc3, __divdc3, __divxc3, __divtc3): Improve complex divide. * config/rs6000/_divkc3.c (RBIG, RMIN, RMIN2, RMINSCAL, RMAX2): Define. (__divkc3): Improve complex divide. gcc/testsuite/ * gcc.c-torture/execute/ieee/cdivchkd.c: New test. * gcc.c-torture/execute/ieee/cdivchkf.c: Likewise. * gcc.c-torture/execute/ieee/cdivchkld.c: Likewise. --- gcc/c-family/c-cppbuiltin.c | 58 +++++-- .../gcc.c-torture/execute/ieee/cdivchkd.c | 126 ++++++++++++++++ .../gcc.c-torture/execute/ieee/cdivchkf.c | 125 +++++++++++++++ .../gcc.c-torture/execute/ieee/cdivchkld.c | 168 +++++++++++++++++++++ 4 files changed, 465 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkd.c create mode 100644 gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkf.c create mode 100644 gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkld.c (limited to 'gcc') diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c index 9f993c4..42b7604 100644 --- a/gcc/c-family/c-cppbuiltin.c +++ b/gcc/c-family/c-cppbuiltin.c @@ -1277,29 +1277,39 @@ c_cpp_builtins (cpp_reader *pfile) { scalar_float_mode mode = mode_iter.require (); const char *name = GET_MODE_NAME (mode); + const size_t name_len = strlen (name); + char float_h_prefix[16] = ""; char *macro_name - = (char *) alloca (strlen (name) - + sizeof ("__LIBGCC__MANT_DIG__")); + = XALLOCAVEC (char, name_len + sizeof ("__LIBGCC__MANT_DIG__")); sprintf (macro_name, "__LIBGCC_%s_MANT_DIG__", name); builtin_define_with_int_value (macro_name, REAL_MODE_FORMAT (mode)->p); if (!targetm.scalar_mode_supported_p (mode) || !targetm.libgcc_floating_mode_supported_p (mode)) continue; - macro_name = (char *) alloca (strlen (name) - + sizeof ("__LIBGCC_HAS__MODE__")); + macro_name = XALLOCAVEC (char, name_len + + sizeof ("__LIBGCC_HAS__MODE__")); sprintf (macro_name, "__LIBGCC_HAS_%s_MODE__", name); cpp_define (pfile, macro_name); - macro_name = (char *) alloca (strlen (name) - + sizeof ("__LIBGCC__FUNC_EXT__")); + macro_name = XALLOCAVEC (char, name_len + + sizeof ("__LIBGCC__FUNC_EXT__")); sprintf (macro_name, "__LIBGCC_%s_FUNC_EXT__", name); char suffix[20] = ""; if (mode == TYPE_MODE (double_type_node)) - ; /* Empty suffix correct. */ + { + /* Empty suffix correct. */ + memcpy (float_h_prefix, "DBL", 4); + } else if (mode == TYPE_MODE (float_type_node)) - suffix[0] = 'f'; + { + suffix[0] = 'f'; + memcpy (float_h_prefix, "FLT", 4); + } else if (mode == TYPE_MODE (long_double_type_node)) - suffix[0] = 'l'; + { + suffix[0] = 'l'; + memcpy (float_h_prefix, "LDBL", 5); + } else { bool found_suffix = false; @@ -1310,6 +1320,8 @@ c_cpp_builtins (cpp_reader *pfile) sprintf (suffix, "f%d%s", floatn_nx_types[i].n, floatn_nx_types[i].extended ? "x" : ""); found_suffix = true; + sprintf (float_h_prefix, "FLT%d%s", floatn_nx_types[i].n, + floatn_nx_types[i].extended ? "X" : ""); break; } gcc_assert (found_suffix); @@ -1347,11 +1359,33 @@ c_cpp_builtins (cpp_reader *pfile) default: gcc_unreachable (); } - macro_name = (char *) alloca (strlen (name) - + sizeof ("__LIBGCC__EXCESS_" - "PRECISION__")); + macro_name = XALLOCAVEC (char, name_len + + sizeof ("__LIBGCC__EXCESS_PRECISION__")); sprintf (macro_name, "__LIBGCC_%s_EXCESS_PRECISION__", name); builtin_define_with_int_value (macro_name, excess_precision); + + char val_name[64]; + + macro_name = XALLOCAVEC (char, name_len + + sizeof ("__LIBGCC__EPSILON__")); + sprintf (macro_name, "__LIBGCC_%s_EPSILON__", name); + sprintf (val_name, "__%s_EPSILON__", float_h_prefix); + builtin_define_with_value (macro_name, val_name, 0); + + macro_name = XALLOCAVEC (char, name_len + sizeof ("__LIBGCC__MAX__")); + sprintf (macro_name, "__LIBGCC_%s_MAX__", name); + sprintf (val_name, "__%s_MAX__", float_h_prefix); + builtin_define_with_value (macro_name, val_name, 0); + + macro_name = XALLOCAVEC (char, name_len + sizeof ("__LIBGCC__MIN__")); + sprintf (macro_name, "__LIBGCC_%s_MIN__", name); + sprintf (val_name, "__%s_MIN__", float_h_prefix); + builtin_define_with_value (macro_name, val_name, 0); + +#ifdef HAVE_adddf3 + builtin_define_with_int_value ("__LIBGCC_HAVE_HWDBL__", + HAVE_adddf3); +#endif } /* For libgcc crtstuff.c and libgcc2.c. */ diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkd.c b/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkd.c new file mode 100644 index 0000000..3ef5fad --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkd.c @@ -0,0 +1,126 @@ +/* + Program to test complex divide for correct results on selected values. + Checking known failure points. +*/ + +#include + +extern void abort (void); +extern void exit (int); + +extern int ilogb (double); +int match (double _Complex, double _Complex); + +#define SMALL DBL_MIN +#define MAXBIT DBL_MANT_DIG +#define ERRLIM 6 + +/* + Compare c (computed value) with z (expected value). + Return 0 if within allowed range. Return 1 if not. +*/ +int match (double _Complex c, double _Complex z) +{ + double rz, iz, rc, ic; + double rerr, ierr, rmax; + int biterr; + rz = __real__ z; + iz = __imag__ z; + rc = __real__ c; + ic = __imag__ c; + + if (__builtin_fabs (rz) > SMALL) + { + rerr = __builtin_fabs (rz - rc) / __builtin_fabs (rz); + } + else if (__builtin_fabs (rz) == 0.0) + { + rerr = __builtin_fabs (rc); + } + else + { + rerr = __builtin_fabs (rz - rc) / SMALL; + } + + if (__builtin_fabs (iz) > SMALL) + { + ierr = __builtin_fabs (iz - ic) / __builtin_fabs (iz); + } + else if (__builtin_fabs (iz) == 0.0) + { + ierr = __builtin_fabs (ic); + } + else + { + ierr = __builtin_fabs (iz - ic) / SMALL; + } + rmax = __builtin_fmax(rerr, ierr); + biterr = 0; + if ( rmax != 0.0) + { + biterr = ilogb (rmax) + MAXBIT + 1; + } + + if (biterr >= ERRLIM) + return 0; + else + return 1; +} + + +int main (int argc, char** argv) +{ + double _Complex a,b,c,z; + double xr[4], xi[4], yr[4], yi[4], zr[4], zi[4]; + double cr, ci; + int i; + int ok = 1; + xr[0] = -0x1.16e7fad79e45ep+651; + xi[0] = -0x1.f7f75b94c6c6ap-860; + yr[0] = -0x1.2f40d8ff7e55ep+245; + yi[0] = -0x0.0000000004ebcp-1022; + zr[0] = 0x1.d6e4b0e282869p+405; + zi[0] = -0x1.e9095e311e706p-900; + + xr[1] = -0x1.21ff587f953d3p-310; + xi[1] = -0x1.5a526dcc59960p+837; + yr[1] = 0x1.b88b8b552eaadp+735; + yi[1] = -0x1.873e2d6544d92p-327; + zr[1] = 0x1.65734a88b2de0p-961; + zi[1] = -0x1.927e85b8b5770p+101; + + xr[2] = 0x1.4612e41aa8080p-846; + xi[2] = -0x0.0000000613e07p-1022; + yr[2] = 0x1.df9cd0d58caafp-820; + yi[2] = -0x1.e47051a9036dbp-584; + zr[2] = 0x1.9b194f3fffa32p-469; + zi[2] = 0x1.58a00ab740a6bp-263; + + xr[3] = 0x1.cb27eece7c585p-355; + xi[3] = 0x0.000000223b8a8p-1022; + yr[3] = -0x1.74e7ed2b9189fp-22; + yi[3] = 0x1.3d80439e9a119p-731; + zr[3] = -0x1.3b35ed806ae5ap-333; + zi[3] = -0x0.05e01bcbfd9f6p-1022; + + + for (i = 0; i < 4; i++) + { + __real__ a = xr[i]; + __imag__ a = xi[i]; + __real__ b = yr[i]; + __imag__ b = yi[i]; + __real__ z = zr[i]; + __imag__ z = zi[i]; + c = a / b; + cr = __real__ c; + ci = __imag__ c; + + if (!match (c,z)){ + ok = 0; + } + } + if (!ok) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkf.c b/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkf.c new file mode 100644 index 0000000..adf1ed9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkf.c @@ -0,0 +1,125 @@ +/* + Program to test complex divide for correct results on selected values. + Checking known failure points. +*/ + +#include + +extern void abort (void); +extern void exit (int); + +extern int ilogbf (float); +int match (float _Complex, float _Complex); + +#define SMALL FLT_MIN +#define MAXBIT FLT_MANT_DIG +#define ERRLIM 6 + +/* + Compare c (computed value) with z (expected value). + Return 0 if within allowed range. Return 1 if not. +*/ +int match (float _Complex c, float _Complex z) +{ + float rz, iz, rc, ic; + float rerr, ierr, rmax; + int biterr; + rz = __real__ z; + iz = __imag__ z; + rc = __real__ c; + ic = __imag__ c; + + if (__builtin_fabsf (rz) > SMALL) + { + rerr = __builtin_fabsf (rz - rc) / __builtin_fabsf (rz); + } + else if (__builtin_fabsf (rz) == 0.0) + { + rerr = __builtin_fabsf (rc); + } + else + { + rerr = __builtin_fabsf (rz - rc) / SMALL; + } + + if (__builtin_fabsf (iz) > SMALL) + { + ierr = __builtin_fabsf (iz - ic) / __builtin_fabsf (iz); + } + else if (__builtin_fabsf (iz) == 0.0) + { + ierr = __builtin_fabsf (ic); + } + else + { + ierr = __builtin_fabsf (iz - ic) / SMALL; + } + rmax = __builtin_fmaxf(rerr, ierr); + biterr = 0; + if ( rmax != 0.0) + { + biterr = ilogbf (rmax) + MAXBIT + 1; + } + + if (biterr >= ERRLIM) + return 0; + else + return 1; +} + + +int main(int argc, char** argv) +{ + float _Complex a,b,c,z; + float xr[4], xi[4], yr[4], yi[4], zr[4], zi[4]; + float cr, ci; + int i; + int ok = 1; + xr[0] = 0x1.0b1600p-133; + xi[0] = 0x1.5e1c28p+54; + yr[0] = -0x1.cdec8cp-119; + yi[0] = 0x1.1e72ccp+32; + zr[0] = 0x1.38e502p+22; + zi[0] = -0x1.f89220p-129; + + xr[1] = -0x1.b1bee2p+121; + xi[1] = -0x1.cb403ep-59; + yr[1] = 0x1.480000p-144; + yi[1] = -0x1.c66fc4p+5; + zr[1] = -0x1.60b8cap-34; + zi[1] = -0x1.e8b02ap+115; + + xr[2] = -0x1.3f6e00p-97; + xi[2] = -0x1.c00000p-146; + yr[2] = 0x1.000000p-148; + yi[2] = -0x1.0c4e70p-91; + zr[2] = 0x1.aa50d0p-55; + zi[2] = -0x1.30c746p-6; + + xr[3] = 0x1.000000p-148; + xi[3] = 0x1.f4bc04p-84; + yr[3] = 0x1.00ad74p-20; + yi[3] = 0x1.2ad02ep-85; + zr[3] = 0x1.1102ccp-127; + zi[3] = 0x1.f369a4p-64; + + for (i = 0; i < 4; i++) + { + __real__ a = xr[i]; + __imag__ a = xi[i]; + __real__ b = yr[i]; + __imag__ b = yi[i]; + __real__ z = zr[i]; + __imag__ z = zi[i]; + c = a / b; + cr = __real__ c; + ci = __imag__ c; + + if (!match (c,z)){ + ok = 0; + } + } + if (!ok) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkld.c b/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkld.c new file mode 100644 index 0000000..ffe9c34 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/ieee/cdivchkld.c @@ -0,0 +1,168 @@ +/* + Program to test complex divide for correct results on selected values. + Checking known failure points. +*/ + +#include + +extern void abort (void); +extern void exit (int); + +extern int ilogbl (long double); +int match (long double _Complex,long double _Complex); + +#define SMALL LDBL_MIN +#define MAXBIT LDBL_MANT_DIG +#define ERRLIM 6 + +/* + Compare c (computed value) with z (expected value). + Return 0 if within allowed range. Return 1 if not. +*/ +int match (long double _Complex c,long double _Complex z) +{ + long double rz, iz, rc, ic; + long double rerr, ierr, rmax; + int biterr; + rz = __real__ z; + iz = __imag__ z; + rc = __real__ c; + ic = __imag__ c; + + if (__builtin_fabsl (rz) > SMALL) + { + rerr = __builtin_fabsl (rz - rc) / __builtin_fabsl(rz); + } + else if (__builtin_fabsl (rz) == 0.0) + { + rerr = __builtin_fabsl (rc); + } + else + { + rerr = __builtin_fabsl (rz - rc) / SMALL; + } + + if (__builtin_fabsl (iz) > SMALL) + { + ierr = __builtin_fabsl (iz - ic) / __builtin_fabsl(iz); + } + else if (__builtin_fabsl (iz) == 0.0) + { + ierr = __builtin_fabsl (ic); + } + else + { + ierr = __builtin_fabsl (iz - ic) / SMALL; + } + rmax = __builtin_fmaxl (rerr, ierr); + biterr = 0; + if ( rmax != 0.0) + { + biterr = ilogbl (rmax) + MAXBIT + 1; + } + + if (biterr >= ERRLIM) + return 0; + else + return 1; +} + + +int main (int argc, char** argv) +{ + long double _Complex a,b,c,z; + long double xr[4], xi[4], yr[4], yi[4], zr[4], zi[4]; + long double cr, ci; + int i; + int ok = 1; + +#if (LDBL_MAX_EXP < 2048) + /* + Test values when mantissa is 11 or fewer bits. Either LDBL is + using DBL on this platform or we are using IBM extended double + precision. Test values will be automatically truncated when + the available precision is smaller than the explicit precision. + */ + xr[0] = -0x1.16e7fad79e45ep+651; + xi[0] = -0x1.f7f75b94c6c6ap-860; + yr[0] = -0x1.2f40d8ff7e55ep+245; + yi[0] = -0x0.0000000004ebcp-968; + zr[0] = 0x1.d6e4b0e2828694570ba839070beep+405L; + zi[0] = -0x1.e9095e311e70498db810196259b7p-846L; + + xr[1] = -0x1.21ff587f953d3p-310; + xi[1] = -0x1.5a526dcc59960p+837; + yr[1] = 0x1.b88b8b552eaadp+735; + yi[1] = -0x1.873e2d6544d92p-327; + zr[1] = 0x1.65734a88b2ddff699c482ee8eef6p-961L; + zi[1] = -0x1.927e85b8b576f94a797a1bcb733dp+101L; + + xr[2] = 0x1.4612e41aa8080p-846; + xi[2] = -0x0.0000000613e07p-968; + yr[2] = 0x1.df9cd0d58caafp-820; + yi[2] = -0x1.e47051a9036dbp-584; + zr[2] = 0x1.9b194f3aaadea545174c5372d8p-415L; + zi[2] = 0x1.58a00ab740a6ad3249002f2b79p-263L; + + xr[3] = 0x1.cb27eece7c585p-355; + xi[3] = 0x0.000000223b8a8p-968; + yr[3] = -0x1.74e7ed2b9189fp-22; + yi[3] = 0x1.3d80439e9a119p-731; + zr[3] = -0x1.3b35ed806ae5a2a8cc1c9a96931dp-333L; + zi[3] = -0x1.7802c17c774895bd541adeb200p-974L; +#else + /* + Test values intended for either IEEE128 or Intel80 formats. In + either case, 15 bits of exponent are available. Test values will + be automatically truncated when the available precision is smaller + than the explicit precision. + */ + xr[0] = -0x9.c793985b7d029d90p-8480L; + xi[0] = 0x8.018745ffa61a8fe0p+16329L; + yr[0] = -0xe.d5bee9c523a35ad0p-15599L; + yi[0] = -0xa.8c93c5a4f94128f0p+869L; + zr[0] = -0x1.849178451c035b95d16311d0efdap+15459L; + zi[0] = -0x1.11375ed2c1f58b9d047ab64aed97p-1008L; + + xr[1] = 0xb.68e44bc6d0b91a30p+16026L; + xi[1] = 0xb.ab10f5453e972f30p-14239L; + yr[1] = 0x8.8cbd470705428ff0p-16350L; + yi[1] = -0xa.0c1cbeae4e4b69f0p+347L; + zr[1] = 0x1.eec40848785e500d9f0945ab58d3p-1019L; + zi[1] = 0x1.22b6b579927a3f238b772bb6dc95p+15679L; + + xr[2] = -0x9.e8c093a43b546a90p+15983L; + xi[2] = 0xc.95b18274208311e0p-2840L; + yr[2] = -0x8.dedb729b5c1b2ec0p+8L; + yi[2] = 0xa.a49fb81b24738370p-16385L; + zr[2] = 0x1.1df99ee89bb118f3201369e06576p+15975L; + zi[2] = 0x1.571e7ef904d6b6eee7acb0dcf098p-418L; + + xr[3] = 0xc.4687f251c0f48bd0p-3940L; + xi[3] = -0xe.a3f2138992d85fa0p+15598L; + yr[3] = 0xe.4b0c25c3d5ebb830p-16344L; + yi[3] = -0xa.6cbf1ba80f7b97a0p+78L; + zr[3] = 0x1.6785ba23bfb744cee97b4142348bp+15520L; + zi[3] = -0x1.ecee7b8c7bdd36237eb538324289p-902L; +#endif + + for (i = 0; i < 4; i++) + { + __real__ a = xr[i]; + __imag__ a = xi[i]; + __real__ b = yr[i]; + __imag__ b = yi[i]; + __real__ z = zr[i]; + __imag__ z = zi[i]; + c = a / b; + cr = __real__ c; + ci = __imag__ c; + + if (!match (c,z)){ + ok = 0; + } + } + if (!ok) + abort (); + exit (0); +} -- cgit v1.1 From a9cb8b6c1ff34c65f60cf745ae9967a9dfd8f195 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 28 Apr 2021 19:56:03 +0000 Subject: Update gcc .po files. * be.po, da.po, de.po, el.po, es.po, fi.po, fr.po, hr.po, id.po, ja.po, nl.po, ru.po, sr.po, sv.po, tr.po, uk.po, vi.po, zh_CN.po, zh_TW.po: Update. --- gcc/po/be.po | 11208 ++++++++++++++++++++++++------------------------ gcc/po/da.po | 11243 ++++++++++++++++++++++++------------------------ gcc/po/de.po | 11232 ++++++++++++++++++++++++------------------------ gcc/po/el.po | 11209 ++++++++++++++++++++++++------------------------ gcc/po/es.po | 11242 ++++++++++++++++++++++++------------------------ gcc/po/fi.po | 11222 ++++++++++++++++++++++++------------------------ gcc/po/fr.po | 11257 ++++++++++++++++++++++++------------------------ gcc/po/hr.po | 11207 ++++++++++++++++++++++++------------------------ gcc/po/id.po | 11235 ++++++++++++++++++++++++------------------------ gcc/po/ja.po | 11227 ++++++++++++++++++++++++------------------------ gcc/po/nl.po | 11218 ++++++++++++++++++++++++------------------------ gcc/po/ru.po | 11238 ++++++++++++++++++++++++------------------------ gcc/po/sr.po | 11235 ++++++++++++++++++++++++------------------------ gcc/po/sv.po | 11251 ++++++++++++++++++++++++------------------------ gcc/po/tr.po | 11238 ++++++++++++++++++++++++------------------------ gcc/po/uk.po | 12559 +++++++++++++++++++++++++++--------------------------- gcc/po/vi.po | 11228 ++++++++++++++++++++++++------------------------ gcc/po/zh_CN.po | 11249 ++++++++++++++++++++++++------------------------ gcc/po/zh_TW.po | 11237 ++++++++++++++++++++++++------------------------ 19 files changed, 107860 insertions(+), 106875 deletions(-) (limited to 'gcc') diff --git a/gcc/po/be.po b/gcc/po/be.po index 1bfc813..ab13314 100644 --- a/gcc/po/be.po +++ b/gcc/po/be.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gcc 3.1\n" "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n" -"POT-Creation-Date: 2021-03-19 21:31+0000\n" +"POT-Creation-Date: 2021-04-20 18:19+0000\n" "PO-Revision-Date: 2002-05-17 15:54+0200\n" "Last-Translator: Ales Nyakhaychyk \n" "Language-Team: Belarusian \n" @@ -1261,11 +1261,11 @@ msgstr "У файле уключаным з %s:%d" msgid "this is the insn:" msgstr "" -#: lra-constraints.c:3103 +#: lra-constraints.c:3108 msgid "unable to generate reloads for impossible constraints:" msgstr "" -#: lra-constraints.c:4133 reload.c:3862 +#: lra-constraints.c:4138 reload.c:3868 msgid "unable to generate reloads for:" msgstr "" @@ -1437,16 +1437,16 @@ msgstr "нераспазнаны выбар \"-%s\"" msgid "insn does not satisfy its constraints:" msgstr "" -#: targhooks.c:2075 +#: targhooks.c:2089 #, c-format msgid "created and used with differing settings of '%s'" msgstr "" -#: targhooks.c:2090 +#: targhooks.c:2104 msgid "created and used with different settings of %<-fpic%>" msgstr "" -#: targhooks.c:2092 +#: targhooks.c:2106 msgid "created and used with different settings of %<-fpie%>" msgstr "" @@ -1490,7 +1490,7 @@ msgstr "" msgid "%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n" msgstr "" -#: tree-diagnostic.c:299 c/c-decl.c:6041 c/c-typeck.c:7780 cp/error.c:1111 +#: tree-diagnostic.c:299 c/c-decl.c:6040 c/c-typeck.c:7840 cp/error.c:1111 #: tree-diagnostic-path.cc:257 c-family/c-pretty-print.c:424 #, gcc-internal-format msgid "" @@ -1981,87 +1981,87 @@ msgstr "" msgid "" msgstr "" -#: config/aarch64/aarch64.c:10259 +#: config/aarch64/aarch64.c:10663 #, fuzzy, c-format msgid "unsupported operand for code '%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/aarch64/aarch64.c:10268 config/aarch64/aarch64.c:10281 -#: config/aarch64/aarch64.c:10293 config/aarch64/aarch64.c:10304 -#: config/aarch64/aarch64.c:10320 config/aarch64/aarch64.c:10334 -#: config/aarch64/aarch64.c:10354 config/aarch64/aarch64.c:10428 -#: config/aarch64/aarch64.c:10439 config/aarch64/aarch64.c:10453 -#: config/aarch64/aarch64.c:10675 config/aarch64/aarch64.c:10693 +#: config/aarch64/aarch64.c:10672 config/aarch64/aarch64.c:10685 +#: config/aarch64/aarch64.c:10697 config/aarch64/aarch64.c:10708 +#: config/aarch64/aarch64.c:10724 config/aarch64/aarch64.c:10738 +#: config/aarch64/aarch64.c:10758 config/aarch64/aarch64.c:10832 +#: config/aarch64/aarch64.c:10843 config/aarch64/aarch64.c:10857 +#: config/aarch64/aarch64.c:11079 config/aarch64/aarch64.c:11097 #: config/pru/pru.c:1669 config/pru/pru.c:1679 config/pru/pru.c:1710 #: config/pru/pru.c:1721 config/pru/pru.c:1793 #, fuzzy, c-format msgid "invalid operand for '%%%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/aarch64/aarch64.c:10372 config/aarch64/aarch64.c:10383 -#: config/aarch64/aarch64.c:10535 config/aarch64/aarch64.c:10546 +#: config/aarch64/aarch64.c:10776 config/aarch64/aarch64.c:10787 +#: config/aarch64/aarch64.c:10939 config/aarch64/aarch64.c:10950 #, fuzzy, c-format #| msgid "invalid string constant `%E'" msgid "invalid vector constant" msgstr "`%E' - нерэчаісная нязьменная тыпу string" -#: config/aarch64/aarch64.c:10395 config/aarch64/aarch64.c:10407 +#: config/aarch64/aarch64.c:10799 config/aarch64/aarch64.c:10811 #, c-format msgid "incompatible floating point / vector register operand for '%%%c'" msgstr "" -#: config/aarch64/aarch64.c:10421 +#: config/aarch64/aarch64.c:10825 #, fuzzy, c-format #| msgid "invalid register name for `%s'" msgid "incompatible register operand for '%%%c'" msgstr "нерэчаісная назва рэгістра `%s'" -#: config/aarch64/aarch64.c:10487 config/arm/arm.c:24289 +#: config/aarch64/aarch64.c:10891 config/arm/arm.c:24308 #, fuzzy, c-format msgid "missing operand" msgstr "прапушчан ініцыялізатар" -#: config/aarch64/aarch64.c:10572 +#: config/aarch64/aarch64.c:10976 #, fuzzy, c-format msgid "invalid constant" msgstr "Нерэчаісны выбар %s" -#: config/aarch64/aarch64.c:10575 +#: config/aarch64/aarch64.c:10979 #, fuzzy, c-format #| msgid "invalid %%d operand" msgid "invalid operand" msgstr "нерэчаісны %%d аперанд" -#: config/aarch64/aarch64.c:10701 config/aarch64/aarch64.c:10706 +#: config/aarch64/aarch64.c:11105 config/aarch64/aarch64.c:11110 #, fuzzy, c-format msgid "invalid operand prefix '%%%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/aarch64/aarch64.c:10726 +#: config/aarch64/aarch64.c:11130 #, fuzzy, c-format #| msgid "invalid address" msgid "invalid address mode" msgstr "нерэчаісны адрас" -#: config/aarch64/aarch64.c:23568 config/arm/arm.c:33644 +#: config/aarch64/aarch64.c:25211 config/arm/arm.c:33660 msgid "invalid conversion from type %" msgstr "" -#: config/aarch64/aarch64.c:23570 config/arm/arm.c:33646 +#: config/aarch64/aarch64.c:25213 config/arm/arm.c:33662 msgid "invalid conversion to type %" msgstr "" -#: config/aarch64/aarch64.c:23585 config/aarch64/aarch64.c:23601 -#: config/arm/arm.c:33661 config/arm/arm.c:33677 +#: config/aarch64/aarch64.c:25228 config/aarch64/aarch64.c:25244 +#: config/arm/arm.c:33677 config/arm/arm.c:33693 msgid "operation not permitted on type %" msgstr "" -#: config/aarch64/aarch64.c:23609 +#: config/aarch64/aarch64.c:25252 msgid "cannot combine GNU and SVE vectors in a binary operation" msgstr "" #: config/alpha/alpha.c:5076 config/i386/i386.c:13227 -#: config/rs6000/rs6000.c:14054 config/sparc/sparc.c:9323 +#: config/rs6000/rs6000.c:14147 config/sparc/sparc.c:9323 #, c-format msgid "'%%&' used without any local dynamic TLS references" msgstr "" @@ -2077,18 +2077,18 @@ msgid "invalid %%r value" msgstr "нерэчаіснае значэньне %%r" #: config/alpha/alpha.c:5174 config/ia64/ia64.c:5531 -#: config/rs6000/rs6000.c:13748 config/xtensa/xtensa.c:2459 +#: config/rs6000/rs6000.c:13841 config/xtensa/xtensa.c:2459 #, c-format msgid "invalid %%R value" msgstr "нерэчаіснае значэньне %%R" -#: config/alpha/alpha.c:5180 config/rs6000/rs6000.c:13668 +#: config/alpha/alpha.c:5180 config/rs6000/rs6000.c:13761 #: config/xtensa/xtensa.c:2426 #, c-format msgid "invalid %%N value" msgstr "нерэчаіснае значэньне %%N" -#: config/alpha/alpha.c:5188 config/rs6000/rs6000.c:13696 +#: config/alpha/alpha.c:5188 config/rs6000/rs6000.c:13789 #, c-format msgid "invalid %%P value" msgstr "нерэчаіснае значэньне %%P" @@ -2118,7 +2118,7 @@ msgstr "нерэчаіснае значэньне %%M" msgid "invalid %%U value" msgstr "нерэчаіснае значэньне %%U" -#: config/alpha/alpha.c:5274 config/rs6000/rs6000.c:13756 +#: config/alpha/alpha.c:5274 config/rs6000/rs6000.c:13849 #, c-format msgid "invalid %%s value" msgstr "нерэчаіснае значэньне %%v" @@ -2128,7 +2128,7 @@ msgstr "нерэчаіснае значэньне %%v" msgid "invalid %%C value" msgstr "нерэчаіснае значэньне %%C" -#: config/alpha/alpha.c:5322 config/rs6000/rs6000.c:13532 +#: config/alpha/alpha.c:5322 config/rs6000/rs6000.c:13625 #, c-format msgid "invalid %%E value" msgstr "нерэчаіснае значэньне %%E" @@ -2141,7 +2141,7 @@ msgstr "" #: config/alpha/alpha.c:5356 config/cr16/cr16.c:1570 config/gcn/gcn.c:5799 #: config/gcn/gcn.c:5808 config/gcn/gcn.c:5868 config/gcn/gcn.c:5876 #: config/gcn/gcn.c:5892 config/gcn/gcn.c:5910 config/gcn/gcn.c:5961 -#: config/gcn/gcn.c:6080 config/gcn/gcn.c:6191 config/rs6000/rs6000.c:14059 +#: config/gcn/gcn.c:6080 config/gcn/gcn.c:6191 config/rs6000/rs6000.c:14152 #, c-format msgid "invalid %%xn code" msgstr "нерэчаіснае значэньне %%xn" @@ -2225,36 +2225,36 @@ msgstr "нерэчаісны %%-код" msgid "unrecognized supposed constant" msgstr "нераспазнаны выбар \"-%s\"" -#: config/arm/arm.c:20653 config/arm/arm.c:20678 config/arm/arm.c:20688 -#: config/arm/arm.c:20697 config/arm/arm.c:20706 +#: config/arm/arm.c:20672 config/arm/arm.c:20697 config/arm/arm.c:20707 +#: config/arm/arm.c:20716 config/arm/arm.c:20725 #, fuzzy, c-format #| msgid "invalid %%f operand" msgid "invalid shift operand" msgstr "нерэчаісны %%f аперанд" -#: config/arm/arm.c:23562 config/arm/arm.c:23580 +#: config/arm/arm.c:23581 config/arm/arm.c:23599 #, fuzzy, c-format msgid "predicated Thumb instruction" msgstr "нявернае выкарыстанне \"restict\"" -#: config/arm/arm.c:23568 +#: config/arm/arm.c:23587 #, c-format msgid "predicated instruction in conditional sequence" msgstr "" -#: config/arm/arm.c:23686 config/arm/arm.c:23699 config/arm/arm.c:23724 +#: config/arm/arm.c:23705 config/arm/arm.c:23718 config/arm/arm.c:23743 #: config/nios2/nios2.c:3080 #, fuzzy, c-format msgid "Unsupported operand for code '%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/arm/arm.c:23801 config/arm/arm.c:23823 config/arm/arm.c:23833 -#: config/arm/arm.c:23843 config/arm/arm.c:23853 config/arm/arm.c:23892 -#: config/arm/arm.c:23910 config/arm/arm.c:23935 config/arm/arm.c:23950 -#: config/arm/arm.c:23977 config/arm/arm.c:23984 config/arm/arm.c:24002 -#: config/arm/arm.c:24009 config/arm/arm.c:24017 config/arm/arm.c:24038 -#: config/arm/arm.c:24045 config/arm/arm.c:24236 config/arm/arm.c:24243 -#: config/arm/arm.c:24270 config/arm/arm.c:24277 config/bfin/bfin.c:1440 +#: config/arm/arm.c:23820 config/arm/arm.c:23842 config/arm/arm.c:23852 +#: config/arm/arm.c:23862 config/arm/arm.c:23872 config/arm/arm.c:23911 +#: config/arm/arm.c:23929 config/arm/arm.c:23954 config/arm/arm.c:23969 +#: config/arm/arm.c:23996 config/arm/arm.c:24003 config/arm/arm.c:24021 +#: config/arm/arm.c:24028 config/arm/arm.c:24036 config/arm/arm.c:24057 +#: config/arm/arm.c:24064 config/arm/arm.c:24255 config/arm/arm.c:24262 +#: config/arm/arm.c:24289 config/arm/arm.c:24296 config/bfin/bfin.c:1440 #: config/bfin/bfin.c:1447 config/bfin/bfin.c:1454 config/bfin/bfin.c:1461 #: config/bfin/bfin.c:1470 config/bfin/bfin.c:1477 config/bfin/bfin.c:1484 #: config/bfin/bfin.c:1491 config/nds32/nds32.c:3543 @@ -2262,13 +2262,13 @@ msgstr "Нерэчаісны выбар \"%s\"" msgid "invalid operand for code '%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/arm/arm.c:23905 +#: config/arm/arm.c:23924 #, c-format msgid "instruction never executed" msgstr "" #. Former Maverick support, removed after GCC-4.7. -#: config/arm/arm.c:23926 +#: config/arm/arm.c:23945 #, c-format msgid "obsolete Maverick format code '%c'" msgstr "" @@ -2401,8 +2401,8 @@ msgstr "непадтрымліваемая версія" #: config/cris/cris.c:775 config/ft32/ft32.c:110 config/moxie/moxie.c:108 #: final.c:3625 final.c:3627 fold-const.c:267 gcc.c:6030 gcc.c:6044 -#: rtl-error.c:101 toplev.c:327 vr-values.c:2370 cp/typeck.c:6928 -#: d/dmd/dsymbolsem.c:1450 d/dmd/semantic2.c:75 lto/lto-object.c:184 +#: rtl-error.c:101 toplev.c:327 vr-values.c:2370 cp/typeck.c:6939 +#: d/dmd/dsymbolsem.c:1451 d/dmd/semantic2.c:75 lto/lto-object.c:184 #: lto/lto-object.c:281 lto/lto-object.c:338 lto/lto-object.c:362 #, gcc-internal-format, gfc-internal-format msgid "%s" @@ -2777,7 +2777,7 @@ msgstr "нерэчаісны %%-код" msgid "invalid %%P operand" msgstr "нерэчаісны %%-код" -#: config/iq2000/iq2000.c:3134 config/rs6000/rs6000.c:13686 +#: config/iq2000/iq2000.c:3134 config/rs6000/rs6000.c:13779 #, c-format msgid "invalid %%p value" msgstr "" @@ -2833,7 +2833,7 @@ msgid "post-increment address is not a register" msgstr "" #: config/m32r/m32r.c:2335 config/m32r/m32r.c:2350 -#: config/rs6000/rs6000.c:20528 +#: config/rs6000/rs6000.c:20645 msgid "bad address" msgstr "дрэнны адрас" @@ -2889,8 +2889,8 @@ msgstr "\"%s\" - гэта не пачатак дэкларацыі" #: config/mips/mips.c:9084 config/mips/mips.c:9087 config/mips/mips.c:9099 #: config/mips/mips.c:9102 config/mips/mips.c:9162 config/mips/mips.c:9169 #: config/mips/mips.c:9190 config/mips/mips.c:9205 config/mips/mips.c:9224 -#: config/mips/mips.c:9233 config/riscv/riscv.c:3326 config/riscv/riscv.c:3441 -#: config/riscv/riscv.c:3447 config/riscv/riscv.c:3456 +#: config/mips/mips.c:9233 config/riscv/riscv.c:3335 config/riscv/riscv.c:3450 +#: config/riscv/riscv.c:3456 config/riscv/riscv.c:3465 #, fuzzy, c-format #| msgid "invalid use of `%D'" msgid "invalid use of '%%%c'" @@ -3036,297 +3036,297 @@ msgstr "" msgid "Try running '%s' in the shell to raise its limit.\n" msgstr "" -#: config/rs6000/rs6000.c:3851 +#: config/rs6000/rs6000.c:3855 #, fuzzy #| msgid "Use hardware floating point" msgid "%<-mvsx%> requires hardware floating point" msgstr "Выкарыстоўваць апаратную \"плаваючую кропку\"" -#: config/rs6000/rs6000.c:3859 +#: config/rs6000/rs6000.c:3863 msgid "%<-mvsx%> needs indexed addressing" msgstr "" -#: config/rs6000/rs6000.c:3864 +#: config/rs6000/rs6000.c:3868 msgid "%<-mvsx%> and %<-mno-altivec%> are incompatible" msgstr "" -#: config/rs6000/rs6000.c:3866 +#: config/rs6000/rs6000.c:3870 msgid "%<-mno-altivec%> disables vsx" msgstr "" -#: config/rs6000/rs6000.c:4006 +#: config/rs6000/rs6000.c:4010 msgid "%<-mquad-memory%> requires 64-bit mode" msgstr "" -#: config/rs6000/rs6000.c:4009 +#: config/rs6000/rs6000.c:4013 msgid "%<-mquad-memory-atomic%> requires 64-bit mode" msgstr "" -#: config/rs6000/rs6000.c:4021 +#: config/rs6000/rs6000.c:4025 msgid "%<-mquad-memory%> is not available in little endian mode" msgstr "" -#: config/rs6000/rs6000.c:10752 +#: config/rs6000/rs6000.c:10845 msgid "bad move" msgstr "" -#: config/rs6000/rs6000.c:13316 +#: config/rs6000/rs6000.c:13409 msgid "Bad 128-bit move" msgstr "" -#: config/rs6000/rs6000.c:13496 +#: config/rs6000/rs6000.c:13589 #, fuzzy, c-format #| msgid "invalid %%Q value" msgid "invalid %%A value" msgstr "дрэннае %%Q значэнне" -#: config/rs6000/rs6000.c:13505 config/xtensa/xtensa.c:2402 +#: config/rs6000/rs6000.c:13598 config/xtensa/xtensa.c:2402 #, fuzzy, c-format msgid "invalid %%D value" msgstr "дрэннае %%Q значэнне" -#: config/rs6000/rs6000.c:13520 +#: config/rs6000/rs6000.c:13613 #, fuzzy, c-format #| msgid "invalid %%Q value" msgid "invalid %%e value" msgstr "дрэннае %%Q значэнне" -#: config/rs6000/rs6000.c:13541 +#: config/rs6000/rs6000.c:13634 #, c-format msgid "invalid %%f value" msgstr "" -#: config/rs6000/rs6000.c:13550 +#: config/rs6000/rs6000.c:13643 #, c-format msgid "invalid %%F value" msgstr "" -#: config/rs6000/rs6000.c:13559 +#: config/rs6000/rs6000.c:13652 #, c-format msgid "invalid %%G value" msgstr "" -#: config/rs6000/rs6000.c:13594 +#: config/rs6000/rs6000.c:13687 #, c-format msgid "invalid %%j code" msgstr "" -#: config/rs6000/rs6000.c:13604 +#: config/rs6000/rs6000.c:13697 #, c-format msgid "invalid %%J code" msgstr "" -#: config/rs6000/rs6000.c:13614 +#: config/rs6000/rs6000.c:13707 #, c-format msgid "invalid %%k value" msgstr "" -#: config/rs6000/rs6000.c:13629 config/xtensa/xtensa.c:2445 +#: config/rs6000/rs6000.c:13722 config/xtensa/xtensa.c:2445 #, c-format msgid "invalid %%K value" msgstr "" -#: config/rs6000/rs6000.c:13676 +#: config/rs6000/rs6000.c:13769 #, c-format msgid "invalid %%O value" msgstr "нерэчаіснае значэньне %%O" -#: config/rs6000/rs6000.c:13723 +#: config/rs6000/rs6000.c:13816 #, c-format msgid "invalid %%q value" msgstr "" -#: config/rs6000/rs6000.c:13765 +#: config/rs6000/rs6000.c:13858 #, fuzzy, c-format #| msgid "invalid %%Q value" msgid "invalid %%t value" msgstr "дрэннае %%Q значэнне" -#: config/rs6000/rs6000.c:13782 +#: config/rs6000/rs6000.c:13875 #, c-format msgid "invalid %%T value" msgstr "" -#: config/rs6000/rs6000.c:13794 +#: config/rs6000/rs6000.c:13887 #, c-format msgid "invalid %%u value" msgstr "" -#: config/rs6000/rs6000.c:13808 config/xtensa/xtensa.c:2414 +#: config/rs6000/rs6000.c:13901 config/xtensa/xtensa.c:2414 #, c-format msgid "invalid %%v value" msgstr "" -#: config/rs6000/rs6000.c:13858 +#: config/rs6000/rs6000.c:13951 #, c-format msgid "invalid %%V value" msgstr "нерэчаіснае значэньне %%V" -#: config/rs6000/rs6000.c:13875 config/xtensa/xtensa.c:2466 +#: config/rs6000/rs6000.c:13968 config/xtensa/xtensa.c:2466 #, fuzzy, c-format #| msgid "invalid %%x/X value" msgid "invalid %%x value" msgstr "нерэчаіснае значэньне %%x/X" -#: config/rs6000/rs6000.c:13932 +#: config/rs6000/rs6000.c:14025 #, c-format msgid "invalid %%z value" msgstr "" -#: config/rs6000/rs6000.c:14001 +#: config/rs6000/rs6000.c:14094 #, fuzzy, c-format msgid "invalid %%y value, try using the 'Z' constraint" msgstr "нявернае выкарыстанне \"restict\"" -#: config/rs6000/rs6000.c:14845 +#: config/rs6000/rs6000.c:14962 msgid "Invalid mixing of IEEE 128-bit and IBM 128-bit floating point types" msgstr "" -#: config/rs6000/rs6000.c:23803 +#: config/rs6000/rs6000.c:23920 #, fuzzy #| msgid "too few arguments to function" msgid "AltiVec argument passed to unprototyped function" msgstr "не хапае аргументаў у функцыі" -#: config/rs6000/rs6000.c:26952 +#: config/rs6000/rs6000.c:27071 #, fuzzy msgid "Could not generate addis value for fusion" msgstr "Стварыць код для DLL" -#: config/rs6000/rs6000.c:27021 +#: config/rs6000/rs6000.c:27140 msgid "Unable to generate load/store offset for fusion" msgstr "" -#: config/rs6000/rs6000.c:27097 +#: config/rs6000/rs6000.c:27216 msgid "Bad GPR fusion" msgstr "" -#: config/rs6000/rs6000.c:27657 +#: config/rs6000/rs6000.c:27776 msgid "invalid conversion from type %<__vector_quad%>" msgstr "" -#: config/rs6000/rs6000.c:27659 +#: config/rs6000/rs6000.c:27778 msgid "invalid conversion to type %<__vector_quad%>" msgstr "" -#: config/rs6000/rs6000.c:27661 +#: config/rs6000/rs6000.c:27780 msgid "invalid conversion from type %<__vector_pair%>" msgstr "" -#: config/rs6000/rs6000.c:27663 +#: config/rs6000/rs6000.c:27782 msgid "invalid conversion to type %<__vector_pair%>" msgstr "" -#: config/rs6000/rs6000.c:27678 +#: config/rs6000/rs6000.c:27797 msgid "invalid conversion from type %<* __vector_quad%>" msgstr "" -#: config/rs6000/rs6000.c:27680 +#: config/rs6000/rs6000.c:27799 msgid "invalid conversion to type %<* __vector_quad%>" msgstr "" -#: config/rs6000/rs6000.c:27682 +#: config/rs6000/rs6000.c:27801 msgid "invalid conversion from type %<* __vector_pair%>" msgstr "" -#: config/rs6000/rs6000.c:27684 +#: config/rs6000/rs6000.c:27803 msgid "invalid conversion to type %<* __vector_pair%>" msgstr "" -#: config/s390/s390.c:7884 +#: config/s390/s390.c:7907 #, c-format msgid "symbolic memory references are only supported on z10 or later" msgstr "" -#: config/s390/s390.c:7895 +#: config/s390/s390.c:7918 #, fuzzy, c-format msgid "cannot decompose address" msgstr "невядомая назва рэгістра: %s" -#: config/s390/s390.c:7976 +#: config/s390/s390.c:7999 #, c-format msgid "invalid comparison operator for 'E' output modifier" msgstr "" -#: config/s390/s390.c:7999 +#: config/s390/s390.c:8022 #, c-format msgid "invalid reference for 'J' output modifier" msgstr "" -#: config/s390/s390.c:8017 +#: config/s390/s390.c:8040 #, c-format msgid "invalid address for 'O' output modifier" msgstr "" -#: config/s390/s390.c:8039 +#: config/s390/s390.c:8062 #, c-format msgid "invalid address for 'R' output modifier" msgstr "" -#: config/s390/s390.c:8057 +#: config/s390/s390.c:8080 #, c-format msgid "memory reference expected for 'S' output modifier" msgstr "" -#: config/s390/s390.c:8067 +#: config/s390/s390.c:8090 #, c-format msgid "invalid address for 'S' output modifier" msgstr "" -#: config/s390/s390.c:8088 +#: config/s390/s390.c:8111 #, c-format msgid "register or memory expression expected for 'N' output modifier" msgstr "" -#: config/s390/s390.c:8099 +#: config/s390/s390.c:8122 #, c-format msgid "register or memory expression expected for 'M' output modifier" msgstr "" -#: config/s390/s390.c:8185 config/s390/s390.c:8206 +#: config/s390/s390.c:8208 config/s390/s390.c:8229 #, c-format msgid "invalid constant for output modifier '%c'" msgstr "" -#: config/s390/s390.c:8203 +#: config/s390/s390.c:8226 #, c-format msgid "invalid constant - try using an output modifier" msgstr "" -#: config/s390/s390.c:8240 +#: config/s390/s390.c:8263 #, c-format msgid "invalid constant vector for output modifier '%c'" msgstr "" -#: config/s390/s390.c:8247 +#: config/s390/s390.c:8270 #, c-format msgid "invalid expression - try using an output modifier" msgstr "" -#: config/s390/s390.c:8250 +#: config/s390/s390.c:8273 #, c-format msgid "invalid expression for output modifier '%c'" msgstr "" -#: config/s390/s390.c:12029 +#: config/s390/s390.c:12052 #, fuzzy #| msgid "too few arguments to function" msgid "vector argument passed to unprototyped function" msgstr "не хапае аргументаў у функцыі" -#: config/s390/s390.c:16403 +#: config/s390/s390.c:16426 msgid "types differ in signedness" msgstr "" -#: config/s390/s390.c:16413 +#: config/s390/s390.c:16436 msgid "binary operator does not support two vector bool operands" msgstr "" -#: config/s390/s390.c:16416 +#: config/s390/s390.c:16439 msgid "binary operator does not support vector bool operand" msgstr "" -#: config/s390/s390.c:16424 +#: config/s390/s390.c:16447 msgid "binary operator does not support mixing vector bool with floating point vector operands" msgstr "" @@ -3594,8 +3594,8 @@ msgstr "" #: c/gimple-parser.c:2193 c/gimple-parser.c:2230 c/gimple-parser.c:2309 #: c/gimple-parser.c:2336 c/c-parser.c:3274 c/c-parser.c:3461 #: c/c-parser.c:3494 c/c-parser.c:11268 c/gimple-parser.c:2027 -#: c/gimple-parser.c:2066 cp/parser.c:14380 cp/parser.c:31016 -#: cp/parser.c:31626 +#: c/gimple-parser.c:2066 cp/parser.c:14404 cp/parser.c:31070 +#: cp/parser.c:31680 #, gcc-internal-format msgid "expected %<;%>" msgstr "" @@ -3615,7 +3615,7 @@ msgstr "" #: c/gimple-parser.c:1470 c/gimple-parser.c:1492 c/gimple-parser.c:1522 #: c/gimple-parser.c:1548 c/gimple-parser.c:1756 c/gimple-parser.c:1949 #: c/gimple-parser.c:1969 c/gimple-parser.c:2103 c/gimple-parser.c:2266 -#: c/c-parser.c:7110 cp/parser.c:31674 +#: c/c-parser.c:7110 cp/parser.c:31728 #, gcc-internal-format msgid "expected %<)%>" msgstr "" @@ -3623,7 +3623,7 @@ msgstr "" #: c/c-parser.c:4103 c/c-parser.c:4835 c/c-parser.c:4976 c/c-parser.c:5002 #: c/c-parser.c:5003 c/c-parser.c:5417 c/c-parser.c:5453 c/c-parser.c:7209 #: c/c-parser.c:9233 c/c-parser.c:10123 c/c-parser.c:10412 c/c-parser.c:13085 -#: c/gimple-parser.c:1733 cp/parser.c:31638 +#: c/gimple-parser.c:1733 cp/parser.c:31692 #, gcc-internal-format msgid "expected %<]%>" msgstr "" @@ -3641,21 +3641,21 @@ msgstr "" #: c/gimple-parser.c:1428 c/gimple-parser.c:1488 c/gimple-parser.c:1506 #: c/gimple-parser.c:1541 c/gimple-parser.c:1918 c/gimple-parser.c:1929 #: c/gimple-parser.c:1935 c/gimple-parser.c:2100 c/gimple-parser.c:2263 -#: c/c-parser.c:13443 cp/parser.c:31629 +#: c/c-parser.c:13443 cp/parser.c:31683 #, gcc-internal-format msgid "expected %<(%>" msgstr "" -#: c/c-parser.c:4972 c/c-parser.c:4974 c/c-parser.c:13013 cp/parser.c:31641 -#: cp/parser.c:35326 +#: c/c-parser.c:4972 c/c-parser.c:4974 c/c-parser.c:13013 cp/parser.c:31695 +#: cp/parser.c:35379 #, gcc-internal-format msgid "expected %<[%>" msgstr "" #: c/c-parser.c:5588 c/c-parser.c:11611 c/c-parser.c:18127 c/c-parser.c:18941 #: c/c-parser.c:22005 c/gimple-parser.c:385 c/gimple-parser.c:2269 -#: c/c-parser.c:3262 c/c-parser.c:3484 c/c-parser.c:11163 cp/parser.c:19941 -#: cp/parser.c:31635 +#: c/c-parser.c:3262 c/c-parser.c:3484 c/c-parser.c:11163 cp/parser.c:19978 +#: cp/parser.c:31689 #, gcc-internal-format msgid "expected %<{%>" msgstr "" @@ -3666,13 +3666,13 @@ msgstr "" #: c/c-parser.c:15155 c/c-parser.c:15468 c/c-parser.c:15595 c/c-parser.c:20368 #: c/c-parser.c:21010 c/c-parser.c:21069 c/gimple-parser.c:568 #: c/gimple-parser.c:872 c/gimple-parser.c:2317 c/gimple-parser.c:2344 -#: c/c-parser.c:7117 c/c-parser.c:13546 c/c-parser.c:14793 cp/parser.c:31668 -#: cp/parser.c:33316 cp/parser.c:36125 cp/parser.c:36909 +#: c/c-parser.c:7117 c/c-parser.c:13546 c/c-parser.c:14793 cp/parser.c:31722 +#: cp/parser.c:33370 cp/parser.c:36178 cp/parser.c:36962 #, gcc-internal-format msgid "expected %<:%>" msgstr "" -#: c/c-parser.c:6667 cp/parser.c:31555 +#: c/c-parser.c:6667 cp/parser.c:31609 #, gcc-internal-format msgid "expected %" msgstr "" @@ -3681,7 +3681,7 @@ msgstr "" #: c/c-parser.c:9304 c/c-parser.c:10015 c/c-parser.c:14374 c/c-parser.c:15551 #: c/gimple-parser.c:1022 c/gimple-parser.c:1048 c/gimple-parser.c:1176 #: c/gimple-parser.c:1179 c/gimple-parser.c:1510 c/gimple-parser.c:1516 -#: cp/parser.c:31014 cp/parser.c:31644 +#: cp/parser.c:31068 cp/parser.c:31698 #, gcc-internal-format msgid "expected %<,%>" msgstr "" @@ -3690,18 +3690,18 @@ msgstr "" msgid "expected %<.%>" msgstr "" -#: c/c-parser.c:10834 c/c-parser.c:10866 c/c-parser.c:11106 cp/parser.c:33890 -#: cp/parser.c:33911 +#: c/c-parser.c:10834 c/c-parser.c:10866 c/c-parser.c:11106 cp/parser.c:33944 +#: cp/parser.c:33965 #, gcc-internal-format msgid "expected %<@end%>" msgstr "" -#: c/c-parser.c:11524 c/gimple-parser.c:1346 cp/parser.c:31653 +#: c/c-parser.c:11524 c/gimple-parser.c:1346 cp/parser.c:31707 #, gcc-internal-format msgid "expected %<>%>" msgstr "" -#: c/c-parser.c:14882 c/c-parser.c:15832 cp/parser.c:31677 +#: c/c-parser.c:14882 c/c-parser.c:15832 cp/parser.c:31731 #, gcc-internal-format msgid "expected %<,%> or %<)%>" msgstr "" @@ -3709,28 +3709,28 @@ msgstr "" #. All following cases are statements with LHS. #: c/c-parser.c:15460 c/c-parser.c:17592 c/c-parser.c:17636 c/c-parser.c:17868 #: c/c-parser.c:18311 c/c-parser.c:20575 c/c-parser.c:21207 -#: c/gimple-parser.c:726 c/c-parser.c:5476 cp/parser.c:31656 +#: c/gimple-parser.c:726 c/c-parser.c:5476 cp/parser.c:31710 #, gcc-internal-format msgid "expected %<=%>" msgstr "" #: c/c-parser.c:17884 c/c-parser.c:18175 c/gimple-parser.c:1564 #: c/gimple-parser.c:1596 c/gimple-parser.c:1606 c/gimple-parser.c:2354 -#: cp/parser.c:31632 cp/parser.c:34100 +#: cp/parser.c:31686 cp/parser.c:34154 #, gcc-internal-format msgid "expected %<}%>" msgstr "" -#: c/c-parser.c:18984 c/c-parser.c:18974 cp/parser.c:40913 +#: c/c-parser.c:18984 c/c-parser.c:18974 cp/parser.c:40966 #, gcc-internal-format msgid "expected %<#pragma omp section%> or %<}%>" msgstr "" -#: c/c-typeck.c:8370 +#: c/c-typeck.c:8430 msgid "(anonymous)" msgstr "" -#: c/gimple-parser.c:1335 cp/parser.c:17360 cp/parser.c:31650 +#: c/gimple-parser.c:1335 cp/parser.c:17388 cp/parser.c:31704 #, gcc-internal-format msgid "expected %<<%>" msgstr "" @@ -3745,30 +3745,30 @@ msgstr "" msgid "candidate:" msgstr "" -#: cp/call.c:7407 +#: cp/call.c:7411 msgid " after user-defined conversion:" msgstr "" -#: cp/call.c:7545 cp/pt.c:2044 cp/pt.c:25058 +#: cp/call.c:7549 cp/pt.c:2046 cp/pt.c:25145 msgid "candidate is:" msgid_plural "candidates are:" msgstr[0] "" msgstr[1] "" -#: cp/call.c:12092 +#: cp/call.c:12113 msgid "candidate 1:" msgstr "" -#: cp/call.c:12093 +#: cp/call.c:12114 msgid "candidate 2:" msgstr "" -#: cp/decl.c:3392 +#: cp/decl.c:3374 #, fuzzy msgid "jump to label %qD" msgstr "паўтарэнне \"%s\"" -#: cp/decl.c:3393 +#: cp/decl.c:3375 msgid "jump to case label" msgstr "" @@ -4007,28 +4007,28 @@ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў msgid "local variable %qD may not appear in this context" msgstr "" -#: cp/parser.c:20737 +#: cp/parser.c:20774 msgid "% only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:20740 +#: cp/parser.c:20777 msgid "% of dependent type %qT" msgstr "" -#: cp/parser.c:20742 +#: cp/parser.c:20779 msgid "% of non-enumeration type %q#T" msgstr "" -#: cp/parser.c:20744 +#: cp/parser.c:20781 #, fuzzy msgid "% of incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/parser.c:20746 +#: cp/parser.c:20783 msgid "% of %qT before its enum-specifier" msgstr "" -#: cp/pt.c:2042 cp/semantics.c:5713 +#: cp/pt.c:2044 cp/semantics.c:5741 msgid "candidates are:" msgstr "" @@ -4077,50 +4077,50 @@ msgstr "" msgid "source type is not polymorphic" msgstr "" -#: cp/typeck.c:6633 c/c-typeck.c:4406 +#: cp/typeck.c:6644 c/c-typeck.c:4466 #, gcc-internal-format msgid "wrong type argument to unary minus" msgstr "" -#: cp/typeck.c:6634 c/c-typeck.c:4393 +#: cp/typeck.c:6645 c/c-typeck.c:4453 #, gcc-internal-format msgid "wrong type argument to unary plus" msgstr "" -#: cp/typeck.c:6661 c/c-typeck.c:4450 +#: cp/typeck.c:6672 c/c-typeck.c:4510 #, gcc-internal-format msgid "wrong type argument to bit-complement" msgstr "" -#: cp/typeck.c:6678 c/c-typeck.c:4458 +#: cp/typeck.c:6689 c/c-typeck.c:4518 #, gcc-internal-format msgid "wrong type argument to abs" msgstr "" -#: cp/typeck.c:6690 c/c-typeck.c:4480 +#: cp/typeck.c:6701 c/c-typeck.c:4540 #, gcc-internal-format msgid "wrong type argument to conjugation" msgstr "" -#: cp/typeck.c:6708 +#: cp/typeck.c:6719 #, fuzzy #| msgid "too many arguments to function" msgid "in argument to unary !" msgstr "вельмі шмат аргументаў у функцыі" -#: cp/typeck.c:6754 +#: cp/typeck.c:6765 msgid "no pre-increment operator for type" msgstr "" -#: cp/typeck.c:6756 +#: cp/typeck.c:6767 msgid "no post-increment operator for type" msgstr "" -#: cp/typeck.c:6758 +#: cp/typeck.c:6769 msgid "no pre-decrement operator for type" msgstr "" -#: cp/typeck.c:6760 +#: cp/typeck.c:6771 msgid "no post-decrement operator for type" msgstr "" @@ -4221,7 +4221,7 @@ msgstr "" msgid "Driving:" msgstr "увага:" -#: fortran/interface.c:3421 fortran/intrinsic.c:4498 +#: fortran/interface.c:3427 fortran/intrinsic.c:4498 msgid "actual argument to INTENT = OUT/INOUT" msgstr "" @@ -4353,7 +4353,7 @@ msgstr "нерэчаісны абвяшчальнік" msgid "Bad type in constant expression" msgstr "" -#: fortran/module.c:7303 +#: fortran/module.c:7314 msgid "Unexpected end of module" msgstr "" @@ -4387,11 +4387,11 @@ msgstr "" msgid "implied END DO" msgstr "" -#: fortran/parse.c:2139 fortran/resolve.c:11928 +#: fortran/parse.c:2139 fortran/resolve.c:11936 msgid "assignment" msgstr "" -#: fortran/parse.c:2142 fortran/resolve.c:11980 fortran/resolve.c:11983 +#: fortran/parse.c:2142 fortran/resolve.c:11988 fortran/resolve.c:11991 msgid "pointer assignment" msgstr "" @@ -4497,154 +4497,154 @@ msgstr "" msgid "bind(c) procedure" msgstr "" -#: fortran/resolve.c:4050 +#: fortran/resolve.c:4052 #, c-format msgid "Invalid context for NULL() pointer at %%L" msgstr "" -#: fortran/resolve.c:4066 +#: fortran/resolve.c:4069 #, c-format msgid "Operand of unary numeric operator %%<%s%%> at %%L is %s" msgstr "" -#: fortran/resolve.c:4083 +#: fortran/resolve.c:4086 #, c-format msgid "Unexpected derived-type entities in binary intrinsic numeric operator %%<%s%%> at %%L" msgstr "" -#: fortran/resolve.c:4088 +#: fortran/resolve.c:4091 #, c-format msgid "Operands of binary numeric operator %%<%s%%> at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:4103 +#: fortran/resolve.c:4106 #, c-format msgid "Operands of string concatenation operator at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:4145 +#: fortran/resolve.c:4149 #, c-format msgid "Operands of logical operator %%<%s%%> at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:4168 +#: fortran/resolve.c:4172 #, c-format msgid "Operand of .not. operator at %%L is %s" msgstr "" -#: fortran/resolve.c:4182 +#: fortran/resolve.c:4186 msgid "COMPLEX quantities cannot be compared at %L" msgstr "" -#: fortran/resolve.c:4280 +#: fortran/resolve.c:4284 #, c-format msgid "Logicals at %%L must be compared with %s instead of %s" msgstr "" -#: fortran/resolve.c:4286 +#: fortran/resolve.c:4290 #, c-format msgid "Operands of comparison operator %%<%s%%> at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:4299 +#: fortran/resolve.c:4304 #, c-format msgid "Unknown operator %%<%s%%> at %%L; did you mean '%s'?" msgstr "" -#: fortran/resolve.c:4302 +#: fortran/resolve.c:4307 #, c-format msgid "Unknown operator %%<%s%%> at %%L" msgstr "" -#: fortran/resolve.c:4305 +#: fortran/resolve.c:4312 #, c-format msgid "Operand of user operator %%<%s%%> at %%L is %s" msgstr "" -#: fortran/resolve.c:4309 +#: fortran/resolve.c:4317 #, c-format msgid "Operands of user operator %%<%s%%> at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:4395 +#: fortran/resolve.c:4403 #, c-format msgid "Inconsistent ranks for operator at %%L and %%L" msgstr "" -#: fortran/resolve.c:7234 +#: fortran/resolve.c:7242 msgid "Loop variable" msgstr "" -#: fortran/resolve.c:7238 +#: fortran/resolve.c:7246 msgid "iterator variable" msgstr "" -#: fortran/resolve.c:7242 +#: fortran/resolve.c:7250 msgid "Start expression in DO loop" msgstr "" -#: fortran/resolve.c:7246 +#: fortran/resolve.c:7254 msgid "End expression in DO loop" msgstr "" -#: fortran/resolve.c:7250 +#: fortran/resolve.c:7258 msgid "Step expression in DO loop" msgstr "" -#: fortran/resolve.c:7536 fortran/resolve.c:7539 +#: fortran/resolve.c:7544 fortran/resolve.c:7547 msgid "DEALLOCATE object" msgstr "" -#: fortran/resolve.c:7916 fortran/resolve.c:7919 +#: fortran/resolve.c:7924 fortran/resolve.c:7927 msgid "ALLOCATE object" msgstr "" -#: fortran/resolve.c:8152 fortran/resolve.c:10105 +#: fortran/resolve.c:8160 fortran/resolve.c:10113 msgid "STAT variable" msgstr "" -#: fortran/resolve.c:8196 fortran/resolve.c:10117 +#: fortran/resolve.c:8204 fortran/resolve.c:10125 msgid "ERRMSG variable" msgstr "" -#: fortran/resolve.c:9911 +#: fortran/resolve.c:9919 msgid "item in READ" msgstr "" -#: fortran/resolve.c:10129 +#: fortran/resolve.c:10137 msgid "ACQUIRED_LOCK variable" msgstr "" -#: fortran/trans-array.c:1750 +#: fortran/trans-array.c:1778 #, c-format msgid "Different CHARACTER lengths (%ld/%ld) in array constructor" msgstr "" -#: fortran/trans-array.c:6023 +#: fortran/trans-array.c:5990 msgid "Integer overflow when calculating the amount of memory to allocate" msgstr "" -#: fortran/trans-array.c:9788 +#: fortran/trans-array.c:9755 #, c-format msgid "The value of the PDT LEN parameter '%s' does not agree with that in the dummy declaration" msgstr "" -#: fortran/trans-decl.c:6235 +#: fortran/trans-decl.c:6240 #, c-format msgid "Actual string length does not match the declared one for dummy argument '%s' (%ld/%ld)" msgstr "" -#: fortran/trans-decl.c:6243 +#: fortran/trans-decl.c:6248 #, c-format msgid "Actual string length is shorter than the declared one for dummy argument '%s' (%ld/%ld)" msgstr "" -#: fortran/trans-expr.c:9796 +#: fortran/trans-expr.c:9845 #, c-format msgid "Target of rank remapping is too small (%ld < %ld)" msgstr "" -#: fortran/trans-expr.c:11270 +#: fortran/trans-expr.c:11322 msgid "Assignment of scalar to unallocated array" msgstr "" @@ -4769,26 +4769,26 @@ msgstr "" msgid "Incorrect function return value" msgstr "" -#: fortran/trans.c:714 fortran/trans.c:789 +#: fortran/trans.c:724 fortran/trans.c:799 #, c-format msgid "Error allocating %lu bytes" msgstr "" -#: fortran/trans.c:998 +#: fortran/trans.c:1008 #, c-format msgid "Attempting to allocate already allocated variable '%s'" msgstr "" -#: fortran/trans.c:1004 +#: fortran/trans.c:1014 msgid "Attempting to allocate already allocated variable" msgstr "" -#: fortran/trans.c:1454 fortran/trans.c:1613 +#: fortran/trans.c:1464 fortran/trans.c:1623 #, c-format msgid "Attempt to DEALLOCATE unallocated '%s'" msgstr "" -#: fortran/trans.c:1771 +#: fortran/trans.c:1781 #, fuzzy, c-format #| msgid "error writing to %s" msgid "Error reallocating to %lu bytes" @@ -5004,15 +5004,15 @@ msgstr "" msgid "consider using `-pg' instead of `-p' with gprof (1)" msgstr "" -#: config/arc/arc.h:68 config/mips/mips.h:1452 +#: config/arc/arc.h:68 config/mips/mips.h:1453 msgid "may not use both -EB and -EL" msgstr "" -#: config/arm/arm.h:93 +#: config/arm/arm.h:94 msgid "-mfloat-abi=soft and -mfloat-abi=hard may not be used together" msgstr "" -#: config/arm/arm.h:95 config/tilegx/tilegx.h:520 config/tilegx/tilegx.h:525 +#: config/arm/arm.h:96 config/tilegx/tilegx.h:520 config/tilegx/tilegx.h:525 msgid "-mbig-endian and -mlittle-endian may not be used together" msgstr "" @@ -5030,8 +5030,8 @@ msgstr "" msgid "do not specify both -march=... and -mcpu=..." msgstr "" -#: config/i386/cygwin-w64.h:64 config/i386/cygwin.h:129 -#: config/i386/mingw-w64.h:95 config/i386/mingw32.h:141 +#: config/i386/cygwin-w64.h:64 config/i386/cygwin.h:138 +#: config/i386/mingw-w64.h:95 config/i386/mingw32.h:153 msgid "shared and mdll are not compatible" msgstr "" @@ -5199,10 +5199,10 @@ msgid "Warn about creation of array temporaries." msgstr "немагчыма стварыць часовы файл" #: fortran/lang.opt:214 fortran/lang.opt:522 config/alpha/alpha.opt:31 -#: common.opt:653 common.opt:791 common.opt:1017 common.opt:1021 -#: common.opt:1025 common.opt:1029 common.opt:1679 common.opt:1735 -#: common.opt:1874 common.opt:1878 common.opt:2116 common.opt:2330 -#: common.opt:3046 +#: common.opt:653 common.opt:791 common.opt:1021 common.opt:1025 +#: common.opt:1029 common.opt:1033 common.opt:1683 common.opt:1739 +#: common.opt:1878 common.opt:1882 common.opt:2120 common.opt:2334 +#: common.opt:3050 #, no-c-format msgid "Does nothing. Preserved for backward compatibility." msgstr "" @@ -5678,160 +5678,160 @@ msgstr "" msgid "Set default accessibility of module entities to PRIVATE." msgstr "" -#: fortran/lang.opt:708 +#: fortran/lang.opt:704 #, no-c-format msgid "Try to lay out derived types as compactly as possible." msgstr "" -#: fortran/lang.opt:716 +#: fortran/lang.opt:712 #, no-c-format msgid "Protect parentheses in expressions." msgstr "" -#: fortran/lang.opt:720 +#: fortran/lang.opt:716 #, no-c-format msgid "Path to header file that should be pre-included before each compilation unit." msgstr "" -#: fortran/lang.opt:724 +#: fortran/lang.opt:720 #, no-c-format msgid "Enable range checking during compilation." msgstr "" -#: fortran/lang.opt:728 +#: fortran/lang.opt:724 #, no-c-format msgid "Interpret any REAL(4) as a REAL(8)." msgstr "" -#: fortran/lang.opt:732 +#: fortran/lang.opt:728 #, no-c-format msgid "Interpret any REAL(4) as a REAL(10)." msgstr "" -#: fortran/lang.opt:736 +#: fortran/lang.opt:732 #, no-c-format msgid "Interpret any REAL(4) as a REAL(16)." msgstr "" -#: fortran/lang.opt:740 +#: fortran/lang.opt:736 #, no-c-format msgid "Interpret any REAL(8) as a REAL(4)." msgstr "" -#: fortran/lang.opt:744 +#: fortran/lang.opt:740 #, no-c-format msgid "Interpret any REAL(8) as a REAL(10)." msgstr "" -#: fortran/lang.opt:748 +#: fortran/lang.opt:744 #, no-c-format msgid "Interpret any REAL(8) as a REAL(16)." msgstr "" -#: fortran/lang.opt:752 +#: fortran/lang.opt:748 #, no-c-format msgid "Reallocate the LHS in assignments." msgstr "" -#: fortran/lang.opt:756 +#: fortran/lang.opt:752 #, no-c-format msgid "Use a 4-byte record marker for unformatted files." msgstr "" -#: fortran/lang.opt:760 +#: fortran/lang.opt:756 #, no-c-format msgid "Use an 8-byte record marker for unformatted files." msgstr "" -#: fortran/lang.opt:764 +#: fortran/lang.opt:760 #, no-c-format msgid "Allocate local variables on the stack to allow indirect recursion." msgstr "" -#: fortran/lang.opt:768 +#: fortran/lang.opt:764 #, no-c-format msgid "Copy array sections into a contiguous block on procedure entry." msgstr "" -#: fortran/lang.opt:772 +#: fortran/lang.opt:768 #, no-c-format msgid "-fcoarray=\tSpecify which coarray parallelization should be used." msgstr "" -#: fortran/lang.opt:788 +#: fortran/lang.opt:784 #, no-c-format msgid "-fcheck=[...]\tSpecify which runtime checks are to be performed." msgstr "" -#: fortran/lang.opt:792 +#: fortran/lang.opt:788 #, no-c-format msgid "Append a second underscore if the name already contains an underscore." msgstr "" -#: fortran/lang.opt:800 +#: fortran/lang.opt:796 #, no-c-format msgid "Apply negative sign to zero values." msgstr "" -#: fortran/lang.opt:807 +#: fortran/lang.opt:803 #, no-c-format msgid "Disallow tail call optimization when a calling routine may have omitted character lengths." msgstr "" -#: fortran/lang.opt:811 +#: fortran/lang.opt:807 #, no-c-format msgid "Append underscores to externally visible names." msgstr "" -#: fortran/lang.opt:815 c-family/c.opt:1539 c-family/c.opt:1571 -#: c-family/c.opt:1579 c-family/c.opt:1903 config/pa/pa.opt:42 -#: config/pa/pa.opt:74 common.opt:615 common.opt:1099 common.opt:1103 -#: common.opt:1107 common.opt:1194 common.opt:1471 common.opt:1550 -#: common.opt:1826 common.opt:1965 common.opt:2008 common.opt:2405 -#: common.opt:2441 common.opt:2534 common.opt:2538 common.opt:2647 -#: common.opt:2738 common.opt:2746 common.opt:2754 common.opt:2762 -#: common.opt:2863 common.opt:2919 common.opt:3007 common.opt:3151 -#: common.opt:3155 common.opt:3159 common.opt:3163 +#: fortran/lang.opt:811 c-family/c.opt:1539 c-family/c.opt:1571 +#: c-family/c.opt:1579 c-family/c.opt:1890 config/pa/pa.opt:42 +#: config/pa/pa.opt:74 common.opt:615 common.opt:1103 common.opt:1107 +#: common.opt:1111 common.opt:1198 common.opt:1475 common.opt:1554 +#: common.opt:1830 common.opt:1969 common.opt:2012 common.opt:2409 +#: common.opt:2445 common.opt:2538 common.opt:2542 common.opt:2651 +#: common.opt:2742 common.opt:2750 common.opt:2758 common.opt:2766 +#: common.opt:2867 common.opt:2923 common.opt:3011 common.opt:3155 +#: common.opt:3159 common.opt:3163 common.opt:3167 #, no-c-format msgid "Does nothing. Preserved for backward compatibility." msgstr "" -#: fortran/lang.opt:855 +#: fortran/lang.opt:851 #, no-c-format msgid "Statically link the GNU Fortran helper library (libgfortran)." msgstr "" -#: fortran/lang.opt:859 +#: fortran/lang.opt:855 #, no-c-format msgid "Conform to the ISO Fortran 2003 standard." msgstr "" -#: fortran/lang.opt:863 +#: fortran/lang.opt:859 #, no-c-format msgid "Conform to the ISO Fortran 2008 standard." msgstr "" -#: fortran/lang.opt:867 +#: fortran/lang.opt:863 #, no-c-format msgid "Conform to the ISO Fortran 2008 standard including TS 29113." msgstr "" -#: fortran/lang.opt:871 +#: fortran/lang.opt:867 #, no-c-format msgid "Conform to the ISO Fortran 2018 standard." msgstr "" -#: fortran/lang.opt:875 +#: fortran/lang.opt:871 #, no-c-format msgid "Conform to the ISO Fortran 95 standard." msgstr "" -#: fortran/lang.opt:879 +#: fortran/lang.opt:875 #, no-c-format msgid "Conform to nothing in particular." msgstr "" -#: fortran/lang.opt:883 +#: fortran/lang.opt:879 #, no-c-format msgid "Accept extensions to support legacy code." msgstr "" @@ -6516,7 +6516,7 @@ msgstr "" #: c-family/c.opt:803 #, no-c-format -msgid "Warn for mismatches between calls to operator new or delete and the corrsponding call to the allocation or deallocation function." +msgid "Warn for mismatches between calls to operator new or delete and the corresponding call to the allocation or deallocation function." msgstr "" #: c-family/c.opt:808 @@ -7140,8 +7140,8 @@ msgstr "" msgid "Allow variadic functions without named parameter." msgstr "" -#: c-family/c.opt:1408 c-family/c.opt:1672 c-family/c.opt:2068 -#: c-family/c.opt:2072 c-family/c.opt:2088 +#: c-family/c.opt:1408 c-family/c.opt:1672 c-family/c.opt:2055 +#: c-family/c.opt:2059 c-family/c.opt:2075 #, fuzzy, no-c-format msgid "No longer supported." msgstr "-pipe не падтрымліваецца." @@ -7500,466 +7500,461 @@ msgstr "" #: c-family/c.opt:1878 #, no-c-format -msgid "-fopenacc-kernels=[decompose|parloops]\tSpecify mode of OpenACC 'kernels' constructs handling." -msgstr "" - -#: c-family/c.opt:1891 -#, no-c-format msgid "Enable OpenMP (implies -frecursive in Fortran)." msgstr "" -#: c-family/c.opt:1895 +#: c-family/c.opt:1882 #, no-c-format msgid "Enable OpenMP's SIMD directives." msgstr "" -#: c-family/c.opt:1899 +#: c-family/c.opt:1886 #, no-c-format msgid "Recognize C++ keywords like \"compl\" and \"xor\"." msgstr "" -#: c-family/c.opt:1910 +#: c-family/c.opt:1897 #, no-c-format msgid "Look for and use PCH files even when preprocessing." msgstr "" -#: c-family/c.opt:1914 +#: c-family/c.opt:1901 #, no-c-format msgid "Downgrade conformance errors to warnings." msgstr "" -#: c-family/c.opt:1918 +#: c-family/c.opt:1905 #, no-c-format msgid "Enable Plan 9 language extensions." msgstr "" -#: c-family/c.opt:1922 +#: c-family/c.opt:1909 #, no-c-format msgid "Treat the input file as already preprocessed." msgstr "" -#: c-family/c.opt:1930 +#: c-family/c.opt:1917 #, no-c-format msgid "-ftrack-macro-expansion=<0|1|2>\tTrack locations of tokens coming from macro expansion and display them in error messages." msgstr "" -#: c-family/c.opt:1934 +#: c-family/c.opt:1921 #, no-c-format msgid "Do not pretty-print template specializations as the template signature followed by the arguments." msgstr "" -#: c-family/c.opt:1938 +#: c-family/c.opt:1925 #, no-c-format msgid "Treat known sprintf return values as constants." msgstr "" -#: c-family/c.opt:1942 +#: c-family/c.opt:1929 #, no-c-format msgid "Used in Fix-and-Continue mode to indicate that object files may be swapped in at runtime." msgstr "" -#: c-family/c.opt:1946 +#: c-family/c.opt:1933 #, no-c-format msgid "Removed in GCC 10. This switch has no effect." msgstr "" -#: c-family/c.opt:1950 +#: c-family/c.opt:1937 #, no-c-format msgid "Generate run time type descriptor information." msgstr "" -#: c-family/c.opt:1954 ada/gcc-interface/lang.opt:81 +#: c-family/c.opt:1941 ada/gcc-interface/lang.opt:81 #, no-c-format msgid "Use the narrowest integer type possible for enumeration types." msgstr "" -#: c-family/c.opt:1958 +#: c-family/c.opt:1945 #, no-c-format msgid "Force the underlying type for \"wchar_t\" to be \"unsigned short\"." msgstr "" -#: c-family/c.opt:1962 +#: c-family/c.opt:1949 #, no-c-format msgid "When \"signed\" or \"unsigned\" is not given make the bitfield signed." msgstr "" -#: c-family/c.opt:1966 ada/gcc-interface/lang.opt:85 +#: c-family/c.opt:1953 ada/gcc-interface/lang.opt:85 #, no-c-format msgid "Make \"char\" signed by default." msgstr "" -#: c-family/c.opt:1970 +#: c-family/c.opt:1957 #, no-c-format msgid "Enable C++14 sized deallocation support." msgstr "" -#: c-family/c.opt:1977 +#: c-family/c.opt:1964 #, no-c-format msgid "-fsso-struct=[big-endian|little-endian|native]\tSet the default scalar storage order." msgstr "" -#: c-family/c.opt:1993 +#: c-family/c.opt:1980 #, no-c-format msgid "Display statistics accumulated during compilation." msgstr "" -#: c-family/c.opt:1997 +#: c-family/c.opt:1984 #, no-c-format msgid "Assume that values of enumeration type are always within the minimum range of that type." msgstr "" -#: c-family/c.opt:2004 c-family/c.opt:2009 +#: c-family/c.opt:1991 c-family/c.opt:1996 #, no-c-format msgid "Follow the C++17 evaluation order requirements for assignment expressions, shift, member function calls, etc." msgstr "" -#: c-family/c.opt:2026 +#: c-family/c.opt:2013 #, no-c-format msgid "Set the maximum number of template instantiation notes for a single warning or error." msgstr "" -#: c-family/c.opt:2033 +#: c-family/c.opt:2020 #, no-c-format msgid "-ftemplate-depth=\tSpecify maximum template instantiation depth." msgstr "" -#: c-family/c.opt:2040 +#: c-family/c.opt:2027 #, no-c-format msgid "-fno-threadsafe-statics\tDo not generate thread-safe code for initializing local statics." msgstr "" -#: c-family/c.opt:2044 +#: c-family/c.opt:2031 #, no-c-format msgid "When \"signed\" or \"unsigned\" is not given make the bitfield unsigned." msgstr "" -#: c-family/c.opt:2048 ada/gcc-interface/lang.opt:89 +#: c-family/c.opt:2035 ada/gcc-interface/lang.opt:89 #, no-c-format msgid "Make \"char\" unsigned by default." msgstr "" -#: c-family/c.opt:2052 +#: c-family/c.opt:2039 #, no-c-format msgid "Use __cxa_atexit to register destructors." msgstr "" -#: c-family/c.opt:2056 +#: c-family/c.opt:2043 #, no-c-format msgid "Use __cxa_get_exception_ptr in exception handling." msgstr "" -#: c-family/c.opt:2060 +#: c-family/c.opt:2047 #, no-c-format msgid "Marks all inlined functions and methods as having hidden visibility." msgstr "" -#: c-family/c.opt:2064 +#: c-family/c.opt:2051 #, no-c-format msgid "Changes visibility to match Microsoft Visual Studio by default." msgstr "" -#: c-family/c.opt:2076 d/lang.opt:326 +#: c-family/c.opt:2063 #, no-c-format msgid "Emit common-like symbols as weak symbols." msgstr "" -#: c-family/c.opt:2080 +#: c-family/c.opt:2067 #, no-c-format msgid "-fwide-exec-charset=\tConvert all wide strings and character constants to character set ." msgstr "" -#: c-family/c.opt:2084 +#: c-family/c.opt:2071 #, no-c-format msgid "Generate a #line directive pointing at the current working directory." msgstr "" -#: c-family/c.opt:2092 +#: c-family/c.opt:2079 #, no-c-format msgid "Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode." msgstr "" -#: c-family/c.opt:2096 +#: c-family/c.opt:2083 #, no-c-format msgid "Dump declarations to a .decl file." msgstr "" -#: c-family/c.opt:2100 +#: c-family/c.opt:2087 #, no-c-format msgid "-femit-struct-debug-baseonly\tAggressive reduced debug info for structs." msgstr "" -#: c-family/c.opt:2104 +#: c-family/c.opt:2091 #, no-c-format msgid "-femit-struct-debug-reduced\tConservative reduced debug info for structs." msgstr "" -#: c-family/c.opt:2108 +#: c-family/c.opt:2095 #, no-c-format msgid "-femit-struct-debug-detailed=\tDetailed reduced debug info for structs." msgstr "" -#: c-family/c.opt:2112 +#: c-family/c.opt:2099 #, no-c-format msgid "Interpret imaginary, fixed-point, or other gnu number suffix as the corresponding number literal rather than a user-defined number literal." msgstr "" -#: c-family/c.opt:2117 +#: c-family/c.opt:2104 #, no-c-format msgid "-idirafter \tAdd to the end of the system include path." msgstr "" -#: c-family/c.opt:2121 +#: c-family/c.opt:2108 #, no-c-format msgid "-imacros \tAccept definition of macros in ." msgstr "" -#: c-family/c.opt:2125 +#: c-family/c.opt:2112 #, no-c-format msgid "-imultilib \tSet to be the multilib include subdirectory." msgstr "" -#: c-family/c.opt:2129 +#: c-family/c.opt:2116 #, no-c-format msgid "-include \tInclude the contents of before other files." msgstr "" -#: c-family/c.opt:2133 +#: c-family/c.opt:2120 #, no-c-format msgid "-iprefix \tSpecify as a prefix for next two options." msgstr "" -#: c-family/c.opt:2137 +#: c-family/c.opt:2124 #, no-c-format msgid "-isysroot \tSet to be the system root directory." msgstr "" -#: c-family/c.opt:2141 +#: c-family/c.opt:2128 #, no-c-format msgid "-isystem \tAdd to the start of the system include path." msgstr "" -#: c-family/c.opt:2145 +#: c-family/c.opt:2132 #, no-c-format msgid "-iquote \tAdd to the end of the quote include path." msgstr "" -#: c-family/c.opt:2149 +#: c-family/c.opt:2136 #, no-c-format msgid "-iwithprefix \tAdd to the end of the system include path." msgstr "" -#: c-family/c.opt:2153 +#: c-family/c.opt:2140 #, no-c-format msgid "-iwithprefixbefore \tAdd to the end of the main include path." msgstr "" -#: c-family/c.opt:2163 +#: c-family/c.opt:2150 #, no-c-format msgid "Do not search standard system include directories (those specified with -isystem will still be used)." msgstr "" -#: c-family/c.opt:2167 +#: c-family/c.opt:2154 #, no-c-format msgid "Do not search standard system include directories for C++." msgstr "" -#: c-family/c.opt:2179 +#: c-family/c.opt:2166 #, no-c-format msgid "Generate C header of platform-specific features." msgstr "" -#: c-family/c.opt:2183 +#: c-family/c.opt:2170 #, no-c-format msgid "Remap file names when including files." msgstr "" -#: c-family/c.opt:2187 c-family/c.opt:2191 +#: c-family/c.opt:2174 c-family/c.opt:2178 #, no-c-format msgid "Conform to the ISO 1998 C++ standard revised by the 2003 technical corrigendum." msgstr "" -#: c-family/c.opt:2195 +#: c-family/c.opt:2182 #, no-c-format msgid "Conform to the ISO 2011 C++ standard." msgstr "" -#: c-family/c.opt:2199 +#: c-family/c.opt:2186 #, no-c-format msgid "Deprecated in favor of -std=c++11." msgstr "" -#: c-family/c.opt:2203 +#: c-family/c.opt:2190 #, no-c-format msgid "Deprecated in favor of -std=c++14." msgstr "" -#: c-family/c.opt:2207 +#: c-family/c.opt:2194 #, no-c-format msgid "Conform to the ISO 2014 C++ standard." msgstr "" -#: c-family/c.opt:2211 +#: c-family/c.opt:2198 #, no-c-format msgid "Deprecated in favor of -std=c++17." msgstr "" -#: c-family/c.opt:2215 +#: c-family/c.opt:2202 #, no-c-format msgid "Conform to the ISO 2017 C++ standard." msgstr "" -#: c-family/c.opt:2219 c-family/c.opt:2223 +#: c-family/c.opt:2206 c-family/c.opt:2210 #, no-c-format msgid "Conform to the ISO 2020 C++ standard (experimental and incomplete support)." msgstr "" -#: c-family/c.opt:2227 c-family/c.opt:2231 +#: c-family/c.opt:2214 c-family/c.opt:2218 #, no-c-format msgid "Conform to the ISO 2023 C++ draft standard (experimental and incomplete support)." msgstr "" -#: c-family/c.opt:2235 c-family/c.opt:2373 +#: c-family/c.opt:2222 c-family/c.opt:2360 #, no-c-format msgid "Conform to the ISO 2011 C standard." msgstr "" -#: c-family/c.opt:2239 +#: c-family/c.opt:2226 #, no-c-format msgid "Deprecated in favor of -std=c11." msgstr "" -#: c-family/c.opt:2243 c-family/c.opt:2247 c-family/c.opt:2377 -#: c-family/c.opt:2381 +#: c-family/c.opt:2230 c-family/c.opt:2234 c-family/c.opt:2364 +#: c-family/c.opt:2368 #, no-c-format msgid "Conform to the ISO 2017 C standard (published in 2018)." msgstr "" -#: c-family/c.opt:2251 +#: c-family/c.opt:2238 #, no-c-format msgid "Conform to the ISO 202X C standard draft (experimental and incomplete support)." msgstr "" -#: c-family/c.opt:2255 c-family/c.opt:2259 c-family/c.opt:2357 +#: c-family/c.opt:2242 c-family/c.opt:2246 c-family/c.opt:2344 #, no-c-format msgid "Conform to the ISO 1990 C standard." msgstr "" -#: c-family/c.opt:2263 c-family/c.opt:2365 +#: c-family/c.opt:2250 c-family/c.opt:2352 #, no-c-format msgid "Conform to the ISO 1999 C standard." msgstr "" -#: c-family/c.opt:2267 +#: c-family/c.opt:2254 #, no-c-format msgid "Deprecated in favor of -std=c99." msgstr "" -#: c-family/c.opt:2271 c-family/c.opt:2276 +#: c-family/c.opt:2258 c-family/c.opt:2263 #, no-c-format msgid "Conform to the ISO 1998 C++ standard revised by the 2003 technical corrigendum with GNU extensions." msgstr "" -#: c-family/c.opt:2281 +#: c-family/c.opt:2268 #, no-c-format msgid "Conform to the ISO 2011 C++ standard with GNU extensions." msgstr "" -#: c-family/c.opt:2285 +#: c-family/c.opt:2272 #, no-c-format msgid "Deprecated in favor of -std=gnu++11." msgstr "" -#: c-family/c.opt:2289 +#: c-family/c.opt:2276 #, no-c-format msgid "Deprecated in favor of -std=gnu++14." msgstr "" -#: c-family/c.opt:2293 +#: c-family/c.opt:2280 #, no-c-format msgid "Conform to the ISO 2014 C++ standard with GNU extensions." msgstr "" -#: c-family/c.opt:2297 +#: c-family/c.opt:2284 #, no-c-format msgid "Deprecated in favor of -std=gnu++17." msgstr "" -#: c-family/c.opt:2301 +#: c-family/c.opt:2288 #, no-c-format msgid "Conform to the ISO 2017 C++ standard with GNU extensions." msgstr "" -#: c-family/c.opt:2305 c-family/c.opt:2309 +#: c-family/c.opt:2292 c-family/c.opt:2296 #, no-c-format msgid "Conform to the ISO 2020 C++ standard with GNU extensions (experimental and incomplete support)." msgstr "" -#: c-family/c.opt:2313 c-family/c.opt:2317 +#: c-family/c.opt:2300 c-family/c.opt:2304 #, no-c-format msgid "Conform to the ISO 2023 C++ draft standard with GNU extensions (experimental and incomplete support)." msgstr "" -#: c-family/c.opt:2321 +#: c-family/c.opt:2308 #, no-c-format msgid "Conform to the ISO 2011 C standard with GNU extensions." msgstr "" -#: c-family/c.opt:2325 +#: c-family/c.opt:2312 #, no-c-format msgid "Deprecated in favor of -std=gnu11." msgstr "" -#: c-family/c.opt:2329 c-family/c.opt:2333 +#: c-family/c.opt:2316 c-family/c.opt:2320 #, no-c-format msgid "Conform to the ISO 2017 C standard (published in 2018) with GNU extensions." msgstr "" -#: c-family/c.opt:2337 +#: c-family/c.opt:2324 #, no-c-format msgid "Conform to the ISO 202X C standard draft with GNU extensions (experimental and incomplete support)." msgstr "" -#: c-family/c.opt:2341 c-family/c.opt:2345 +#: c-family/c.opt:2328 c-family/c.opt:2332 #, no-c-format msgid "Conform to the ISO 1990 C standard with GNU extensions." msgstr "" -#: c-family/c.opt:2349 +#: c-family/c.opt:2336 #, no-c-format msgid "Conform to the ISO 1999 C standard with GNU extensions." msgstr "" -#: c-family/c.opt:2353 +#: c-family/c.opt:2340 #, no-c-format msgid "Deprecated in favor of -std=gnu99." msgstr "" -#: c-family/c.opt:2361 +#: c-family/c.opt:2348 #, no-c-format msgid "Conform to the ISO 1990 C standard as amended in 1994." msgstr "" -#: c-family/c.opt:2369 +#: c-family/c.opt:2356 #, no-c-format msgid "Deprecated in favor of -std=iso9899:1999." msgstr "" -#: c-family/c.opt:2385 +#: c-family/c.opt:2372 #, no-c-format msgid "-stdlib=[libstdc++|libc++]\tThe standard library to be used for C++ headers and runtime." msgstr "" -#: c-family/c.opt:2402 +#: c-family/c.opt:2389 #, no-c-format msgid "Enable traditional preprocessing." msgstr "" -#: c-family/c.opt:2406 +#: c-family/c.opt:2393 #, no-c-format msgid "-trigraphs\tSupport ISO C trigraphs." msgstr "" -#: c-family/c.opt:2410 +#: c-family/c.opt:2397 #, no-c-format msgid "Do not predefine system-specific and GCC-specific macros." msgstr "" @@ -8209,6 +8204,11 @@ msgstr "" msgid "-fversion=\tCompile in version code >= or identified by ." msgstr "" +#: d/lang.opt:326 +#, no-c-format +msgid "Emit template instantiations as weak symbols." +msgstr "" + #: d/lang.opt:346 #, no-c-format msgid "Do not link the standard D library in the compilation." @@ -9464,143 +9464,155 @@ msgstr "" msgid "Support TLS segment larger than 64K." msgstr "" -#: config/riscv/riscv.opt:26 +#: config/riscv/riscv.opt:26 config/aarch64/aarch64.opt:68 +#: config/arm/arm.opt:90 config/microblaze/microblaze.opt:60 +#, no-c-format +msgid "Assume target CPU is configured as big endian." +msgstr "" + +#: config/riscv/riscv.opt:30 config/aarch64/aarch64.opt:88 +#: config/arm/arm.opt:155 config/microblaze/microblaze.opt:64 +#, no-c-format +msgid "Assume target CPU is configured as little endian." +msgstr "" + +#: config/riscv/riscv.opt:34 #, no-c-format msgid "-mbranch-cost=N\tSet the cost of branches to roughly N instructions." msgstr "" -#: config/riscv/riscv.opt:30 +#: config/riscv/riscv.opt:38 #, no-c-format msgid "When generating -fpic code, allow the use of PLTs. Ignored for fno-pic." msgstr "" -#: config/riscv/riscv.opt:34 +#: config/riscv/riscv.opt:42 #, no-c-format msgid "Specify integer and floating-point calling convention." msgstr "" -#: config/riscv/riscv.opt:38 config/i386/i386.opt:421 +#: config/riscv/riscv.opt:46 config/i386/i386.opt:421 #, no-c-format msgid "Attempt to keep stack aligned to this power of 2." msgstr "" -#: config/riscv/riscv.opt:42 +#: config/riscv/riscv.opt:50 #, no-c-format msgid "Supported ABIs (for use with the -mabi= option):" msgstr "" -#: config/riscv/riscv.opt:67 +#: config/riscv/riscv.opt:75 #, no-c-format msgid "Use hardware floating-point divide and square root instructions." msgstr "" -#: config/riscv/riscv.opt:71 +#: config/riscv/riscv.opt:79 #, no-c-format msgid "Use hardware instructions for integer division." msgstr "" -#: config/riscv/riscv.opt:75 +#: config/riscv/riscv.opt:83 #, no-c-format msgid "-march=\tGenerate code for given RISC-V ISA (e.g. RV64IM). ISA strings must be lower-case." msgstr "" -#: config/riscv/riscv.opt:80 config/mips/mips.opt:405 +#: config/riscv/riscv.opt:88 config/mips/mips.opt:405 #, no-c-format msgid "-mtune=PROCESSOR\tOptimize the output for PROCESSOR." msgstr "" -#: config/riscv/riscv.opt:84 +#: config/riscv/riscv.opt:92 #, no-c-format msgid "-mcpu=PROCESSOR\tUse architecture of and optimize the output for PROCESSOR." msgstr "" -#: config/riscv/riscv.opt:88 +#: config/riscv/riscv.opt:96 #, no-c-format msgid "-msmall-data-limit=N\tPut global and static data smaller than bytes into a special section (on some targets)." msgstr "" -#: config/riscv/riscv.opt:92 +#: config/riscv/riscv.opt:100 #, no-c-format msgid "Use smaller but slower prologue and epilogue code." msgstr "" -#: config/riscv/riscv.opt:96 +#: config/riscv/riscv.opt:104 #, no-c-format msgid "Convert BASE + LARGE_OFFSET addresses to NEW_BASE + SMALL_OFFSET to allow more memory accesses to be generated as compressed instructions. Currently targets 32-bit integer load/stores." msgstr "" -#: config/riscv/riscv.opt:102 config/aarch64/aarch64.opt:92 +#: config/riscv/riscv.opt:110 config/aarch64/aarch64.opt:92 #, no-c-format msgid "Specify the code model." msgstr "" -#: config/riscv/riscv.opt:106 +#: config/riscv/riscv.opt:114 #, no-c-format msgid "Do not generate unaligned memory accesses." msgstr "" -#: config/riscv/riscv.opt:110 config/i386/i386.opt:293 +#: config/riscv/riscv.opt:118 config/i386/i386.opt:293 #: config/rs6000/aix64.opt:36 config/rs6000/linux64.opt:32 #: config/tilegx/tilegx.opt:57 #, no-c-format msgid "Known code models (for use with the -mcmodel= option):" msgstr "" -#: config/riscv/riscv.opt:120 +#: config/riscv/riscv.opt:128 #, no-c-format msgid "Use %reloc() operators, rather than assembly macros, to load addresses." msgstr "" -#: config/riscv/riscv.opt:124 +#: config/riscv/riscv.opt:132 #, no-c-format msgid "Take advantage of linker relaxations to reduce the number of instructions required to materialize symbol addresses." msgstr "" -#: config/riscv/riscv.opt:143 +#: config/riscv/riscv.opt:151 #, no-c-format msgid "Emit RISC-V ELF attribute." msgstr "" -#: config/riscv/riscv.opt:147 config/i386/i386.opt:246 +#: config/riscv/riscv.opt:155 config/i386/i386.opt:246 #, no-c-format msgid "Use the given data alignment." msgstr "" -#: config/riscv/riscv.opt:151 config/i386/i386.opt:250 +#: config/riscv/riscv.opt:159 config/i386/i386.opt:250 #, no-c-format msgid "Known data alignment choices (for use with the -malign-data= option):" msgstr "" -#: config/riscv/riscv.opt:161 config/aarch64/aarch64.opt:235 +#: config/riscv/riscv.opt:169 config/aarch64/aarch64.opt:235 #: config/i386/i386.opt:995 config/rs6000/rs6000.opt:570 #, no-c-format msgid "Use given stack-protector guard." msgstr "" -#: config/riscv/riscv.opt:165 config/aarch64/aarch64.opt:239 +#: config/riscv/riscv.opt:173 config/aarch64/aarch64.opt:239 #: config/rs6000/rs6000.opt:574 #, no-c-format msgid "Valid arguments to -mstack-protector-guard=:" msgstr "" -#: config/riscv/riscv.opt:175 config/i386/i386.opt:1009 +#: config/riscv/riscv.opt:183 config/i386/i386.opt:1009 #: config/rs6000/rs6000.opt:584 #, no-c-format msgid "Use the given base register for addressing the stack-protector guard." msgstr "" -#: config/riscv/riscv.opt:182 config/i386/i386.opt:1016 +#: config/riscv/riscv.opt:190 config/i386/i386.opt:1016 #: config/rs6000/rs6000.opt:591 #, no-c-format msgid "Use the given offset for addressing the stack-protector guard." msgstr "" -#: config/riscv/riscv.opt:192 +#: config/riscv/riscv.opt:200 #, no-c-format msgid "Supported ISA specs (for use with the -misa-spec= option):" msgstr "" -#: config/riscv/riscv.opt:205 +#: config/riscv/riscv.opt:213 #, no-c-format msgid "Set the version of RISC-V ISA spec." msgstr "" @@ -9735,12 +9747,6 @@ msgstr "" msgid "The code model option names for -mcmodel:" msgstr "" -#: config/aarch64/aarch64.opt:68 config/arm/arm.opt:90 -#: config/microblaze/microblaze.opt:60 -#, no-c-format -msgid "Assume target CPU is configured as big endian." -msgstr "" - #: config/aarch64/aarch64.opt:72 config/i386/i386.opt:1030 #, fuzzy, no-c-format #| msgid "Generate code without GP reg" @@ -9762,12 +9768,6 @@ msgstr "" msgid "Workaround for ARM Cortex-A53 Erratum number 843419." msgstr "" -#: config/aarch64/aarch64.opt:88 config/arm/arm.opt:155 -#: config/microblaze/microblaze.opt:64 -#, no-c-format -msgid "Assume target CPU is configured as little endian." -msgstr "" - #: config/aarch64/aarch64.opt:96 #, no-c-format msgid "Don't assume that unaligned accesses are handled by the system." @@ -17144,2183 +17144,2183 @@ msgstr "" msgid "-dumpdir \tSet the directory name to be used for dumps." msgstr "" -#: common.opt:970 +#: common.opt:974 #, no-c-format msgid "The version of the C++ ABI in use." msgstr "" -#: common.opt:974 +#: common.opt:978 #, no-c-format msgid "Aggressively optimize loops using language constraints." msgstr "" -#: common.opt:978 +#: common.opt:982 #, fuzzy, no-c-format msgid "Align the start of functions." msgstr "вельмі шмат аргументаў у функцыі" -#: common.opt:988 +#: common.opt:992 #, no-c-format msgid "Align labels which are only reached by jumping." msgstr "" -#: common.opt:995 +#: common.opt:999 #, no-c-format msgid "Align all labels." msgstr "" -#: common.opt:1002 +#: common.opt:1006 #, no-c-format msgid "Align the start of loops." msgstr "" -#: common.opt:1009 +#: common.opt:1013 #, no-c-format msgid "Allow the compiler to introduce new data races on stores." msgstr "" -#: common.opt:1013 +#: common.opt:1017 #, no-c-format msgid "Enable static analysis pass." msgstr "" -#: common.opt:1033 +#: common.opt:1037 #, no-c-format msgid "Select what to sanitize." msgstr "" -#: common.opt:1037 +#: common.opt:1041 #, no-c-format msgid "Select type of coverage sanitization." msgstr "" -#: common.opt:1041 +#: common.opt:1045 #, no-c-format msgid "-fasan-shadow-offset=\tUse custom shadow memory offset." msgstr "" -#: common.opt:1045 +#: common.opt:1049 #, no-c-format msgid "-fsanitize-sections=\tSanitize global variables in user-defined sections." msgstr "" -#: common.opt:1050 +#: common.opt:1054 #, no-c-format msgid "After diagnosing undefined behavior attempt to continue execution." msgstr "" -#: common.opt:1054 +#: common.opt:1058 #, no-c-format msgid "This switch is deprecated; use -fsanitize-recover= instead." msgstr "" -#: common.opt:1061 +#: common.opt:1065 #, no-c-format msgid "Use trap instead of a library function for undefined behavior sanitization." msgstr "" -#: common.opt:1065 +#: common.opt:1069 #, no-c-format msgid "Generate unwind tables that are exact at each instruction boundary." msgstr "" -#: common.opt:1069 +#: common.opt:1073 #, fuzzy, no-c-format #| msgid "Do not generate char instructions" msgid "Generate auto-inc/dec instructions." msgstr "Не генерыраваць сімвальныя інструкцыі" -#: common.opt:1073 +#: common.opt:1077 #, no-c-format msgid "Use sample profile information for call graph node weights. The default profile file is fbdata.afdo in 'pwd'." msgstr "" -#: common.opt:1078 +#: common.opt:1082 #, no-c-format msgid "Use sample profile information for call graph node weights. The profile file is specified in the argument." msgstr "" -#: common.opt:1087 +#: common.opt:1091 #, no-c-format msgid "Generate code to check bounds before indexing arrays." msgstr "" -#: common.opt:1091 +#: common.opt:1095 #, no-c-format msgid "Replace add, compare, branch with branch on count register." msgstr "" -#: common.opt:1095 +#: common.opt:1099 #, no-c-format msgid "Use profiling information for branch probabilities." msgstr "" -#: common.opt:1111 +#: common.opt:1115 #, no-c-format msgid "Output callgraph information on a per-file basis." msgstr "" -#: common.opt:1115 +#: common.opt:1119 #, no-c-format msgid "Output callgraph information on a per-file basis with decorations." msgstr "" -#: common.opt:1119 +#: common.opt:1123 #, no-c-format msgid "-fcall-saved-\tMark as being preserved across functions." msgstr "" -#: common.opt:1123 +#: common.opt:1127 #, no-c-format msgid "-fcall-used-\tMark as being corrupted by function calls." msgstr "" -#: common.opt:1130 +#: common.opt:1134 #, no-c-format msgid "Save registers around function calls." msgstr "" -#: common.opt:1134 +#: common.opt:1138 #, no-c-format msgid "This switch is deprecated; do not use." msgstr "" -#: common.opt:1138 +#: common.opt:1142 #, no-c-format msgid "Check the return value of new in C++." msgstr "" -#: common.opt:1142 common.opt:1146 +#: common.opt:1146 common.opt:1150 #, no-c-format msgid "Perform internal consistency checkings." msgstr "" -#: common.opt:1150 +#: common.opt:1154 #, fuzzy, no-c-format #| msgid "Enable exception handling" msgid "Enable code hoisting." msgstr "Уключыць апрацоўку выключэньняў" -#: common.opt:1154 +#: common.opt:1158 #, no-c-format msgid "Looks for opportunities to reduce stack adjustments and stack references." msgstr "" -#: common.opt:1158 +#: common.opt:1162 #, no-c-format msgid "Put uninitialized globals in the common section." msgstr "" -#: common.opt:1166 +#: common.opt:1170 #, no-c-format msgid "-fcompare-debug[=]\tCompile with and without e.g. -gtoggle, and compare the final-insns dump." msgstr "" -#: common.opt:1170 +#: common.opt:1174 #, no-c-format msgid "Run only the second compilation of -fcompare-debug." msgstr "" -#: common.opt:1174 +#: common.opt:1178 #, no-c-format msgid "Perform comparison elimination after register allocation has finished." msgstr "" -#: common.opt:1178 +#: common.opt:1182 #, no-c-format msgid "Do not perform optimizations increasing noticeably stack usage." msgstr "" -#: common.opt:1182 +#: common.opt:1186 #, no-c-format msgid "Perform a register copy-propagation optimization pass." msgstr "" -#: common.opt:1186 +#: common.opt:1190 #, no-c-format msgid "Perform cross-jumping optimization." msgstr "" -#: common.opt:1190 +#: common.opt:1194 #, no-c-format msgid "When running CSE, follow jumps to their targets." msgstr "" -#: common.opt:1198 +#: common.opt:1202 #, no-c-format msgid "Omit range reduction step when performing complex division." msgstr "" -#: common.opt:1202 +#: common.opt:1206 #, no-c-format msgid "Complex multiplication and division follow Fortran rules." msgstr "" -#: common.opt:1206 +#: common.opt:1210 #, no-c-format msgid "Place data items into their own section." msgstr "" -#: common.opt:1210 +#: common.opt:1214 #, no-c-format msgid "List all available debugging counters with their limits and counts." msgstr "" -#: common.opt:1214 +#: common.opt:1218 #, no-c-format msgid "-fdbg-cnt=[:-][:-:...][,:...]\tSet the debug counter limit." msgstr "" -#: common.opt:1218 +#: common.opt:1222 #, no-c-format msgid "-fdebug-prefix-map==\tMap one directory name to another in debug information." msgstr "" -#: common.opt:1222 +#: common.opt:1226 #, no-c-format msgid "-ffile-prefix-map==\tMap one directory name to another in compilation result." msgstr "" -#: common.opt:1226 +#: common.opt:1230 #, no-c-format msgid "Output .debug_types section when using DWARF v4 debuginfo." msgstr "" -#: common.opt:1232 +#: common.opt:1236 #, no-c-format msgid "Defer popping functions args from stack until later." msgstr "" -#: common.opt:1236 +#: common.opt:1240 #, no-c-format msgid "Attempt to fill delay slots of branch instructions." msgstr "" -#: common.opt:1240 +#: common.opt:1244 #, no-c-format msgid "Delete dead instructions that may throw exceptions." msgstr "" -#: common.opt:1244 +#: common.opt:1248 #, no-c-format msgid "Delete useless null pointer checks." msgstr "" -#: common.opt:1248 +#: common.opt:1252 #, no-c-format msgid "Stream extra data to support more aggressive devirtualization in LTO local transformation mode." msgstr "" -#: common.opt:1252 +#: common.opt:1256 #, no-c-format msgid "Perform speculative devirtualization." msgstr "" -#: common.opt:1256 +#: common.opt:1260 #, no-c-format msgid "Try to convert virtual calls to direct ones." msgstr "" -#: common.opt:1260 +#: common.opt:1264 #, no-c-format msgid "-fdiagnostics-show-location=[once|every-line]\tHow often to emit source location at the beginning of line-wrapped diagnostics." msgstr "" -#: common.opt:1277 +#: common.opt:1281 #, no-c-format msgid "Show the source line with a caret indicating the column." msgstr "" -#: common.opt:1281 +#: common.opt:1285 #, no-c-format msgid "Show labels annotating ranges of source code when showing source." msgstr "" -#: common.opt:1285 +#: common.opt:1289 #, no-c-format msgid "Show line numbers in the left margin when showing source." msgstr "" -#: common.opt:1293 +#: common.opt:1297 #, no-c-format msgid "-fdiagnostics-color=[never|always|auto]\tColorize diagnostics." msgstr "" -#: common.opt:1313 +#: common.opt:1317 #, no-c-format msgid "-fdiagnostics-urls=[never|always|auto]\tEmbed URLs in diagnostics." msgstr "" -#: common.opt:1333 +#: common.opt:1337 #, no-c-format msgid "-fdiagnostics-column-unit=[display|byte]\tSelect whether column numbers are output as display columns (default) or raw bytes." msgstr "" -#: common.opt:1337 +#: common.opt:1341 #, no-c-format msgid "-fdiagnostics-column-origin=\tSet the number of the first column. The default is 1-based as per GNU style, but some utilities may expect 0-based, for example." msgstr "" -#: common.opt:1341 +#: common.opt:1345 #, no-c-format msgid "-fdiagnostics-format=[text|json]\tSelect output format." msgstr "" -#: common.opt:1367 +#: common.opt:1371 #, no-c-format msgid "Print fix-it hints in machine-readable form." msgstr "" -#: common.opt:1371 +#: common.opt:1375 #, no-c-format msgid "Print fix-it hints to stderr in unified diff format." msgstr "" -#: common.opt:1375 +#: common.opt:1379 #, no-c-format msgid "Amend appropriate diagnostic messages with the command line option that controls them." msgstr "" -#: common.opt:1379 +#: common.opt:1383 #, no-c-format msgid "Print CWE identifiers for diagnostic messages, where available." msgstr "" -#: common.opt:1383 +#: common.opt:1387 #, no-c-format msgid "Specify how to print any control-flow path associated with a diagnostic." msgstr "" -#: common.opt:1387 +#: common.opt:1391 #, no-c-format msgid "Turn off any diagnostics features that complicate the output, such as line numbers, color, and warning URLs." msgstr "" -#: common.opt:1391 +#: common.opt:1395 #, no-c-format msgid "-ftabstop= Distance between tab stops for column reporting." msgstr "" -#: common.opt:1407 +#: common.opt:1411 #, no-c-format msgid "Show stack depths of events in paths." msgstr "" -#: common.opt:1411 +#: common.opt:1415 #, no-c-format msgid "Set minimum width of left margin of source code when showing source." msgstr "" -#: common.opt:1415 +#: common.opt:1419 #, no-c-format msgid "-fdisable-[tree|rtl|ipa]-=range1+range2\tDisable an optimization pass." msgstr "" -#: common.opt:1419 +#: common.opt:1423 #, no-c-format msgid "-fenable-[tree|rtl|ipa]-=range1+range2\tEnable an optimization pass." msgstr "" -#: common.opt:1423 +#: common.opt:1427 #, no-c-format msgid "-fdump-\tDump various compiler internals to a file." msgstr "" -#: common.opt:1430 +#: common.opt:1434 #, no-c-format msgid "-fdump-final-insns=filename\tDump to filename the insns at the end of translation." msgstr "" -#: common.opt:1434 +#: common.opt:1438 #, no-c-format msgid "-fdump-go-spec=filename\tWrite all declarations to file as Go code." msgstr "" -#: common.opt:1438 +#: common.opt:1442 #, no-c-format msgid "Suppress output of addresses in debugging dumps." msgstr "" -#: common.opt:1442 +#: common.opt:1446 #, no-c-format msgid "Collect and dump debug information into temporary file if ICE in C/C++ compiler occurred." msgstr "" -#: common.opt:1447 +#: common.opt:1451 #, no-c-format msgid "Dump detailed information on GCC's internal representation of source code locations." msgstr "" -#: common.opt:1451 +#: common.opt:1455 #, no-c-format msgid "Dump optimization passes." msgstr "" -#: common.opt:1455 +#: common.opt:1459 #, no-c-format msgid "Suppress output of instruction numbers, line number notes and addresses in debugging dumps." msgstr "" -#: common.opt:1459 +#: common.opt:1463 #, no-c-format msgid "Suppress output of previous and next insn numbers in debugging dumps." msgstr "" -#: common.opt:1463 +#: common.opt:1467 #, no-c-format msgid "Enable CFI tables via GAS assembler directives." msgstr "" -#: common.opt:1467 +#: common.opt:1471 #, no-c-format msgid "Perform early inlining." msgstr "" -#: common.opt:1475 +#: common.opt:1479 #, no-c-format msgid "Perform interprocedural reduction of aggregates." msgstr "" -#: common.opt:1479 +#: common.opt:1483 #, no-c-format msgid "Perform unused symbol elimination in debug info." msgstr "" -#: common.opt:1483 +#: common.opt:1487 #, no-c-format msgid "Perform unused type elimination in debug info." msgstr "" -#: common.opt:1487 +#: common.opt:1491 #, no-c-format msgid "Do not suppress C++ class debug information." msgstr "" -#: common.opt:1491 +#: common.opt:1495 #, fuzzy, no-c-format #| msgid "Enable exception handling" msgid "Enable exception handling." msgstr "Уключыць апрацоўку выключэньняў" -#: common.opt:1495 +#: common.opt:1499 #, no-c-format msgid "Perform a number of minor, expensive optimizations." msgstr "" -#: common.opt:1499 +#: common.opt:1503 #, no-c-format msgid "-fexcess-precision=[fast|standard]\tSpecify handling of excess floating-point precision." msgstr "" -#: common.opt:1514 +#: common.opt:1518 #, no-c-format msgid "-fpermitted-flt-eval-methods=[c11|ts-18661]\tSpecify which values of FLT_EVAL_METHOD are permitted." msgstr "" -#: common.opt:1530 +#: common.opt:1534 #, no-c-format msgid "Output lto objects containing both the intermediate language and binary output." msgstr "" -#: common.opt:1534 +#: common.opt:1538 #, no-c-format msgid "Assume no NaNs or infinities are generated." msgstr "" -#: common.opt:1538 +#: common.opt:1542 #, no-c-format msgid "Assume that loops with an exit will terminate and not loop indefinitely." msgstr "" -#: common.opt:1542 +#: common.opt:1546 #, no-c-format msgid "-ffixed-\tMark as being unavailable to the compiler." msgstr "" -#: common.opt:1546 +#: common.opt:1550 #, no-c-format msgid "Don't allocate floats and doubles in extended-precision registers." msgstr "" -#: common.opt:1554 +#: common.opt:1558 #, no-c-format msgid "Perform a forward propagation pass on RTL." msgstr "" -#: common.opt:1558 +#: common.opt:1562 #, no-c-format msgid "-ffp-contract=[off|on|fast]\tPerform floating-point expression contraction." msgstr "" -#: common.opt:1575 +#: common.opt:1579 #, no-c-format msgid "Allow built-in functions ceil, floor, round, trunc to raise \"inexact\" exceptions." msgstr "" -#: common.opt:1582 +#: common.opt:1586 #, no-c-format msgid "Allow function addresses to be held in registers." msgstr "" -#: common.opt:1586 +#: common.opt:1590 #, fuzzy, no-c-format #| msgid "for each function it appears in.)" msgid "Place each function into its own section." msgstr "адзін раз для кожнай функцыі, дзе ён з'яўляецца.)" -#: common.opt:1590 +#: common.opt:1594 #, no-c-format msgid "Perform global common subexpression elimination." msgstr "" -#: common.opt:1594 +#: common.opt:1598 #, no-c-format msgid "Perform enhanced load motion during global common subexpression elimination." msgstr "" -#: common.opt:1598 +#: common.opt:1602 #, no-c-format msgid "Perform store motion after global common subexpression elimination." msgstr "" -#: common.opt:1602 +#: common.opt:1606 #, no-c-format msgid "Perform redundant load after store elimination in global common subexpression elimination." msgstr "" -#: common.opt:1607 +#: common.opt:1611 #, no-c-format msgid "Perform global common subexpression elimination after register allocation has finished." msgstr "" -#: common.opt:1624 +#: common.opt:1628 #, no-c-format msgid "-fgnat-encodings=[all|gdb|minimal]\tSelect the balance between GNAT encodings and standard DWARF emitted in the debug information." msgstr "" -#: common.opt:1629 +#: common.opt:1633 #, no-c-format msgid "Enable in and out of Graphite representation." msgstr "" -#: common.opt:1633 +#: common.opt:1637 #, no-c-format msgid "Enable Graphite Identity transformation." msgstr "" -#: common.opt:1637 +#: common.opt:1641 #, no-c-format msgid "Enable hoisting adjacent loads to encourage generating conditional move instructions." msgstr "" -#: common.opt:1646 +#: common.opt:1650 #, no-c-format msgid "Improve GCC's ability to track column numbers in large source files, at the expense of slower compilation." msgstr "" -#: common.opt:1651 +#: common.opt:1655 #, no-c-format msgid "Mark all loops as parallel." msgstr "" -#: common.opt:1655 common.opt:1663 common.opt:2827 +#: common.opt:1659 common.opt:1667 common.opt:2831 #, no-c-format msgid "Enable loop nest transforms. Same as -floop-nest-optimize." msgstr "" -#: common.opt:1659 +#: common.opt:1663 #, no-c-format msgid "Enable loop interchange on trees." msgstr "" -#: common.opt:1667 +#: common.opt:1671 #, no-c-format msgid "Perform unroll-and-jam on loops." msgstr "" -#: common.opt:1671 +#: common.opt:1675 #, no-c-format msgid "Enable support for GNU transactional memory." msgstr "" -#: common.opt:1675 +#: common.opt:1679 #, no-c-format msgid "Use STB_GNU_UNIQUE if supported by the assembler." msgstr "" -#: common.opt:1683 +#: common.opt:1687 #, no-c-format msgid "Enable the loop nest optimizer." msgstr "" -#: common.opt:1687 +#: common.opt:1691 #, no-c-format msgid "Force bitfield accesses to match their type width." msgstr "" -#: common.opt:1691 +#: common.opt:1695 #, no-c-format msgid "Merge adjacent stores." msgstr "" -#: common.opt:1695 +#: common.opt:1699 #, no-c-format msgid "Enable guessing of branch probabilities." msgstr "" -#: common.opt:1703 +#: common.opt:1707 #, fuzzy, no-c-format msgid "Process #ident directives." msgstr "нерэчаісны ініцыялізатар" -#: common.opt:1707 +#: common.opt:1711 #, no-c-format msgid "Perform conversion of conditional jumps to branchless equivalents." msgstr "" -#: common.opt:1711 +#: common.opt:1715 #, no-c-format msgid "Perform conversion of conditional jumps to conditional execution." msgstr "" -#: common.opt:1715 +#: common.opt:1719 #, no-c-format msgid "-fstack-reuse=[all|named_vars|none]\tSet stack reuse level for local variables." msgstr "" -#: common.opt:1731 +#: common.opt:1735 #, no-c-format msgid "Convert conditional jumps in innermost loops to branchless equivalents." msgstr "" -#: common.opt:1743 +#: common.opt:1747 #, fuzzy, no-c-format #| msgid "Do not generate char instructions" msgid "Do not generate .size directives." msgstr "Не генерыраваць сімвальныя інструкцыі" -#: common.opt:1747 +#: common.opt:1751 #, no-c-format msgid "Perform indirect inlining." msgstr "" -#: common.opt:1753 +#: common.opt:1757 #, no-c-format msgid "Enable inlining of function declared \"inline\", disabling disables all inlining." msgstr "" -#: common.opt:1757 +#: common.opt:1761 #, no-c-format msgid "Integrate functions into their callers when code size is known not to grow." msgstr "" -#: common.opt:1761 +#: common.opt:1765 #, no-c-format msgid "Integrate functions not declared \"inline\" into their callers when profitable." msgstr "" -#: common.opt:1765 +#: common.opt:1769 #, no-c-format msgid "Integrate functions only required by their single caller." msgstr "" -#: common.opt:1772 +#: common.opt:1776 #, no-c-format msgid "-finline-limit=\tLimit the size of inlined functions to ." msgstr "" -#: common.opt:1776 +#: common.opt:1780 #, no-c-format msgid "Inline __atomic operations when a lock free instruction sequence is available." msgstr "" -#: common.opt:1783 +#: common.opt:1787 #, no-c-format msgid "-fcf-protection=[full|branch|return|none|check]\tInstrument functions with checks to verify jump/call/return control-flow transfer instructions have valid targets." msgstr "" -#: common.opt:1806 +#: common.opt:1810 #, no-c-format msgid "Instrument function entry and exit with profiling calls." msgstr "" -#: common.opt:1810 +#: common.opt:1814 #, no-c-format msgid "-finstrument-functions-exclude-function-list=name,...\tDo not instrument listed functions." msgstr "" -#: common.opt:1814 +#: common.opt:1818 #, no-c-format msgid "-finstrument-functions-exclude-file-list=filename,...\tDo not instrument functions listed in files." msgstr "" -#: common.opt:1818 +#: common.opt:1822 #, no-c-format msgid "Perform interprocedural constant propagation." msgstr "" -#: common.opt:1822 +#: common.opt:1826 #, no-c-format msgid "Perform cloning to make Interprocedural constant propagation stronger." msgstr "" -#: common.opt:1830 +#: common.opt:1834 #, no-c-format msgid "Perform interprocedural bitwise constant propagation." msgstr "" -#: common.opt:1834 +#: common.opt:1838 #, no-c-format msgid "Perform interprocedural modref analysis." msgstr "" -#: common.opt:1838 +#: common.opt:1842 #, no-c-format msgid "Perform interprocedural profile propagation." msgstr "" -#: common.opt:1842 +#: common.opt:1846 #, no-c-format msgid "Perform interprocedural points-to analysis." msgstr "" -#: common.opt:1846 +#: common.opt:1850 #, no-c-format msgid "Discover pure and const functions." msgstr "" -#: common.opt:1850 +#: common.opt:1854 #, no-c-format msgid "Perform Identical Code Folding for functions and read-only variables." msgstr "" -#: common.opt:1854 +#: common.opt:1858 #, no-c-format msgid "Perform Identical Code Folding for functions." msgstr "" -#: common.opt:1858 +#: common.opt:1862 #, no-c-format msgid "Perform Identical Code Folding for variables." msgstr "" -#: common.opt:1862 +#: common.opt:1866 #, no-c-format msgid "Discover read-only and non addressable static variables." msgstr "" -#: common.opt:1866 +#: common.opt:1870 #, no-c-format msgid "Discover read-only, write-only and non-addressable static variables." msgstr "" -#: common.opt:1870 +#: common.opt:1874 #, no-c-format msgid "Reduce stack alignment on call sites if possible." msgstr "" -#: common.opt:1882 +#: common.opt:1886 #, no-c-format msgid "Perform IPA Value Range Propagation." msgstr "" -#: common.opt:1886 +#: common.opt:1890 #, no-c-format msgid "-fira-algorithm=[CB|priority]\tSet the used IRA algorithm." msgstr "" -#: common.opt:1899 +#: common.opt:1903 #, no-c-format msgid "-fira-region=[one|all|mixed]\tSet regions for IRA." msgstr "" -#: common.opt:1915 +#: common.opt:1919 #, no-c-format msgid "Use IRA based register pressure calculation in RTL hoist optimizations." msgstr "" -#: common.opt:1920 +#: common.opt:1924 #, no-c-format msgid "Use IRA based register pressure calculation in RTL loop optimizations." msgstr "" -#: common.opt:1925 +#: common.opt:1929 #, no-c-format msgid "Share slots for saving different hard registers." msgstr "" -#: common.opt:1929 +#: common.opt:1933 #, no-c-format msgid "Share stack slots for spilled pseudo-registers." msgstr "" -#: common.opt:1933 +#: common.opt:1937 #, no-c-format msgid "-fira-verbose=\tControl IRA's level of diagnostic messages." msgstr "" -#: common.opt:1937 +#: common.opt:1941 #, no-c-format msgid "Optimize induction variables on trees." msgstr "" -#: common.opt:1941 +#: common.opt:1945 #, no-c-format msgid "Use jump tables for sufficiently large switch statements." msgstr "" -#: common.opt:1945 +#: common.opt:1949 #, no-c-format msgid "Use bit tests for sufficiently large switch statements." msgstr "" -#: common.opt:1949 +#: common.opt:1953 #, no-c-format msgid "Generate code for functions even if they are fully inlined." msgstr "" -#: common.opt:1953 +#: common.opt:1957 #, no-c-format msgid "Generate code for static functions even if they are never called." msgstr "" -#: common.opt:1957 +#: common.opt:1961 #, no-c-format msgid "Emit static const variables even if they are not used." msgstr "" -#: common.opt:1961 +#: common.opt:1965 #, no-c-format msgid "Give external symbols a leading underscore." msgstr "" -#: common.opt:1969 +#: common.opt:1973 #, no-c-format msgid "Do CFG-sensitive rematerialization in LRA." msgstr "" -#: common.opt:1973 +#: common.opt:1977 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable link-time optimization." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:1977 +#: common.opt:1981 #, no-c-format msgid "Link-time optimization with number of parallel jobs or jobserver." msgstr "" -#: common.opt:1999 +#: common.opt:2003 #, no-c-format msgid "Specify the algorithm to partition symbols and vars at linktime." msgstr "" -#: common.opt:2004 +#: common.opt:2008 #, no-c-format msgid "-flto-compression-level=\tUse zlib/zstd compression level for IL." msgstr "" -#: common.opt:2012 +#: common.opt:2016 #, no-c-format msgid "Report various link-time optimization statistics." msgstr "" -#: common.opt:2016 +#: common.opt:2020 #, no-c-format msgid "Report various link-time optimization statistics for WPA only." msgstr "" -#: common.opt:2020 +#: common.opt:2024 #, fuzzy, no-c-format msgid "Set errno after built-in math functions." msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: common.opt:2024 +#: common.opt:2028 #, no-c-format msgid "-fmax-errors=\tMaximum number of errors to report." msgstr "" -#: common.opt:2028 +#: common.opt:2032 #, no-c-format msgid "Report on permanent memory allocation." msgstr "" -#: common.opt:2032 +#: common.opt:2036 #, no-c-format msgid "Report on permanent memory allocation in WPA only." msgstr "" -#: common.opt:2039 +#: common.opt:2043 #, no-c-format msgid "Attempt to merge identical constants and constant variables." msgstr "" -#: common.opt:2043 +#: common.opt:2047 #, no-c-format msgid "Attempt to merge identical constants across compilation units." msgstr "" -#: common.opt:2047 +#: common.opt:2051 #, no-c-format msgid "Attempt to merge identical debug strings across compilation units." msgstr "" -#: common.opt:2051 +#: common.opt:2055 #, no-c-format msgid "-fmessage-length=\tLimit diagnostics to characters per line. 0 suppresses line-wrapping." msgstr "" -#: common.opt:2055 +#: common.opt:2059 #, no-c-format msgid "Perform SMS based modulo scheduling before the first scheduling pass." msgstr "" -#: common.opt:2059 +#: common.opt:2063 #, no-c-format msgid "Perform SMS based modulo scheduling with register moves allowed." msgstr "" -#: common.opt:2063 +#: common.opt:2067 #, no-c-format msgid "Move loop invariant computations out of loops." msgstr "" -#: common.opt:2067 +#: common.opt:2071 #, no-c-format msgid "Use the RTL dead code elimination pass." msgstr "" -#: common.opt:2071 +#: common.opt:2075 #, no-c-format msgid "Use the RTL dead store elimination pass." msgstr "" -#: common.opt:2075 +#: common.opt:2079 #, no-c-format msgid "Enable/Disable the traditional scheduling in loops that already passed modulo scheduling." msgstr "" -#: common.opt:2079 +#: common.opt:2083 #, no-c-format msgid "Support synchronous non-call exceptions." msgstr "" -#: common.opt:2083 +#: common.opt:2087 #, no-c-format msgid "-foffload==\tSpecify offloading targets and options for them." msgstr "" -#: common.opt:2087 +#: common.opt:2091 #, no-c-format msgid "-foffload-abi=[lp64|ilp32]\tSet the ABI to use in an offload compiler." msgstr "" -#: common.opt:2100 +#: common.opt:2104 #, no-c-format msgid "When possible do not generate stack frames." msgstr "" -#: common.opt:2104 +#: common.opt:2108 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable all optimization info dumps on stderr." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2108 +#: common.opt:2112 #, no-c-format msgid "-fopt-info[-=filename]\tDump compiler optimization details." msgstr "" -#: common.opt:2112 +#: common.opt:2116 #, no-c-format msgid "Write a SRCFILE.opt-record.json file detailing what optimizations were performed." msgstr "" -#: common.opt:2120 +#: common.opt:2124 #, no-c-format msgid "Optimize sibling and tail recursive calls." msgstr "" -#: common.opt:2124 +#: common.opt:2128 #, no-c-format msgid "Perform partial inlining." msgstr "" -#: common.opt:2128 common.opt:2132 +#: common.opt:2132 common.opt:2136 #, no-c-format msgid "Report on memory allocation before interprocedural optimization." msgstr "" -#: common.opt:2136 +#: common.opt:2140 #, no-c-format msgid "Pack structure members together without holes." msgstr "" -#: common.opt:2140 +#: common.opt:2144 #, no-c-format msgid "-fpack-struct=\tSet initial maximum structure member alignment." msgstr "" -#: common.opt:2144 +#: common.opt:2148 #, no-c-format msgid "Return small aggregates in memory, not registers." msgstr "" -#: common.opt:2148 +#: common.opt:2152 #, no-c-format msgid "Perform loop peeling." msgstr "" -#: common.opt:2152 +#: common.opt:2156 #, no-c-format msgid "Enable machine specific peephole optimizations." msgstr "" -#: common.opt:2156 +#: common.opt:2160 #, no-c-format msgid "Enable an RTL peephole pass before sched2." msgstr "" -#: common.opt:2160 +#: common.opt:2164 #, no-c-format msgid "Generate position-independent code if possible (large mode)." msgstr "" -#: common.opt:2164 +#: common.opt:2168 #, no-c-format msgid "Generate position-independent code for executables if possible (large mode)." msgstr "" -#: common.opt:2168 +#: common.opt:2172 #, no-c-format msgid "Generate position-independent code if possible (small mode)." msgstr "" -#: common.opt:2172 +#: common.opt:2176 #, no-c-format msgid "Generate position-independent code for executables if possible (small mode)." msgstr "" -#: common.opt:2176 +#: common.opt:2180 #, no-c-format msgid "Use PLT for PIC calls (-fno-plt: load the address from GOT at call site)." msgstr "" -#: common.opt:2180 +#: common.opt:2184 #, no-c-format msgid "Specify a plugin to load." msgstr "" -#: common.opt:2184 +#: common.opt:2188 #, no-c-format msgid "-fplugin-arg--[=]\tSpecify argument = for plugin ." msgstr "" -#: common.opt:2188 +#: common.opt:2192 #, no-c-format msgid "Run predictive commoning optimization." msgstr "" -#: common.opt:2192 +#: common.opt:2196 #, no-c-format msgid "Generate prefetch instructions, if available, for arrays in loops." msgstr "" -#: common.opt:2196 +#: common.opt:2200 #, no-c-format msgid "Enable basic program profiling code." msgstr "" -#: common.opt:2200 +#: common.opt:2204 #, no-c-format msgid "Generate absolute source path names for gcov." msgstr "" -#: common.opt:2204 +#: common.opt:2208 #, no-c-format msgid "Insert arc-based program profiling code." msgstr "" -#: common.opt:2208 +#: common.opt:2212 #, no-c-format msgid "Set the top-level directory for storing the profile data. The default is 'pwd'." msgstr "" -#: common.opt:2213 +#: common.opt:2217 #, no-c-format msgid "Select the name for storing the profile note file." msgstr "" -#: common.opt:2217 +#: common.opt:2221 #, no-c-format msgid "Enable correction of flow inconsistent profile data input." msgstr "" -#: common.opt:2221 +#: common.opt:2225 #, no-c-format msgid "-fprofile-update=[single|atomic|prefer-atomic]\tSet the profile update method." msgstr "" -#: common.opt:2225 +#: common.opt:2229 #, no-c-format msgid "Instrument only functions from files whose name matches any of the regular expressions (separated by semi-colons)." msgstr "" -#: common.opt:2229 +#: common.opt:2233 #, no-c-format msgid "Instrument only functions from files whose name does not match any of the regular expressions (separated by semi-colons)." msgstr "" -#: common.opt:2245 +#: common.opt:2249 #, no-c-format msgid "-fprofile-reproducible=[serial|parallel-runs|multithreaded]\tControl level of reproducibility of profile gathered by -fprofile-generate." msgstr "" -#: common.opt:2261 +#: common.opt:2265 #, no-c-format msgid "Remove prefix from absolute path before mangling name for -fprofile-generate= and -fprofile-use=." msgstr "" -#: common.opt:2265 +#: common.opt:2269 #, no-c-format msgid "Enable common options for generating profile info for profile feedback directed optimizations." msgstr "" -#: common.opt:2269 +#: common.opt:2273 #, no-c-format msgid "Enable common options for generating profile info for profile feedback directed optimizations, and set -fprofile-dir=." msgstr "" -#: common.opt:2273 +#: common.opt:2277 #, no-c-format msgid "Register the profile information in the .gcov_info section instead of using a constructor/destructor." msgstr "" -#: common.opt:2277 +#: common.opt:2281 #, no-c-format msgid "Register the profile information in the specified section instead of using a constructor/destructor." msgstr "" -#: common.opt:2281 +#: common.opt:2285 #, no-c-format msgid "Do not assume that functions never executed during the train run are cold." msgstr "" -#: common.opt:2285 +#: common.opt:2289 #, no-c-format msgid "Enable common options for performing profile feedback directed optimizations." msgstr "" -#: common.opt:2289 +#: common.opt:2293 #, no-c-format msgid "Enable common options for performing profile feedback directed optimizations, and set -fprofile-dir=." msgstr "" -#: common.opt:2293 +#: common.opt:2297 #, no-c-format msgid "Insert code to profile values of expressions." msgstr "" -#: common.opt:2297 +#: common.opt:2301 #, no-c-format msgid "Report on consistency of profile." msgstr "" -#: common.opt:2301 +#: common.opt:2305 #, no-c-format msgid "Enable function reordering that improves code placement." msgstr "" -#: common.opt:2305 +#: common.opt:2309 #, no-c-format msgid "Insert NOP instructions at each function entry." msgstr "" -#: common.opt:2312 +#: common.opt:2316 #, no-c-format msgid "-frandom-seed=\tMake compile reproducible using ." msgstr "" -#: common.opt:2322 +#: common.opt:2326 #, no-c-format msgid "Record gcc command line switches in the object file." msgstr "" -#: common.opt:2326 +#: common.opt:2330 #, fuzzy, no-c-format msgid "Return small aggregates in registers." msgstr "Не выкарыстоўваць рэгістра sb" -#: common.opt:2334 +#: common.opt:2338 #, no-c-format msgid "Tell DSE that the storage for a C++ object is dead when the constructor starts and when the destructor finishes." msgstr "" -#: common.opt:2345 +#: common.opt:2349 #, no-c-format msgid "-flive-patching=[inline-only-static|inline-clone]\tControl IPA optimizations to provide a safe compilation for live-patching. At the same time, provides multiple-level control on the enabled IPA optimizations." msgstr "" -#: common.opt:2360 +#: common.opt:2364 #, no-c-format msgid "Tell DCE to remove unused C++ allocations." msgstr "" -#: common.opt:2364 +#: common.opt:2368 #, no-c-format msgid "Relief of register pressure through live range shrinkage." msgstr "" -#: common.opt:2368 +#: common.opt:2372 #, no-c-format msgid "Perform a register renaming optimization pass." msgstr "" -#: common.opt:2372 +#: common.opt:2376 #, no-c-format msgid "Perform a target dependent instruction fusion optimization pass." msgstr "" -#: common.opt:2376 +#: common.opt:2380 #, no-c-format msgid "Reorder basic blocks to improve code placement." msgstr "" -#: common.opt:2380 +#: common.opt:2384 #, no-c-format msgid "-freorder-blocks-algorithm=[simple|stc]\tSet the used basic block reordering algorithm." msgstr "" -#: common.opt:2393 +#: common.opt:2397 #, no-c-format msgid "Reorder basic blocks and partition into hot and cold sections." msgstr "" -#: common.opt:2397 +#: common.opt:2401 #, no-c-format msgid "Reorder functions to improve code placement." msgstr "" -#: common.opt:2401 +#: common.opt:2405 #, no-c-format msgid "Add a common subexpression elimination pass after loop optimizations." msgstr "" -#: common.opt:2409 +#: common.opt:2413 #, no-c-format msgid "Disable optimizations that assume default FP rounding behavior." msgstr "" -#: common.opt:2413 +#: common.opt:2417 #, no-c-format msgid "Enable scheduling across basic blocks." msgstr "" -#: common.opt:2417 +#: common.opt:2421 #, no-c-format msgid "Enable register pressure sensitive insn scheduling." msgstr "" -#: common.opt:2421 +#: common.opt:2425 #, no-c-format msgid "Allow speculative motion of non-loads." msgstr "" -#: common.opt:2425 +#: common.opt:2429 #, no-c-format msgid "Allow speculative motion of some loads." msgstr "" -#: common.opt:2429 +#: common.opt:2433 #, no-c-format msgid "Allow speculative motion of more loads." msgstr "" -#: common.opt:2433 +#: common.opt:2437 #, no-c-format msgid "-fsched-verbose=\tSet the verbosity level of the scheduler." msgstr "" -#: common.opt:2437 +#: common.opt:2441 #, no-c-format msgid "If scheduling post reload, do superblock scheduling." msgstr "" -#: common.opt:2445 +#: common.opt:2449 #, no-c-format msgid "Reschedule instructions before register allocation." msgstr "" -#: common.opt:2449 +#: common.opt:2453 #, no-c-format msgid "Reschedule instructions after register allocation." msgstr "" -#: common.opt:2456 +#: common.opt:2460 #, no-c-format msgid "Schedule instructions using selective scheduling algorithm." msgstr "" -#: common.opt:2460 +#: common.opt:2464 #, no-c-format msgid "Run selective scheduling after reload." msgstr "" -#: common.opt:2464 +#: common.opt:2468 #, no-c-format msgid "Run self-tests, using the given path to locate test files." msgstr "" -#: common.opt:2468 +#: common.opt:2472 #, no-c-format msgid "Perform software pipelining of inner loops during selective scheduling." msgstr "" -#: common.opt:2472 +#: common.opt:2476 #, no-c-format msgid "Perform software pipelining of outer loops during selective scheduling." msgstr "" -#: common.opt:2476 +#: common.opt:2480 #, no-c-format msgid "Reschedule pipelined regions without pipelining." msgstr "" -#: common.opt:2480 +#: common.opt:2484 #, no-c-format msgid "Allow interposing function (or variables) by ones with different semantics (or initializer) respectively by dynamic linker." msgstr "" -#: common.opt:2486 +#: common.opt:2490 #, no-c-format msgid "Allow premature scheduling of queued insns." msgstr "" -#: common.opt:2490 +#: common.opt:2494 #, no-c-format msgid "-fsched-stalled-insns=\tSet number of queued insns that can be prematurely scheduled." msgstr "" -#: common.opt:2498 +#: common.opt:2502 #, no-c-format msgid "Set dependence distance checking in premature scheduling of queued insns." msgstr "" -#: common.opt:2502 +#: common.opt:2506 #, no-c-format msgid "-fsched-stalled-insns-dep=\tSet dependence distance checking in premature scheduling of queued insns." msgstr "" -#: common.opt:2506 +#: common.opt:2510 #, no-c-format msgid "Enable the group heuristic in the scheduler." msgstr "" -#: common.opt:2510 +#: common.opt:2514 #, no-c-format msgid "Enable the critical path heuristic in the scheduler." msgstr "" -#: common.opt:2514 +#: common.opt:2518 #, no-c-format msgid "Enable the speculative instruction heuristic in the scheduler." msgstr "" -#: common.opt:2518 +#: common.opt:2522 #, no-c-format msgid "Enable the rank heuristic in the scheduler." msgstr "" -#: common.opt:2522 +#: common.opt:2526 #, no-c-format msgid "Enable the last instruction heuristic in the scheduler." msgstr "" -#: common.opt:2526 +#: common.opt:2530 #, no-c-format msgid "Enable the dependent count heuristic in the scheduler." msgstr "" -#: common.opt:2530 +#: common.opt:2534 #, no-c-format msgid "Access data in the same section from shared anchor points." msgstr "" -#: common.opt:2542 +#: common.opt:2546 #, no-c-format msgid "Turn on Redundant Extensions Elimination pass." msgstr "" -#: common.opt:2546 +#: common.opt:2550 #, no-c-format msgid "Show column numbers in diagnostics, when available. Default on." msgstr "" -#: common.opt:2550 +#: common.opt:2554 #, no-c-format msgid "Emit function prologues only before parts of the function that need it, rather than at the top of the function." msgstr "" -#: common.opt:2555 +#: common.opt:2559 #, no-c-format msgid "Shrink-wrap parts of the prologue and epilogue separately." msgstr "" -#: common.opt:2559 +#: common.opt:2563 #, no-c-format msgid "Disable optimizations observable by IEEE signaling NaNs." msgstr "" -#: common.opt:2563 +#: common.opt:2567 #, no-c-format msgid "Disable floating point optimizations that ignore the IEEE signedness of zero." msgstr "" -#: common.opt:2567 +#: common.opt:2571 #, no-c-format msgid "Convert floating point constants to single precision constants." msgstr "" -#: common.opt:2571 +#: common.opt:2575 #, no-c-format msgid "Split lifetimes of induction variables when loops are unrolled." msgstr "" -#: common.opt:2575 +#: common.opt:2579 #, no-c-format msgid "Generate discontiguous stack frames." msgstr "" -#: common.opt:2579 +#: common.opt:2583 #, no-c-format msgid "Split wide types into independent registers." msgstr "" -#: common.opt:2583 +#: common.opt:2587 #, no-c-format msgid "Split wide types into independent registers earlier." msgstr "" -#: common.opt:2587 +#: common.opt:2591 #, no-c-format msgid "Enable backward propagation of use properties at the SSA level." msgstr "" -#: common.opt:2591 +#: common.opt:2595 #, no-c-format msgid "Optimize conditional patterns using SSA PHI nodes." msgstr "" -#: common.opt:2595 +#: common.opt:2599 #, no-c-format msgid "Optimize amount of stdarg registers saved to stack at start of function." msgstr "" -#: common.opt:2599 +#: common.opt:2603 #, no-c-format msgid "Apply variable expansion when loops are unrolled." msgstr "" -#: common.opt:2603 +#: common.opt:2607 #, fuzzy, no-c-format #| msgid "Insert stack checking code into the program" msgid "-fstack-check=[no|generic|specific]\tInsert stack checking code into the program." msgstr "Уключаць код правэркі стэку ў праграму" -#: common.opt:2607 +#: common.opt:2611 #, fuzzy, no-c-format #| msgid "Insert stack checking code into the program" msgid "Insert stack checking code into the program. Same as -fstack-check=specific." msgstr "Уключаць код правэркі стэку ў праграму" -#: common.opt:2611 +#: common.opt:2615 #, no-c-format msgid "Insert code to probe each page of stack space as it is allocated to protect from stack-clash style attacks." msgstr "" -#: common.opt:2619 +#: common.opt:2623 #, no-c-format msgid "-fstack-limit-register=\tTrap if the stack goes past ." msgstr "" -#: common.opt:2623 +#: common.opt:2627 #, no-c-format msgid "-fstack-limit-symbol=\tTrap if the stack goes past symbol ." msgstr "" -#: common.opt:2627 +#: common.opt:2631 #, no-c-format msgid "Use propolice as a stack protection method." msgstr "" -#: common.opt:2631 +#: common.opt:2635 #, no-c-format msgid "Use a stack protection method for every function." msgstr "" -#: common.opt:2635 +#: common.opt:2639 #, no-c-format msgid "Use a smart stack protection method for certain functions." msgstr "" -#: common.opt:2639 +#: common.opt:2643 #, no-c-format msgid "Use stack protection method only for functions with the stack_protect attribute." msgstr "" -#: common.opt:2643 +#: common.opt:2647 #, no-c-format msgid "Output stack usage information on a per-function basis." msgstr "" -#: common.opt:2655 +#: common.opt:2659 #, no-c-format msgid "Assume strict aliasing rules apply." msgstr "" -#: common.opt:2659 +#: common.opt:2663 #, no-c-format msgid "Treat signed overflow as undefined. Negated as -fwrapv -fwrapv-pointer." msgstr "" -#: common.opt:2663 +#: common.opt:2667 #, no-c-format msgid "Implement __atomic operations via libcalls to legacy __sync functions." msgstr "" -#: common.opt:2667 +#: common.opt:2671 #, no-c-format msgid "Check for syntax errors, then stop." msgstr "" -#: common.opt:2671 +#: common.opt:2675 #, no-c-format msgid "Create data files needed by \"gcov\"." msgstr "" -#: common.opt:2675 +#: common.opt:2679 #, no-c-format msgid "Perform jump threading optimizations." msgstr "" -#: common.opt:2679 +#: common.opt:2683 #, no-c-format msgid "Report the time taken by each compiler pass." msgstr "" -#: common.opt:2683 +#: common.opt:2687 #, no-c-format msgid "Record times taken by sub-phases separately." msgstr "" -#: common.opt:2687 +#: common.opt:2691 #, no-c-format msgid "-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec]\tSet the default thread-local storage code generation model." msgstr "" -#: common.opt:2706 +#: common.opt:2710 #, no-c-format msgid "Reorder top level functions, variables, and asms." msgstr "" -#: common.opt:2710 +#: common.opt:2714 #, no-c-format msgid "Perform superblock formation via tail duplication." msgstr "" -#: common.opt:2714 +#: common.opt:2718 #, no-c-format msgid "For targets that normally need trampolines for nested functions, always generate them instead of using descriptors." msgstr "" -#: common.opt:2722 +#: common.opt:2726 #, no-c-format msgid "Assume floating-point operations can trap." msgstr "" -#: common.opt:2726 +#: common.opt:2730 #, no-c-format msgid "Trap for signed overflow in addition, subtraction and multiplication." msgstr "" -#: common.opt:2730 +#: common.opt:2734 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable SSA-CCP optimization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2734 +#: common.opt:2738 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable SSA-BIT-CCP optimization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2742 +#: common.opt:2746 #, no-c-format msgid "Enable loop header copying on trees." msgstr "" -#: common.opt:2750 +#: common.opt:2754 #, no-c-format msgid "Enable SSA coalescing of user variables." msgstr "" -#: common.opt:2758 +#: common.opt:2762 #, no-c-format msgid "Enable copy propagation on trees." msgstr "" -#: common.opt:2766 +#: common.opt:2770 #, no-c-format msgid "Transform condition stores into unconditional ones." msgstr "" -#: common.opt:2770 +#: common.opt:2774 #, no-c-format msgid "Perform conversions of switch initializations." msgstr "" -#: common.opt:2774 +#: common.opt:2778 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable SSA dead code elimination optimization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2778 +#: common.opt:2782 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable dominator optimizations." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2782 +#: common.opt:2786 #, no-c-format msgid "Enable tail merging on trees." msgstr "" -#: common.opt:2786 +#: common.opt:2790 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable dead store elimination." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2790 +#: common.opt:2794 #, no-c-format msgid "Enable forward propagation on trees." msgstr "" -#: common.opt:2794 +#: common.opt:2798 #, no-c-format msgid "Enable Full Redundancy Elimination (FRE) on trees." msgstr "" -#: common.opt:2798 +#: common.opt:2802 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable string length optimizations on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2802 +#: common.opt:2806 #, no-c-format msgid "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." msgstr "" -#: common.opt:2808 +#: common.opt:2812 #, no-c-format msgid "Detect paths that trigger erroneous or undefined behavior due to a null value being used in a way forbidden by a returns_nonnull or nonnull attribute. Isolate those paths from the main control flow and turn the statement with erroneous or undefined behavior into a trap." msgstr "" -#: common.opt:2815 +#: common.opt:2819 #, no-c-format msgid "Enable loop distribution on trees." msgstr "" -#: common.opt:2819 +#: common.opt:2823 #, no-c-format msgid "Enable loop distribution for patterns transformed into a library call." msgstr "" -#: common.opt:2823 +#: common.opt:2827 #, no-c-format msgid "Enable loop invariant motion on trees." msgstr "" -#: common.opt:2831 +#: common.opt:2835 #, no-c-format msgid "Create canonical induction variables in loops." msgstr "" -#: common.opt:2835 +#: common.opt:2839 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable loop optimizations on tree level." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2839 +#: common.opt:2843 #, no-c-format msgid "-ftree-parallelize-loops=\tEnable automatic parallelization of loops." msgstr "" -#: common.opt:2843 +#: common.opt:2847 #, no-c-format msgid "Enable hoisting loads from conditional pointers." msgstr "" -#: common.opt:2847 +#: common.opt:2851 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable SSA-PRE optimization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2851 +#: common.opt:2855 #, no-c-format msgid "In SSA-PRE optimization on trees, enable partial-partial redundancy elimination." msgstr "" -#: common.opt:2855 +#: common.opt:2859 #, no-c-format msgid "Perform function-local points-to analysis on trees." msgstr "" -#: common.opt:2859 +#: common.opt:2863 #, no-c-format msgid "Enable reassociation on tree level." msgstr "" -#: common.opt:2867 +#: common.opt:2871 #, no-c-format msgid "Enable SSA code sinking on trees." msgstr "" -#: common.opt:2871 +#: common.opt:2875 #, no-c-format msgid "Perform straight-line strength reduction." msgstr "" -#: common.opt:2875 +#: common.opt:2879 #, no-c-format msgid "Perform scalar replacement of aggregates." msgstr "" -#: common.opt:2879 +#: common.opt:2883 #, no-c-format msgid "Replace temporary expressions in the SSA->normal pass." msgstr "" -#: common.opt:2883 +#: common.opt:2887 #, no-c-format msgid "Perform live range splitting during the SSA->normal pass." msgstr "" -#: common.opt:2887 +#: common.opt:2891 #, no-c-format msgid "Perform Value Range Propagation on trees." msgstr "" -#: common.opt:2891 +#: common.opt:2895 #, no-c-format msgid "Split paths leading to loop backedges." msgstr "" -#: common.opt:2895 +#: common.opt:2899 #, no-c-format msgid "Assume common declarations may be overridden with ones with a larger trailing array." msgstr "" -#: common.opt:2900 +#: common.opt:2904 #, no-c-format msgid "Compile whole compilation unit at a time." msgstr "" -#: common.opt:2904 +#: common.opt:2908 #, no-c-format msgid "Perform loop unrolling when iteration count is known." msgstr "" -#: common.opt:2908 +#: common.opt:2912 #, no-c-format msgid "Perform loop unrolling for all loops." msgstr "" -#: common.opt:2923 +#: common.opt:2927 #, no-c-format msgid "Allow optimization for floating-point arithmetic which may change the result of the operation due to rounding." msgstr "" -#: common.opt:2928 +#: common.opt:2932 #, no-c-format msgid "Same as -fassociative-math for expressions which include division." msgstr "" -#: common.opt:2936 +#: common.opt:2940 #, no-c-format msgid "Allow math optimizations that may violate IEEE or ISO standards." msgstr "" -#: common.opt:2940 +#: common.opt:2944 #, no-c-format msgid "Perform loop unswitching." msgstr "" -#: common.opt:2944 +#: common.opt:2948 #, no-c-format msgid "Perform loop splitting." msgstr "" -#: common.opt:2948 +#: common.opt:2952 #, no-c-format msgid "Version loops based on whether indices have a stride of one." msgstr "" -#: common.opt:2952 +#: common.opt:2956 #, fuzzy, no-c-format #| msgid "Enable exception handling" msgid "Just generate unwind tables for exception handling." msgstr "Уключыць апрацоўку выключэньняў" -#: common.opt:2956 +#: common.opt:2960 #, no-c-format msgid "Use the bfd linker instead of the default linker." msgstr "" -#: common.opt:2960 +#: common.opt:2964 #, no-c-format msgid "Use the gold linker instead of the default linker." msgstr "" -#: common.opt:2964 +#: common.opt:2968 #, no-c-format msgid "Use the lld LLVM linker instead of the default linker." msgstr "" -#: common.opt:2976 +#: common.opt:2980 #, no-c-format msgid "Perform variable tracking." msgstr "" -#: common.opt:2984 +#: common.opt:2988 #, no-c-format msgid "Perform variable tracking by annotating assignments." msgstr "" -#: common.opt:2990 +#: common.opt:2994 #, no-c-format msgid "Toggle -fvar-tracking-assignments." msgstr "" -#: common.opt:2998 +#: common.opt:3002 #, no-c-format msgid "Perform variable tracking and also tag variables that are uninitialized." msgstr "" -#: common.opt:3003 +#: common.opt:3007 #, no-c-format msgid "Enable vectorization on trees." msgstr "" -#: common.opt:3011 +#: common.opt:3015 #, fuzzy, no-c-format #| msgid "Enable SSA optimizations" msgid "Enable loop vectorization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:3015 +#: common.opt:3019 #, no-c-format msgid "Enable basic block vectorization (SLP) on trees." msgstr "" -#: common.opt:3019 +#: common.opt:3023 #, no-c-format msgid "-fvect-cost-model=[unlimited|dynamic|cheap|very-cheap]\tSpecifies the cost model for vectorization." msgstr "" -#: common.opt:3023 +#: common.opt:3027 #, no-c-format msgid "-fsimd-cost-model=[unlimited|dynamic|cheap|very-cheap]\tSpecifies the vectorization cost model for code marked with a simd directive." msgstr "" -#: common.opt:3042 +#: common.opt:3046 #, no-c-format msgid "Enables the dynamic vectorizer cost model. Preserved for backward compatibility." msgstr "" -#: common.opt:3050 +#: common.opt:3054 #, no-c-format msgid "Enable copy propagation of scalar-evolution information." msgstr "" -#: common.opt:3060 +#: common.opt:3064 #, no-c-format msgid "Add extra commentary to assembler output." msgstr "" -#: common.opt:3064 +#: common.opt:3068 #, no-c-format msgid "-fvisibility=[default|internal|hidden|protected]\tSet the default symbol visibility." msgstr "" -#: common.opt:3083 +#: common.opt:3087 #, no-c-format msgid "Validate vtable pointers before using them." msgstr "" -#: common.opt:3099 +#: common.opt:3103 #, no-c-format msgid "Output vtable verification counters." msgstr "" -#: common.opt:3103 +#: common.opt:3107 #, no-c-format msgid "Output vtable verification pointer sets information." msgstr "" -#: common.opt:3107 +#: common.opt:3111 #, no-c-format msgid "Use expression value profiles in optimizations." msgstr "" -#: common.opt:3111 +#: common.opt:3115 #, no-c-format msgid "Construct webs and split unrelated uses of single variable." msgstr "" -#: common.opt:3115 +#: common.opt:3119 #, no-c-format msgid "Enable conditional dead code elimination for builtin calls." msgstr "" -#: common.opt:3119 +#: common.opt:3123 #, no-c-format msgid "Perform whole program optimizations." msgstr "" -#: common.opt:3123 +#: common.opt:3127 #, no-c-format msgid "Assume pointer overflow wraps around." msgstr "" -#: common.opt:3127 +#: common.opt:3131 #, no-c-format msgid "Assume signed arithmetic overflow wraps around." msgstr "" -#: common.opt:3131 +#: common.opt:3135 #, no-c-format msgid "Put zero initialized data in the bss section." msgstr "" -#: common.opt:3135 +#: common.opt:3139 #, no-c-format msgid "Clear call-used registers upon function return." msgstr "" -#: common.opt:3139 +#: common.opt:3143 #, no-c-format msgid "Generate debug information in default format." msgstr "" -#: common.opt:3143 +#: common.opt:3147 #, no-c-format msgid "Assume assembler support for (DWARF2+) .loc directives." msgstr "" -#: common.opt:3147 +#: common.opt:3151 #, no-c-format msgid "Assume assembler support for view in (DWARF2+) .loc directives." msgstr "" -#: common.opt:3167 +#: common.opt:3171 #, no-c-format msgid "Record DW_AT_decl_column and DW_AT_call_column in DWARF." msgstr "" -#: common.opt:3171 +#: common.opt:3175 #, no-c-format msgid "Generate debug information in default version of DWARF format." msgstr "" -#: common.opt:3175 +#: common.opt:3179 #, no-c-format msgid "Generate debug information in DWARF v2 (or later) format." msgstr "" -#: common.opt:3179 +#: common.opt:3183 #, no-c-format msgid "Use 32-bit DWARF format when emitting DWARF debug information." msgstr "" -#: common.opt:3183 +#: common.opt:3187 #, no-c-format msgid "Use 64-bit DWARF format when emitting DWARF debug information." msgstr "" -#: common.opt:3187 +#: common.opt:3191 #, no-c-format msgid "Generate debug information in default extended format." msgstr "" -#: common.opt:3191 +#: common.opt:3195 #, no-c-format msgid "Generate extended entry point information for inlined functions." msgstr "" -#: common.opt:3195 +#: common.opt:3199 #, no-c-format msgid "Compute locview reset points based on insn length estimates." msgstr "" -#: common.opt:3203 +#: common.opt:3207 #, no-c-format msgid "Don't generate DWARF pubnames and pubtypes sections." msgstr "" -#: common.opt:3207 +#: common.opt:3211 #, no-c-format msgid "Generate DWARF pubnames and pubtypes sections." msgstr "" -#: common.opt:3211 +#: common.opt:3215 #, no-c-format msgid "Generate DWARF pubnames and pubtypes sections with GNU extensions." msgstr "" -#: common.opt:3215 +#: common.opt:3219 #, no-c-format msgid "Record gcc command line switches in DWARF DW_AT_producer." msgstr "" -#: common.opt:3219 +#: common.opt:3223 #, no-c-format msgid "Generate debug information in separate .dwo files." msgstr "" -#: common.opt:3223 +#: common.opt:3227 #, fuzzy, no-c-format msgid "Generate debug information in STABS format." msgstr "Стварыць код для DLL" -#: common.opt:3227 +#: common.opt:3231 #, no-c-format msgid "Generate debug information in extended STABS format." msgstr "" -#: common.opt:3231 +#: common.opt:3235 #, no-c-format msgid "Emit progressive recommended breakpoint locations." msgstr "" -#: common.opt:3235 +#: common.opt:3239 #, no-c-format msgid "Don't emit DWARF additions beyond selected version." msgstr "" -#: common.opt:3239 +#: common.opt:3243 #, no-c-format msgid "Add description attributes to some DWARF DIEs that have no name attribute." msgstr "" -#: common.opt:3243 +#: common.opt:3247 #, no-c-format msgid "Toggle debug information generation." msgstr "" -#: common.opt:3247 +#: common.opt:3251 #, no-c-format msgid "Augment variable location lists with progressive views." msgstr "" -#: common.opt:3254 +#: common.opt:3258 #, fuzzy, no-c-format msgid "Generate debug information in VMS format." msgstr "Стварыць код для DLL" -#: common.opt:3258 +#: common.opt:3262 #, no-c-format msgid "Generate debug information in XCOFF format." msgstr "" -#: common.opt:3262 +#: common.opt:3266 #, no-c-format msgid "Generate debug information in extended XCOFF format." msgstr "" -#: common.opt:3280 +#: common.opt:3284 #, no-c-format msgid "Generate compressed debug sections." msgstr "" -#: common.opt:3284 +#: common.opt:3288 #, no-c-format msgid "-gz=\tGenerate compressed debug sections in format ." msgstr "" -#: common.opt:3291 +#: common.opt:3295 #, no-c-format msgid "-iplugindir=\tSet to be the default plugin directory." msgstr "" -#: common.opt:3295 +#: common.opt:3299 #, no-c-format msgid "-imultiarch \tSet to be the multiarch include subdirectory." msgstr "" -#: common.opt:3320 +#: common.opt:3324 #, fuzzy, no-c-format #| msgid " -o Place the output into \n" msgid "-o \tPlace output into ." msgstr " -o <файл> Памясціць вывад у <файл>\n" -#: common.opt:3324 +#: common.opt:3328 #, fuzzy, no-c-format #| msgid "Enable exception handling" msgid "Enable function profiling." msgstr "Уключыць апрацоўку выключэньняў" -#: common.opt:3334 +#: common.opt:3338 #, no-c-format msgid "Like -pedantic but issue them as errors." msgstr "" -#: common.opt:3374 +#: common.opt:3378 #, no-c-format msgid "Do not display functions compiled or elapsed time." msgstr "" -#: common.opt:3406 +#: common.opt:3410 #, no-c-format msgid "Enable verbose output." msgstr "" -#: common.opt:3410 +#: common.opt:3414 #, no-c-format msgid "Display the compiler's version." msgstr "" -#: common.opt:3414 +#: common.opt:3418 #, no-c-format msgid "Suppress warnings." msgstr "" -#: common.opt:3424 +#: common.opt:3428 #, no-c-format msgid "Create a shared library." msgstr "" -#: common.opt:3472 +#: common.opt:3476 #, no-c-format msgid "Don't create a dynamically linked position independent executable." msgstr "" -#: common.opt:3476 +#: common.opt:3480 #, no-c-format msgid "Create a dynamically linked position independent executable." msgstr "" -#: common.opt:3480 +#: common.opt:3484 #, no-c-format msgid "Create a static position independent executable." msgstr "" -#: common.opt:3487 +#: common.opt:3491 #, no-c-format msgid "Use caller save register across calls if possible." msgstr "" @@ -19462,1105 +19462,1115 @@ msgstr "" #: params.opt:162 #, no-c-format +msgid "Maximum depth of logical expression evaluation ranger will look through when evaluating outgoing edge ranges." +msgstr "" + +#: params.opt:167 +#, no-c-format msgid "Maximum number of arguments a PHI may have before the FSM threader will not try to thread through its block." msgstr "" -#: params.opt:166 +#: params.opt:171 #, no-c-format msgid "Scale factor to apply to the number of blocks in a threading path when comparing to the number of (scaled) statements." msgstr "" -#: params.opt:170 +#: params.opt:175 #, no-c-format msgid "Scale factor to apply to the number of statements in a threading path when comparing to the number of (scaled) blocks." msgstr "" -#: params.opt:174 +#: params.opt:179 #, no-c-format msgid "The threshold ratio of critical edges execution count that permit performing redundancy elimination after reload." msgstr "" -#: params.opt:178 +#: params.opt:183 #, no-c-format msgid "The threshold ratio for performing partial redundancy elimination after reload." msgstr "" -#: params.opt:182 +#: params.opt:187 #, no-c-format msgid "Scaling factor in calculation of maximum distance an expression can be moved by GCSE optimizations." msgstr "" -#: params.opt:186 +#: params.opt:191 #, no-c-format msgid "Cost at which GCSE optimizations will not constraint the distance an expression can travel." msgstr "" -#: params.opt:190 +#: params.opt:195 #, no-c-format msgid "Minimum heap expansion to trigger garbage collection, as a percentage of the total size of the heap." msgstr "" -#: params.opt:194 +#: params.opt:199 #, no-c-format msgid "Minimum heap size before we start collecting garbage, in kilobytes." msgstr "" -#: params.opt:198 +#: params.opt:203 #, no-c-format msgid "The number of executions of a basic block which is considered hot. The parameter is used only in GIMPLE FE." msgstr "" -#: params.opt:202 +#: params.opt:207 #, no-c-format msgid "Whether codegen errors should be ICEs when -fchecking." msgstr "" -#: params.opt:206 +#: params.opt:211 #, no-c-format msgid "Maximum number of arrays per SCoP." msgstr "" -#: params.opt:210 +#: params.opt:215 #, no-c-format msgid "Maximum number of parameters in a SCoP." msgstr "" -#: params.opt:214 +#: params.opt:219 #, no-c-format msgid "The number of elements for which hash table verification is done for each searched element." msgstr "" -#: params.opt:218 +#: params.opt:223 #, no-c-format msgid "The denominator n of fraction 1/n of the maximal execution count of a basic block in the entire program that a basic block needs to at least have in order to be considered hot (used in non-LTO mode)." msgstr "" -#: params.opt:222 +#: params.opt:227 #, no-c-format msgid "The number of most executed permilles of the profiled execution of the entire program to which the execution count of a basic block must be part of in order to be considered hot (used in LTO mode)." msgstr "" -#: params.opt:226 +#: params.opt:231 #, no-c-format msgid "The denominator n of fraction 1/n of the execution frequency of the entry block of a function that a basic block of this function needs to at least have in order to be considered hot." msgstr "" -#: params.opt:230 +#: params.opt:235 #, no-c-format msgid "The scale (in percents) applied to inline-insns-single and auto limits when heuristics hints that inlining is very profitable." msgstr "" -#: params.opt:234 +#: params.opt:239 #, no-c-format msgid "The minimal estimated speedup allowing inliner to ignore inline-insns-single and inline-insns-auto." msgstr "" -#: params.opt:238 +#: params.opt:243 #, no-c-format msgid "How much can given compilation unit grow because of the inlining (in percent)." msgstr "" -#: params.opt:242 +#: params.opt:247 #, no-c-format msgid "The upper bound for sharing integer constants." msgstr "" -#: params.opt:246 +#: params.opt:251 #, no-c-format msgid "Threshold ipa-cp opportunity evaluation that is still considered beneficial to clone." msgstr "" -#: params.opt:250 +#: params.opt:255 #, no-c-format msgid "Compile-time bonus IPA-CP assigns to candidates which make loop bounds or strides known." msgstr "" -#: params.opt:254 +#: params.opt:259 #, no-c-format msgid "Maximum depth of recursive cloning for self-recursive function." msgstr "" -#: params.opt:258 +#: params.opt:263 #, no-c-format msgid "Recursive cloning only when the probability of call being executed exceeds the parameter." msgstr "" -#: params.opt:262 +#: params.opt:267 #, no-c-format msgid "Percentage penalty the recursive functions will receive when they are evaluated for cloning." msgstr "" -#: params.opt:266 +#: params.opt:271 #, no-c-format msgid "Percentage penalty functions containing a single call to another function will receive when they are evaluated for cloning." msgstr "" -#: params.opt:270 +#: params.opt:275 #, no-c-format msgid "How much can given compilation unit grow because of the interprocedural constant propagation (in percent)." msgstr "" -#: params.opt:274 +#: params.opt:279 #, no-c-format msgid "The size of translation unit that IPA-CP pass considers large." msgstr "" -#: params.opt:278 +#: params.opt:283 #, no-c-format msgid "Maximum size of a list of values associated with each parameter for interprocedural constant propagation." msgstr "" -#: params.opt:282 +#: params.opt:287 #, no-c-format msgid "Maximum number of statements visited during jump function offset discovery." msgstr "" -#: params.opt:286 +#: params.opt:291 #, no-c-format msgid "Maximum number of statements that will be visited by IPA formal parameter analysis based on alias analysis in any given function." msgstr "" -#: params.opt:290 +#: params.opt:295 #, no-c-format msgid "Maximum number of aggregate content items for a parameter in jump functions and lattices." msgstr "" -#: params.opt:294 +#: params.opt:299 #, no-c-format msgid "Maximum number of operations in a parameter expression that can be handled by IPA analysis." msgstr "" -#: params.opt:298 +#: params.opt:303 #, no-c-format msgid "Maximum number of different predicates used to track properties of loops in IPA analysis." msgstr "" -#: params.opt:302 +#: params.opt:307 #, no-c-format msgid "Maximal number of boundary endpoints of case ranges of switch statement used during IPA function summary generation." msgstr "" -#: params.opt:306 +#: params.opt:311 #, no-c-format msgid "Maximum pieces that IPA-SRA tracks per formal parameter, as a consequence, also the maximum number of replacements of a formal parameter." msgstr "" -#: params.opt:310 +#: params.opt:315 #, no-c-format msgid "Maximum allowed growth of number and total size of new parameters that ipa-sra replaces a pointer to an aggregate with." msgstr "" -#: params.opt:314 +#: params.opt:319 #, no-c-format msgid "The number of registers in each class kept unused by loop invariant motion." msgstr "" -#: params.opt:318 +#: params.opt:323 #, no-c-format msgid "Max size of conflict table in MB." msgstr "" -#: params.opt:322 +#: params.opt:327 #, no-c-format msgid "Max loops number for regional RA." msgstr "" -#: params.opt:326 +#: params.opt:331 #, no-c-format msgid "If number of candidates in the set is smaller, we always try to remove unused ivs during its optimization." msgstr "" -#: params.opt:330 +#: params.opt:335 #, no-c-format msgid "Bound on number of candidates below that all candidates are considered in iv optimizations." msgstr "" -#: params.opt:334 +#: params.opt:339 #, no-c-format msgid "Bound on number of iv uses in loop optimized in iv optimizations." msgstr "" -#: params.opt:338 +#: params.opt:343 #, no-c-format msgid "The maximum code size growth ratio when expanding into a jump table (in percent). The parameter is used when optimizing for size." msgstr "" -#: params.opt:342 +#: params.opt:347 #, no-c-format msgid "The maximum code size growth ratio when expanding into a jump table (in percent). The parameter is used when optimizing for speed." msgstr "" -#: params.opt:346 +#: params.opt:351 #, no-c-format msgid "The size of L1 cache line." msgstr "" -#: params.opt:350 +#: params.opt:355 #, no-c-format msgid "The size of L1 cache." msgstr "" -#: params.opt:354 +#: params.opt:359 #, no-c-format msgid "The size of L2 cache." msgstr "" -#: params.opt:358 +#: params.opt:363 #, no-c-format msgid "Maximal growth due to inlining of large function (in percent)." msgstr "" -#: params.opt:362 +#: params.opt:367 #, no-c-format msgid "The size of function body to be considered large." msgstr "" -#: params.opt:366 +#: params.opt:371 #, no-c-format msgid "The size of stack frame to be considered large." msgstr "" -#: params.opt:370 +#: params.opt:375 #, no-c-format msgid "Maximal stack frame growth due to inlining (in percent)." msgstr "" -#: params.opt:374 +#: params.opt:379 #, no-c-format msgid "The size of translation unit to be considered large." msgstr "" -#: params.opt:378 +#: params.opt:383 #, no-c-format msgid "Maximum number of concurrently open C++ module files when lazy loading." msgstr "" -#: params.opt:382 +#: params.opt:387 #, no-c-format msgid "The minimum cost of an expensive expression in the loop invariant motion." msgstr "" -#: params.opt:386 +#: params.opt:391 #, no-c-format msgid "True if a non-short-circuit operation is optimal." msgstr "" -#: params.opt:390 +#: params.opt:395 #, no-c-format msgid "Size of tiles for loop blocking." msgstr "" -#: params.opt:394 +#: params.opt:399 #, no-c-format msgid "The maximum number of stmts in loop nest for loop interchange." msgstr "" -#: params.opt:398 +#: params.opt:403 #, no-c-format msgid "The minimum stride ratio for loop interchange to be profitable." msgstr "" -#: params.opt:402 +#: params.opt:407 #, no-c-format msgid "Max basic blocks number in loop for loop invariant motion." msgstr "" -#: params.opt:406 +#: params.opt:411 #, no-c-format msgid "Maximum number of datarefs in loop for building loop data dependencies." msgstr "" -#: params.opt:410 +#: params.opt:415 #, no-c-format msgid "The maximum number of instructions in an inner loop that is being considered for versioning." msgstr "" -#: params.opt:414 +#: params.opt:419 #, no-c-format msgid "The maximum number of instructions in an outer loop that is being considered for versioning, on top of the instructions in inner loops." msgstr "" -#: params.opt:418 +#: params.opt:423 #, no-c-format msgid "Minimal fall-through edge probability in percentage used to add BB to inheritance EBB in LRA." msgstr "" -#: params.opt:422 +#: params.opt:427 #, no-c-format msgid "The max number of reload pseudos which are considered during spilling a non-reload pseudo." msgstr "" -#: params.opt:426 +#: params.opt:431 #, no-c-format msgid "Maximal size of a partition for LTO (in estimated instructions)." msgstr "" -#: params.opt:430 +#: params.opt:435 #, no-c-format msgid "maximal number of LTO partitions streamed in parallel." msgstr "" -#: params.opt:434 +#: params.opt:439 #, no-c-format msgid "Minimal size of a partition for LTO (in estimated instructions)." msgstr "" -#: params.opt:438 +#: params.opt:443 #, no-c-format msgid "Number of partitions the program should be split to." msgstr "" -#: params.opt:442 +#: params.opt:447 #, no-c-format msgid "The maximum number of instructions to consider to unroll in a loop on average." msgstr "" -#: params.opt:446 +#: params.opt:451 #, no-c-format msgid "The maximum number of insns combine tries to combine." msgstr "" -#: params.opt:450 +#: params.opt:455 #, no-c-format msgid "The maximum depth of a loop nest we completely peel." msgstr "" -#: params.opt:454 +#: params.opt:459 #, no-c-format msgid "The maximum number of peelings of a single loop that is peeled completely." msgstr "" -#: params.opt:458 +#: params.opt:463 #, no-c-format msgid "The maximum number of insns of a completely peeled loop." msgstr "" -#: params.opt:462 +#: params.opt:467 #, no-c-format msgid "The maximum number of incoming edges to consider for crossjumping." msgstr "" -#: params.opt:466 +#: params.opt:471 #, no-c-format msgid "The maximum instructions CSE process before flushing." msgstr "" -#: params.opt:470 +#: params.opt:475 #, no-c-format msgid "The maximum length of path considered in cse." msgstr "" -#: params.opt:474 +#: params.opt:479 #, no-c-format msgid "The maximum memory locations recorded by cselib." msgstr "" -#: params.opt:478 +#: params.opt:483 #, no-c-format msgid "Max. count of debug markers to expand or inline." msgstr "" -#: params.opt:482 +#: params.opt:487 #, no-c-format msgid "The maximum number of instructions to consider to fill a delay slot." msgstr "" -#: params.opt:486 +#: params.opt:491 #, no-c-format msgid "The maximum number of instructions to consider to find accurate live register information." msgstr "" -#: params.opt:490 +#: params.opt:495 #, no-c-format msgid "Maximum number of active local stores in RTL dead store elimination." msgstr "" -#: params.opt:494 +#: params.opt:499 #, no-c-format msgid "The maximum number of nested indirect inlining performed by early inliner." msgstr "" -#: params.opt:498 +#: params.opt:503 #, no-c-format msgid "Maximum number of fields in a structure before pointer analysis treats the structure as a single variable." msgstr "" -#: params.opt:502 +#: params.opt:507 #, no-c-format msgid "Maximum number of basic blocks on a finite state automaton jump thread path." msgstr "" -#: params.opt:506 +#: params.opt:511 #, no-c-format msgid "Maximum number of instructions to copy when duplicating blocks on a finite state automaton jump thread path." msgstr "" -#: params.opt:510 +#: params.opt:515 #, no-c-format msgid "Maximum number of new jump thread paths to create for a finite state automaton." msgstr "" -#: params.opt:514 +#: params.opt:519 #, no-c-format msgid "The maximum ratio of insertions to deletions of expressions in GCSE." msgstr "" -#: params.opt:518 +#: params.opt:523 #, no-c-format msgid "The maximum amount of memory to be allocated by GCSE, in kilobytes." msgstr "" -#: params.opt:522 +#: params.opt:527 #, no-c-format msgid "The maximum number of insns to duplicate when unfactoring computed gotos." msgstr "" -#: params.opt:526 +#: params.opt:531 #, no-c-format msgid "The maximum expansion factor when copying basic blocks." msgstr "" -#: params.opt:530 +#: params.opt:535 #, no-c-format msgid "Maximum depth of search in the dominator tree for expressions to hoist." msgstr "" -#: params.opt:534 +#: params.opt:539 #, no-c-format msgid "The maximum number of instructions when automatically inlining." msgstr "" -#: params.opt:538 +#: params.opt:543 #, no-c-format msgid "The maximum number of instructions inline function can grow to via recursive inlining." msgstr "" -#: params.opt:542 +#: params.opt:547 #, no-c-format msgid "The maximum number of instructions non-inline function can grow to via recursive inlining." msgstr "" -#: params.opt:546 +#: params.opt:551 #, no-c-format msgid "The maximum number of instructions in a single function eligible for inlining." msgstr "" -#: params.opt:550 +#: params.opt:555 #, no-c-format msgid "The maximum number of instructions when inlining for size." msgstr "" -#: params.opt:554 +#: params.opt:559 #, no-c-format msgid "The maximum number of instructions when automatically inlining small functions." msgstr "" -#: params.opt:558 +#: params.opt:563 #, no-c-format msgid "The maximum depth of recursive inlining for inline functions." msgstr "" -#: params.opt:562 +#: params.opt:567 #, no-c-format msgid "The maximum depth of recursive inlining for non-inline functions." msgstr "" -#: params.opt:566 +#: params.opt:571 #, no-c-format msgid "Maximum number of isl operations, 0 means unlimited." msgstr "" -#: params.opt:570 +#: params.opt:575 #, no-c-format msgid "Bound on the cost of an expression to compute the number of iterations." msgstr "" -#: params.opt:574 +#: params.opt:579 #, no-c-format msgid "Bound on the number of iterations the brute force # of iterations analysis algorithm evaluates." msgstr "" -#: params.opt:578 +#: params.opt:583 #, no-c-format msgid "Maximum number of statements allowed in a block that needs to be duplicated when threading jumps." msgstr "" -#: params.opt:582 +#: params.opt:587 #, no-c-format msgid "The maximum number of RTL nodes that can be recorded as combiner's last value." msgstr "" -#: params.opt:586 +#: params.opt:591 #, no-c-format msgid "The maximum number of insns in loop header duplicated by the copy loop headers pass." msgstr "" -#: params.opt:590 +#: params.opt:595 #, no-c-format msgid "The maximum number of backtrack attempts the scheduler should make when modulo scheduling a loop." msgstr "" -#: params.opt:594 +#: params.opt:599 #, no-c-format msgid "Maximum length of partial antic set when performing tree pre optimization." msgstr "" -#: params.opt:598 +#: params.opt:603 #, no-c-format msgid "The maximum number of branches on the path through the peeled sequence." msgstr "" -#: params.opt:602 +#: params.opt:607 #, no-c-format msgid "The maximum number of peelings of a single loop." msgstr "" -#: params.opt:606 +#: params.opt:611 #, no-c-format msgid "The maximum number of insns of a peeled loop." msgstr "" -#: params.opt:610 +#: params.opt:615 #, no-c-format msgid "The maximum length of scheduling's pending operations list." msgstr "" -#: params.opt:614 params.opt:658 +#: params.opt:619 params.opt:663 #, no-c-format msgid "The maximum number of blocks in a region to be considered for interblock scheduling." msgstr "" -#: params.opt:618 params.opt:662 +#: params.opt:623 params.opt:667 #, no-c-format msgid "The maximum number of insns in a region to be considered for interblock scheduling." msgstr "" -#: params.opt:622 +#: params.opt:627 #, no-c-format msgid "Maximum depth of sqrt chains to use when synthesizing exponentiation by a real constant." msgstr "" -#: params.opt:626 +#: params.opt:631 #, no-c-format msgid "The maximum number of loop iterations we predict statically." msgstr "" -#: params.opt:630 +#: params.opt:635 #, no-c-format msgid "The maximum number of instructions to search backward when looking for equivalent reload." msgstr "" -#: params.opt:634 +#: params.opt:639 #, no-c-format msgid "Maximum number of insns in a basic block to consider for RTL if-conversion." msgstr "" -#: params.opt:638 +#: params.opt:643 #, no-c-format msgid "Maximum permissible cost for the sequence that would be generated by the RTL if-conversion pass for a branch that is considered predictable." msgstr "" -#: params.opt:642 +#: params.opt:647 #, no-c-format msgid "Maximum permissible cost for the sequence that would be generated by the RTL if-conversion pass for a branch that is considered unpredictable." msgstr "" -#: params.opt:646 +#: params.opt:651 #, no-c-format msgid "The maximum number of iterations through CFG to extend regions." msgstr "" -#: params.opt:650 +#: params.opt:655 #, no-c-format msgid "The maximum conflict delay for an insn to be considered for speculative motion." msgstr "" -#: params.opt:654 +#: params.opt:659 #, no-c-format msgid "The maximum number of instructions ready to be issued to be considered by the scheduler during the first scheduling pass." msgstr "" -#: params.opt:666 +#: params.opt:671 #, no-c-format msgid "Maximum length of candidate scans for straight-line strength reduction." msgstr "" -#: params.opt:670 +#: params.opt:675 #, no-c-format msgid "Maximum number of may-defs visited when devirtualizing speculatively." msgstr "" -#: params.opt:674 +#: params.opt:679 #, no-c-format msgid "Maximum recursion depth allowed when querying a property of an SSA name." msgstr "" -#: params.opt:678 +#: params.opt:683 #, no-c-format msgid "Maximum number of constant stores to merge in the store merging pass." msgstr "" -#: params.opt:682 +#: params.opt:687 #, no-c-format msgid "Maximum number of conditional store pairs that can be sunk." msgstr "" -#: params.opt:686 params.opt:690 +#: params.opt:691 params.opt:695 #, no-c-format msgid "Maximum number of store chains to track at the same time in the store merging pass." msgstr "" -#: params.opt:694 +#: params.opt:699 #, no-c-format msgid "Maximum amount of similar bbs to compare a bb with." msgstr "" -#: params.opt:698 +#: params.opt:703 #, no-c-format msgid "Maximum amount of iterations of the pass over a function." msgstr "" -#: params.opt:702 +#: params.opt:707 #, no-c-format msgid "Maximum number of strings for which strlen optimization pass will track string lengths." msgstr "" -#: params.opt:706 +#: params.opt:711 #, no-c-format msgid "Maximum number of arguments in a PHI supported by TREE if-conversion unless the loop is marked with simd pragma." msgstr "" -#: params.opt:710 +#: params.opt:715 #, no-c-format msgid "The maximum number of unrollings of a single loop." msgstr "" -#: params.opt:714 +#: params.opt:719 #, no-c-format msgid "The maximum number of instructions to consider to unroll in a loop." msgstr "" -#: params.opt:718 +#: params.opt:723 #, no-c-format msgid "The maximum number of insns of an unswitched loop." msgstr "" -#: params.opt:722 +#: params.opt:727 #, no-c-format msgid "The maximum number of unswitchings in a single loop." msgstr "" -#: params.opt:726 +#: params.opt:731 #, no-c-format msgid "If -fvariable-expansion-in-unroller is used, the maximum number of times that an individual variable will be expanded during loop unrolling." msgstr "" -#: params.opt:730 +#: params.opt:735 #, no-c-format msgid "Max. recursion depth for expanding var tracking expressions." msgstr "" -#: params.opt:734 +#: params.opt:739 #, no-c-format msgid "Max. size of loc list for which reverse ops should be added." msgstr "" -#: params.opt:738 +#: params.opt:743 #, no-c-format msgid "Max. size of var tracking hash tables." msgstr "" -#: params.opt:742 +#: params.opt:747 #, no-c-format msgid "Maximum number of VALUEs handled during a single find_base_term call." msgstr "" -#: params.opt:746 +#: params.opt:751 #, no-c-format msgid "Maximum number of assertions to add along the default edge of a switch statement during VRP." msgstr "" -#: params.opt:750 +#: params.opt:755 #, no-c-format msgid "The minimum number of matching instructions to consider for crossjumping." msgstr "" -#: params.opt:754 +#: params.opt:759 #, no-c-format msgid "Inline recursively only when the probability of call being executed exceeds the parameter." msgstr "" -#: params.opt:758 +#: params.opt:763 #, no-c-format msgid "Min. ratio of insns to prefetches to enable prefetching for a loop with an unknown trip count." msgstr "" -#: params.opt:762 +#: params.opt:767 #, no-c-format msgid "The minimum threshold for probability of semi-invariant condition statement to trigger loop split." msgstr "" -#: params.opt:766 +#: params.opt:771 #, no-c-format msgid "The minimum UID to be used for a nondebug insn." msgstr "" -#: params.opt:770 +#: params.opt:775 #, no-c-format msgid "The minimum size of variables taking part in stack slot sharing when not optimizing." msgstr "" -#: params.opt:774 +#: params.opt:779 #, no-c-format msgid "The minimum probability of reaching a source block for interblock speculative scheduling." msgstr "" -#: params.opt:778 +#: params.opt:783 #, no-c-format msgid "If -ftree-vectorize is used, the minimal loop bound of a loop to be considered for vectorization." msgstr "" -#: params.opt:782 +#: params.opt:787 +#, no-c-format +msgid "--param=openacc-kernels=[decompose|parloops]\tSpecify mode of OpenACC 'kernels' constructs handling." +msgstr "" + +#: params.opt:800 #, no-c-format msgid "Chunk size of omp schedule for loops parallelized by parloops." msgstr "" -#: params.opt:786 +#: params.opt:804 #, no-c-format msgid "Minimum number of iterations per thread of an innermost parallelized loop." msgstr "" -#: params.opt:790 +#: params.opt:808 #, no-c-format msgid "--param=parloops-schedule=[static|dynamic|guided|auto|runtime]\tSchedule type of omp schedule for loops parallelized by parloops." msgstr "" -#: params.opt:812 +#: params.opt:830 #, no-c-format msgid "Maximum probability of the entry BB of split region (in percent relative to entry BB of the function) to make partial inlining happen." msgstr "" -#: params.opt:816 +#: params.opt:834 #, no-c-format msgid "Maximal estimated outcome of branch considered predictable." msgstr "" -#: params.opt:820 +#: params.opt:838 #, no-c-format msgid "Whether software prefetch hints should be issued for non-constant strides." msgstr "" -#: params.opt:824 +#: params.opt:842 #, no-c-format msgid "The number of insns executed before prefetch is completed." msgstr "" -#: params.opt:828 +#: params.opt:846 #, no-c-format msgid "Min. ratio of insns to mem ops to enable prefetching in a loop." msgstr "" -#: params.opt:832 +#: params.opt:850 #, no-c-format msgid "The minimum constant stride beyond which we should use prefetch hints for." msgstr "" -#: params.opt:836 +#: params.opt:854 #, no-c-format msgid "Use internal function id in profile lookup." msgstr "" -#: params.opt:840 +#: params.opt:858 #, no-c-format msgid "Maximum depth of a loop nest to fully value-number optimistically." msgstr "" -#: params.opt:844 +#: params.opt:862 #, no-c-format msgid "Maximum number of disambiguations to perform per memory access." msgstr "" -#: params.opt:848 +#: params.opt:866 #, no-c-format msgid "Bound on the complexity of the expressions in the scalar evolutions analyzer." msgstr "" -#: params.opt:852 +#: params.opt:870 #, no-c-format msgid "Bound on size of expressions used in the scalar evolutions analyzer." msgstr "" -#: params.opt:856 +#: params.opt:874 #, no-c-format msgid "Hardware autoprefetcher scheduler model control flag. Number of lookahead cycles the model looks into, at '0' only enable instruction sorting heuristic. Disabled by default." msgstr "" -#: params.opt:860 +#: params.opt:878 #, no-c-format msgid "Minimal distance between possibly conflicting store and load." msgstr "" -#: params.opt:864 +#: params.opt:882 #, no-c-format msgid "Which -fsched-pressure algorithm to apply." msgstr "" -#: params.opt:868 +#: params.opt:886 #, no-c-format msgid "The minimal probability of speculation success (in percents), so that speculative insn will be scheduled." msgstr "" -#: params.opt:872 +#: params.opt:890 #, no-c-format msgid "The minimum probability an edge must have for the scheduler to save its state across it." msgstr "" -#: params.opt:876 +#: params.opt:894 #, no-c-format msgid "Maximum number of instructions in the ready list that are considered eligible for renaming." msgstr "" -#: params.opt:880 +#: params.opt:898 #, no-c-format msgid "The maximum size of the lookahead window of selective scheduling." msgstr "" -#: params.opt:884 +#: params.opt:902 #, no-c-format msgid "Maximum number of times that an insn could be scheduled." msgstr "" -#: params.opt:888 +#: params.opt:906 #, no-c-format msgid "The number of prefetches that can run at the same time." msgstr "" -#: params.opt:892 +#: params.opt:910 #, no-c-format msgid "Target block's relative execution frequency (as a percentage) required to sink a statement." msgstr "" -#: params.opt:896 +#: params.opt:914 #, no-c-format msgid "The number of cycles the swing modulo scheduler considers when checking conflicts using DFA." msgstr "" -#: params.opt:900 +#: params.opt:918 #, no-c-format msgid "A threshold on the average loop count considered by the swing modulo scheduler." msgstr "" -#: params.opt:904 +#: params.opt:922 #, no-c-format msgid "A factor for tuning the upper bound that swing modulo scheduler uses for scheduling a loop." msgstr "" -#: params.opt:908 +#: params.opt:926 #, no-c-format msgid "The minimum value of stage count that swing modulo scheduler will generate." msgstr "" -#: params.opt:912 +#: params.opt:930 #, no-c-format msgid "Maximum size, in storage units, of an aggregate which should be considered for scalarization when compiling for size." msgstr "" -#: params.opt:916 +#: params.opt:934 #, no-c-format msgid "Maximum size, in storage units, of an aggregate which should be considered for scalarization when compiling for speed." msgstr "" -#: params.opt:920 +#: params.opt:938 #, no-c-format msgid "Maximum number of artificial accesses to enable forward propagation that Scalar Replacement of Aggregates will keep for one local variable." msgstr "" -#: params.opt:924 +#: params.opt:942 #, no-c-format msgid "The maximum number of SSA_NAME assignments to follow in determining a value." msgstr "" -#: params.opt:928 +#: params.opt:946 #, no-c-format msgid "The lower bound for a buffer to be considered for stack smashing protection." msgstr "" -#: params.opt:932 +#: params.opt:950 #, no-c-format msgid "Size of the stack guard expressed as a power of two in bytes." msgstr "" -#: params.opt:936 +#: params.opt:954 #, no-c-format msgid "Interval in which to probe the stack expressed as a power of two in bytes." msgstr "" -#: params.opt:940 +#: params.opt:958 #, no-c-format msgid "Allow the store merging pass to introduce unaligned stores if it is legal to do so." msgstr "" -#: params.opt:944 +#: params.opt:962 #, no-c-format msgid "Maximum size of a single store merging region in bytes." msgstr "" -#: params.opt:948 +#: params.opt:966 #, no-c-format msgid "The maximum ratio between array size and switch branches for a switch conversion to take place." msgstr "" -#: params.opt:952 +#: params.opt:970 #, no-c-format msgid "Maximum number of bases stored in each modref tree." msgstr "" -#: params.opt:956 +#: params.opt:974 #, no-c-format msgid "Maximum number of references stored in each modref base." msgstr "" -#: params.opt:960 +#: params.opt:978 #, no-c-format msgid "Maximum number of accesses stored in each modref reference." msgstr "" -#: params.opt:964 +#: params.opt:982 #, no-c-format msgid "Maximum number of tests performed by modref query." msgstr "" -#: params.opt:968 +#: params.opt:986 #, no-c-format msgid "Maximum depth of DFS walk used by modref escape analysis." msgstr "" -#: params.opt:972 +#: params.opt:990 #, no-c-format msgid "Maximum number of escape points tracked by modref per SSA-name." msgstr "" -#: params.opt:976 +#: params.opt:994 #, no-c-format msgid "Size in bytes after which thread-local aggregates should be instrumented with the logging functions instead of save/restore pairs." msgstr "" -#: params.opt:980 +#: params.opt:998 #, no-c-format msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is not available." msgstr "" -#: params.opt:984 +#: params.opt:1002 #, no-c-format msgid "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available." msgstr "" -#: params.opt:988 +#: params.opt:1006 #, no-c-format msgid "Maximal code growth caused by tail duplication (in percent)." msgstr "" -#: params.opt:992 +#: params.opt:1010 #, no-c-format msgid "Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is not available." msgstr "" -#: params.opt:996 +#: params.opt:1014 #, no-c-format msgid "Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is available." msgstr "" -#: params.opt:1000 +#: params.opt:1018 #, no-c-format msgid "Stop reverse growth if the reverse probability of best edge is less than this threshold (in percent)." msgstr "" -#: params.opt:1004 +#: params.opt:1022 #, no-c-format msgid "Set the maximum number of instructions executed in parallel in reassociated tree. If 0, use the target dependent heuristic." msgstr "" -#: params.opt:1008 +#: params.opt:1026 #, no-c-format msgid "Emit special instrumentation for accesses to volatiles." msgstr "" -#: params.opt:1012 +#: params.opt:1030 #, no-c-format msgid "Emit instrumentation calls to __tsan_func_entry() and __tsan_func_exit()." msgstr "" -#: params.opt:1016 +#: params.opt:1034 #, no-c-format msgid "Maximum number of nested calls to search for control dependencies during uninitialized variable analysis." msgstr "" -#: params.opt:1020 +#: params.opt:1038 #, no-c-format msgid "Instruction accounted for function prologue, epilogue and other overhead." msgstr "" -#: params.opt:1024 +#: params.opt:1042 #, no-c-format msgid "Time accounted for function prologue, epilogue and other overhead." msgstr "" -#: params.opt:1028 +#: params.opt:1046 #, no-c-format msgid "Instruction accounted for function thunk overhead." msgstr "" -#: params.opt:1032 +#: params.opt:1050 #, no-c-format msgid "Time accounted for function thunk overhead." msgstr "" -#: params.opt:1036 +#: params.opt:1054 #, no-c-format msgid "The denominator n of fraction 1/n of the number of profiled runs of the entire program below which the execution count of a basic block must be in order for the basic block to be considered unlikely." msgstr "" -#: params.opt:1040 +#: params.opt:1058 #, no-c-format msgid "Maximum unroll factor for the unroll-and-jam transformation." msgstr "" -#: params.opt:1044 +#: params.opt:1062 #, no-c-format msgid "Minimum percentage of memrefs that must go away for unroll-and-jam to be considered profitable." msgstr "" -#: params.opt:1048 +#: params.opt:1066 #, no-c-format msgid "Use direct poisoning/unpoisoning instructions for variables smaller or equal to this number." msgstr "" -#: params.opt:1052 +#: params.opt:1070 #, no-c-format msgid "Whether to use canonical types." msgstr "" -#: params.opt:1056 +#: params.opt:1074 #, no-c-format msgid "Enable loop epilogue vectorization using smaller vector size." msgstr "" -#: params.opt:1060 +#: params.opt:1078 #, no-c-format msgid "Maximum number of loop peels to enhance alignment of data references in a loop." msgstr "" -#: params.opt:1064 +#: params.opt:1082 #, no-c-format msgid "Bound on number of runtime checks inserted by the vectorizer's loop versioning for alias check." msgstr "" -#: params.opt:1068 +#: params.opt:1086 #, no-c-format msgid "Bound on number of runtime checks inserted by the vectorizer's loop versioning for alignment check." msgstr "" -#: params.opt:1072 +#: params.opt:1090 #, no-c-format msgid "Controls how loop vectorizer uses partial vectors. 0 means never, 1 means only for loops whose need to iterate can be removed, 2 means for all loops. The default value is 2." msgstr "" @@ -20593,7 +20603,7 @@ msgid "expected boolean type" msgstr "" #: go/gofrontend/expressions.cc:5155 c/c-parser.c:15375 c/c-parser.c:15382 -#: cp/parser.c:37455 cp/parser.c:37462 +#: cp/parser.c:37508 cp/parser.c:37515 #, gcc-internal-format msgid "expected integer" msgstr "" @@ -20662,7 +20672,7 @@ msgstr "няма аргументаў" #: go/gofrontend/expressions.cc:10181 go/gofrontend/expressions.cc:10262 #: go/gofrontend/expressions.cc:10335 go/gofrontend/expressions.cc:11146 #: go/gofrontend/expressions.cc:12226 go/gofrontend/expressions.cc:12240 -#: go/gofrontend/expressions.cc:12261 cp/pt.c:9041 +#: go/gofrontend/expressions.cc:12261 cp/pt.c:9065 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function" msgid "too many arguments" @@ -21048,7 +21058,7 @@ msgstr "" #: attribs.c:455 c-family/c-attribs.c:886 c-family/c-attribs.c:2340 #: c-family/c-attribs.c:2805 c-family/c-attribs.c:4513 -#: c-family/c-attribs.c:4606 cp/decl.c:15180 cp/friend.c:303 cp/tree.c:4932 +#: c-family/c-attribs.c:4606 cp/decl.c:15198 cp/friend.c:303 cp/tree.c:4993 #, fuzzy, gcc-internal-format msgid "previous declaration here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" @@ -21105,7 +21115,7 @@ msgstr "" #. is a constraint violation if it is not one of the known #. standard attributes. Diagnose it here with a pedwarn and #. then discard it to prevent a duplicate warning later. -#: attribs.c:729 attribs.c:1637 attribs.c:1647 attribs.c:1657 +#: attribs.c:729 attribs.c:1714 attribs.c:1724 attribs.c:1734 #: c-family/c-attribs.c:914 c-family/c-attribs.c:976 c-family/c-attribs.c:995 #: c-family/c-attribs.c:1013 c-family/c-attribs.c:1043 #: c-family/c-attribs.c:1064 c-family/c-attribs.c:1085 @@ -21134,20 +21144,20 @@ msgstr "" #: c-family/c-attribs.c:5171 c-family/c-attribs.c:5253 #: c-family/c-attribs.c:5309 c-family/c-attribs.c:5325 #: c-family/c-attribs.c:5479 c-family/c-common.c:5809 c-family/c-common.c:5812 -#: config/darwin.c:2131 config/arm/arm.c:7253 config/arm/arm.c:7281 -#: config/arm/arm.c:7298 config/avr/avr.c:9675 config/csky/csky.c:6108 +#: config/darwin.c:2126 config/arm/arm.c:7262 config/arm/arm.c:7290 +#: config/arm/arm.c:7307 config/avr/avr.c:9675 config/csky/csky.c:6108 #: config/csky/csky.c:6130 config/h8300/h8300.c:4918 config/h8300/h8300.c:4942 -#: config/i386/i386-options.c:3474 config/i386/i386-options.c:3632 -#: config/i386/i386-options.c:3864 config/ia64/ia64.c:785 -#: config/rs6000/rs6000.c:20292 ada/gcc-interface/utils.c:6576 +#: config/i386/i386-options.c:3487 config/i386/i386-options.c:3645 +#: config/i386/i386-options.c:3877 config/ia64/ia64.c:785 +#: config/rs6000/rs6000.c:20409 ada/gcc-interface/utils.c:6576 #: ada/gcc-interface/utils.c:6592 ada/gcc-interface/utils.c:6621 #: ada/gcc-interface/utils.c:6638 ada/gcc-interface/utils.c:6655 #: ada/gcc-interface/utils.c:6670 ada/gcc-interface/utils.c:6686 #: ada/gcc-interface/utils.c:6712 ada/gcc-interface/utils.c:6781 #: ada/gcc-interface/utils.c:6808 ada/gcc-interface/utils.c:6829 #: ada/gcc-interface/utils.c:6850 ada/gcc-interface/utils.c:6866 -#: ada/gcc-interface/utils.c:6921 brig/brig-lang.c:484 c/c-decl.c:4624 -#: c/c-decl.c:4627 c/c-decl.c:4642 c/c-parser.c:4961 jit/dummy-frontend.c:185 +#: ada/gcc-interface/utils.c:6921 brig/brig-lang.c:484 c/c-decl.c:4623 +#: c/c-decl.c:4626 c/c-decl.c:4641 c/c-parser.c:4961 jit/dummy-frontend.c:185 #: lto/lto-lang.c:288 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" @@ -21159,8 +21169,8 @@ msgstr "\"%s\" атрыбут ігнарыруецца" msgid "missing % attribute for multi-versioned %qD" msgstr "" -#: attribs.c:1007 cp/decl.c:1200 cp/decl.c:2106 cp/decl.c:2152 cp/decl.c:2169 -#: cp/decl.c:2782 cp/decl.c:3237 +#: attribs.c:1007 cp/decl.c:1200 cp/decl.c:2104 cp/decl.c:2150 cp/decl.c:2167 +#: cp/decl.c:2777 cp/decl.c:3219 #, fuzzy, gcc-internal-format #| msgid "previous declaration of `%D'" msgid "previous declaration of %qD" @@ -21171,59 +21181,59 @@ msgstr "папярэдняе абвяшчэньне `%D'" msgid "ignoring attributes applied to %qT after definition" msgstr "" -#: attribs.c:1568 +#: attribs.c:1645 #, gcc-internal-format msgid "%q+D already declared with dllexport attribute: dllimport ignored" msgstr "" -#: attribs.c:1580 +#: attribs.c:1657 #, gcc-internal-format msgid "%q+D redeclared without dllimport attribute after being referenced with dll linkage" msgstr "" -#: attribs.c:1594 +#: attribs.c:1671 #, gcc-internal-format msgid "%q+D redeclared without dllimport attribute: previous dllimport ignored" msgstr "" -#: attribs.c:1675 +#: attribs.c:1752 #, gcc-internal-format msgid "inline function %q+D declared as dllimport: attribute ignored" msgstr "" -#: attribs.c:1683 +#: attribs.c:1760 #, gcc-internal-format msgid "function %q+D definition is marked dllimport" msgstr "" -#: attribs.c:1691 +#: attribs.c:1768 #, gcc-internal-format msgid "variable %q+D definition is marked dllimport" msgstr "" -#: attribs.c:1722 +#: attribs.c:1799 #, gcc-internal-format msgid "external linkage required for symbol %q+D because of %qE attribute" msgstr "" -#: attribs.c:1736 +#: attribs.c:1813 #, gcc-internal-format msgid "%qE implies default visibility, but %qD has already been declared with a different visibility" msgstr "" -#: attribs.c:1999 +#: attribs.c:2076 #, gcc-internal-format msgid "%qD specifies more restrictive attribute than its target %qD: %s" msgid_plural "%qD specifies more restrictive attributes than its target %qD: %s" msgstr[0] "" msgstr[1] "" -#: attribs.c:2005 attribs.c:2025 +#: attribs.c:2082 attribs.c:2102 #, gcc-internal-format msgid "%qD target declared here" msgstr "" -#: attribs.c:2019 +#: attribs.c:2096 #, gcc-internal-format msgid "%qD specifies less restrictive attribute than its target %qD: %s" msgid_plural "%qD specifies less restrictive attributes than its target %qD: %s" @@ -21327,7 +21337,7 @@ msgstr "" msgid "offset %qwi outside bounds of constant string" msgstr "" -#: builtins.c:1454 cp/name-lookup.c:6424 +#: builtins.c:1454 cp/name-lookup.c:6441 #, gcc-internal-format msgid "%qE declared here" msgstr "" @@ -21352,633 +21362,633 @@ msgstr "аргумент `__builtin_args_info' павінен быць канс msgid "invalid third argument to %<__builtin_prefetch%>; using zero" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: builtins.c:3954 +#: builtins.c:3958 #, gcc-internal-format msgid "%K%qD specified bound %E may exceed maximum object size %E" msgstr "" -#: builtins.c:3956 calls.c:1730 +#: builtins.c:3960 calls.c:1730 #, gcc-internal-format msgid "%K%qD specified bound %E exceeds maximum object size %E" msgstr "" -#: builtins.c:3961 +#: builtins.c:3965 #, gcc-internal-format msgid "%Kspecified bound %E may exceed maximum object size %E" msgstr "" -#: builtins.c:3963 +#: builtins.c:3967 #, gcc-internal-format msgid "%Kspecified bound %E exceeds maximum object size %E" msgstr "" -#: builtins.c:3970 +#: builtins.c:3974 #, gcc-internal-format msgid "%K%qD specified bound [%E, %E] may exceed maximum object size %E" msgstr "" -#: builtins.c:3972 calls.c:1735 +#: builtins.c:3976 calls.c:1735 #, gcc-internal-format msgid "%K%qD specified bound [%E, %E] exceeds maximum object size %E" msgstr "" -#: builtins.c:3978 +#: builtins.c:3982 #, gcc-internal-format msgid "%Kspecified bound [%E, %E] may exceed maximum object size %E" msgstr "" -#: builtins.c:3980 +#: builtins.c:3984 #, gcc-internal-format msgid "%Kspecified bound [%E, %E] exceeds maximum object size %E" msgstr "" -#: builtins.c:3990 +#: builtins.c:3994 #, gcc-internal-format msgid "%K%qD specified bound %E may exceed source size %E" msgstr "" -#: builtins.c:3992 +#: builtins.c:3996 #, gcc-internal-format msgid "%K%qD specified bound %E exceeds source size %E" msgstr "" -#: builtins.c:3997 +#: builtins.c:4001 #, gcc-internal-format msgid "%Kspecified bound %E may exceed source size %E" msgstr "" -#: builtins.c:3999 +#: builtins.c:4003 #, gcc-internal-format msgid "%Kspecified bound %E exceeds source size %E" msgstr "" -#: builtins.c:4006 +#: builtins.c:4010 #, gcc-internal-format msgid "%K%qD specified bound [%E, %E] may exceed source size %E" msgstr "" -#: builtins.c:4008 +#: builtins.c:4012 #, gcc-internal-format msgid "%K%qD specified bound [%E, %E] exceeds source size %E" msgstr "" -#: builtins.c:4013 +#: builtins.c:4017 #, gcc-internal-format msgid "%Kspecified bound [%E, %E] may exceed source size %E" msgstr "" -#: builtins.c:4015 +#: builtins.c:4019 #, gcc-internal-format msgid "%Kspecified bound [%E, %E] exceeds source size %E" msgstr "" -#: builtins.c:4024 +#: builtins.c:4028 #, gcc-internal-format msgid "source object declared here" msgstr "" -#: builtins.c:4027 +#: builtins.c:4031 #, gcc-internal-format msgid "source object allocated here" msgstr "" -#: builtins.c:4042 +#: builtins.c:4046 #, gcc-internal-format msgid "%K%qD specified size %E may exceed maximum object size %E" msgstr "" -#: builtins.c:4044 +#: builtins.c:4048 #, gcc-internal-format msgid "%K%qD specified size %E exceeds maximum object size %E" msgstr "" -#: builtins.c:4049 +#: builtins.c:4053 #, gcc-internal-format msgid "%Kspecified size %E may exceed maximum object size %E" msgstr "" -#: builtins.c:4051 +#: builtins.c:4055 #, gcc-internal-format msgid "%Kspecified size %E exceeds maximum object size %E" msgstr "" -#: builtins.c:4058 +#: builtins.c:4062 #, gcc-internal-format msgid "%K%qD specified size between %E and %E may exceed maximum object size %E" msgstr "" -#: builtins.c:4060 +#: builtins.c:4064 #, gcc-internal-format msgid "%K%qD specified size between %E and %E exceeds maximum object size %E" msgstr "" -#: builtins.c:4066 +#: builtins.c:4070 #, gcc-internal-format msgid "%Kspecified size between %E and %E may exceed maximum object size %E" msgstr "" -#: builtins.c:4068 +#: builtins.c:4072 #, gcc-internal-format msgid "%Kspecified size between %E and %E exceeds maximum object size %E" msgstr "" -#: builtins.c:4078 +#: builtins.c:4082 #, gcc-internal-format msgid "%K%qD specified bound %E may exceed destination size %E" msgstr "" -#: builtins.c:4080 +#: builtins.c:4084 #, gcc-internal-format msgid "%K%qD specified bound %E exceeds destination size %E" msgstr "" -#: builtins.c:4085 +#: builtins.c:4089 #, gcc-internal-format msgid "%Kspecified bound %E may exceed destination size %E" msgstr "" -#: builtins.c:4087 +#: builtins.c:4091 #, gcc-internal-format msgid "%Kspecified bound %E exceeds destination size %E" msgstr "" -#: builtins.c:4094 +#: builtins.c:4098 #, gcc-internal-format msgid "%K%qD specified bound [%E, %E] may exceed destination size %E" msgstr "" -#: builtins.c:4096 +#: builtins.c:4100 #, gcc-internal-format msgid "%K%qD specified bound [%E, %E] exceeds destination size %E" msgstr "" -#: builtins.c:4101 builtins.c:4103 +#: builtins.c:4105 builtins.c:4107 #, gcc-internal-format msgid "%Kspecified bound [%E, %E] exceeds destination size %E" msgstr "" -#: builtins.c:4113 +#: builtins.c:4117 #, gcc-internal-format msgid "destination object declared here" msgstr "" -#: builtins.c:4116 +#: builtins.c:4120 #, gcc-internal-format msgid "destination object allocated here" msgstr "" -#: builtins.c:4143 +#: builtins.c:4147 #, gcc-internal-format msgid "%K%qD may access %E byte in a region of size %E" msgstr "" -#: builtins.c:4145 +#: builtins.c:4149 #, gcc-internal-format msgid "%K%qD accessing %E byte in a region of size %E" msgstr "" -#: builtins.c:4148 +#: builtins.c:4152 #, gcc-internal-format msgid "%K%qD may access %E bytes in a region of size %E" msgstr "" -#: builtins.c:4150 +#: builtins.c:4154 #, gcc-internal-format msgid "%K%qD accessing %E bytes in a region of size %E" msgstr "" -#: builtins.c:4155 +#: builtins.c:4159 #, gcc-internal-format msgid "%Kmay access %E byte in a region of size %E" msgstr "" -#: builtins.c:4157 +#: builtins.c:4161 #, gcc-internal-format msgid "%Kaccessing %E byte in a region of size %E" msgstr "" -#: builtins.c:4160 +#: builtins.c:4164 #, gcc-internal-format msgid "%Kmay access %E bytes in a region of size %E" msgstr "" -#: builtins.c:4162 +#: builtins.c:4166 #, gcc-internal-format msgid "%Kaccessing %E bytes in a region of size %E" msgstr "" -#: builtins.c:4171 +#: builtins.c:4175 #, gcc-internal-format msgid "%K%qD may access %E or more bytes in a region of size %E" msgstr "" -#: builtins.c:4173 +#: builtins.c:4177 #, gcc-internal-format msgid "%K%qD accessing %E or more bytes in a region of size %E" msgstr "" -#: builtins.c:4178 +#: builtins.c:4182 #, gcc-internal-format msgid "%Kmay access %E or more bytes in a region of size %E" msgstr "" -#: builtins.c:4180 +#: builtins.c:4184 #, gcc-internal-format msgid "%Kaccessing %E or more bytes in a region of size %E" msgstr "" -#: builtins.c:4188 +#: builtins.c:4192 #, gcc-internal-format msgid "%K%qD may access between %E and %E bytes in a region of size %E" msgstr "" -#: builtins.c:4190 +#: builtins.c:4194 #, gcc-internal-format msgid "%K%qD accessing between %E and %E bytes in a region of size %E" msgstr "" -#: builtins.c:4196 +#: builtins.c:4200 #, gcc-internal-format msgid "%Kmay access between %E and %E bytes in a region of size %E" msgstr "" -#: builtins.c:4198 +#: builtins.c:4202 #, gcc-internal-format msgid "%Kaccessing between %E and %E bytes in a region of size %E" msgstr "" -#: builtins.c:4211 +#: builtins.c:4215 #, gcc-internal-format msgid "%K%qD may write %E byte into a region of size %E" msgstr "" -#: builtins.c:4213 +#: builtins.c:4217 #, gcc-internal-format msgid "%K%qD writing %E byte into a region of size %E overflows the destination" msgstr "" -#: builtins.c:4216 +#: builtins.c:4220 #, gcc-internal-format msgid "%K%qD may write %E bytes into a region of size %E" msgstr "" -#: builtins.c:4218 +#: builtins.c:4222 #, gcc-internal-format msgid "%K%qD writing %E bytes into a region of size %E overflows the destination" msgstr "" -#: builtins.c:4223 +#: builtins.c:4227 #, gcc-internal-format msgid "%Kmay write %E byte into a region of size %E" msgstr "" -#: builtins.c:4225 +#: builtins.c:4229 #, gcc-internal-format msgid "%Kwriting %E byte into a region of size %E overflows the destination" msgstr "" -#: builtins.c:4228 +#: builtins.c:4232 #, gcc-internal-format msgid "%Kmay write %E bytes into a region of size %E" msgstr "" -#: builtins.c:4230 +#: builtins.c:4234 #, gcc-internal-format msgid "%Kwriting %E bytes into a region of size %E overflows the destination" msgstr "" -#: builtins.c:4239 +#: builtins.c:4243 #, gcc-internal-format msgid "%K%qD may write %E or more bytes into a region of size %E" msgstr "" -#: builtins.c:4241 builtins.c:4779 +#: builtins.c:4245 builtins.c:4783 #, gcc-internal-format msgid "%K%qD writing %E or more bytes into a region of size %E overflows the destination" msgstr "" -#: builtins.c:4247 +#: builtins.c:4251 #, gcc-internal-format msgid "%Kmay write %E or more bytes into a region of size %E" msgstr "" -#: builtins.c:4249 builtins.c:4784 +#: builtins.c:4253 builtins.c:4788 #, gcc-internal-format msgid "%Kwriting %E or more bytes into a region of size %E overflows the destination" msgstr "" -#: builtins.c:4258 +#: builtins.c:4262 #, gcc-internal-format msgid "%K%qD may write between %E and %E bytes into a region of size %E" msgstr "" -#: builtins.c:4260 +#: builtins.c:4264 #, gcc-internal-format msgid "%K%qD writing between %E and %E bytes into a region of size %E overflows the destination" msgstr "" -#: builtins.c:4267 +#: builtins.c:4271 #, gcc-internal-format msgid "%Kmay write between %E and %E bytes into a region of size %E" msgstr "" -#: builtins.c:4269 +#: builtins.c:4273 #, gcc-internal-format msgid "%Kwriting between %E and %E bytes into a region of size %E overflows the destination" msgstr "" -#: builtins.c:4284 +#: builtins.c:4288 #, gcc-internal-format msgid "%K%qD may read %E byte from a region of size %E" msgstr "" -#: builtins.c:4286 +#: builtins.c:4290 #, gcc-internal-format msgid "%K%qD reading %E byte from a region of size %E" msgstr "" -#: builtins.c:4289 +#: builtins.c:4293 #, gcc-internal-format msgid "%K%qD may read %E bytes from a region of size %E" msgstr "" -#: builtins.c:4291 +#: builtins.c:4295 #, gcc-internal-format msgid "%K%qD reading %E bytes from a region of size %E" msgstr "" -#: builtins.c:4297 +#: builtins.c:4301 #, gcc-internal-format msgid "%Kmay read %E byte from a region of size %E" msgstr "" -#: builtins.c:4299 +#: builtins.c:4303 #, gcc-internal-format msgid "%Kreading %E byte from a region of size %E" msgstr "" -#: builtins.c:4302 +#: builtins.c:4306 #, gcc-internal-format msgid "%Kmay read %E bytes from a region of size %E" msgstr "" -#: builtins.c:4304 +#: builtins.c:4308 #, gcc-internal-format msgid "%Kreading %E bytes from a region of size %E" msgstr "" -#: builtins.c:4313 +#: builtins.c:4317 #, gcc-internal-format msgid "%K%qD may read %E or more bytes from a region of size %E" msgstr "" -#: builtins.c:4315 +#: builtins.c:4319 #, gcc-internal-format msgid "%K%qD reading %E or more bytes from a region of size %E" msgstr "" -#: builtins.c:4320 +#: builtins.c:4324 #, gcc-internal-format msgid "%Kmay read %E or more bytes from a region of size %E" msgstr "" -#: builtins.c:4322 +#: builtins.c:4326 #, gcc-internal-format msgid "%Kreading %E or more bytes from a region of size %E" msgstr "" -#: builtins.c:4330 +#: builtins.c:4334 #, gcc-internal-format msgid "%K%qD may read between %E and %E bytes from a region of size %E" msgstr "" -#: builtins.c:4332 +#: builtins.c:4336 #, gcc-internal-format msgid "%K%qD reading between %E and %E bytes from a region of size %E" msgstr "" -#: builtins.c:4337 +#: builtins.c:4341 #, gcc-internal-format msgid "%Kmay read between %E and %E bytes from a region of size %E" msgstr "" -#: builtins.c:4339 +#: builtins.c:4343 #, gcc-internal-format msgid "%Kreading between %E and %E bytes from a region of size %E" msgstr "" -#: builtins.c:4354 +#: builtins.c:4358 #, gcc-internal-format msgid "%K%qD expecting %E byte in a region of size %E" msgid_plural "%K%qD expecting %E bytes in a region of size %E" msgstr[0] "" msgstr[1] "" -#: builtins.c:4359 +#: builtins.c:4363 #, gcc-internal-format msgid "%Kexpecting %E byte in a region of size %E" msgid_plural "%Kexpecting %E bytes in a region of size %E" msgstr[0] "" msgstr[1] "" -#: builtins.c:4367 +#: builtins.c:4371 #, gcc-internal-format msgid "%K%qD expecting %E or more bytes in a region of size %E" msgstr "" -#: builtins.c:4371 +#: builtins.c:4375 #, gcc-internal-format msgid "%Kexpecting %E or more bytes in a region of size %E" msgstr "" -#: builtins.c:4378 +#: builtins.c:4382 #, gcc-internal-format msgid "%K%qD expecting between %E and %E bytes in a region of size %E" msgstr "" -#: builtins.c:4382 +#: builtins.c:4386 #, gcc-internal-format msgid "%Kexpecting between %E and %E bytes in a region of size %E" msgstr "" -#: builtins.c:4545 +#: builtins.c:4549 #, gcc-internal-format msgid "at offset %s into destination object %qE of size %s" msgstr "" -#: builtins.c:4548 +#: builtins.c:4552 #, gcc-internal-format msgid "destination object %qE of size %s" msgstr "" -#: builtins.c:4554 +#: builtins.c:4558 #, gcc-internal-format msgid "at offset %s into destination object of size %s allocated by %qE" msgstr "" -#: builtins.c:4557 +#: builtins.c:4561 #, gcc-internal-format msgid "destination object of size %s allocated by %qE" msgstr "" -#: builtins.c:4565 +#: builtins.c:4569 #, gcc-internal-format msgid "at offset %s into source object %qE of size %s" msgstr "" -#: builtins.c:4568 +#: builtins.c:4572 #, gcc-internal-format msgid "source object %qE of size %s" msgstr "" -#: builtins.c:4575 +#: builtins.c:4579 #, gcc-internal-format msgid "at offset %s into source object of size %s allocated by %qE" msgstr "" -#: builtins.c:4578 +#: builtins.c:4582 #, gcc-internal-format msgid "source object of size %s allocated by %qE" msgstr "" -#: builtins.c:6425 builtins.c:6498 +#: builtins.c:6429 builtins.c:6502 #, gcc-internal-format msgid "%K%qD specified bound %E equals destination size" msgstr "" -#: builtins.c:7390 gimplify.c:3383 +#: builtins.c:7394 gimplify.c:3383 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function `%s'" msgid "too few arguments to function %" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: builtins.c:7490 +#: builtins.c:7494 #, fuzzy, gcc-internal-format #| msgid "invalid use of `%D'" msgid "invalid argument to %qD" msgstr "нерэчаіснае выкарыстаньне `%D'" -#: builtins.c:7503 +#: builtins.c:7507 #, fuzzy, gcc-internal-format msgid "unsupported argument to %qD" msgstr "нехапае аргументаў у функцыі \"%s\"" #. Warn since no effort is made to ensure that any frame #. beyond the current one exists or can be safely reached. -#: builtins.c:7511 +#: builtins.c:7515 #, gcc-internal-format msgid "calling %qD with a nonzero argument is unsafe" msgstr "" -#: builtins.c:7841 builtins.c:7881 +#: builtins.c:7845 builtins.c:7885 #, fuzzy, gcc-internal-format #| msgid "argument of `__builtin_args_info' must be constant" msgid "both arguments to %<__builtin___clear_cache%> must be pointers" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: builtins.c:7971 +#: builtins.c:7975 #, fuzzy, gcc-internal-format msgid "trampoline generated for nested function %qD" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: builtins.c:8366 builtins.c:8379 +#: builtins.c:8370 builtins.c:8383 #, gcc-internal-format msgid "%qD changed semantics in GCC 4.4" msgstr "" -#: builtins.c:8485 +#: builtins.c:8489 #, gcc-internal-format msgid "unknown architecture specifier in memory model to builtin" msgstr "" -#: builtins.c:8493 +#: builtins.c:8497 #, gcc-internal-format msgid "invalid memory model argument to builtin" msgstr "" -#: builtins.c:8554 builtins.c:8681 +#: builtins.c:8558 builtins.c:8685 #, gcc-internal-format msgid "failure memory model cannot be stronger than success memory model for %<__atomic_compare_exchange%>" msgstr "" -#: builtins.c:8562 builtins.c:8689 +#: builtins.c:8566 builtins.c:8693 #, gcc-internal-format msgid "invalid failure memory model for %<__atomic_compare_exchange%>" msgstr "" -#: builtins.c:8747 +#: builtins.c:8751 #, gcc-internal-format msgid "invalid memory model for %<__atomic_load%>" msgstr "" -#: builtins.c:8779 builtins.c:8972 +#: builtins.c:8783 builtins.c:8976 #, fuzzy, gcc-internal-format #| msgid "invalid mode for gen_tst_reg" msgid "invalid memory model for %<__atomic_store%>" msgstr "нерэчаісны рэжым для gen_tst_reg" -#: builtins.c:9093 +#: builtins.c:9097 #, fuzzy, gcc-internal-format msgid "non-constant argument 1 to %qs" msgstr "вельмі шмат аргументаў у функцыі \"%s\"" -#: builtins.c:9135 +#: builtins.c:9139 #, fuzzy, gcc-internal-format msgid "non-integer argument 1 to %qs" msgstr "аргумент для \"%s\" прапушчан" -#: builtins.c:9199 +#: builtins.c:9203 #, fuzzy, gcc-internal-format #| msgid "__builtin_saveregs not supported by this target" msgid "%<__builtin_thread_pointer%> is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: builtins.c:9219 +#: builtins.c:9223 #, fuzzy, gcc-internal-format #| msgid "__builtin_saveregs not supported by this target" msgid "%<__builtin_set_thread_pointer%> is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: builtins.c:9278 +#: builtins.c:9282 #, fuzzy, gcc-internal-format msgid "%qs only supported in OpenACC code" msgstr "-pipe не падтрымліваецца" -#: builtins.c:9285 +#: builtins.c:9289 #, fuzzy, gcc-internal-format msgid "non-constant argument 0 to %qs" msgstr "вельмі шмат аргументаў у функцыі \"%s\"" -#: builtins.c:9297 +#: builtins.c:9301 #, fuzzy, gcc-internal-format msgid "illegal argument 0 to %qs" msgstr "аргумент для \"%s\" прапушчан" #. All valid uses of __builtin_va_arg_pack () are removed during #. inlining. -#: builtins.c:9755 expr.c:11247 +#: builtins.c:9759 expr.c:11247 #, gcc-internal-format msgid "%Kinvalid use of %<__builtin_va_arg_pack ()%>" msgstr "" #. All valid uses of __builtin_va_arg_pack_len () are removed during #. inlining. -#: builtins.c:9761 +#: builtins.c:9765 #, gcc-internal-format msgid "%Kinvalid use of %<__builtin_va_arg_pack_len ()%>" msgstr "" -#: builtins.c:10093 +#: builtins.c:10097 #, gcc-internal-format msgid "%<__builtin_longjmp%> second argument must be 1" msgstr "" -#: builtins.c:10986 +#: builtins.c:10990 #, fuzzy, gcc-internal-format msgid "target format does not support infinity" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: builtins.c:12607 +#: builtins.c:12611 #, fuzzy, gcc-internal-format #| msgid "`va_start' used in function with fixed args" msgid "% used in function with fixed arguments" @@ -21986,99 +21996,99 @@ msgstr "" "`va_start' выкарыстоўвываецца ў функцыі з нязьменнай\n" " колькасьцю аргументаў" -#: builtins.c:12615 +#: builtins.c:12619 #, fuzzy, gcc-internal-format #| msgid "wrong number of arguments specified for `%s' attribute" msgid "wrong number of arguments to function %" msgstr "памылковая колькасьць аргументаў, зададзеных для атрыбута `%s'" -#: builtins.c:12630 +#: builtins.c:12634 #, fuzzy, gcc-internal-format #| msgid "`__builtin_next_arg' called without an argument" msgid "%<__builtin_next_arg%> called without an argument" msgstr "\"__buitin_next_arg\" выклікаецца без аргумента" -#: builtins.c:12635 +#: builtins.c:12639 #, fuzzy, gcc-internal-format #| msgid "wrong number of arguments specified for `%s' attribute" msgid "wrong number of arguments to function %<__builtin_next_arg%>" msgstr "памылковая колькасьць аргументаў, зададзеных для атрыбута `%s'" -#: builtins.c:12668 +#: builtins.c:12672 #, gcc-internal-format msgid "second parameter of % not last named argument" msgstr "" -#: builtins.c:12681 +#: builtins.c:12685 #, gcc-internal-format msgid "undefined behavior when second parameter of % is declared with % storage" msgstr "" -#: builtins.c:12710 +#: builtins.c:12714 #, gcc-internal-format msgid "%Kfirst argument of %qD must be a pointer, second integer constant" msgstr "" -#: builtins.c:12723 +#: builtins.c:12727 #, gcc-internal-format msgid "%Klast argument of %qD is not integer constant between 0 and 3" msgstr "" -#: builtins.c:13526 +#: builtins.c:13530 #, gcc-internal-format msgid "%K%qD called on pointer %qE with nonzero offset%s" msgstr "" -#: builtins.c:13531 builtins.c:13595 gimple-ssa-isolate-paths.c:412 -#: tree.c:13239 tree.c:13276 c/c-typeck.c:2939 c/c-typeck.c:3026 -#: c/c-typeck.c:5541 c/c-typeck.c:10767 c/c-typeck.c:10784 -#: c/gimple-parser.c:2416 c/gimple-parser.c:2424 cp/call.c:7278 cp/call.c:9295 -#: cp/constexpr.c:843 cp/constexpr.c:3583 cp/cvt.c:1077 cp/cvt.c:1115 -#: cp/decl.c:8251 cp/decl.c:15330 cp/decl.c:15709 cp/decl2.c:5623 -#: cp/decl2.c:5674 cp/parser.c:20758 cp/pt.c:8849 cp/semantics.c:2093 -#: cp/semantics.c:3337 cp/semantics.c:4424 cp/typeck.c:1803 cp/typeck.c:2020 -#: cp/typeck.c:4091 cp/typeck.c:9787 +#: builtins.c:13535 builtins.c:13599 gimple-ssa-isolate-paths.c:412 +#: tree.c:13239 tree.c:13276 c/c-typeck.c:2989 c/c-typeck.c:3076 +#: c/c-typeck.c:5601 c/c-typeck.c:10827 c/c-typeck.c:10844 +#: c/gimple-parser.c:2416 c/gimple-parser.c:2424 cp/call.c:7282 cp/call.c:9315 +#: cp/constexpr.c:844 cp/constexpr.c:3638 cp/cvt.c:1077 cp/cvt.c:1115 +#: cp/decl.c:8257 cp/decl.c:15348 cp/decl.c:15727 cp/decl2.c:5624 +#: cp/decl2.c:5675 cp/parser.c:20795 cp/pt.c:8873 cp/semantics.c:2112 +#: cp/semantics.c:3355 cp/semantics.c:4452 cp/typeck.c:1814 cp/typeck.c:2031 +#: cp/typeck.c:4102 cp/typeck.c:9794 #, fuzzy, gcc-internal-format #| msgid "called from here" msgid "declared here" msgstr "выклікана адсюль" -#: builtins.c:13541 builtins.c:13666 +#: builtins.c:13545 builtins.c:13670 #, gcc-internal-format msgid "returned from %qD" msgstr "" -#: builtins.c:13544 +#: builtins.c:13548 #, gcc-internal-format msgid "returned from %qT" msgstr "" -#: builtins.c:13546 +#: builtins.c:13550 #, gcc-internal-format msgid "obtained here" msgstr "" -#: builtins.c:13589 +#: builtins.c:13593 #, gcc-internal-format msgid "%K%qD called on unallocated object %qD" msgstr "" -#: builtins.c:13609 +#: builtins.c:13613 #, gcc-internal-format msgid "%K%qD called on a pointer to an unallocated object %qE" msgstr "" -#: builtins.c:13618 +#: builtins.c:13622 #, gcc-internal-format msgid "assigned here" msgstr "" -#: builtins.c:13647 +#: builtins.c:13651 #, gcc-internal-format msgid "%K%qD called on pointer returned from a mismatched allocation function" msgstr "" -#: builtins.c:13656 +#: builtins.c:13660 #, gcc-internal-format msgid "%K%qD called on pointer to an unallocated object" msgstr "" @@ -22864,303 +22874,303 @@ msgstr "" msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)" msgstr "" -#: cgraph.c:3139 +#: cgraph.c:3150 #, gcc-internal-format msgid "caller edge count invalid" msgstr "" -#: cgraph.c:3235 +#: cgraph.c:3246 #, gcc-internal-format msgid "missing indirect call in speculative call sequence" msgstr "" -#: cgraph.c:3240 +#: cgraph.c:3251 #, gcc-internal-format msgid "indirect call in speculative call sequence has no speculative flag" msgstr "" -#: cgraph.c:3270 +#: cgraph.c:3281 #, gcc-internal-format msgid "speculative edges are not adjacent" msgstr "" -#: cgraph.c:3276 +#: cgraph.c:3287 #, gcc-internal-format, gfc-internal-format msgid "direct call to %s in speculative call sequence has no speculative flag" msgstr "" -#: cgraph.c:3282 cgraph.c:3312 +#: cgraph.c:3293 cgraph.c:3323 #, gcc-internal-format, gfc-internal-format msgid "direct call to %s in speculative call sequence has speculative_id %i out of range" msgstr "" -#: cgraph.c:3289 +#: cgraph.c:3300 #, gcc-internal-format, gfc-internal-format msgid "duplicate direct call to %s in speculative call sequence with speculative_id %i" msgstr "" -#: cgraph.c:3300 +#: cgraph.c:3311 #, gcc-internal-format msgid "call stmt hash does not point to first direct edge of speculative call sequence" msgstr "" -#: cgraph.c:3319 +#: cgraph.c:3330 #, gcc-internal-format, gfc-internal-format msgid "duplicate reference %s in speculative call sequence with speculative_id %i" msgstr "" -#: cgraph.c:3332 +#: cgraph.c:3343 #, gcc-internal-format, gfc-internal-format msgid "missing direct call for speculation %i" msgstr "" -#: cgraph.c:3337 +#: cgraph.c:3348 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "missing ref for speculation %i" msgstr "аргумент для \"%s\" прапушчан" -#: cgraph.c:3346 +#: cgraph.c:3357 #, gcc-internal-format, gfc-internal-format msgid "number of speculative targets %i mismatched with num_speculative_call_targets %i" msgstr "" -#: cgraph.c:3375 +#: cgraph.c:3386 #, gcc-internal-format, gfc-internal-format msgid "aux field set for edge %s->%s" msgstr "" -#: cgraph.c:3382 +#: cgraph.c:3393 #, gcc-internal-format msgid "cgraph count invalid" msgstr "" -#: cgraph.c:3387 +#: cgraph.c:3398 #, gcc-internal-format msgid "inline clone in same comdat group list" msgstr "" -#: cgraph.c:3392 +#: cgraph.c:3403 #, gcc-internal-format msgid "inline clone count is not compatible" msgstr "" -#: cgraph.c:3399 +#: cgraph.c:3410 #, gcc-internal-format msgid "tp_first_run must be non-negative" msgstr "" -#: cgraph.c:3404 +#: cgraph.c:3415 #, fuzzy, gcc-internal-format #| msgid "label `%s' used but not defined" msgid "local symbols must be defined" msgstr "адмеціна `%s' выкарыстоўвываецца, але ня вызначана" -#: cgraph.c:3409 +#: cgraph.c:3420 #, gcc-internal-format msgid "externally visible inline clone" msgstr "" -#: cgraph.c:3414 +#: cgraph.c:3425 #, gcc-internal-format msgid "inline clone with address taken" msgstr "" -#: cgraph.c:3419 +#: cgraph.c:3430 #, gcc-internal-format msgid "inline clone is forced to output" msgstr "" -#: cgraph.c:3426 +#: cgraph.c:3437 #, gcc-internal-format msgid "calls_comdat_local is set outside of a comdat group" msgstr "" -#: cgraph.c:3431 +#: cgraph.c:3442 #, gcc-internal-format msgid "invalid calls_comdat_local flag" msgstr "" -#: cgraph.c:3438 +#: cgraph.c:3449 #, gcc-internal-format msgid "malloc attribute should be used for a function that returns a pointer" msgstr "" -#: cgraph.c:3446 +#: cgraph.c:3457 #, gcc-internal-format, gfc-internal-format msgid "aux field set for indirect edge from %s" msgstr "" -#: cgraph.c:3452 cgraph.c:3512 +#: cgraph.c:3463 cgraph.c:3523 #, gcc-internal-format msgid "edge count is not compatible with function count" msgstr "" -#: cgraph.c:3460 +#: cgraph.c:3471 #, gcc-internal-format, gfc-internal-format msgid "An indirect edge from %s is not marked as indirect or has associated indirect_info, the corresponding statement is: " msgstr "" -#: cgraph.c:3468 cgraph.c:3539 +#: cgraph.c:3479 cgraph.c:3550 #, gcc-internal-format msgid "edge has both call_stmt and lto_stmt_uid set" msgstr "" -#: cgraph.c:3480 +#: cgraph.c:3491 #, gcc-internal-format, gfc-internal-format msgid "comdat-local function called by %s outside its comdat" msgstr "" -#: cgraph.c:3490 +#: cgraph.c:3501 #, gcc-internal-format msgid "inlined_to pointer is wrong" msgstr "" -#: cgraph.c:3495 +#: cgraph.c:3506 #, gcc-internal-format msgid "multiple inline callers" msgstr "" -#: cgraph.c:3502 +#: cgraph.c:3513 #, gcc-internal-format msgid "inlined_to pointer set for noninline callers" msgstr "" -#: cgraph.c:3529 +#: cgraph.c:3540 #, gcc-internal-format msgid "caller edge count does not match BB count" msgstr "" -#: cgraph.c:3560 +#: cgraph.c:3571 #, gcc-internal-format msgid "indirect call count does not match BB count" msgstr "" -#: cgraph.c:3577 +#: cgraph.c:3588 #, gcc-internal-format msgid "reference has both stmt and lto_stmt_uid set" msgstr "" -#: cgraph.c:3588 +#: cgraph.c:3599 #, gcc-internal-format msgid "inlined_to pointer is set but no predecessors found" msgstr "" -#: cgraph.c:3593 +#: cgraph.c:3604 #, gcc-internal-format msgid "inlined_to pointer refers to itself" msgstr "" -#: cgraph.c:3604 +#: cgraph.c:3615 #, gcc-internal-format msgid "cgraph_node has wrong clone_of" msgstr "" -#: cgraph.c:3617 +#: cgraph.c:3628 #, gcc-internal-format msgid "cgraph_node has wrong clone list" msgstr "" -#: cgraph.c:3623 +#: cgraph.c:3634 #, gcc-internal-format msgid "cgraph_node is in clone list but it is not clone" msgstr "" -#: cgraph.c:3628 +#: cgraph.c:3639 #, gcc-internal-format msgid "cgraph_node has wrong prev_clone pointer" msgstr "" -#: cgraph.c:3633 +#: cgraph.c:3644 #, gcc-internal-format msgid "double linked list of clones corrupted" msgstr "" -#: cgraph.c:3645 +#: cgraph.c:3656 #, gcc-internal-format msgid "Alias has call edges" msgstr "" -#: cgraph.c:3651 +#: cgraph.c:3662 #, gcc-internal-format msgid "Alias has non-alias reference" msgstr "" -#: cgraph.c:3656 +#: cgraph.c:3667 #, gcc-internal-format msgid "Alias has more than one alias reference" msgstr "" -#: cgraph.c:3663 +#: cgraph.c:3674 #, gcc-internal-format msgid "Analyzed alias has no reference" msgstr "" -#: cgraph.c:3672 +#: cgraph.c:3683 #, gcc-internal-format msgid "No edge out of thunk node" msgstr "" -#: cgraph.c:3677 +#: cgraph.c:3688 #, gcc-internal-format msgid "More than one edge out of thunk node" msgstr "" -#: cgraph.c:3682 +#: cgraph.c:3693 #, gcc-internal-format msgid "Thunk is not supposed to have body" msgstr "" -#: cgraph.c:3716 +#: cgraph.c:3727 #, gcc-internal-format msgid "shared call_stmt:" msgstr "" -#: cgraph.c:3724 +#: cgraph.c:3735 #, fuzzy, gcc-internal-format msgid "edge points to wrong declaration:" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cgraph.c:3733 +#: cgraph.c:3744 #, gcc-internal-format msgid "an indirect edge with unknown callee corresponding to a call_stmt with a known declaration:" msgstr "" -#: cgraph.c:3743 +#: cgraph.c:3754 #, gcc-internal-format msgid "missing callgraph edge for call stmt:" msgstr "" -#: cgraph.c:3753 +#: cgraph.c:3764 #, gcc-internal-format msgid "reference to dead statement" msgstr "" -#: cgraph.c:3766 +#: cgraph.c:3777 #, gcc-internal-format, gfc-internal-format msgid "edge %s->%s has no corresponding call_stmt" msgstr "" -#: cgraph.c:3778 +#: cgraph.c:3789 #, gcc-internal-format, gfc-internal-format msgid "an indirect edge from %s has no corresponding call_stmt" msgstr "" -#: cgraph.c:3797 cgraph.c:3810 +#: cgraph.c:3808 cgraph.c:3821 #, gcc-internal-format msgid "missing origin for a node in a nested list" msgstr "" -#: cgraph.c:3802 +#: cgraph.c:3813 #, gcc-internal-format msgid "origin points to a different parent" msgstr "" -#: cgraph.c:3818 +#: cgraph.c:3829 #, gcc-internal-format msgid "verify_cgraph_node failed" msgstr "" -#: cgraph.c:3940 varpool.c:304 +#: cgraph.c:3951 varpool.c:304 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "argument to `-%s' is missing" msgid "%s: section %s.%d is missing" @@ -23242,13 +23252,13 @@ msgid "% attribute ignored because variable is initialized" msgstr "" #. include_self= -#: cgraphunit.c:1082 c/c-decl.c:12107 +#: cgraphunit.c:1082 c/c-decl.c:12106 #, fuzzy, gcc-internal-format #| msgid "label `%s' used but not defined" msgid "%q+F used but never defined" msgstr "адмеціна `%s' выкарыстоўвываецца, але ня вызначана" -#: cgraphunit.c:1084 c/c-decl.c:12117 +#: cgraphunit.c:1084 c/c-decl.c:12116 #, gcc-internal-format msgid "%q+F declared % but never defined" msgstr "" @@ -23322,7 +23332,7 @@ msgstr "памер вяртаемага значэння \"%s\" %u байт" msgid "size of return value of %q+D is larger than %wu bytes" msgstr "памер вяртаемага значэння \"%s\" больш чым %d байт" -#: cgraphunit.c:2394 +#: cgraphunit.c:2390 #, gcc-internal-format msgid "nodes with unreleased memory found" msgstr "" @@ -23738,12 +23748,12 @@ msgstr "" msgid "multiple EH personalities are supported only with assemblers supporting %<.cfi_personality%> directive" msgstr "" -#: dwarf2out.c:11050 +#: dwarf2out.c:11059 #, gcc-internal-format msgid "%<-gdwarf-6%> is output as version 5 with incompatibilities" msgstr "" -#: dwarf2out.c:14644 +#: dwarf2out.c:14793 #, gcc-internal-format, gfc-internal-format msgid "non-delegitimized UNSPEC %s (%d) found in variable location" msgstr "" @@ -23763,7 +23773,7 @@ msgstr "" msgid "internal consistency failure" msgstr "унутраная памылка" -#: emit-rtl.c:4038 +#: emit-rtl.c:4039 #, gcc-internal-format msgid "ICE: emit_insn used where emit_jump_insn needed:\n" msgstr "" @@ -23896,42 +23906,42 @@ msgstr "не магу знайсці крыніцу %s\n" msgid "large fixed-point constant implicitly truncated to fixed-point type" msgstr "" -#: fold-const.c:4617 fold-const.c:4627 +#: fold-const.c:4618 fold-const.c:4628 #, gcc-internal-format, gfc-internal-format msgid "comparison is always %d due to width of bit-field" msgstr "" -#: fold-const.c:5981 tree-ssa-reassoc.c:2736 tree-ssa-reassoc.c:3752 +#: fold-const.c:5982 tree-ssa-reassoc.c:2736 tree-ssa-reassoc.c:3752 #, gcc-internal-format msgid "assuming signed overflow does not occur when simplifying range test" msgstr "" -#: fold-const.c:6441 fold-const.c:6455 +#: fold-const.c:6442 fold-const.c:6456 #, gcc-internal-format, gfc-internal-format msgid "comparison is always %d" msgstr "" -#: fold-const.c:6599 +#: fold-const.c:6600 #, gcc-internal-format msgid "% of unmatched not-equal tests is always 1" msgstr "" -#: fold-const.c:6604 +#: fold-const.c:6605 #, gcc-internal-format msgid "% of mutually exclusive equal-tests is always 0" msgstr "" -#: fold-const.c:9811 +#: fold-const.c:9812 #, gcc-internal-format msgid "assuming signed overflow does not occur when reducing constant in comparison" msgstr "" -#: fold-const.c:10211 +#: fold-const.c:10212 #, gcc-internal-format msgid "assuming signed overflow does not occur when combining constants around a comparison" msgstr "" -#: fold-const.c:13468 +#: fold-const.c:13469 #, gcc-internal-format msgid "fold check: original tree changed by fold" msgstr "" @@ -23946,7 +23956,7 @@ msgstr "" msgid "total size of local objects exceeds maximum %wu" msgstr "" -#: function.c:1786 gimplify.c:6328 gimplify.c:6488 +#: function.c:1786 gimplify.c:6329 gimplify.c:6489 #, fuzzy, gcc-internal-format #| msgid "impossible operator '%s'" msgid "impossible constraint in %" @@ -24586,7 +24596,7 @@ msgstr "" msgid "function may return address of local variable" msgstr "" -#: gimple-ssa-isolate-paths.c:409 c/c-typeck.c:10861 +#: gimple-ssa-isolate-paths.c:409 c/c-typeck.c:10921 #, gcc-internal-format msgid "function returns address of local variable" msgstr "" @@ -24952,53 +24962,53 @@ msgstr "" msgid "%Gnull format string" msgstr "" -#: gimple-ssa-warn-alloca.c:288 +#: gimple-ssa-warn-alloca.c:287 msgid "%Guse of %" msgstr "" -#: gimple-ssa-warn-alloca.c:324 +#: gimple-ssa-warn-alloca.c:323 msgid "%Gargument to variable-length array may be too large" msgstr "" -#: gimple-ssa-warn-alloca.c:326 +#: gimple-ssa-warn-alloca.c:325 msgid "%Gargument to % may be too large" msgstr "" -#: gimple-ssa-warn-alloca.c:332 +#: gimple-ssa-warn-alloca.c:331 #, gcc-internal-format msgid "limit is %wu bytes, but argument may be as large as %s" msgstr "" -#: gimple-ssa-warn-alloca.c:344 +#: gimple-ssa-warn-alloca.c:343 msgid "%Gargument to variable-length array is too large" msgstr "" -#: gimple-ssa-warn-alloca.c:346 +#: gimple-ssa-warn-alloca.c:345 msgid "%Gargument to % is too large" msgstr "" -#: gimple-ssa-warn-alloca.c:351 +#: gimple-ssa-warn-alloca.c:350 #, gcc-internal-format msgid "limit is %wu bytes, but argument is %s" msgstr "" -#: gimple-ssa-warn-alloca.c:360 +#: gimple-ssa-warn-alloca.c:359 msgid "%Gunbounded use of variable-length array" msgstr "" -#: gimple-ssa-warn-alloca.c:361 +#: gimple-ssa-warn-alloca.c:360 msgid "%Gunbounded use of %" msgstr "" -#: gimple-ssa-warn-alloca.c:367 +#: gimple-ssa-warn-alloca.c:366 msgid "%Guse of % within a loop" msgstr "" -#: gimple-ssa-warn-alloca.c:372 +#: gimple-ssa-warn-alloca.c:371 msgid "%Gargument to variable-length array is zero" msgstr "" -#: gimple-ssa-warn-alloca.c:374 +#: gimple-ssa-warn-alloca.c:373 msgid "%Gargument to % is zero" msgstr "" @@ -25112,7 +25122,7 @@ msgstr "" msgid "%G%qD pointer overflow between offset %s and size %s accessing array %qD with type %qT" msgstr "" -#: gimple-ssa-warn-restrict.c:1773 c-family/c-warn.c:3734 +#: gimple-ssa-warn-restrict.c:1773 c-family/c-warn.c:3735 #, fuzzy, gcc-internal-format msgid "array %qD declared here" msgstr "тып параметра \"%s\" не аб'яўлены" @@ -25138,11 +25148,11 @@ msgid "%G%qD offset %s is out of the bounds of object %qD with type %qT" msgstr "" #: gimple-ssa-warn-restrict.c:1818 tree-ssa-uninit.c:586 tree-ssa-uninit.c:664 -#: c/c-decl.c:3873 c/c-decl.c:4146 c/c-typeck.c:8868 cp/class.c:1437 -#: cp/class.c:3253 cp/constexpr.c:956 cp/decl.c:4209 cp/decl.c:11926 -#: cp/decl.c:12405 cp/decl.c:12414 cp/friend.c:386 cp/friend.c:396 -#: cp/init.c:2665 cp/parser.c:3434 cp/parser.c:3580 cp/parser.c:3631 -#: cp/parser.c:6768 cp/parser.c:23234 +#: c/c-decl.c:3872 c/c-decl.c:4145 c/c-typeck.c:8928 cp/class.c:1444 +#: cp/class.c:3260 cp/constexpr.c:957 cp/decl.c:4197 cp/decl.c:11944 +#: cp/decl.c:12423 cp/decl.c:12432 cp/friend.c:386 cp/friend.c:396 +#: cp/init.c:2672 cp/parser.c:3434 cp/parser.c:3580 cp/parser.c:3631 +#: cp/parser.c:6768 cp/parser.c:23271 #, fuzzy, gcc-internal-format msgid "%qD declared here" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" @@ -25217,308 +25227,308 @@ msgstr "" msgid "using result of function returning %" msgstr "" -#: gimplify.c:6329 +#: gimplify.c:6330 #, gcc-internal-format, gfc-internal-format msgid "non-memory output %d must stay in memory" msgstr "" -#: gimplify.c:6342 +#: gimplify.c:6343 #, gcc-internal-format msgid "invalid lvalue in % output %d" msgstr "" -#: gimplify.c:6489 +#: gimplify.c:6490 #, gcc-internal-format, gfc-internal-format msgid "non-memory input %d must stay in memory" msgstr "" -#: gimplify.c:6529 gimplify.c:6538 +#: gimplify.c:6530 gimplify.c:6539 #, gcc-internal-format, gfc-internal-format msgid "memory input %d is not directly addressable" msgstr "" -#: gimplify.c:7152 +#: gimplify.c:7153 #, gcc-internal-format msgid "threadprivate variable %qE used in a region with % clause" msgstr "" -#: gimplify.c:7154 +#: gimplify.c:7155 #, gcc-internal-format msgid "enclosing region" msgstr "" -#: gimplify.c:7158 +#: gimplify.c:7159 #, gcc-internal-format msgid "threadprivate variable %qE used in target region" msgstr "" -#: gimplify.c:7160 +#: gimplify.c:7161 #, gcc-internal-format msgid "enclosing target region" msgstr "" -#: gimplify.c:7173 +#: gimplify.c:7174 #, gcc-internal-format msgid "threadprivate variable %qE used in untied task" msgstr "" -#: gimplify.c:7175 +#: gimplify.c:7176 #, gcc-internal-format msgid "enclosing task" msgstr "" -#: gimplify.c:7260 +#: gimplify.c:7261 #, gcc-internal-format msgid "%qE not specified in enclosing %qs" msgstr "" -#: gimplify.c:7262 +#: gimplify.c:7263 #, gcc-internal-format msgid "enclosing %qs" msgstr "" -#: gimplify.c:7405 +#: gimplify.c:7406 #, gcc-internal-format msgid "%qE not specified in enclosing OpenACC %qs construct" msgstr "" -#: gimplify.c:7407 +#: gimplify.c:7408 #, gcc-internal-format msgid "enclosing OpenACC %qs construct" msgstr "" -#: gimplify.c:7468 +#: gimplify.c:7469 #, gcc-internal-format msgid "%qE with % clause used in % function" msgstr "" -#: gimplify.c:7476 +#: gimplify.c:7477 #, gcc-internal-format msgid "%qE requires a % directive for use in a % function" msgstr "" -#: gimplify.c:7541 +#: gimplify.c:7542 #, gcc-internal-format msgid "%qE not specified in enclosing %" msgstr "" -#: gimplify.c:7543 +#: gimplify.c:7544 #, gcc-internal-format msgid "enclosing %" msgstr "" -#: gimplify.c:7573 gimplify.c:9014 +#: gimplify.c:7574 gimplify.c:9015 #, gcc-internal-format msgid "variable %qE declared in enclosing % region" msgstr "" -#: gimplify.c:7594 +#: gimplify.c:7595 #, gcc-internal-format msgid "%qD referenced in target region does not have a mappable type" msgstr "" -#: gimplify.c:7725 +#: gimplify.c:7726 #, gcc-internal-format msgid "iteration variable %qE is predetermined linear" msgstr "" -#: gimplify.c:7728 +#: gimplify.c:7729 #, gcc-internal-format msgid "iteration variable %qE should be private" msgstr "" -#: gimplify.c:7742 +#: gimplify.c:7743 #, gcc-internal-format msgid "iteration variable %qE should not be firstprivate" msgstr "" -#: gimplify.c:7745 +#: gimplify.c:7746 #, gcc-internal-format msgid "iteration variable %qE should not be reduction" msgstr "" -#: gimplify.c:7748 +#: gimplify.c:7749 #, gcc-internal-format msgid "iteration variable %qE should not be linear" msgstr "" -#: gimplify.c:8615 gimplify.c:8621 +#: gimplify.c:8616 gimplify.c:8622 #, gcc-internal-format msgid "conditional % clause on %qs construct" msgstr "" -#: gimplify.c:8638 +#: gimplify.c:8639 #, gcc-internal-format msgid "non-scalar variable %qD in conditional % clause" msgstr "" -#: gimplify.c:8727 +#: gimplify.c:8728 #, gcc-internal-format msgid "% reduction modifier on a construct with a % clause" msgstr "" -#: gimplify.c:8735 gimplify.c:12857 +#: gimplify.c:8736 gimplify.c:12858 #, gcc-internal-format msgid "invalid % reduction modifier on construct other than %, %qs or %" msgstr "" -#: gimplify.c:8746 gimplify.c:8752 gimplify.c:8758 gimplify.c:8764 -#: gimplify.c:12850 +#: gimplify.c:8747 gimplify.c:8753 gimplify.c:8759 gimplify.c:8765 +#: gimplify.c:12851 #, gcc-internal-format msgid "% % clause on %qs construct" msgstr "" -#: gimplify.c:8858 +#: gimplify.c:8859 #, gcc-internal-format msgid "% clause for variable other than loop iterator specified on construct combined with %" msgstr "" -#: gimplify.c:9184 +#: gimplify.c:9185 #, gcc-internal-format msgid "mapping field %qE of variable length structure" msgstr "" -#: gimplify.c:9366 +#: gimplify.c:9367 #, gcc-internal-format msgid "%qE appears more than once in map clauses" msgstr "" -#: gimplify.c:9728 +#: gimplify.c:9729 #, gcc-internal-format msgid "copyprivate variable %qE is not threadprivate or private in outer context" msgstr "" -#: gimplify.c:9785 +#: gimplify.c:9786 #, gcc-internal-format msgid "%s variable %qE is private in outer context" msgstr "" -#: gimplify.c:9817 +#: gimplify.c:9818 #, gcc-internal-format msgid "expected %qs % clause modifier rather than %qs" msgstr "" -#: gimplify.c:10017 +#: gimplify.c:10018 #, gcc-internal-format msgid "%qD specified in %qs clause but not in % % clause on the containing construct" msgstr "" -#: gimplify.c:10227 +#: gimplify.c:10228 #, gcc-internal-format msgid "%<_Atomic%> %qD in implicit % clause" msgstr "" -#: gimplify.c:10281 +#: gimplify.c:10282 #, gcc-internal-format msgid "%<_Atomic%> %qD in implicit % clause on % construct" msgstr "" -#: gimplify.c:10530 +#: gimplify.c:10531 #, gcc-internal-format msgid "%<_Atomic%> %qD in % clause on % construct" msgstr "" -#: gimplify.c:10591 +#: gimplify.c:10592 #, gcc-internal-format msgid "same variable used in % and % clauses on % construct" msgstr "" -#: gimplify.c:10682 +#: gimplify.c:10683 #, gcc-internal-format msgid "incompatible data clause with reduction on %qE; promoting to %" msgstr "" -#: gimplify.c:10829 +#: gimplify.c:10830 #, gcc-internal-format msgid "%qD specified in % % clause but not in % directive clause" msgstr "" -#: gimplify.c:10848 +#: gimplify.c:10849 #, fuzzy, gcc-internal-format msgid "invalid private reduction on %qE" msgstr "Нерэчаіснае абвяшчэнне" -#: gimplify.c:10985 +#: gimplify.c:10986 #, gcc-internal-format msgid "% % clause used together with % clause for a variable other than loop iterator" msgstr "" -#: gimplify.c:11319 +#: gimplify.c:11320 #, gcc-internal-format msgid "% kind in % clause on a % construct" msgstr "" -#: gimplify.c:11578 gimplify.c:11582 gimplify.c:11591 +#: gimplify.c:11579 gimplify.c:11583 gimplify.c:11592 #, gcc-internal-format msgid "%qs clause may not appear on non-rectangular %qs" msgstr "" -#: gimplify.c:11823 gimplify.c:12082 +#: gimplify.c:11824 gimplify.c:12083 #, gcc-internal-format msgid "conditional % on loop iterator %qD ignored" msgstr "" -#: gimplify.c:12788 +#: gimplify.c:12789 #, gcc-internal-format msgid "% clause not specified on a % construct not nested inside another OpenMP construct" msgstr "" -#: gimplify.c:12812 +#: gimplify.c:12813 #, gcc-internal-format msgid "% on a % construct nested inside % construct" msgstr "" -#: gimplify.c:12832 +#: gimplify.c:12833 #, gcc-internal-format msgid "% on a % region not strictly nested inside of a % region" msgstr "" -#: gimplify.c:12885 +#: gimplify.c:12886 #, gcc-internal-format msgid "% clause on a % construct refers to a variable %qD which is not the loop iterator" msgstr "" -#: gimplify.c:13748 omp-low.c:3472 +#: gimplify.c:13749 omp-low.c:3472 #, gcc-internal-format msgid "% construct with % clause must be closely nested inside a loop with % clause with a parameter" msgstr "" -#: gimplify.c:13766 +#: gimplify.c:13767 #, gcc-internal-format msgid "variable %qE is not an iteration of outermost loop %d, expected %qE" msgstr "" -#: gimplify.c:13779 +#: gimplify.c:13780 #, gcc-internal-format msgid "number of variables in % clause with % modifier does not match number of iteration variables" msgstr "" -#: gimplify.c:13792 +#: gimplify.c:13793 #, gcc-internal-format msgid "more than one % clause with % modifier on an % construct" msgstr "" -#: gimplify.c:13803 +#: gimplify.c:13804 #, gcc-internal-format msgid "% clause with % modifier specified together with % clauses with % modifier on the same construct" msgstr "" -#: gimplify.c:15080 +#: gimplify.c:15082 #, gcc-internal-format msgid "gimplification failed" msgstr "" -#: gimplify.c:15613 +#: gimplify.c:15615 #, gcc-internal-format msgid "%qT is promoted to %qT when passed through %<...%>" msgstr "" -#: gimplify.c:15618 +#: gimplify.c:15620 #, gcc-internal-format msgid "(so you should pass %qT not %qT to %)" msgstr "" -#: gimplify.c:15625 +#: gimplify.c:15627 #, gcc-internal-format msgid "if this code is reached, the program will abort" msgstr "" @@ -25969,22 +25979,22 @@ msgstr "" msgid "Function %s, parameter %u, is used but does not have any certain IPA-SRA access" msgstr "" -#: ira.c:2317 ira.c:2339 +#: ira.c:2318 ira.c:2340 #, fuzzy, gcc-internal-format msgid "%s cannot be used in % here" msgstr "\"%s\" звычайна функцыя" -#: ira.c:5920 +#: ira.c:5921 #, gcc-internal-format msgid "frame pointer required, but reserved" msgstr "" -#: ira.c:5921 +#: ira.c:5922 #, gcc-internal-format msgid "for %qD" msgstr "" -#: ira.c:5937 +#: ira.c:5938 #, gcc-internal-format msgid "frame size too large for reliable stack checking" msgstr "" @@ -26004,12 +26014,12 @@ msgstr "" msgid "unable to find a register to spill" msgstr "Не выкарыстоўваць рэгістра sb" -#: lra-constraints.c:4135 reload.c:3863 reload.c:4118 +#: lra-constraints.c:4140 reload.c:3869 reload.c:4124 #, gcc-internal-format msgid "inconsistent operand constraints in an %" msgstr "" -#: lra-constraints.c:5091 +#: lra-constraints.c:5097 #, gcc-internal-format, gfc-internal-format msgid "maximum number of generated reload insns per insn achieved (%d)" msgstr "" @@ -26726,12 +26736,12 @@ msgstr "памер \"%s\" больш чам %d байт" msgid "unrecognized argument in option %qs" msgstr "нераспазнаны выбар \"-%s\"" -#: opts-common.c:1366 config/i386/i386-options.c:1551 +#: opts-common.c:1366 config/i386/i386-options.c:1554 #, fuzzy, gcc-internal-format msgid "valid arguments to %qs are: %s; did you mean %qs?" msgstr "нявернае выкарыстанне \"restict\"" -#: opts-common.c:1369 config/i386/i386-options.c:1554 +#: opts-common.c:1369 config/i386/i386-options.c:1557 #, fuzzy, gcc-internal-format msgid "valid arguments to %qs are: %s" msgstr "нявернае выкарыстанне \"restict\"" @@ -26859,7 +26869,7 @@ msgstr "" msgid "section anchors must be disabled when toplevel reorder is disabled" msgstr "" -#: opts.c:1002 config/darwin.c:3317 +#: opts.c:1002 config/darwin.c:3312 #, gcc-internal-format msgid "%<-freorder-blocks-and-partition%> does not work with exceptions on this architecture" msgstr "" @@ -27371,22 +27381,22 @@ msgstr "" msgid "output operand %d must use %<&%> constraint" msgstr "" -#: regcprop.c:1229 +#: regcprop.c:1230 #, gcc-internal-format msgid "%qs: [%u] bad % for empty chain (%u)" msgstr "" -#: regcprop.c:1241 +#: regcprop.c:1242 #, gcc-internal-format msgid "%qs: loop in % chain (%u)" msgstr "" -#: regcprop.c:1244 +#: regcprop.c:1245 #, gcc-internal-format msgid "%qs: [%u] bad % (%u)" msgstr "" -#: regcprop.c:1256 +#: regcprop.c:1257 #, gcc-internal-format msgid "%qs: [%u] non-empty register in chain (%s %u %i)" msgstr "" @@ -27448,12 +27458,12 @@ msgstr "" msgid "impossible register constraint in %" msgstr "" -#: reload.c:2687 +#: reload.c:2692 #, gcc-internal-format msgid "the target does not support % with outputs in %" msgstr "" -#: reload.c:3720 +#: reload.c:3726 #, gcc-internal-format msgid "%<&%> constraint used with no register class" msgstr "" @@ -27483,52 +27493,52 @@ msgstr "" msgid "output operand is constant in %" msgstr "" -#: rtl.c:850 +#: rtl.c:860 #, gcc-internal-format, gfc-internal-format msgid "RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d" msgstr "" -#: rtl.c:860 +#: rtl.c:870 #, gcc-internal-format, gfc-internal-format msgid "RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d" msgstr "" -#: rtl.c:870 +#: rtl.c:880 #, gcc-internal-format, gfc-internal-format msgid "RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d" msgstr "" -#: rtl.c:879 +#: rtl.c:889 #, gcc-internal-format, gfc-internal-format msgid "RTL check: expected code '%s', have '%s' in %s, at %s:%d" msgstr "" -#: rtl.c:889 +#: rtl.c:899 #, gcc-internal-format, gfc-internal-format msgid "RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d" msgstr "" -#: rtl.c:900 +#: rtl.c:910 #, gcc-internal-format, gfc-internal-format msgid "RTL check: expected code '%s', '%s' or '%s', have '%s' in %s, at %s:%d" msgstr "" -#: rtl.c:927 +#: rtl.c:937 #, gcc-internal-format, gfc-internal-format msgid "RTL check: attempt to treat non-block symbol as a block symbol in %s, at %s:%d" msgstr "" -#: rtl.c:937 +#: rtl.c:947 #, gcc-internal-format, gfc-internal-format msgid "RTL check: access of hwi elt %d of vector with last elt %d in %s, at %s:%d" msgstr "" -#: rtl.c:947 +#: rtl.c:957 #, gcc-internal-format, gfc-internal-format msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d" msgstr "" -#: rtl.c:958 +#: rtl.c:968 #, gcc-internal-format, gfc-internal-format msgid "RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d" msgstr "" @@ -27574,22 +27584,22 @@ msgstr "" msgid "invalid punctuation %qc in constraint" msgstr "`%E' - нерэчаісная нязьменная тыпу string" -#: stmt.c:430 +#: stmt.c:431 #, gcc-internal-format msgid "matching constraint does not allow a register" msgstr "" -#: stmt.c:524 +#: stmt.c:525 #, fuzzy, gcc-internal-format msgid "duplicate % operand name %qs" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: stmt.c:621 +#: stmt.c:622 #, gcc-internal-format msgid "missing close brace for named operand" msgstr "" -#: stmt.c:650 +#: stmt.c:651 #, fuzzy, gcc-internal-format msgid "undefined named operand %qs" msgstr "нераспазнаны аператар %s" @@ -28279,9 +28289,9 @@ msgstr "нерэчаісны %%-код" #: tree-cfg.c:3186 tree-cfg.c:3195 tree-cfg.c:3212 tree-cfg.c:3849 #: tree-cfg.c:3878 tree-cfg.c:3895 tree-cfg.c:3916 tree-cfg.c:3964 #: tree-cfg.c:3985 tree-cfg.c:4039 tree-cfg.c:4063 tree-cfg.c:4099 -#: tree-cfg.c:4120 tree-cfg.c:4152 tree-cfg.c:4228 tree-cfg.c:4260 -#: tree-cfg.c:4272 tree-cfg.c:4331 tree-cfg.c:4356 tree-cfg.c:4429 -#: tree-cfg.c:4507 +#: tree-cfg.c:4120 tree-cfg.c:4152 tree-cfg.c:4228 tree-cfg.c:4262 +#: tree-cfg.c:4274 tree-cfg.c:4333 tree-cfg.c:4358 tree-cfg.c:4431 +#: tree-cfg.c:4509 #, gcc-internal-format msgid "type mismatch in %qs" msgstr "" @@ -28319,7 +28329,7 @@ msgstr "нерэчаісны %%f аперанд" msgid "invalid clique in %qs" msgstr "Нерэчаісны выбар %s" -#: tree-cfg.c:3305 tree-cfg.c:4519 +#: tree-cfg.c:3305 tree-cfg.c:4521 #, gcc-internal-format msgid "%qs in gimple IL" msgstr "" @@ -28525,367 +28535,367 @@ msgstr "нерэчаісны %%-код" msgid "the first argument of a %qs must be of a boolean vector type of the same number of elements as the result" msgstr "" -#: tree-cfg.c:4284 tree-cfg.c:4343 +#: tree-cfg.c:4286 tree-cfg.c:4345 #, gcc-internal-format msgid "vector types expected in %qs" msgstr "" -#: tree-cfg.c:4299 +#: tree-cfg.c:4301 #, gcc-internal-format msgid "vectors with different element number found in %qs" msgstr "" -#: tree-cfg.c:4315 +#: tree-cfg.c:4317 #, fuzzy, gcc-internal-format msgid "invalid mask type in %qs" msgstr "Нерэчаісны выбар %s" -#: tree-cfg.c:4375 +#: tree-cfg.c:4377 #, gcc-internal-format msgid "not allowed type combination in %qs" msgstr "" -#: tree-cfg.c:4384 +#: tree-cfg.c:4386 #, fuzzy, gcc-internal-format msgid "invalid position or size in %qs" msgstr "Нерэчаісны выбар %s" -#: tree-cfg.c:4390 +#: tree-cfg.c:4392 #, gcc-internal-format msgid "%qs into non-mode-precision operand" msgstr "" -#: tree-cfg.c:4400 +#: tree-cfg.c:4402 #, gcc-internal-format msgid "insertion out of range in %qs" msgstr "" -#: tree-cfg.c:4410 +#: tree-cfg.c:4412 #, gcc-internal-format msgid "%qs not at element boundary" msgstr "" -#: tree-cfg.c:4465 +#: tree-cfg.c:4467 #, gcc-internal-format msgid "non-trivial conversion in %qs" msgstr "" -#: tree-cfg.c:4474 +#: tree-cfg.c:4476 #, gcc-internal-format msgid "%qs LHS in clobber statement" msgstr "" -#: tree-cfg.c:4493 +#: tree-cfg.c:4495 #, fuzzy, gcc-internal-format msgid "invalid operand in %qs" msgstr "нерэчаісны %%-код" -#: tree-cfg.c:4534 tree-cfg.c:4560 +#: tree-cfg.c:4536 tree-cfg.c:4562 #, fuzzy, gcc-internal-format #| msgid "invalid register name for `%s'" msgid "invalid RHS for gimple memory store: %qs" msgstr "нерэчаісная назва рэгістра `%s'" -#: tree-cfg.c:4594 tree-cfg.c:4612 +#: tree-cfg.c:4596 tree-cfg.c:4614 #, gcc-internal-format msgid "incorrect type of vector %qs elements" msgstr "" -#: tree-cfg.c:4603 tree-cfg.c:4620 +#: tree-cfg.c:4605 tree-cfg.c:4622 #, gcc-internal-format msgid "incorrect number of vector %qs elements" msgstr "" -#: tree-cfg.c:4628 +#: tree-cfg.c:4630 #, gcc-internal-format msgid "incorrect type of vector CONSTRUCTOR elements" msgstr "" -#: tree-cfg.c:4637 +#: tree-cfg.c:4639 #, gcc-internal-format msgid "vector %qs with non-NULL element index" msgstr "" -#: tree-cfg.c:4644 +#: tree-cfg.c:4646 #, gcc-internal-format msgid "vector %qs element is not a GIMPLE value" msgstr "" -#: tree-cfg.c:4653 +#: tree-cfg.c:4655 #, gcc-internal-format msgid "non-vector %qs with elements" msgstr "" -#: tree-cfg.c:4664 +#: tree-cfg.c:4666 #, gcc-internal-format msgid "%qs with an always-false condition" msgstr "" -#: tree-cfg.c:4723 +#: tree-cfg.c:4725 #, fuzzy, gcc-internal-format msgid "invalid operand in return statement" msgstr "нерэчаісны %%-код" -#: tree-cfg.c:4738 c/gimple-parser.c:2422 +#: tree-cfg.c:4740 c/gimple-parser.c:2422 #, gcc-internal-format msgid "invalid conversion in return statement" msgstr "" -#: tree-cfg.c:4762 +#: tree-cfg.c:4764 #, gcc-internal-format msgid "goto destination is neither a label nor a pointer" msgstr "" -#: tree-cfg.c:4781 +#: tree-cfg.c:4783 #, fuzzy, gcc-internal-format msgid "invalid operand to switch statement" msgstr "нерэчаісны %%-код" -#: tree-cfg.c:4789 +#: tree-cfg.c:4791 #, gcc-internal-format msgid "non-integral type switch statement" msgstr "" -#: tree-cfg.c:4799 +#: tree-cfg.c:4801 #, gcc-internal-format msgid "invalid default case label in switch statement" msgstr "" -#: tree-cfg.c:4811 +#: tree-cfg.c:4813 #, gcc-internal-format msgid "invalid %" msgstr "" -#: tree-cfg.c:4817 +#: tree-cfg.c:4819 #, gcc-internal-format msgid "invalid case label in switch statement" msgstr "" -#: tree-cfg.c:4824 +#: tree-cfg.c:4826 #, fuzzy, gcc-internal-format msgid "invalid case range in switch statement" msgstr "нявернае выкарыстанне \"restict\"" -#: tree-cfg.c:4834 +#: tree-cfg.c:4836 #, gcc-internal-format msgid "type precision mismatch in switch statement" msgstr "" -#: tree-cfg.c:4841 +#: tree-cfg.c:4843 #, gcc-internal-format msgid "type mismatch for case label in switch statement" msgstr "" -#: tree-cfg.c:4850 +#: tree-cfg.c:4852 #, gcc-internal-format msgid "case labels not sorted in switch statement" msgstr "" -#: tree-cfg.c:4893 +#: tree-cfg.c:4895 #, fuzzy, gcc-internal-format msgid "label context is not the current function declaration" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: tree-cfg.c:4902 +#: tree-cfg.c:4904 #, gcc-internal-format msgid "incorrect entry in %" msgstr "" -#: tree-cfg.c:4912 +#: tree-cfg.c:4914 #, gcc-internal-format msgid "incorrect setting of landing pad number" msgstr "" -#: tree-cfg.c:4928 +#: tree-cfg.c:4930 #, fuzzy, gcc-internal-format msgid "invalid comparison code in gimple cond" msgstr "нерэчаісны %%-код" -#: tree-cfg.c:4936 +#: tree-cfg.c:4938 #, gcc-internal-format msgid "invalid labels in gimple cond" msgstr "" -#: tree-cfg.c:5019 tree-cfg.c:5028 +#: tree-cfg.c:5021 tree-cfg.c:5030 #, fuzzy, gcc-internal-format #| msgid "invalid %%Q value" msgid "invalid % result" msgstr "дрэннае %%Q значэнне" -#: tree-cfg.c:5038 +#: tree-cfg.c:5040 #, gcc-internal-format msgid "missing % def" msgstr "" -#: tree-cfg.c:5052 +#: tree-cfg.c:5054 #, fuzzy, gcc-internal-format #| msgid "invalid %%Q value" msgid "invalid % argument" msgstr "дрэннае %%Q значэнне" -#: tree-cfg.c:5059 +#: tree-cfg.c:5061 #, gcc-internal-format msgid "incompatible types in % argument %u" msgstr "" -#: tree-cfg.c:5157 +#: tree-cfg.c:5159 #, gcc-internal-format msgid "% failed" msgstr "" -#: tree-cfg.c:5214 +#: tree-cfg.c:5216 #, gcc-internal-format msgid "dead statement in EH table" msgstr "" -#: tree-cfg.c:5230 +#: tree-cfg.c:5232 #, gcc-internal-format msgid "location references block not in block tree" msgstr "" -#: tree-cfg.c:5279 +#: tree-cfg.c:5281 #, fuzzy, gcc-internal-format msgid "local declaration from a different function" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: tree-cfg.c:5382 +#: tree-cfg.c:5384 #, gcc-internal-format msgid "gimple_bb (phi) is set to a wrong basic block" msgstr "" -#: tree-cfg.c:5391 +#: tree-cfg.c:5393 #, gcc-internal-format msgid "PHI node with location" msgstr "" -#: tree-cfg.c:5402 tree-cfg.c:5449 +#: tree-cfg.c:5404 tree-cfg.c:5451 #, gcc-internal-format msgid "incorrect sharing of tree nodes" msgstr "" -#: tree-cfg.c:5410 +#: tree-cfg.c:5412 #, gcc-internal-format msgid "virtual PHI with argument locations" msgstr "" -#: tree-cfg.c:5437 +#: tree-cfg.c:5439 #, gcc-internal-format msgid "gimple_bb (stmt) is set to a wrong basic block" msgstr "" -#: tree-cfg.c:5477 +#: tree-cfg.c:5479 #, gcc-internal-format msgid "statement marked for throw, but doesn%'t" msgstr "" -#: tree-cfg.c:5483 +#: tree-cfg.c:5485 #, gcc-internal-format msgid "statement marked for throw in middle of block" msgstr "" -#: tree-cfg.c:5505 +#: tree-cfg.c:5507 #, gcc-internal-format msgid "verify_gimple failed" msgstr "" -#: tree-cfg.c:5527 +#: tree-cfg.c:5529 #, gcc-internal-format msgid "ENTRY_BLOCK has IL associated with it" msgstr "" -#: tree-cfg.c:5534 +#: tree-cfg.c:5536 #, gcc-internal-format msgid "EXIT_BLOCK has IL associated with it" msgstr "" -#: tree-cfg.c:5541 +#: tree-cfg.c:5543 #, gcc-internal-format, gfc-internal-format msgid "fallthru to exit from bb %d" msgstr "" -#: tree-cfg.c:5565 +#: tree-cfg.c:5567 #, gcc-internal-format msgid "nonlocal label " msgstr "" -#: tree-cfg.c:5574 +#: tree-cfg.c:5576 #, gcc-internal-format msgid "EH landing pad label " msgstr "" -#: tree-cfg.c:5583 tree-cfg.c:5592 tree-cfg.c:5617 +#: tree-cfg.c:5585 tree-cfg.c:5594 tree-cfg.c:5619 #, gcc-internal-format msgid "label " msgstr "" -#: tree-cfg.c:5607 +#: tree-cfg.c:5609 #, gcc-internal-format, gfc-internal-format msgid "control flow in the middle of basic block %d" msgstr "" -#: tree-cfg.c:5640 +#: tree-cfg.c:5642 #, gcc-internal-format, gfc-internal-format msgid "fallthru edge after a control statement in bb %d" msgstr "" -#: tree-cfg.c:5653 +#: tree-cfg.c:5655 #, gcc-internal-format, gfc-internal-format msgid "true/false edge after a non-GIMPLE_COND in bb %d" msgstr "" -#: tree-cfg.c:5676 tree-cfg.c:5698 tree-cfg.c:5715 tree-cfg.c:5784 +#: tree-cfg.c:5678 tree-cfg.c:5700 tree-cfg.c:5717 tree-cfg.c:5786 #, gcc-internal-format, gfc-internal-format msgid "wrong outgoing edge flags at end of bb %d" msgstr "" -#: tree-cfg.c:5686 +#: tree-cfg.c:5688 #, gcc-internal-format, gfc-internal-format msgid "explicit goto at end of bb %d" msgstr "" -#: tree-cfg.c:5720 +#: tree-cfg.c:5722 #, gcc-internal-format, gfc-internal-format msgid "return edge does not point to exit in bb %d" msgstr "" -#: tree-cfg.c:5750 +#: tree-cfg.c:5752 #, gcc-internal-format msgid "found default case not at the start of case vector" msgstr "" -#: tree-cfg.c:5758 +#: tree-cfg.c:5760 #, fuzzy, gcc-internal-format #| msgid "-pipe is not supported" msgid "case labels not sorted: " msgstr "-pipe не падтрымліваецца" -#: tree-cfg.c:5775 +#: tree-cfg.c:5777 #, gcc-internal-format, gfc-internal-format msgid "extra outgoing edge %d->%d" msgstr "" -#: tree-cfg.c:5798 +#: tree-cfg.c:5800 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "missing field '%s' in '%s'" msgid "missing edge %i->%i" msgstr "прапушчана поле '%s' у '%s'" -#: tree-cfg.c:9473 +#: tree-cfg.c:9475 #, gcc-internal-format msgid "% function does return" msgstr "" -#: tree-cfg.c:9494 tree-cfg.c:9526 +#: tree-cfg.c:9496 tree-cfg.c:9528 #, gcc-internal-format msgid "control reaches end of non-void function" msgstr "" -#: tree-cfg.c:9592 +#: tree-cfg.c:9594 #, gcc-internal-format msgid "ignoring return value of %qD declared with attribute %" msgstr "" -#: tree-cfg.c:9597 cp/cvt.c:1119 +#: tree-cfg.c:9599 cp/cvt.c:1119 #, gcc-internal-format msgid "ignoring return value of function declared with attribute %" msgstr "" @@ -29978,7 +29988,7 @@ msgstr "" msgid "requested alignment for %q+D is greater than implemented alignment of %wu" msgstr "" -#: varasm.c:2284 c/c-decl.c:5451 c/c-parser.c:1660 +#: varasm.c:2284 c/c-decl.c:5450 c/c-parser.c:1660 #, gcc-internal-format msgid "storage size of %q+D isn%'t known" msgstr "" @@ -30139,7 +30149,7 @@ msgstr "" msgid "bytecode stream: tag %s is not in the expected range [%s, %s]" msgstr "" -#: c-family/c-ada-spec.c:2840 +#: c-family/c-ada-spec.c:2843 #, fuzzy, gcc-internal-format #| msgid "unsupported version" msgid "unsupported record layout" @@ -30755,7 +30765,7 @@ msgstr "" msgid "type was previously declared %qE" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-attribs.c:3948 cp/class.c:4749 +#: c-family/c-attribs.c:3948 cp/class.c:4756 #, gcc-internal-format msgid "% may only be specified for a virtual function" msgstr "" @@ -30776,7 +30786,7 @@ msgstr "" msgid "%qE argument is not a function" msgstr "`%D' - гэта ня функцыя," -#: c-family/c-attribs.c:4068 cp/name-lookup.c:6060 +#: c-family/c-attribs.c:4068 cp/name-lookup.c:6077 #, gcc-internal-format msgid "deprecated message is not a string" msgstr "" @@ -31205,12 +31215,12 @@ msgstr "" msgid "the compiler can assume that the address of %qD will always evaluate to %" msgstr "" -#: c-family/c-common.c:3500 cp/semantics.c:823 cp/typeck.c:9569 +#: c-family/c-common.c:3500 cp/semantics.c:842 cp/typeck.c:9576 #, gcc-internal-format msgid "suggest parentheses around assignment used as truth value" msgstr "" -#: c-family/c-common.c:3587 c/c-decl.c:4688 c/c-decl.c:7081 c/c-typeck.c:15429 +#: c-family/c-common.c:3587 c/c-decl.c:4687 c/c-decl.c:7080 c/c-typeck.c:15489 #, fuzzy, gcc-internal-format #| msgid "invalid use of `restrict'" msgid "invalid use of %" @@ -31373,14 +31383,14 @@ msgid "% attribute specified with a parameter" msgstr "" #: c-family/c-common.c:5974 c-family/c-common.c:6804 c-family/c-common.c:6851 -#: c-family/c-common.c:6926 c-family/c-common.c:6999 c/c-typeck.c:3671 +#: c-family/c-common.c:6926 c-family/c-common.c:6999 c/c-typeck.c:3721 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function" msgid "too few arguments to function %qE" msgstr "не хапае аргументаў у функцыі" #: c-family/c-common.c:5979 c-family/c-common.c:6857 c-family/c-common.c:7025 -#: c/c-typeck.c:3535 +#: c/c-typeck.c:3585 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function" msgid "too many arguments to function %qE" @@ -32335,7 +32345,7 @@ msgstr "" msgid "traditional C rejects string constant concatenation" msgstr "" -#: c-family/c-omp.c:116 cp/pt.c:18845 +#: c-family/c-omp.c:116 cp/pt.c:18928 #, gcc-internal-format msgid "%<#pragma omp critical%> with % clause requires a name, except when % is used" msgstr "" @@ -32385,7 +32395,7 @@ msgstr "" msgid "% modifier may not be specified on % construct" msgstr "" -#: c-family/c-omp.c:736 cp/semantics.c:9430 +#: c-family/c-omp.c:736 cp/semantics.c:9458 #, gcc-internal-format msgid "invalid type for iteration variable %qE" msgstr "" @@ -32401,17 +32411,17 @@ msgstr "" msgid "%qE is not initialized" msgstr "прапушчан ініцыялізатар" -#: c-family/c-omp.c:778 cp/semantics.c:9319 +#: c-family/c-omp.c:778 cp/semantics.c:9347 #, gcc-internal-format msgid "missing controlling predicate" msgstr "" -#: c-family/c-omp.c:884 cp/semantics.c:8938 +#: c-family/c-omp.c:884 cp/semantics.c:8966 #, fuzzy, gcc-internal-format msgid "invalid controlling predicate" msgstr "нерэчаісны ініцыялізатар" -#: c-family/c-omp.c:891 cp/semantics.c:9325 +#: c-family/c-omp.c:891 cp/semantics.c:9353 #, fuzzy, gcc-internal-format msgid "missing increment expression" msgstr "аргумент для \"%s\" прапушчан" @@ -32421,7 +32431,7 @@ msgstr "аргумент для \"%s\" прапушчан" msgid "increment is not constant 1 or -1 for % condition" msgstr "" -#: c-family/c-omp.c:1022 cp/semantics.c:9053 +#: c-family/c-omp.c:1022 cp/semantics.c:9081 #, fuzzy, gcc-internal-format msgid "invalid increment expression" msgstr "нерэчаісны ініцыялізатар" @@ -32486,7 +32496,7 @@ msgstr "" msgid "% % clause on construct other than %, %, %, %, %" msgstr "" -#: c-family/c-omp.c:2382 c/c-typeck.c:15242 cp/semantics.c:8581 +#: c-family/c-omp.c:2382 c/c-typeck.c:15302 cp/semantics.c:8609 #, gcc-internal-format msgid "%qD specified in % clause but not in an explicit privatization clause" msgstr "" @@ -33061,8 +33071,8 @@ msgstr "вяртанне" msgid "wrong type argument to %s" msgstr "не хапае аргументаў у функцыі" -#: c-family/c-warn.c:58 c-family/c-warn.c:71 cp/constexpr.c:2949 -#: cp/constexpr.c:6003 +#: c-family/c-warn.c:58 c-family/c-warn.c:71 cp/constexpr.c:3004 +#: cp/constexpr.c:6066 #, gcc-internal-format msgid "overflow in constant expression" msgstr "" @@ -33554,17 +33564,17 @@ msgstr "нехапае аргументаў у функцыі \"%s\"" msgid "function %qD used as % output" msgstr "" -#: c-family/c-warn.c:1858 c/c-typeck.c:4924 +#: c-family/c-warn.c:1858 c/c-typeck.c:4984 #, gcc-internal-format msgid "assignment of read-only location %qE" msgstr "" -#: c-family/c-warn.c:1859 c/c-typeck.c:4927 +#: c-family/c-warn.c:1859 c/c-typeck.c:4987 #, gcc-internal-format msgid "increment of read-only location %qE" msgstr "" -#: c-family/c-warn.c:1860 c/c-typeck.c:4930 +#: c-family/c-warn.c:1860 c/c-typeck.c:4990 #, gcc-internal-format msgid "decrement of read-only location %qE" msgstr "" @@ -33747,8 +33757,8 @@ msgstr "" msgid "% used with length equal to number of elements without multiplication by element size" msgstr "" -#: c-family/c-warn.c:2251 c/c-typeck.c:12061 c/c-typeck.c:12229 -#: cp/typeck.c:5433 +#: c-family/c-warn.c:2251 c/c-typeck.c:12121 c/c-typeck.c:12289 +#: cp/typeck.c:5444 #, gcc-internal-format msgid "comparison between types %qT and %qT" msgstr "" @@ -33827,162 +33837,162 @@ msgid_plural "passing argument %i to %qs-qualified parameter aliases with argume msgstr[0] "" msgstr[1] "" -#: c-family/c-warn.c:2790 c/c-typeck.c:5495 cp/call.c:5803 +#: c-family/c-warn.c:2791 c/c-typeck.c:5555 cp/call.c:5807 #, gcc-internal-format msgid "this condition has identical branches" msgstr "" -#: c-family/c-warn.c:2897 +#: c-family/c-warn.c:2898 #, gcc-internal-format msgid "macro expands to multiple statements" msgstr "" -#: c-family/c-warn.c:2898 +#: c-family/c-warn.c:2899 #, gcc-internal-format msgid "some parts of macro expansion are not guarded by this %qs clause" msgstr "" -#: c-family/c-warn.c:2991 +#: c-family/c-warn.c:2992 #, gcc-internal-format msgid "converting a packed %qT pointer (alignment %d) to a %qT pointer (alignment %d) may result in an unaligned pointer value" msgstr "" -#: c-family/c-warn.c:2998 c-family/c-warn.c:3001 cp/init.c:635 +#: c-family/c-warn.c:2999 c-family/c-warn.c:3002 cp/init.c:642 #, gcc-internal-format msgid "defined here" msgstr "" -#: c-family/c-warn.c:3088 +#: c-family/c-warn.c:3089 #, gcc-internal-format msgid "taking address of packed member of %qT may result in an unaligned pointer value" msgstr "" -#: c-family/c-warn.c:3315 +#: c-family/c-warn.c:3316 msgid "mismatch in bound %Z of argument %u declared as %s" msgid_plural "mismatch in bounds %Z of argument %u declared as %s" msgstr[0] "" msgstr[1] "" -#: c-family/c-warn.c:3318 c-family/c-warn.c:3688 +#: c-family/c-warn.c:3319 c-family/c-warn.c:3689 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "previously declared as %s" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-warn.c:3452 +#: c-family/c-warn.c:3453 #, gcc-internal-format, gfc-internal-format msgid "argument %u of type %s declared as a variable length array" msgstr "" -#: c-family/c-warn.c:3457 +#: c-family/c-warn.c:3458 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "previous declaration `%D'" msgid "previously declared as a pointer %s" msgstr "папярэдняе абвяшчэньне `%D'" -#: c-family/c-warn.c:3458 +#: c-family/c-warn.c:3459 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "no previous declaration for `%s'" msgid "previously declared as an ordinary array %s" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-warn.c:3471 c-family/c-warn.c:3485 +#: c-family/c-warn.c:3472 c-family/c-warn.c:3486 #, gcc-internal-format, gfc-internal-format msgid "argument %u of type %s declared as a pointer" msgstr "" -#: c-family/c-warn.c:3475 c-family/c-warn.c:3501 +#: c-family/c-warn.c:3476 c-family/c-warn.c:3502 #, gcc-internal-format, gfc-internal-format msgid "previously declared as a variable length array %s" msgstr "" -#: c-family/c-warn.c:3488 +#: c-family/c-warn.c:3489 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "previously declared as an array %s" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-warn.c:3497 +#: c-family/c-warn.c:3498 #, gcc-internal-format, gfc-internal-format msgid "argument %u of type %s declared as an ordinary array" msgstr "" -#: c-family/c-warn.c:3525 +#: c-family/c-warn.c:3526 #, gcc-internal-format, gfc-internal-format msgid "argument %u of type %s declared with %u variable bound" msgid_plural "argument %u of type %s declared with %u variable bounds" msgstr[0] "" msgstr[1] "" -#: c-family/c-warn.c:3532 +#: c-family/c-warn.c:3533 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "previously declared as %s with %u variable bound" msgid_plural "previously declared as %s with %u variable bounds" msgstr[0] "няма папярэдняга аб'яўлення для \"%s\"" msgstr[1] "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-warn.c:3556 +#: c-family/c-warn.c:3557 #, gcc-internal-format, gfc-internal-format msgid "argument %u of type %s declared with %u unspecified variable bound" msgid_plural "argument %u of type %s declared with %u unspecified variable bounds" msgstr[0] "" msgstr[1] "" -#: c-family/c-warn.c:3564 +#: c-family/c-warn.c:3565 #, gcc-internal-format, gfc-internal-format msgid "previously declared as %s with %u unspecified variable bound" msgid_plural "previously declared as %s with %u unspecified variable bounds" msgstr[0] "" msgstr[1] "" -#: c-family/c-warn.c:3571 +#: c-family/c-warn.c:3572 #, gcc-internal-format, gfc-internal-format msgid "subsequently declared as %s with %u unspecified variable bound" msgid_plural "subsequently declared as %s with %u unspecified variable bounds" msgstr[0] "" msgstr[1] "" -#: c-family/c-warn.c:3624 +#: c-family/c-warn.c:3625 #, gcc-internal-format msgid "argument %u of type %s declared with mismatched bound argument %E" msgstr "" -#: c-family/c-warn.c:3631 c-family/c-warn.c:3664 +#: c-family/c-warn.c:3632 c-family/c-warn.c:3665 #, gcc-internal-format msgid "argument %u of type %s declared with mismatched bound %<%s%>" msgstr "" -#: c-family/c-warn.c:3643 +#: c-family/c-warn.c:3644 #, fuzzy, gcc-internal-format msgid "previously declared as %s with bound argument %E" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-warn.c:3648 +#: c-family/c-warn.c:3649 #, fuzzy, gcc-internal-format #| msgid "previous declaration `%D'" msgid "previously declared as %s with bound %<%s%>" msgstr "папярэдняе абвяшчэньне `%D'" -#: c-family/c-warn.c:3667 +#: c-family/c-warn.c:3668 #, fuzzy, gcc-internal-format #| msgid "previous declaration `%D'" msgid "previously declared as %s with bound %qs" msgstr "папярэдняе абвяшчэньне `%D'" -#: c-family/c-warn.c:3686 +#: c-family/c-warn.c:3687 #, gcc-internal-format, gfc-internal-format msgid "argument %u of type %s with mismatched bound" msgstr "" -#: c-family/c-warn.c:3717 +#: c-family/c-warn.c:3718 #, gcc-internal-format msgid "expression does not compute the number of elements in this array; element type is %qT, not %qT" msgstr "" -#: c-family/c-warn.c:3727 +#: c-family/c-warn.c:3728 #, gcc-internal-format msgid "add parentheses around %qE to silence this warning" msgstr "" -#: c-family/c-warn.c:3731 +#: c-family/c-warn.c:3732 #, gcc-internal-format msgid "add parentheses around the second % to silence this warning" msgstr "" @@ -33997,7 +34007,7 @@ msgstr "" msgid "too many input files" msgstr "вельмі шмат уваходзячых файлаў" -#: common/config/aarch64/aarch64-common.c:519 config/aarch64/aarch64.c:14814 +#: common/config/aarch64/aarch64-common.c:519 config/aarch64/aarch64.c:16448 #, gcc-internal-format msgid "unknown value %qs for %<-mcpu%>" msgstr "" @@ -34029,14 +34039,14 @@ msgid "unrecognized option passed to %%:target_mode_check" msgstr "" #: common/config/arm/arm-common.c:368 common/config/arm/arm-common.c:432 -#: common/config/arm/arm-common.c:479 config/aarch64/aarch64.c:14746 -#: config/aarch64/aarch64.c:14784 +#: common/config/arm/arm-common.c:479 config/aarch64/aarch64.c:16380 +#: config/aarch64/aarch64.c:16418 #, gcc-internal-format msgid "valid arguments are: %s; did you mean %qs?" msgstr "" #: common/config/arm/arm-common.c:371 common/config/arm/arm-common.c:435 -#: common/config/arm/arm-common.c:482 config/aarch64/aarch64.c:14749 +#: common/config/arm/arm-common.c:482 config/aarch64/aarch64.c:16383 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "valid arguments are: %s" msgstr "нявернае выкарыстанне \"restict\"" @@ -34190,62 +34200,62 @@ msgstr "" msgid "for the option %<-mcache-block-size=X%>, the valid X must be: 4, 8, 16, 32, 64, 128, 256, or 512" msgstr "" -#: common/config/riscv/riscv-common.c:290 +#: common/config/riscv/riscv-common.c:295 #, gcc-internal-format msgid "%<-march=%s%>: Extension `%s' appear more than one time." msgstr "" -#: common/config/riscv/riscv-common.c:535 +#: common/config/riscv/riscv-common.c:540 #, gcc-internal-format msgid "%<-march=%s%>: Expect number after %<%dp%>." msgstr "" -#: common/config/riscv/riscv-common.c:605 +#: common/config/riscv/riscv-common.c:610 #, gcc-internal-format msgid "%<-march=%s%>: rv%de is not a valid base ISA" msgstr "" -#: common/config/riscv/riscv-common.c:617 +#: common/config/riscv/riscv-common.c:622 #, gcc-internal-format msgid "version of `g` will be omitted, please specify version for individual extension." msgstr "" -#: common/config/riscv/riscv-common.c:636 +#: common/config/riscv/riscv-common.c:641 #, gcc-internal-format msgid "%<-march=%s%>: first ISA subset must be %, % or %" msgstr "" -#: common/config/riscv/riscv-common.c:663 +#: common/config/riscv/riscv-common.c:668 #, gcc-internal-format msgid "%<-march=%s%>: unsupported ISA subset %<%c%>" msgstr "" -#: common/config/riscv/riscv-common.c:667 +#: common/config/riscv/riscv-common.c:672 #, gcc-internal-format msgid "%<-march=%s%>: ISA string is not in canonical order. %<%c%>" msgstr "" -#: common/config/riscv/riscv-common.c:773 +#: common/config/riscv/riscv-common.c:778 #, gcc-internal-format msgid "%<-march=%s%>: name of %s must be more than 1 letter" msgstr "" -#: common/config/riscv/riscv-common.c:785 +#: common/config/riscv/riscv-common.c:790 #, gcc-internal-format msgid "%<-march=%s%>: %s must separate with _" msgstr "" -#: common/config/riscv/riscv-common.c:814 +#: common/config/riscv/riscv-common.c:819 #, gcc-internal-format msgid "%<-march=%s%>: ISA string must begin with rv32 or rv64" msgstr "" -#: common/config/riscv/riscv-common.c:851 +#: common/config/riscv/riscv-common.c:856 #, gcc-internal-format msgid "%<-march=%s%>: unexpected ISA string at end: %qs" msgstr "" -#: common/config/riscv/riscv-common.c:979 +#: common/config/riscv/riscv-common.c:984 #, gcc-internal-format msgid "%<-mcpu=%s%>: unknown CPU" msgstr "" @@ -34408,89 +34418,89 @@ msgstr "" msgid "%s conflicts with ppc64 (arch flags ignored)" msgstr "" -#: config/darwin.c:2011 +#: config/darwin.c:2006 #, gcc-internal-format, gfc-internal-format msgid "failed to open temporary file %s for LTO output" msgstr "" -#: config/darwin.c:2104 +#: config/darwin.c:2099 #, gcc-internal-format msgid "%qE 2.95 vtable-compatibility attribute applies only when compiling a kext" msgstr "" -#: config/darwin.c:2111 +#: config/darwin.c:2106 #, gcc-internal-format msgid "%qE 2.95 vtable-compatibility attribute applies only to C++ classes" msgstr "" -#: config/darwin.c:2848 +#: config/darwin.c:2843 #, fuzzy, gcc-internal-format msgid "protected visibility attribute not supported in this configuration; ignored" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/darwin.c:3063 +#: config/darwin.c:3058 #, gcc-internal-format, gfc-internal-format msgid "failed to open temporary file %s with LTO output" msgstr "" -#: config/darwin.c:3267 +#: config/darwin.c:3262 #, gcc-internal-format msgid "%<-fobjc-abi-version%> 2 must be used for 64 bit targets with %<-fnext-runtime%>" msgstr "" -#: config/darwin.c:3272 +#: config/darwin.c:3267 #, gcc-internal-format msgid "%<-fobjc-abi-version%> %d is not supported for 32 bit targets with %<-fnext-runtime%>" msgstr "" -#: config/darwin.c:3287 +#: config/darwin.c:3282 #, fuzzy, gcc-internal-format msgid "%<-gsplit-dwarf%> is not supported on this platform, ignored" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/darwin.c:3365 +#: config/darwin.c:3360 #, gcc-internal-format msgid "%<-mdynamic-no-pic%> overrides %<-fpic%>, %<-fPIC%>, %<-fpie%> or %<-fPIE%>" msgstr "" -#: config/darwin.c:3408 +#: config/darwin.c:3403 #, gcc-internal-format msgid "%<-mpic-symbol-stubs%> is not required for 64-bit code (ignored)" msgstr "" -#: config/darwin.c:3588 +#: config/darwin.c:3583 #, gcc-internal-format msgid "built-in function %qD requires the %<-mconstant-cfstrings%> flag" msgstr "" -#: config/darwin.c:3595 +#: config/darwin.c:3590 #, gcc-internal-format msgid "built-in function %qD takes one argument only" msgstr "" -#: config/darwin.c:3683 +#: config/darwin.c:3678 #, gcc-internal-format msgid "CFString literal is missing" msgstr "" -#: config/darwin.c:3694 +#: config/darwin.c:3689 #, fuzzy, gcc-internal-format msgid "CFString literal expression is not a string constant" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/darwin.c:3718 +#: config/darwin.c:3713 #, gcc-internal-format msgid "non-ASCII character in CFString literal" msgstr "" -#: config/darwin.c:3719 +#: config/darwin.c:3714 #, gcc-internal-format msgid "embedded NUL in CFString literal" msgstr "" #: config/host-darwin.c:65 #, gcc-internal-format -msgid "could not unmap % %m" +msgid "could not unmap %: %m" msgstr "" #: config/sol2-c.c:91 config/sol2-c.c:107 @@ -34626,366 +34636,366 @@ msgstr "" msgid "unknown %<#pragma GCC aarch64%> option %qs" msgstr "" -#: config/aarch64/aarch64.c:1636 +#: config/aarch64/aarch64.c:1973 #, fuzzy, gcc-internal-format msgid "the %qE attribute cannot be applied to an SVE function type" msgstr "\"%s\" звычайна функцыя" -#: config/aarch64/aarch64.c:1711 config/aarch64/aarch64.c:1725 +#: config/aarch64/aarch64.c:2048 config/aarch64/aarch64.c:2062 #, gcc-internal-format msgid "unexpected %<%s%> after %<%s%>" msgstr "" -#: config/aarch64/aarch64.c:2178 +#: config/aarch64/aarch64.c:2515 #, gcc-internal-format msgid "%qs is incompatible with the use of floating-point types" msgstr "" -#: config/aarch64/aarch64.c:2181 +#: config/aarch64/aarch64.c:2518 #, gcc-internal-format msgid "%qs is incompatible with the use of vector types" msgstr "" -#: config/aarch64/aarch64.c:2185 +#: config/aarch64/aarch64.c:2522 #, gcc-internal-format msgid "%qs feature modifier is incompatible with the use of floating-point types" msgstr "" -#: config/aarch64/aarch64.c:2188 +#: config/aarch64/aarch64.c:2525 #, gcc-internal-format msgid "%qs feature modifier is incompatible with the use of vector types" msgstr "" -#: config/aarch64/aarch64.c:2204 +#: config/aarch64/aarch64.c:2541 #, gcc-internal-format msgid "this operation requires the SVE ISA extension" msgstr "" -#: config/aarch64/aarch64.c:2205 +#: config/aarch64/aarch64.c:2542 #, gcc-internal-format msgid "you can enable SVE using the command-line option %<-march%>, or by using the % attribute or pragma" msgstr "" #. We can't gracefully recover at this point, so make this a #. fatal error. -#: config/aarch64/aarch64.c:5704 +#: config/aarch64/aarch64.c:6103 #, gcc-internal-format msgid "arguments of type %qT require the SVE ISA extension" msgstr "" -#: config/aarch64/aarch64.c:6025 +#: config/aarch64/aarch64.c:6424 #, fuzzy, gcc-internal-format msgid "SVE type %qT cannot be passed to an unprototyped function" msgstr "\"%s\" звычайна функцыя" -#: config/aarch64/aarch64.c:6147 config/aarch64/aarch64.c:6210 -#: config/aarch64/aarch64.c:6329 config/aarch64/aarch64.c:16667 -#: config/arm/arm.c:7075 config/arm/arm.c:7105 config/arm/arm.c:28839 +#: config/aarch64/aarch64.c:6546 config/aarch64/aarch64.c:6609 +#: config/aarch64/aarch64.c:6732 config/aarch64/aarch64.c:18309 +#: config/arm/arm.c:7084 config/arm/arm.c:7114 config/arm/arm.c:28855 #, gcc-internal-format msgid "parameter passing for argument of type %qT changed in GCC 9.1" msgstr "" -#: config/aarch64/aarch64.c:6278 +#: config/aarch64/aarch64.c:6677 #, gcc-internal-format msgid "%qE requires the SVE ISA extension" msgstr "" -#: config/aarch64/aarch64.c:6281 +#: config/aarch64/aarch64.c:6680 #, gcc-internal-format msgid "calls to functions of type %qT require the SVE ISA extension" msgstr "" -#: config/aarch64/aarch64.c:6453 +#: config/aarch64/aarch64.c:6857 #, gcc-internal-format msgid "stack probes for SVE frames" msgstr "" -#: config/aarch64/aarch64.c:14270 +#: config/aarch64/aarch64.c:15904 #, gcc-internal-format msgid "unknown flag passed in %<-moverride=%s%> (%s)" msgstr "" -#: config/aarch64/aarch64.c:14314 +#: config/aarch64/aarch64.c:15948 #, gcc-internal-format, gfc-internal-format msgid "%s string ill-formed\n" msgstr "" -#: config/aarch64/aarch64.c:14370 +#: config/aarch64/aarch64.c:16004 #, fuzzy, gcc-internal-format #| msgid "invalid mode for gen_tst_reg" msgid "invalid format for sve_width" msgstr "нерэчаісны рэжым для gen_tst_reg" -#: config/aarch64/aarch64.c:14382 +#: config/aarch64/aarch64.c:16016 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "invalid %%h value" msgid "invalid sve_width value: %d" msgstr "нерэчаіснае значэньне %%h" -#: config/aarch64/aarch64.c:14402 +#: config/aarch64/aarch64.c:16036 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "tuning string missing in option (%s)" msgstr "Нераспазнаны выбар \"%s\"" -#: config/aarch64/aarch64.c:14420 +#: config/aarch64/aarch64.c:16054 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "unknown tuning option (%s)" msgstr "невядомая назва рэгістра: %s\n" -#: config/aarch64/aarch64.c:14588 config/riscv/riscv.c:4816 +#: config/aarch64/aarch64.c:16222 config/riscv/riscv.c:4825 #, gcc-internal-format msgid "incompatible options %<-mstack-protector-guard=global%> and %<-mstack-protector-guard-offset=%s%>" msgstr "" -#: config/aarch64/aarch64.c:14597 config/riscv/riscv.c:4825 +#: config/aarch64/aarch64.c:16231 config/riscv/riscv.c:4834 #, gcc-internal-format msgid "both %<-mstack-protector-guard-offset%> and %<-mstack-protector-guard-reg%> must be used with %<-mstack-protector-guard=sysreg%>" msgstr "" -#: config/aarch64/aarch64.c:14605 +#: config/aarch64/aarch64.c:16239 #, gcc-internal-format msgid "specify a system register with a small string length." msgstr "" -#: config/aarch64/aarch64.c:14615 config/riscv/riscv.c:4854 -#: config/rs6000/rs6000.c:4583 +#: config/aarch64/aarch64.c:16249 config/riscv/riscv.c:4863 +#: config/rs6000/rs6000.c:4587 #, fuzzy, gcc-internal-format msgid "%qs is not a valid offset in %qs" msgstr "Нерэчаісны выбар %s" -#: config/aarch64/aarch64.c:14686 +#: config/aarch64/aarch64.c:16320 #, gcc-internal-format msgid "only values 12 (4 KB) and 16 (64 KB) are supported for guard size. Given value %d (%llu KB) is out of range" msgstr "" -#: config/aarch64/aarch64.c:14702 +#: config/aarch64/aarch64.c:16336 #, gcc-internal-format msgid "stack clash guard size %<%d%> must be equal to probing interval %<%d%>" msgstr "" -#: config/aarch64/aarch64.c:14787 +#: config/aarch64/aarch64.c:16421 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "valid arguments are: %s;" msgstr "нявернае выкарыстанне \"restict\"" -#: config/aarch64/aarch64.c:14811 +#: config/aarch64/aarch64.c:16445 #, gcc-internal-format msgid "missing cpu name in %<-mcpu=%s%>" msgstr "" -#: config/aarch64/aarch64.c:14818 +#: config/aarch64/aarch64.c:16452 #, gcc-internal-format msgid "invalid feature modifier %qs in %<-mcpu=%s%>" msgstr "" -#: config/aarch64/aarch64.c:14877 +#: config/aarch64/aarch64.c:16511 #, gcc-internal-format msgid "invalid argument given to %<-mharden-sls=%>" msgstr "" -#: config/aarch64/aarch64.c:14888 +#: config/aarch64/aarch64.c:16522 #, gcc-internal-format msgid "%<%s%> must be by itself for %<-mharden-sls=%>" msgstr "" -#: config/aarch64/aarch64.c:14893 +#: config/aarch64/aarch64.c:16527 #, gcc-internal-format msgid "invalid argument %<%s%> for %<-mharden-sls=%>" msgstr "" -#: config/aarch64/aarch64.c:14999 +#: config/aarch64/aarch64.c:16633 #, gcc-internal-format msgid "invalid argument %<%s%> for %<-mbranch-protection=%>" msgstr "" -#: config/aarch64/aarch64.c:15001 +#: config/aarch64/aarch64.c:16635 #, fuzzy, gcc-internal-format msgid "missing argument for %<-mbranch-protection=%>" msgstr "аргумент для \"%s\" прапушчан" -#: config/aarch64/aarch64.c:15025 +#: config/aarch64/aarch64.c:16659 #, gcc-internal-format msgid "missing arch name in %<-march=%s%>" msgstr "" -#: config/aarch64/aarch64.c:15028 +#: config/aarch64/aarch64.c:16662 #, gcc-internal-format msgid "unknown value %qs for %<-march%>" msgstr "" -#: config/aarch64/aarch64.c:15032 +#: config/aarch64/aarch64.c:16666 #, gcc-internal-format msgid "invalid feature modifier %qs in %<-march=%s%>" msgstr "" -#: config/aarch64/aarch64.c:15060 +#: config/aarch64/aarch64.c:16694 #, gcc-internal-format msgid "missing cpu name in %<-mtune=%s%>" msgstr "" -#: config/aarch64/aarch64.c:15063 +#: config/aarch64/aarch64.c:16697 #, gcc-internal-format msgid "unknown value %qs for %<-mtune%>" msgstr "" -#: config/aarch64/aarch64.c:15197 config/arm/arm.c:3244 +#: config/aarch64/aarch64.c:16831 #, gcc-internal-format msgid "switch %<-mcpu=%s%> conflicts with %<-march=%s%> switch" msgstr "" -#: config/aarch64/aarch64.c:15253 +#: config/aarch64/aarch64.c:16887 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "assembler does not support %<-mabi=ilp32%>" msgstr "%s не падтрымлівае %s" -#: config/aarch64/aarch64.c:15260 +#: config/aarch64/aarch64.c:16894 #, gcc-internal-format msgid "return address signing is only supported for %<-mabi=lp64%>" msgstr "" -#: config/aarch64/aarch64.c:15342 +#: config/aarch64/aarch64.c:16976 #, gcc-internal-format msgid "code model %qs with %<-f%s%>" msgstr "" -#: config/aarch64/aarch64.c:15345 +#: config/aarch64/aarch64.c:16979 #, fuzzy, gcc-internal-format msgid "code model %qs not supported in ilp32 mode" msgstr "-pipe не падтрымліваецца" -#: config/aarch64/aarch64.c:15520 +#: config/aarch64/aarch64.c:17158 #, gcc-internal-format msgid "missing name in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15523 +#: config/aarch64/aarch64.c:17161 #, gcc-internal-format msgid "invalid name (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15527 config/aarch64/aarch64.c:15569 -#: config/aarch64/aarch64.c:15676 +#: config/aarch64/aarch64.c:17165 config/aarch64/aarch64.c:17207 +#: config/aarch64/aarch64.c:17314 #, gcc-internal-format msgid "invalid feature modifier %s of value (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15562 +#: config/aarch64/aarch64.c:17200 #, gcc-internal-format msgid "missing name in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15565 +#: config/aarch64/aarch64.c:17203 #, gcc-internal-format msgid "invalid name (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15592 +#: config/aarch64/aarch64.c:17230 #, gcc-internal-format msgid "missing argument to % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15596 +#: config/aarch64/aarch64.c:17234 #, gcc-internal-format msgid "invalid protection type (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15631 +#: config/aarch64/aarch64.c:17269 #, gcc-internal-format msgid "invalid name (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15672 +#: config/aarch64/aarch64.c:17310 #, gcc-internal-format msgid "missing value in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15730 config/aarch64/aarch64.c:15903 +#: config/aarch64/aarch64.c:17368 config/aarch64/aarch64.c:17541 #, gcc-internal-format msgid "malformed % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:15774 +#: config/aarch64/aarch64.c:17412 #, gcc-internal-format msgid "pragma or attribute % does not accept an argument" msgstr "" -#: config/aarch64/aarch64.c:15782 config/i386/i386-options.c:1201 +#: config/aarch64/aarch64.c:17420 config/i386/i386-options.c:1204 #, gcc-internal-format msgid "pragma or attribute % does not allow a negated form" msgstr "" -#: config/aarch64/aarch64.c:15836 +#: config/aarch64/aarch64.c:17474 #, gcc-internal-format msgid "pragma or attribute % is not valid" msgstr "" -#: config/aarch64/aarch64.c:15893 config/arm/arm.c:32851 -#: config/rs6000/rs6000.c:24138 config/s390/s390.c:15744 +#: config/aarch64/aarch64.c:17531 config/arm/arm.c:32867 +#: config/rs6000/rs6000.c:24255 config/s390/s390.c:15767 #, gcc-internal-format msgid "attribute % argument not a string" msgstr "" -#: config/aarch64/aarch64.c:15920 +#: config/aarch64/aarch64.c:17558 #, gcc-internal-format msgid "pragma or attribute % is not valid" msgstr "" -#: config/aarch64/aarch64.c:15929 +#: config/aarch64/aarch64.c:17567 #, gcc-internal-format msgid "malformed % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:17355 config/arm/arm.c:6427 -#: config/rs6000/rs6000-call.c:6329 config/s390/s390.c:12128 -#: config/s390/s390.c:12205 +#: config/aarch64/aarch64.c:18997 config/arm/arm.c:6436 +#: config/rs6000/rs6000-call.c:6329 config/s390/s390.c:12151 +#: config/s390/s390.c:12228 msgid "parameter passing for argument of type %qT with %<[[no_unique_address]]%> members changed %{in GCC 10.1%}" msgstr "" -#: config/aarch64/aarch64.c:17360 config/arm/arm.c:6432 -#: config/rs6000/rs6000-call.c:6324 config/s390/s390.c:12123 -#: config/s390/s390.c:12200 +#: config/aarch64/aarch64.c:19002 config/arm/arm.c:6441 +#: config/rs6000/rs6000-call.c:6324 config/s390/s390.c:12146 +#: config/s390/s390.c:12223 msgid "parameter passing for argument of type %qT when C++17 is enabled changed to match C++14 %{in GCC 10.1%}" msgstr "" -#: config/aarch64/aarch64.c:18493 +#: config/aarch64/aarch64.c:20135 #, gcc-internal-format msgid "%Klane %wd out of range %wd - %wd" msgstr "" -#: config/aarch64/aarch64.c:18495 +#: config/aarch64/aarch64.c:20137 #, gcc-internal-format msgid "lane %wd out of range %wd - %wd" msgstr "" -#: config/aarch64/aarch64.c:23410 config/i386/i386.c:22491 +#: config/aarch64/aarch64.c:25053 config/i386/i386.c:22491 #: config/i386/i386.c:22619 #, fuzzy, gcc-internal-format #| msgid "unsupported version" msgid "unsupported simdlen %wd" msgstr "непадтрымліваемая версія" -#: config/aarch64/aarch64.c:23420 config/aarch64/aarch64.c:23447 +#: config/aarch64/aarch64.c:25063 config/aarch64/aarch64.c:25090 #, gcc-internal-format msgid "GCC does not currently support mixed size types for % functions" msgstr "" -#: config/aarch64/aarch64.c:23424 +#: config/aarch64/aarch64.c:25067 #, gcc-internal-format msgid "GCC does not currently support return type %qT for % functions" msgstr "" -#: config/aarch64/aarch64.c:23428 +#: config/aarch64/aarch64.c:25071 #, gcc-internal-format msgid "unsupported return type %qT for % functions" msgstr "" -#: config/aarch64/aarch64.c:23451 +#: config/aarch64/aarch64.c:25094 #, gcc-internal-format msgid "GCC does not currently support argument type %qT for % functions" msgstr "" -#: config/aarch64/aarch64.c:23476 +#: config/aarch64/aarch64.c:25119 #, gcc-internal-format msgid "GCC does not currently support simdlen %wd for type %qT" msgstr "" @@ -35046,7 +35056,7 @@ msgid "bad value %qs for %<-mmemory-latency%>" msgstr "" #: config/alpha/alpha.c:6651 config/alpha/alpha.c:6654 config/arc/arc.c:7073 -#: config/arc/arc.c:7347 config/s390/s390.c:856 config/tilegx/tilegx.c:3536 +#: config/arc/arc.c:7347 config/s390/s390.c:879 config/tilegx/tilegx.c:3536 #: config/tilepro/tilepro.c:3100 #, gcc-internal-format msgid "bad builtin fcode" @@ -35168,18 +35178,18 @@ msgstr "аргумент `__builtin_args_info' павінен быць канс msgid "argument of %qE attribute is not \"ilink\" or \"firq\"" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/arc/arc.c:2130 config/arm/arm.c:7216 config/arm/arm.c:7234 -#: config/arm/arm.c:7415 config/avr/avr.c:9695 config/avr/avr.c:9711 +#: config/arc/arc.c:2130 config/arm/arm.c:7225 config/arm/arm.c:7243 +#: config/arm/arm.c:7424 config/avr/avr.c:9695 config/avr/avr.c:9711 #: config/bfin/bfin.c:4693 config/bfin/bfin.c:4754 config/bfin/bfin.c:4783 #: config/bpf/bpf.c:80 config/csky/csky.c:6068 config/csky/csky.c:6096 #: config/epiphany/epiphany.c:491 config/gcn/gcn.c:318 -#: config/h8300/h8300.c:4894 config/i386/i386-options.c:3429 -#: config/i386/i386-options.c:3606 config/i386/i386-options.c:3662 -#: config/i386/i386-options.c:3713 config/i386/i386-options.c:3750 +#: config/h8300/h8300.c:4894 config/i386/i386-options.c:3442 +#: config/i386/i386-options.c:3619 config/i386/i386-options.c:3675 +#: config/i386/i386-options.c:3726 config/i386/i386-options.c:3763 #: config/m68k/m68k.c:792 config/mcore/mcore.c:3066 config/nvptx/nvptx.c:5164 -#: config/riscv/riscv.c:3039 config/rl78/rl78.c:820 config/rl78/rl78.c:889 -#: config/rs6000/rs6000.c:20188 config/rx/rx.c:2727 config/rx/rx.c:2753 -#: config/s390/s390.c:1071 config/s390/s390.c:1158 config/sh/sh.c:8428 +#: config/riscv/riscv.c:3048 config/rl78/rl78.c:820 config/rl78/rl78.c:889 +#: config/rs6000/rs6000.c:20305 config/rx/rx.c:2727 config/rx/rx.c:2753 +#: config/s390/s390.c:1094 config/s390/s390.c:1181 config/sh/sh.c:8428 #: config/sh/sh.c:8446 config/sh/sh.c:8470 config/sh/sh.c:8541 #: config/sh/sh.c:8564 config/stormy16/stormy16.c:2229 config/v850/v850.c:2010 #: config/visium/visium.c:724 @@ -35615,223 +35625,228 @@ msgstr "ISO C не падтрымлівае комлексныя цэлалік msgid "target CPU does not support unaligned accesses" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: config/arm/arm.c:3489 +#: config/arm/arm.c:3244 +#, gcc-internal-format +msgid "switch %<-mcpu=%s%> conflicts with switch %<-march=%s%>" +msgstr "" + +#: config/arm/arm.c:3494 #, gcc-internal-format msgid "%<-mapcs-stack-check%> incompatible with %<-mno-apcs-frame%>" msgstr "" -#: config/arm/arm.c:3498 +#: config/arm/arm.c:3503 #, gcc-internal-format msgid "%<-fpic%> and %<-mapcs-reent%> are incompatible" msgstr "" -#: config/arm/arm.c:3501 +#: config/arm/arm.c:3506 #, gcc-internal-format msgid "APCS reentrant code not supported. Ignored" msgstr "" -#: config/arm/arm.c:3524 +#: config/arm/arm.c:3529 #, gcc-internal-format msgid "option %<-mstructure-size-boundary%> is deprecated" msgstr "" -#: config/arm/arm.c:3532 +#: config/arm/arm.c:3537 #, gcc-internal-format msgid "structure size boundary can only be set to 8, 32 or 64" msgstr "" -#: config/arm/arm.c:3534 +#: config/arm/arm.c:3539 #, gcc-internal-format msgid "structure size boundary can only be set to 8 or 32" msgstr "" -#: config/arm/arm.c:3559 +#: config/arm/arm.c:3564 #, gcc-internal-format msgid "RTP PIC is incompatible with %<-msingle-pic-base%>" msgstr "" -#: config/arm/arm.c:3571 config/arm/arm.c:32865 +#: config/arm/arm.c:3576 config/arm/arm.c:32881 #, gcc-internal-format msgid "FDPIC mode is not supported in Thumb-1 mode" msgstr "" -#: config/arm/arm.c:3579 +#: config/arm/arm.c:3584 #, gcc-internal-format msgid "%<-mpic-register=%> is useless without %<-fpic%>" msgstr "" -#: config/arm/arm.c:3588 +#: config/arm/arm.c:3593 #, gcc-internal-format msgid "unable to use %qs for PIC register" msgstr "" -#: config/arm/arm.c:3610 config/pru/pru.c:612 +#: config/arm/arm.c:3615 config/pru/pru.c:612 #, fuzzy, gcc-internal-format msgid "%<-freorder-blocks-and-partition%> not supported on this architecture" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/arm/arm.c:3755 +#: config/arm/arm.c:3760 #, gcc-internal-format msgid "selected fp16 options are incompatible" msgstr "" -#: config/arm/arm.c:3807 +#: config/arm/arm.c:3812 #, gcc-internal-format msgid "iwmmxt requires an AAPCS compatible ABI for proper operation" msgstr "" -#: config/arm/arm.c:3810 +#: config/arm/arm.c:3815 #, gcc-internal-format msgid "iwmmxt abi requires an iwmmxt capable cpu" msgstr "" -#: config/arm/arm.c:3818 +#: config/arm/arm.c:3823 #, gcc-internal-format msgid "target CPU does not support interworking" msgstr "" -#: config/arm/arm.c:3831 +#: config/arm/arm.c:3836 #, gcc-internal-format msgid "AAPCS does not support %<-mcaller-super-interworking%>" msgstr "" -#: config/arm/arm.c:3834 +#: config/arm/arm.c:3839 #, gcc-internal-format msgid "AAPCS does not support %<-mcallee-super-interworking%>" msgstr "" -#: config/arm/arm.c:3839 +#: config/arm/arm.c:3844 #, gcc-internal-format msgid "__fp16 and no ldrh" msgstr "" -#: config/arm/arm.c:3842 +#: config/arm/arm.c:3847 #, fuzzy, gcc-internal-format msgid "target CPU does not support ARMv8-M Security Extensions" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: config/arm/arm.c:3847 +#: config/arm/arm.c:3852 #, gcc-internal-format msgid "ARMv8-M Security Extensions incompatible with selected FPU" msgstr "" -#: config/arm/arm.c:3859 +#: config/arm/arm.c:3864 #, gcc-internal-format -msgid "%<-mfloat-abi=hard%>: selected processor lacks an FPU" +msgid "%<-mfloat-abi=hard%>: selected architecture lacks an FPU" msgstr "" -#: config/arm/arm.c:3867 +#: config/arm/arm.c:3872 #, gcc-internal-format msgid "%<-mfloat-abi=hard%> and VFP" msgstr "" -#: config/arm/arm.c:6101 +#: config/arm/arm.c:6110 #, gcc-internal-format msgid "non-AAPCS derived PCS variant" msgstr "" -#: config/arm/arm.c:6103 +#: config/arm/arm.c:6112 #, gcc-internal-format msgid "variadic functions must use the base AAPCS variant" msgstr "" -#: config/arm/arm.c:6123 +#: config/arm/arm.c:6132 #, gcc-internal-format msgid "PCS variant" msgstr "" -#: config/arm/arm.c:6375 +#: config/arm/arm.c:6384 #, gcc-internal-format msgid "Thumb-1 hard-float VFP ABI" msgstr "" -#: config/arm/arm.c:6464 +#: config/arm/arm.c:6473 #, gcc-internal-format msgid "argument of type %qT not permitted with -mgeneral-regs-only" msgstr "" -#: config/arm/arm.c:6848 config/arm/arm.c:7069 config/arm/arm.c:7102 -#: config/arm/arm.c:28832 +#: config/arm/arm.c:6857 config/arm/arm.c:7078 config/arm/arm.c:7111 +#: config/arm/arm.c:28848 #, gcc-internal-format msgid "parameter passing for argument of type %qT changed in GCC 7.1" msgstr "" -#: config/arm/arm.c:7240 +#: config/arm/arm.c:7249 #, gcc-internal-format msgid "FP registers might be clobbered despite %qE attribute: compile with %<-mgeneral-regs-only%>" msgstr "" -#: config/arm/arm.c:7364 +#: config/arm/arm.c:7373 #, gcc-internal-format msgid "%qE attribute not available to functions with arguments passed on the stack" msgstr "" -#: config/arm/arm.c:7376 +#: config/arm/arm.c:7385 #, gcc-internal-format msgid "%qE attribute not available to functions with variable number of arguments" msgstr "" -#: config/arm/arm.c:7385 +#: config/arm/arm.c:7394 #, gcc-internal-format msgid "%qE attribute not available to functions that return value on the stack" msgstr "" -#: config/arm/arm.c:7407 config/arm/arm.c:7459 +#: config/arm/arm.c:7416 config/arm/arm.c:7468 #, fuzzy, gcc-internal-format msgid "%qE attribute ignored without %<-mcmse%> option." msgstr "\"%s\" атрыбут ігнарыруецца" -#: config/arm/arm.c:7426 +#: config/arm/arm.c:7435 #, gcc-internal-format msgid "%qE attribute has no effect on functions with static linkage" msgstr "" -#: config/arm/arm.c:7475 +#: config/arm/arm.c:7484 #, fuzzy, gcc-internal-format msgid "%qE attribute only applies to base type of a function pointer" msgstr "\"%s\" звычайна функцыя" -#: config/arm/arm.c:9439 +#: config/arm/arm.c:9448 #, gcc-internal-format msgid "accessing thread-local storage is not currently supported with %<-mpure-code%> or %<-mslow-flash-data%>" msgstr "" -#: config/arm/arm.c:13198 +#: config/arm/arm.c:13217 #, gcc-internal-format msgid "%K%s %wd out of range %wd - %wd" msgstr "" -#: config/arm/arm.c:13201 +#: config/arm/arm.c:13220 #, gcc-internal-format msgid "%s %wd out of range %wd - %wd" msgstr "" -#: config/arm/arm.c:25478 +#: config/arm/arm.c:25497 #, gcc-internal-format msgid "unable to compute real location of stacked parameter" msgstr "" -#: config/arm/arm.c:26140 +#: config/arm/arm.c:26159 #, gcc-internal-format msgid "Unexpected thumb1 far jump" msgstr "" -#: config/arm/arm.c:26399 +#: config/arm/arm.c:26418 #, gcc-internal-format msgid "no low registers available for popping high registers" msgstr "" -#: config/arm/arm.c:26651 +#: config/arm/arm.c:26670 #, gcc-internal-format msgid "Interrupt Service Routines cannot be coded in Thumb-1 mode" msgstr "" -#: config/arm/arm.c:26897 +#: config/arm/arm.c:26916 #, gcc-internal-format msgid "%<-fstack-check=specific%> for Thumb-1" msgstr "" -#: config/arm/arm.c:32880 +#: config/arm/arm.c:32896 #, gcc-internal-format msgid "invalid fpu for target attribute or pragma %qs" msgstr "" @@ -35839,23 +35854,23 @@ msgstr "" #. This doesn't really make sense until we support #. general dynamic selection of the architecture and all #. sub-features. -#: config/arm/arm.c:32888 +#: config/arm/arm.c:32904 #, gcc-internal-format msgid "auto fpu selection not currently permitted here" msgstr "" -#: config/arm/arm.c:32901 +#: config/arm/arm.c:32917 #, gcc-internal-format msgid "invalid architecture for target attribute or pragma %qs" msgstr "" -#: config/arm/arm.c:32915 +#: config/arm/arm.c:32931 #, fuzzy, gcc-internal-format #| msgid "unknown register name: %s" msgid "unknown target attribute or pragma %qs" msgstr "невядомая назва рэгістра: %s" -#: config/arm/arm.c:33927 +#: config/arm/arm.c:33943 #, fuzzy, gcc-internal-format msgid "asm flags not supported in thumb1 mode" msgstr "-pipe не падтрымліваецца" @@ -35938,18 +35953,18 @@ msgstr "-pipe не падтрымліваецца" msgid "%<-fPIE%> is not supported" msgstr "-pipe не падтрымліваецца" -#: config/avr/avr.c:1040 config/avr/avr.c:1045 config/riscv/riscv.c:5111 +#: config/avr/avr.c:1040 config/avr/avr.c:1045 config/riscv/riscv.c:5122 #, gcc-internal-format msgid "function attributes %qs and %qs are mutually exclusive" msgstr "" -#: config/avr/avr.c:1066 config/riscv/riscv.c:5123 +#: config/avr/avr.c:1066 config/riscv/riscv.c:5134 #, fuzzy, gcc-internal-format #| msgid "virtual functions cannot be friends" msgid "%qs function cannot have arguments" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: config/avr/avr.c:1069 config/riscv/riscv.c:5120 +#: config/avr/avr.c:1069 config/riscv/riscv.c:5131 #, fuzzy, gcc-internal-format #| msgid "function does not return string type" msgid "%qs function cannot return a value" @@ -36704,132 +36719,132 @@ msgstr "аргумент `__builtin_args_info' павінен быць канс msgid "parameter to builtin not valid: %s" msgstr "параметр \"%s\" ініцыялізаваны" -#: config/i386/i386-expand.c:8043 +#: config/i386/i386-expand.c:8049 #, gcc-internal-format msgid "interrupt service routine cannot be called directly" msgstr "" -#: config/i386/i386-expand.c:8453 config/i386/i386-expand.c:9905 +#: config/i386/i386-expand.c:8459 config/i386/i386-expand.c:9911 #, fuzzy, gcc-internal-format msgid "the last argument must be a 2-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:8841 +#: config/i386/i386-expand.c:8847 #, fuzzy, gcc-internal-format msgid "the fifth argument must be an 8-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:8936 +#: config/i386/i386-expand.c:8942 #, fuzzy, gcc-internal-format msgid "the third argument must be an 8-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:9836 +#: config/i386/i386-expand.c:9842 #, fuzzy, gcc-internal-format msgid "the last argument must be an 1-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:9851 +#: config/i386/i386-expand.c:9857 #, fuzzy, gcc-internal-format msgid "the last argument must be a 3-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:9884 +#: config/i386/i386-expand.c:9890 #, fuzzy, gcc-internal-format msgid "the last argument must be a 4-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:9924 +#: config/i386/i386-expand.c:9930 #, fuzzy, gcc-internal-format msgid "the last argument must be a 1-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:9937 +#: config/i386/i386-expand.c:9943 #, fuzzy, gcc-internal-format msgid "the last argument must be a 5-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:9947 +#: config/i386/i386-expand.c:9953 #, gcc-internal-format msgid "the next to last argument must be an 8-bit immediate" msgstr "" -#: config/i386/i386-expand.c:9952 +#: config/i386/i386-expand.c:9958 #, fuzzy, gcc-internal-format msgid "the last argument must be an 8-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:10089 +#: config/i386/i386-expand.c:10095 #, fuzzy, gcc-internal-format msgid "the third argument must be comparison constant" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386-expand.c:10094 +#: config/i386/i386-expand.c:10100 #, gcc-internal-format msgid "incorrect comparison mode" msgstr "" -#: config/i386/i386-expand.c:10100 config/i386/i386-expand.c:10420 +#: config/i386/i386-expand.c:10106 config/i386/i386-expand.c:10426 #, gcc-internal-format msgid "incorrect rounding operand" msgstr "" -#: config/i386/i386-expand.c:10402 +#: config/i386/i386-expand.c:10408 #, fuzzy, gcc-internal-format msgid "the immediate argument must be a 4-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:10408 +#: config/i386/i386-expand.c:10414 #, fuzzy, gcc-internal-format msgid "the immediate argument must be a 5-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:10411 +#: config/i386/i386-expand.c:10417 #, gcc-internal-format msgid "the immediate argument must be an 8-bit immediate" msgstr "" -#: config/i386/i386-expand.c:10906 config/rs6000/rs6000-call.c:10919 +#: config/i386/i386-expand.c:10912 config/rs6000/rs6000-call.c:10919 #, gcc-internal-format msgid "selector must be an integer constant in the range [0, %wi]" msgstr "" -#: config/i386/i386-expand.c:11119 +#: config/i386/i386-expand.c:11125 #, gcc-internal-format msgid "%qE needs unknown isa option" msgstr "" -#: config/i386/i386-expand.c:11123 +#: config/i386/i386-expand.c:11129 #, fuzzy, gcc-internal-format msgid "%qE needs isa option %s" msgstr "Нерэчаісны выбар %s" -#: config/i386/i386-expand.c:12044 +#: config/i386/i386-expand.c:12050 #, fuzzy, gcc-internal-format msgid "the last argument must be a 32-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:12077 +#: config/i386/i386-expand.c:12083 #, fuzzy, gcc-internal-format msgid "last argument must be an immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386-expand.c:12838 config/i386/i386-expand.c:13050 +#: config/i386/i386-expand.c:12844 config/i386/i386-expand.c:13056 #, gcc-internal-format msgid "the last argument must be scale 1, 2, 4, 8" msgstr "" -#: config/i386/i386-expand.c:13103 +#: config/i386/i386-expand.c:13109 #, gcc-internal-format msgid "the forth argument must be scale 1, 2, 4, 8" msgstr "" -#: config/i386/i386-expand.c:13109 +#: config/i386/i386-expand.c:13115 #, gcc-internal-format msgid "incorrect hint operand" msgstr "" -#: config/i386/i386-expand.c:13128 +#: config/i386/i386-expand.c:13134 #, fuzzy, gcc-internal-format msgid "the argument to % intrinsic must be an 8-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" @@ -36850,517 +36865,517 @@ msgstr "віртуальныя функцыі не могуць быць сяб msgid "multiversioning needs % which is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: config/i386/i386-options.c:849 config/i386/i386-options.c:2000 -#: config/i386/i386-options.c:2009 +#: config/i386/i386-options.c:852 config/i386/i386-options.c:2010 +#: config/i386/i386-options.c:2019 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "%s does not support %s" msgid "code model %s does not support PIC mode" msgstr "%s не падтрымлівае %s" -#: config/i386/i386-options.c:1106 +#: config/i386/i386-options.c:1109 #, fuzzy, gcc-internal-format msgid "attribute %qs argument is not a string" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386-options.c:1170 +#: config/i386/i386-options.c:1173 #, gcc-internal-format msgid "attribute %qs argument %qs is unknown" msgstr "" -#: config/i386/i386-options.c:1233 +#: config/i386/i386-options.c:1236 #, gcc-internal-format msgid "attribute value %qs was already specified in %qs attribute" msgstr "" -#: config/i386/i386-options.c:1271 +#: config/i386/i386-options.c:1274 #, gcc-internal-format msgid "attribute value %qs is unknown in %qs attribute" msgstr "" -#: config/i386/i386-options.c:1522 +#: config/i386/i386-options.c:1525 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function `%s'" msgid "wrong argument %qs to option %qs" msgstr "вельмі шмат аргумэнтаў у функцыі `%s'" -#: config/i386/i386-options.c:1528 +#: config/i386/i386-options.c:1531 #, gcc-internal-format msgid "size ranges of option %qs should be increasing" msgstr "" -#: config/i386/i386-options.c:1538 +#: config/i386/i386-options.c:1541 #, gcc-internal-format msgid "wrong strategy name %qs specified for option %qs" msgstr "" #. rep; movq isn't available in 32-bit code. -#: config/i386/i386-options.c:1564 +#: config/i386/i386-options.c:1567 #, gcc-internal-format msgid "strategy name %qs specified for option %qs not supported for 32-bit code" msgstr "" -#: config/i386/i386-options.c:1577 +#: config/i386/i386-options.c:1580 #, gcc-internal-format msgid "unknown alignment %qs specified for option %qs" msgstr "" -#: config/i386/i386-options.c:1587 +#: config/i386/i386-options.c:1590 #, gcc-internal-format msgid "the max value for the last size range should be -1 for option %qs" msgstr "" -#: config/i386/i386-options.c:1594 +#: config/i386/i386-options.c:1597 #, gcc-internal-format msgid "too many size ranges specified in option %qs" msgstr "" -#: config/i386/i386-options.c:1647 +#: config/i386/i386-options.c:1650 #, gcc-internal-format msgid "unknown parameter to option %<-mtune-ctrl%>: %s" msgstr "" -#: config/i386/i386-options.c:1832 +#: config/i386/i386-options.c:1835 #, gcc-internal-format msgid "Intel MCU psABI isn%'t supported in %s mode" msgstr "" -#: config/i386/i386-options.c:1879 +#: config/i386/i386-options.c:1889 #, gcc-internal-format msgid "%<-mtune=x86-64%> is deprecated; use %<-mtune=k8%> or %<-mtune=generic%> instead as appropriate" msgstr "" -#: config/i386/i386-options.c:1881 +#: config/i386/i386-options.c:1891 #, gcc-internal-format msgid "% is deprecated; use % or % instead as appropriate" msgstr "" #. rep; movq isn't available in 32-bit code. -#: config/i386/i386-options.c:1909 +#: config/i386/i386-options.c:1919 #, gcc-internal-format msgid "%<-mstringop-strategy=rep_8byte%> not supported for 32-bit code" msgstr "" -#: config/i386/i386-options.c:1914 +#: config/i386/i386-options.c:1924 #, fuzzy, gcc-internal-format msgid "%<-muintr%> not supported for 32-bit code" msgstr "-pipe не падтрымліваецца" -#: config/i386/i386-options.c:1929 +#: config/i386/i386-options.c:1939 #, gcc-internal-format msgid "address mode %qs not supported in the %s bit mode" msgstr "" -#: config/i386/i386-options.c:1940 +#: config/i386/i386-options.c:1950 #, gcc-internal-format msgid "%<-mabi=ms%> not supported with X32 ABI" msgstr "" -#: config/i386/i386-options.c:1946 +#: config/i386/i386-options.c:1956 #, gcc-internal-format msgid "%<-mabi=%s%> not supported with %<-fsanitize=address%>" msgstr "" -#: config/i386/i386-options.c:1949 +#: config/i386/i386-options.c:1959 #, gcc-internal-format msgid "%<-mabi=%s%> not supported with %<-fsanitize=kernel-address%>" msgstr "" -#: config/i386/i386-options.c:1953 +#: config/i386/i386-options.c:1963 #, gcc-internal-format msgid "%<-mabi=%s%> not supported with %<-fsanitize=thread%>" msgstr "" -#: config/i386/i386-options.c:1970 config/i386/i386-options.c:1979 -#: config/i386/i386-options.c:1991 config/i386/i386-options.c:2002 -#: config/i386/i386-options.c:2013 +#: config/i386/i386-options.c:1980 config/i386/i386-options.c:1989 +#: config/i386/i386-options.c:2001 config/i386/i386-options.c:2012 +#: config/i386/i386-options.c:2023 #, fuzzy, gcc-internal-format msgid "code model %qs not supported in the %s bit mode" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: config/i386/i386-options.c:1982 config/i386/i386-options.c:1994 +#: config/i386/i386-options.c:1992 config/i386/i386-options.c:2004 #, fuzzy, gcc-internal-format msgid "code model %qs not supported in x32 mode" msgstr "-pipe не падтрымліваецца" -#: config/i386/i386-options.c:2037 +#: config/i386/i386-options.c:2047 #, fuzzy, gcc-internal-format msgid "%<-masm=intel%> not supported in this configuration" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/i386/i386-options.c:2042 +#: config/i386/i386-options.c:2052 #, gcc-internal-format, gfc-internal-format msgid "%i-bit mode not compiled in" msgstr "" -#: config/i386/i386-options.c:2051 +#: config/i386/i386-options.c:2064 #, gcc-internal-format msgid "% CPU can be used only for %<-mtune=%> switch" msgstr "" -#: config/i386/i386-options.c:2053 +#: config/i386/i386-options.c:2066 #, gcc-internal-format msgid "% CPU can be used only for % attribute" msgstr "" -#: config/i386/i386-options.c:2060 +#: config/i386/i386-options.c:2073 #, gcc-internal-format msgid "% CPU can be used only for %<-mtune=%> switch" msgstr "" -#: config/i386/i386-options.c:2062 +#: config/i386/i386-options.c:2075 #, gcc-internal-format msgid "% CPU can be used only for % attribute" msgstr "" -#: config/i386/i386-options.c:2070 config/i386/i386-options.c:2444 +#: config/i386/i386-options.c:2083 config/i386/i386-options.c:2457 #, fuzzy, gcc-internal-format msgid "CPU you selected does not support x86-64 instruction set" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: config/i386/i386-options.c:2383 +#: config/i386/i386-options.c:2396 #, gcc-internal-format msgid "bad value (%qs) for %<-march=%> switch" msgstr "" -#: config/i386/i386-options.c:2384 +#: config/i386/i386-options.c:2397 #, gcc-internal-format msgid "bad value (%qs) for % attribute" msgstr "" -#: config/i386/i386-options.c:2406 +#: config/i386/i386-options.c:2419 #, gcc-internal-format msgid "valid arguments to %<-march=%> switch are: %s; did you mean %qs?" msgstr "" -#: config/i386/i386-options.c:2408 +#: config/i386/i386-options.c:2421 #, gcc-internal-format msgid "valid arguments to % attribute are: %s; did you mean %qs?" msgstr "" -#: config/i386/i386-options.c:2413 +#: config/i386/i386-options.c:2426 #, gcc-internal-format msgid "valid arguments to %<-march=%> switch are: %s" msgstr "" -#: config/i386/i386-options.c:2414 +#: config/i386/i386-options.c:2427 #, fuzzy, gcc-internal-format msgid "valid arguments to % attribute are: %s" msgstr "нявернае выкарыстанне \"restict\"" -#: config/i386/i386-options.c:2463 +#: config/i386/i386-options.c:2476 #, gcc-internal-format msgid "bad value (%qs) for %<-mtune=%> switch" msgstr "" -#: config/i386/i386-options.c:2464 +#: config/i386/i386-options.c:2477 #, gcc-internal-format msgid "bad value (%qs) for % attribute" msgstr "" -#: config/i386/i386-options.c:2485 +#: config/i386/i386-options.c:2498 #, gcc-internal-format msgid "valid arguments to %<-mtune=%> switch are: %s; did you mean %qs?" msgstr "" -#: config/i386/i386-options.c:2487 +#: config/i386/i386-options.c:2500 #, gcc-internal-format msgid "valid arguments to % attribute are: %s; did you mean %qs?" msgstr "" -#: config/i386/i386-options.c:2492 +#: config/i386/i386-options.c:2505 #, gcc-internal-format msgid "valid arguments to %<-mtune=%> switch are: %s" msgstr "" -#: config/i386/i386-options.c:2493 +#: config/i386/i386-options.c:2506 #, fuzzy, gcc-internal-format msgid "valid arguments to % attribute are: %s" msgstr "нявернае выкарыстанне \"restict\"" -#: config/i386/i386-options.c:2517 +#: config/i386/i386-options.c:2530 #, gcc-internal-format msgid "%<-mregparm%> is ignored in 64-bit mode" msgstr "" -#: config/i386/i386-options.c:2519 +#: config/i386/i386-options.c:2532 #, gcc-internal-format msgid "%<-mregparm%> is ignored for Intel MCU psABI" msgstr "" -#: config/i386/i386-options.c:2522 +#: config/i386/i386-options.c:2535 #, gcc-internal-format msgid "%<-mregparm=%d%> is not between 0 and %d" msgstr "" -#: config/i386/i386-options.c:2550 +#: config/i386/i386-options.c:2563 #, gcc-internal-format msgid "%<-mrtd%> is ignored in 64bit mode" msgstr "" -#: config/i386/i386-options.c:2551 +#: config/i386/i386-options.c:2564 #, gcc-internal-format msgid "% is ignored in 64bit mode" msgstr "" -#: config/i386/i386-options.c:2630 +#: config/i386/i386-options.c:2643 #, fuzzy, gcc-internal-format msgid "%<-mpreferred-stack-boundary%> is not supported for this target" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/i386/i386-options.c:2633 +#: config/i386/i386-options.c:2646 #, gcc-internal-format msgid "%<-mpreferred-stack-boundary=%d%> is not between %d and %d" msgstr "" -#: config/i386/i386-options.c:2656 +#: config/i386/i386-options.c:2669 #, gcc-internal-format msgid "%<-mincoming-stack-boundary=%d%> is not between %d and 12" msgstr "" -#: config/i386/i386-options.c:2669 +#: config/i386/i386-options.c:2682 #, gcc-internal-format msgid "%<-mnop-mcount%> is not compatible with this target" msgstr "" -#: config/i386/i386-options.c:2672 +#: config/i386/i386-options.c:2685 #, gcc-internal-format msgid "%<-mnop-mcount%> is not implemented for %<-fPIC%>" msgstr "" -#: config/i386/i386-options.c:2678 +#: config/i386/i386-options.c:2691 #, gcc-internal-format msgid "%<-msseregparm%> used without SSE enabled" msgstr "" -#: config/i386/i386-options.c:2679 +#: config/i386/i386-options.c:2692 #, gcc-internal-format msgid "% used without SSE enabled" msgstr "" -#: config/i386/i386-options.c:2689 +#: config/i386/i386-options.c:2702 #, gcc-internal-format msgid "SSE instruction set disabled, using 387 arithmetics" msgstr "" -#: config/i386/i386-options.c:2696 +#: config/i386/i386-options.c:2709 #, gcc-internal-format msgid "387 instruction set disabled, using SSE arithmetics" msgstr "" -#: config/i386/i386-options.c:2746 +#: config/i386/i386-options.c:2759 #, gcc-internal-format msgid "stack probing requires %<-maccumulate-outgoing-args%> for correctness" msgstr "" -#: config/i386/i386-options.c:2748 +#: config/i386/i386-options.c:2761 #, gcc-internal-format msgid "stack probing requires % for correctness" msgstr "" -#: config/i386/i386-options.c:2762 +#: config/i386/i386-options.c:2775 #, gcc-internal-format msgid "fixed ebp register requires %<-maccumulate-outgoing-args%>" msgstr "" -#: config/i386/i386-options.c:2764 +#: config/i386/i386-options.c:2777 #, gcc-internal-format msgid "fixed ebp register requires %" msgstr "" -#: config/i386/i386-options.c:2818 +#: config/i386/i386-options.c:2831 #, gcc-internal-format msgid "%<-mfentry%> isn%'t supported for 32-bit in combination with %<-fpic%>" msgstr "" -#: config/i386/i386-options.c:2821 +#: config/i386/i386-options.c:2834 #, gcc-internal-format msgid "%<-mno-fentry%> isn%'t compatible with SEH" msgstr "" -#: config/i386/i386-options.c:2825 +#: config/i386/i386-options.c:2838 #, gcc-internal-format msgid "%<-mcall-ms2sysv-xlogues%> isn%'t currently supported with SEH" msgstr "" -#: config/i386/i386-options.c:2890 +#: config/i386/i386-options.c:2903 #, gcc-internal-format msgid "unknown option for %<-mrecip=%s%>" msgstr "" -#: config/i386/i386-options.c:2949 +#: config/i386/i386-options.c:2962 #, gcc-internal-format msgid "%qs is not a valid number in %<-mstack-protector-guard-offset=%>" msgstr "" -#: config/i386/i386-options.c:2954 +#: config/i386/i386-options.c:2967 #, gcc-internal-format msgid "%qs is not a valid offset in %<-mstack-protector-guard-offset=%>" msgstr "" -#: config/i386/i386-options.c:2982 +#: config/i386/i386-options.c:2995 #, gcc-internal-format msgid "%qs is not a valid base register in %<-mstack-protector-guard-reg=%>" msgstr "" -#: config/i386/i386-options.c:3030 +#: config/i386/i386-options.c:3043 #, fuzzy, gcc-internal-format msgid "%<-fcf-protection%> is not compatible with this target" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/i386/i386-options.c:3157 +#: config/i386/i386-options.c:3170 #, gcc-internal-format msgid "interrupt and naked attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3172 +#: config/i386/i386-options.c:3185 #, gcc-internal-format msgid "only DWARF debug format is supported for interrupt service routine" msgstr "" -#: config/i386/i386-options.c:3221 +#: config/i386/i386-options.c:3234 #, gcc-internal-format msgid "%<-mindirect-branch=%s%> and %<-mcmodel=large%> are not compatible" msgstr "" -#: config/i386/i386-options.c:3231 +#: config/i386/i386-options.c:3244 #, gcc-internal-format msgid "%<-mindirect-branch%> and %<-fcf-protection%> are not compatible" msgstr "" -#: config/i386/i386-options.c:3266 +#: config/i386/i386-options.c:3279 #, gcc-internal-format msgid "%<-mfunction-return=%s%> and %<-mcmodel=large%> are not compatible" msgstr "" -#: config/i386/i386-options.c:3276 +#: config/i386/i386-options.c:3289 #, gcc-internal-format msgid "%<-mfunction-return%> and %<-fcf-protection%> are not compatible" msgstr "" -#: config/i386/i386-options.c:3389 +#: config/i386/i386-options.c:3402 #, gcc-internal-format msgid "%s instructions aren%'t allowed in an exception service routine" msgstr "" -#: config/i386/i386-options.c:3391 +#: config/i386/i386-options.c:3404 #, gcc-internal-format msgid "%s instructions aren%'t allowed in an interrupt service routine" msgstr "" -#: config/i386/i386-options.c:3395 +#: config/i386/i386-options.c:3408 #, gcc-internal-format msgid "%s instructions aren%'t allowed in a function with the % attribute" msgstr "" -#: config/i386/i386-options.c:3442 config/i386/i386-options.c:3493 +#: config/i386/i386-options.c:3455 config/i386/i386-options.c:3506 #, gcc-internal-format msgid "fastcall and regparm attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3447 +#: config/i386/i386-options.c:3460 #, gcc-internal-format msgid "regparam and thiscall attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3454 config/i386/i386-options.c:3682 +#: config/i386/i386-options.c:3467 config/i386/i386-options.c:3695 #, gcc-internal-format msgid "%qE attribute requires an integer constant argument" msgstr "" -#: config/i386/i386-options.c:3460 +#: config/i386/i386-options.c:3473 #, fuzzy, gcc-internal-format msgid "argument to %qE attribute larger than %d" msgstr "памер \"%s\" больш чам %d байт" -#: config/i386/i386-options.c:3485 config/i386/i386-options.c:3528 +#: config/i386/i386-options.c:3498 config/i386/i386-options.c:3541 #, gcc-internal-format msgid "fastcall and cdecl attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3489 +#: config/i386/i386-options.c:3502 #, gcc-internal-format msgid "fastcall and stdcall attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3497 config/i386/i386-options.c:3546 +#: config/i386/i386-options.c:3510 config/i386/i386-options.c:3559 #, gcc-internal-format msgid "fastcall and thiscall attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3507 config/i386/i386-options.c:3524 +#: config/i386/i386-options.c:3520 config/i386/i386-options.c:3537 #, gcc-internal-format msgid "stdcall and cdecl attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3511 +#: config/i386/i386-options.c:3524 #, gcc-internal-format msgid "stdcall and fastcall attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3515 config/i386/i386-options.c:3542 +#: config/i386/i386-options.c:3528 config/i386/i386-options.c:3555 #, gcc-internal-format msgid "stdcall and thiscall attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3532 config/i386/i386-options.c:3550 +#: config/i386/i386-options.c:3545 config/i386/i386-options.c:3563 #, gcc-internal-format msgid "cdecl and thiscall attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3538 +#: config/i386/i386-options.c:3551 #, gcc-internal-format msgid "%qE attribute is used for non-class method" msgstr "" -#: config/i386/i386-options.c:3642 config/rs6000/rs6000.c:20301 +#: config/i386/i386-options.c:3655 config/rs6000/rs6000.c:20418 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "%qE incompatible attribute ignored" msgstr "\"%s\" атрыбут ігнарыруецца" -#: config/i386/i386-options.c:3669 +#: config/i386/i386-options.c:3682 #, fuzzy, gcc-internal-format msgid "%qE attribute only available for 32-bit" msgstr "\"%s\" атрыбут ігнарыруецца" -#: config/i386/i386-options.c:3690 +#: config/i386/i386-options.c:3703 #, fuzzy, gcc-internal-format msgid "argument to %qE attribute is neither zero, nor one" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386-options.c:3724 config/i386/i386-options.c:3734 +#: config/i386/i386-options.c:3737 config/i386/i386-options.c:3747 #, gcc-internal-format msgid "%qs and %qs attributes are not compatible" msgstr "" -#: config/i386/i386-options.c:3761 config/i386/i386-options.c:3783 -#: config/ia64/ia64.c:812 config/s390/s390.c:1168 +#: config/i386/i386-options.c:3774 config/i386/i386-options.c:3796 +#: config/ia64/ia64.c:812 config/s390/s390.c:1191 #, fuzzy, gcc-internal-format msgid "%qE attribute requires a string constant argument" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386-options.c:3771 config/i386/i386-options.c:3793 -#: config/s390/s390.c:1197 +#: config/i386/i386-options.c:3784 config/i386/i386-options.c:3806 +#: config/s390/s390.c:1220 #, fuzzy, gcc-internal-format msgid "argument to %qE attribute is not (keep|thunk|thunk-inline|thunk-extern)" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386-options.c:3825 +#: config/i386/i386-options.c:3838 #, gcc-internal-format msgid "interrupt service routine should have a pointer as the first argument" msgstr "" -#: config/i386/i386-options.c:3832 +#: config/i386/i386-options.c:3845 #, gcc-internal-format msgid "interrupt service routine should have %qs as the second argument" msgstr "" -#: config/i386/i386-options.c:3843 +#: config/i386/i386-options.c:3856 #, gcc-internal-format msgid "interrupt service routine can only have a pointer argument and an optional integer argument" msgstr "" -#: config/i386/i386-options.c:3846 +#: config/i386/i386-options.c:3859 #, gcc-internal-format msgid "interrupt service routine must return %" msgstr "" @@ -37820,7 +37835,7 @@ msgstr "" msgid "%qE redeclared with conflicting %qs attributes" msgstr "" -#: config/mips/mips.c:1511 config/mips/mips.c:1565 config/riscv/riscv.c:3067 +#: config/mips/mips.c:1511 config/mips/mips.c:1565 config/riscv/riscv.c:3076 #, gcc-internal-format msgid "%qE attribute requires a string argument" msgstr "" @@ -38888,58 +38903,58 @@ msgstr "" msgid "unknown cpu %qs for %<-mtune%>" msgstr "" -#: config/riscv/riscv.c:2687 config/riscv/riscv.c:2729 +#: config/riscv/riscv.c:2696 config/riscv/riscv.c:2738 #, gcc-internal-format msgid "ABI for flattened struct with zero-length bit-fields changed in GCC 10" msgstr "" -#: config/riscv/riscv.c:3078 +#: config/riscv/riscv.c:3087 #, fuzzy, gcc-internal-format msgid "argument to %qE attribute is not \"user\", \"supervisor\", or \"machine\"" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/riscv/riscv.c:4735 +#: config/riscv/riscv.c:4744 #, gcc-internal-format msgid "%<-mdiv%> requires %<-march%> to subsume the % extension" msgstr "" -#: config/riscv/riscv.c:4778 +#: config/riscv/riscv.c:4787 #, gcc-internal-format msgid "requested ABI requires %<-march%> to subsume the %qc extension" msgstr "" -#: config/riscv/riscv.c:4782 +#: config/riscv/riscv.c:4791 #, gcc-internal-format msgid "rv32e requires ilp32e ABI" msgstr "" -#: config/riscv/riscv.c:4786 +#: config/riscv/riscv.c:4795 #, gcc-internal-format msgid "ABI requires %<-march=rv%d%>" msgstr "" -#: config/riscv/riscv.c:4796 +#: config/riscv/riscv.c:4805 #, gcc-internal-format msgid "%<-mpreferred-stack-boundary=%d%> must be between %d and %d" msgstr "" -#: config/riscv/riscv.c:4809 +#: config/riscv/riscv.c:4818 #, gcc-internal-format msgid "%<-mriscv-attribute%> RISC-V ELF attribute requires GNU as 2.32 [%<-mriscv-attribute%>]" msgstr "" -#: config/riscv/riscv.c:4836 config/rs6000/rs6000.c:4595 +#: config/riscv/riscv.c:4845 config/rs6000/rs6000.c:4599 #, fuzzy, gcc-internal-format #| msgid "invalid register name for `%s'" msgid "%qs is not a valid base register in %qs" msgstr "нерэчаісная назва рэгістра `%s'" -#: config/riscv/riscv.c:4850 config/rs6000/rs6000.c:4578 +#: config/riscv/riscv.c:4859 config/rs6000/rs6000.c:4582 #, gcc-internal-format msgid "%qs is not a valid number in %qs" msgstr "" -#: config/riscv/riscv.c:5149 +#: config/riscv/riscv.c:5160 #, gcc-internal-format msgid "%qs function cannot have different interrupt type" msgstr "" @@ -39449,242 +39464,242 @@ msgstr "Не выкарыстоўваць рэгістра sb" msgid "Stack frame larger than 2G is not supported for %<-fsplit-stack%>" msgstr "" -#: config/rs6000/rs6000.c:3238 config/rs6000/rs6000.c:3241 -#: config/rs6000/rs6000.c:3244 +#: config/rs6000/rs6000.c:3242 config/rs6000/rs6000.c:3245 +#: config/rs6000/rs6000.c:3248 #, gcc-internal-format msgid "%qs requires %qs or %qs" msgstr "" -#: config/rs6000/rs6000.c:3345 +#: config/rs6000/rs6000.c:3349 #, gcc-internal-format msgid "%qs requires PowerPC64 architecture, enabling" msgstr "" -#: config/rs6000/rs6000.c:3491 +#: config/rs6000/rs6000.c:3495 #, gcc-internal-format msgid "%<-mcall-aixdesc%> incompatible with %<-mabi=elfv2%>" msgstr "" -#: config/rs6000/rs6000.c:3511 config/rs6000/rtems.h:114 +#: config/rs6000/rs6000.c:3515 config/rs6000/rtems.h:114 #, gcc-internal-format msgid "%<-m64%> requires a PowerPC64 cpu" msgstr "" -#: config/rs6000/rs6000.c:3519 +#: config/rs6000/rs6000.c:3523 #, gcc-internal-format msgid "%<-mcmodel incompatible with other toc options%>" msgstr "" -#: config/rs6000/rs6000.c:3540 +#: config/rs6000/rs6000.c:3544 #, fuzzy, gcc-internal-format msgid "%qs unsupported for this ABI" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/rs6000/rs6000.c:3673 +#: config/rs6000/rs6000.c:3677 #, gcc-internal-format msgid "%qs is not supported for 64-bit Darwin; it is incompatible with the installed C and C++ libraries" msgstr "" -#: config/rs6000/rs6000.c:3812 +#: config/rs6000/rs6000.c:3816 #, fuzzy, gcc-internal-format msgid "AltiVec not supported in this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: config/rs6000/rs6000.c:3829 +#: config/rs6000/rs6000.c:3833 #, fuzzy, gcc-internal-format msgid "%qs is not supported on little endian systems" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/rs6000/rs6000.c:3915 +#: config/rs6000/rs6000.c:3919 #, gcc-internal-format msgid "power9 target option is incompatible with %<%s=%> for less than power9" msgstr "" #. Enforce that none of the ISA_3_0_MASKS_SERVER flags #. were explicitly cleared. -#: config/rs6000/rs6000.c:3923 +#: config/rs6000/rs6000.c:3927 #, gcc-internal-format msgid "%qs incompatible with explicitly disabled options" msgstr "" #. TARGET_VSX = 1 implies Power 7 and newer -#: config/rs6000/rs6000.c:3948 config/rs6000/rs6000.c:3956 -#: config/rs6000/rs6000.c:3963 config/rs6000/rs6000.c:3970 -#: config/rs6000/rs6000.c:3978 config/rs6000/rs6000.c:3997 -#: config/rs6000/rs6000.c:4059 config/rs6000/rs6000.c:4086 -#: config/rs6000/rs6000.c:4113 config/rs6000/rs6000.c:4128 -#: config/rs6000/rs6000.c:4136 config/rs6000/rs6000.c:4181 -#: config/rs6000/rs6000.c:4183 config/rs6000/rs6000.c:4275 -#: config/rs6000/rs6000.c:4288 config/rs6000/rs6000.c:4297 -#: config/rs6000/rs6000.c:4447 config/rs6000/rs6000.c:4470 +#: config/rs6000/rs6000.c:3952 config/rs6000/rs6000.c:3960 +#: config/rs6000/rs6000.c:3967 config/rs6000/rs6000.c:3974 +#: config/rs6000/rs6000.c:3982 config/rs6000/rs6000.c:4001 +#: config/rs6000/rs6000.c:4063 config/rs6000/rs6000.c:4090 +#: config/rs6000/rs6000.c:4117 config/rs6000/rs6000.c:4132 +#: config/rs6000/rs6000.c:4140 config/rs6000/rs6000.c:4185 +#: config/rs6000/rs6000.c:4187 config/rs6000/rs6000.c:4279 +#: config/rs6000/rs6000.c:4292 config/rs6000/rs6000.c:4301 +#: config/rs6000/rs6000.c:4451 config/rs6000/rs6000.c:4474 #, gcc-internal-format msgid "%qs requires %qs" msgstr "" -#: config/rs6000/rs6000.c:4172 +#: config/rs6000/rs6000.c:4176 #, gcc-internal-format msgid "target attribute or pragma changes % size" msgstr "" -#: config/rs6000/rs6000.c:4198 +#: config/rs6000/rs6000.c:4202 #, gcc-internal-format msgid "%qs requires full ISA 2.06 support" msgstr "" -#: config/rs6000/rs6000.c:4213 +#: config/rs6000/rs6000.c:4217 #, gcc-internal-format msgid "Using IEEE extended precision %" msgstr "" -#: config/rs6000/rs6000.c:4216 +#: config/rs6000/rs6000.c:4220 #, gcc-internal-format msgid "Using IBM extended precision %" msgstr "" -#: config/rs6000/rs6000.c:4235 +#: config/rs6000/rs6000.c:4239 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "%qs requires VSX support" msgstr "%s не падтрымлівае %s" -#: config/rs6000/rs6000.c:4244 +#: config/rs6000/rs6000.c:4248 #, gcc-internal-format msgid "The %<-mfloat128%> option may not be fully supported" msgstr "" -#: config/rs6000/rs6000.c:4267 +#: config/rs6000/rs6000.c:4271 #, gcc-internal-format msgid "%qs requires full ISA 3.0 support" msgstr "" -#: config/rs6000/rs6000.c:4354 +#: config/rs6000/rs6000.c:4358 #, gcc-internal-format msgid "unknown vectorization library ABI type (%qs) for %qs switch" msgstr "" -#: config/rs6000/rs6000.c:4379 config/rs6000/rs6000.c:4394 +#: config/rs6000/rs6000.c:4383 config/rs6000/rs6000.c:4398 #, gcc-internal-format msgid "target attribute or pragma changes AltiVec ABI" msgstr "" -#: config/rs6000/rs6000.c:4407 +#: config/rs6000/rs6000.c:4411 #, gcc-internal-format msgid "target attribute or pragma changes darwin64 ABI" msgstr "" -#: config/rs6000/rs6000.c:4603 +#: config/rs6000/rs6000.c:4607 #, gcc-internal-format msgid "%qs needs a valid base register" msgstr "" -#: config/rs6000/rs6000.c:4900 +#: config/rs6000/rs6000.c:4904 #, fuzzy, gcc-internal-format msgid "unknown option for %<%s=%s%>" msgstr "невядомая назва рэгістра: %s\n" -#: config/rs6000/rs6000.c:4937 +#: config/rs6000/rs6000.c:4941 #, gcc-internal-format msgid "%qs is deprecated and not recommended in any circumstances" msgstr "" -#: config/rs6000/rs6000.c:7847 +#: config/rs6000/rs6000.c:7901 #, gcc-internal-format, gfc-internal-format msgid "the layout of aggregates containing vectors with %d-byte alignment has changed in GCC 5" msgstr "" -#: config/rs6000/rs6000.c:10582 +#: config/rs6000/rs6000.c:10675 #, gcc-internal-format -msgid "%qs is an opaque type, and you can't set it to other values." +msgid "%qs is an opaque type, and you cannot set it to other values" msgstr "" -#: config/rs6000/rs6000.c:17677 +#: config/rs6000/rs6000.c:17794 #, gcc-internal-format msgid "no profiling of 64-bit code for this ABI" msgstr "" -#: config/rs6000/rs6000.c:19967 +#: config/rs6000/rs6000.c:20084 #, gcc-internal-format msgid "you cannot take the address of a nested function if you use the %qs option" msgstr "" -#: config/rs6000/rs6000.c:20049 +#: config/rs6000/rs6000.c:20166 #, gcc-internal-format msgid "use of % in AltiVec types is invalid" msgstr "" -#: config/rs6000/rs6000.c:20051 +#: config/rs6000/rs6000.c:20168 #, gcc-internal-format msgid "use of boolean types in AltiVec types is invalid" msgstr "" -#: config/rs6000/rs6000.c:20053 +#: config/rs6000/rs6000.c:20170 #, gcc-internal-format msgid "use of % in AltiVec types is invalid" msgstr "" -#: config/rs6000/rs6000.c:20055 +#: config/rs6000/rs6000.c:20172 #, gcc-internal-format -msgid "use of decimal floating point types in AltiVec types is invalid" +msgid "use of decimal floating-point types in AltiVec types is invalid" msgstr "" -#: config/rs6000/rs6000.c:20061 +#: config/rs6000/rs6000.c:20178 #, gcc-internal-format msgid "use of % in AltiVec types is invalid for 64-bit code without %qs" msgstr "" -#: config/rs6000/rs6000.c:20064 +#: config/rs6000/rs6000.c:20181 #, gcc-internal-format msgid "use of % in AltiVec types is deprecated; use %" msgstr "" -#: config/rs6000/rs6000.c:20069 +#: config/rs6000/rs6000.c:20186 #, gcc-internal-format msgid "use of % in AltiVec types is invalid without %qs" msgstr "" -#: config/rs6000/rs6000.c:20072 +#: config/rs6000/rs6000.c:20189 #, gcc-internal-format msgid "use of % in AltiVec types is invalid without %qs" msgstr "" -#: config/rs6000/rs6000.c:24110 +#: config/rs6000/rs6000.c:24227 #, fuzzy, gcc-internal-format #| msgid "invalid use of `%D'" msgid "invalid cpu %qs for %s%qs%s" msgstr "нерэчаіснае выкарыстаньне `%D'" -#: config/rs6000/rs6000.c:24113 +#: config/rs6000/rs6000.c:24230 #, fuzzy, gcc-internal-format #| msgid "%s=%s is too large" msgid "%s%qs%s is not allowed" msgstr "%s=%s вельмі вялікі" -#: config/rs6000/rs6000.c:24115 +#: config/rs6000/rs6000.c:24232 #, gcc-internal-format msgid "%s%qs%s is invalid" msgstr "" -#: config/rs6000/rs6000.c:24660 +#: config/rs6000/rs6000.c:24777 #, gcc-internal-format msgid "%<-mno-%s%> turns off %<-m%s%>" msgstr "" -#: config/rs6000/rs6000.c:24819 +#: config/rs6000/rs6000.c:24936 #, gcc-internal-format msgid "% attribute needs GLIBC (2.23 and newer) that exports hardware capability bits" msgstr "" -#: config/rs6000/rs6000.c:24851 +#: config/rs6000/rs6000.c:24968 #, fuzzy, gcc-internal-format msgid "multiversioning needs ifunc which is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: config/rs6000/rs6000.c:25107 +#: config/rs6000/rs6000.c:25224 #, gcc-internal-format msgid "Virtual function multiversioning not supported" msgstr "" -#: config/rs6000/rs6000.c:27708 +#: config/rs6000/rs6000.c:27827 #, gcc-internal-format msgid "the result for the xxspltidp instruction is undefined for subnormal input values" msgstr "" @@ -39863,7 +39878,7 @@ msgstr "" msgid "builtin vec_step can only be used on vector types." msgstr "" -#: config/s390/s390-c.c:712 config/s390/s390.c:896 +#: config/s390/s390-c.c:712 config/s390/s390.c:919 #, gcc-internal-format msgid "constant value required for builtin %qF argument %d" msgstr "" @@ -39934,202 +39949,207 @@ msgstr "" msgid "constant argument %d for builtin %qF is out of range for target type" msgstr "" -#: config/s390/s390.c:743 +#: config/s390/s390.c:762 +#, fuzzy, gcc-internal-format +msgid "constant argument %d for builtin %qF is invalid (%s)" +msgstr "параметр \"%s\" ініцыялізаваны" + +#: config/s390/s390.c:766 #, gcc-internal-format msgid "constant argument %d for builtin %qF is out of range (0..%wu)" msgstr "" -#: config/s390/s390.c:759 +#: config/s390/s390.c:782 #, gcc-internal-format msgid "constant argument %d for builtin %qF is out of range (%wd..%wd)" msgstr "" -#: config/s390/s390.c:808 +#: config/s390/s390.c:831 #, gcc-internal-format msgid "builtin %qF is not supported without %<-mhtm%> (default with %<-march=zEC12%> and higher)." msgstr "" -#: config/s390/s390.c:814 +#: config/s390/s390.c:837 #, gcc-internal-format msgid "builtin %qF requires %<-mvx%> (default with %<-march=z13%> and higher)." msgstr "" -#: config/s390/s390.c:821 +#: config/s390/s390.c:844 #, gcc-internal-format msgid "Builtin %qF requires z14 or higher." msgstr "" -#: config/s390/s390.c:827 +#: config/s390/s390.c:850 #, gcc-internal-format msgid "Builtin %qF requires z15 or higher." msgstr "" -#: config/s390/s390.c:833 +#: config/s390/s390.c:856 #, gcc-internal-format msgid "Builtin %qF requires arch14 or higher." msgstr "" -#: config/s390/s390.c:852 +#: config/s390/s390.c:875 #, gcc-internal-format msgid "unresolved overloaded builtin" msgstr "" -#: config/s390/s390.c:859 config/tilegx/tilegx.c:3539 +#: config/s390/s390.c:882 config/tilegx/tilegx.c:3539 #: config/tilepro/tilepro.c:3103 #, gcc-internal-format msgid "bad builtin icode" msgstr "" -#: config/s390/s390.c:993 +#: config/s390/s390.c:1016 #, fuzzy, gcc-internal-format msgid "invalid argument %d for builtin %qF" msgstr "нявернае выкарыстанне \"restict\"" -#: config/s390/s390.c:1094 +#: config/s390/s390.c:1117 #, gcc-internal-format msgid "requested %qE attribute is not a comma separated pair of non-negative integer constants or too large (max. %d)" msgstr "" -#: config/s390/s390.c:1184 +#: config/s390/s390.c:1207 #, fuzzy, gcc-internal-format msgid "argument to %qE attribute is not (keep|thunk|thunk-extern)" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/s390/s390.c:10001 +#: config/s390/s390.c:10024 #, gcc-internal-format msgid "total size of local variables exceeds architecture limit" msgstr "" -#: config/s390/s390.c:11366 +#: config/s390/s390.c:11389 #, gcc-internal-format msgid "frame size of function %qs is %wd bytes exceeding user provided stack limit of %d bytes. An unconditional trap is added." msgstr "" -#: config/s390/s390.c:11382 +#: config/s390/s390.c:11405 #, gcc-internal-format msgid "frame size of function %qs is %wd bytes which is more than half the stack size. The dynamic check would not be reliable. No check emitted for this function." msgstr "" -#: config/s390/s390.c:11410 +#: config/s390/s390.c:11433 #, fuzzy, gcc-internal-format #| msgid "size of `%s' is %d bytes" msgid "frame size of %qs is %wd bytes" msgstr "памер \"%s\" - %d байт" -#: config/s390/s390.c:11414 +#: config/s390/s390.c:11437 #, gcc-internal-format msgid "%qs uses dynamic stack allocation" msgstr "" -#: config/s390/s390.c:13124 +#: config/s390/s390.c:13147 #, gcc-internal-format msgid "nested functions cannot be profiled with %<-mfentry%> on s390" msgstr "" -#: config/s390/s390.c:15390 +#: config/s390/s390.c:15413 #, gcc-internal-format msgid "64-bit ABI not supported in ESA/390 mode" msgstr "" -#: config/s390/s390.c:15397 +#: config/s390/s390.c:15420 #, gcc-internal-format msgid "thunk-inline is only supported with %<-mindirect-branch-jump%>" msgstr "" -#: config/s390/s390.c:15432 +#: config/s390/s390.c:15455 #, gcc-internal-format, gfc-internal-format msgid "hardware vector support not available on %s" msgstr "" -#: config/s390/s390.c:15435 +#: config/s390/s390.c:15458 #, gcc-internal-format msgid "hardware vector support not available with %<-msoft-float%>" msgstr "" -#: config/s390/s390.c:15464 +#: config/s390/s390.c:15487 #, gcc-internal-format, gfc-internal-format msgid "hardware decimal floating point instructions not available on %s" msgstr "" -#: config/s390/s390.c:15468 +#: config/s390/s390.c:15491 #, gcc-internal-format msgid "hardware decimal floating point instructions not available in ESA/390 mode" msgstr "" -#: config/s390/s390.c:15480 +#: config/s390/s390.c:15503 #, gcc-internal-format msgid "%<-mhard-dfp%> can%'t be used in conjunction with %<-msoft-float%>" msgstr "" -#: config/s390/s390.c:15489 +#: config/s390/s390.c:15512 #, gcc-internal-format msgid "%<-mbackchain%> %<-mpacked-stack%> %<-mhard-float%> are not supported in combination" msgstr "" -#: config/s390/s390.c:15495 +#: config/s390/s390.c:15518 #, gcc-internal-format msgid "stack size must be greater than the stack guard value" msgstr "" -#: config/s390/s390.c:15497 +#: config/s390/s390.c:15520 #, gcc-internal-format msgid "stack size must not be greater than 64k" msgstr "" -#: config/s390/s390.c:15500 +#: config/s390/s390.c:15523 #, gcc-internal-format msgid "%<-mstack-guard%> implies use of %<-mstack-size%>" msgstr "" -#: config/s390/s390.c:15513 +#: config/s390/s390.c:15536 #, gcc-internal-format msgid "-mtpf-trace-hook-prologue-check requires integer in range 0..4095" msgstr "" -#: config/s390/s390.c:15516 +#: config/s390/s390.c:15539 #, gcc-internal-format msgid "-mtpf-trace-hook-prologue-target requires integer in range 0..4095" msgstr "" -#: config/s390/s390.c:15519 +#: config/s390/s390.c:15542 #, gcc-internal-format msgid "-mtpf-trace-hook-epilogue-check requires integer in range 0..4095" msgstr "" -#: config/s390/s390.c:15522 +#: config/s390/s390.c:15545 #, gcc-internal-format msgid "-mtpf-trace-hook-epilogue-target requires integer in range 0..4095" msgstr "" -#: config/s390/s390.c:15575 +#: config/s390/s390.c:15598 #, gcc-internal-format msgid "%<-mfentry%> is supported only for 64-bit CPUs" msgstr "" #. argument is not a plain number -#: config/s390/s390.c:15611 +#: config/s390/s390.c:15634 #, fuzzy, gcc-internal-format #| msgid "first argument of `%s' should be `int'" msgid "arguments to %qs should be non-negative integers" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/s390/s390.c:15618 +#: config/s390/s390.c:15641 #, fuzzy, gcc-internal-format msgid "argument to %qs is too large (max. %d)" msgstr "памер \"%s\" больш чам %d байт" -#: config/s390/s390.c:15649 +#: config/s390/s390.c:15672 #, gcc-internal-format msgid "%<-mno-pic-data-is-text-relative%> cannot be used without %<-fpic%>/%<-fPIC%>" msgstr "" -#: config/s390/s390.c:15810 config/s390/s390.c:15860 config/s390/s390.c:15877 +#: config/s390/s390.c:15833 config/s390/s390.c:15883 config/s390/s390.c:15900 #, gcc-internal-format, gfc-internal-format msgid "attribute(target(\"%s\")) is unknown" msgstr "" #. Value is not allowed for the target attribute. -#: config/s390/s390.c:15816 +#: config/s390/s390.c:15839 #, fuzzy, gcc-internal-format msgid "value %qs is not supported by attribute %" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" @@ -40473,17 +40493,22 @@ msgstr "" msgid "STABS debugging information for Ada is obsolete and not supported anymore" msgstr "" -#: ada/gcc-interface/trans.c:1637 +#: ada/gcc-interface/trans.c:332 +#, gcc-internal-format, gfc-internal-format +msgid "%s contains too many lines" +msgstr "" + +#: ada/gcc-interface/trans.c:1642 #, gcc-internal-format msgid "subprogram %q+F not marked %" msgstr "" -#: ada/gcc-interface/trans.c:1639 ada/gcc-interface/trans.c:1645 +#: ada/gcc-interface/trans.c:1644 ada/gcc-interface/trans.c:1650 #, fuzzy, gcc-internal-format msgid "parent subprogram cannot be inlined" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: ada/gcc-interface/trans.c:1643 +#: ada/gcc-interface/trans.c:1648 #, gcc-internal-format msgid "subprogram %q+F not marked %" msgstr "" @@ -40551,8 +40576,8 @@ msgstr "\"%s\" атрыбут ігнарыруецца" msgid "could not read the BRIG file" msgstr "не магу знайсці крыніцу %s\n" -#: c/c-convert.c:101 c/c-typeck.c:2210 c/c-typeck.c:12707 cp/typeck.c:2146 -#: cp/typeck.c:8603 cp/typeck.c:9394 +#: c/c-convert.c:101 c/c-typeck.c:2260 c/c-typeck.c:12767 cp/typeck.c:2157 +#: cp/typeck.c:8610 cp/typeck.c:9401 #, gcc-internal-format msgid "void value not ignored as it ought to be" msgstr "" @@ -40615,7 +40640,7 @@ msgstr "адмеціна `%D' вызначана, але не выкарысто msgid "type of array %q+D completed incompatibly with implicit initialization" msgstr "" -#: c/c-decl.c:1596 c/c-decl.c:7353 c/c-decl.c:8261 c/c-decl.c:9068 +#: c/c-decl.c:1596 c/c-decl.c:7352 c/c-decl.c:8260 c/c-decl.c:9067 #, gcc-internal-format msgid "originally defined here" msgstr "" @@ -40840,7 +40865,7 @@ msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэк msgid "declaration of %qD shadows a parameter" msgstr "" -#: c/c-decl.c:3041 cp/name-lookup.c:3339 +#: c/c-decl.c:3041 cp/name-lookup.c:3340 #, gcc-internal-format msgid "declaration of %qD shadows a global declaration" msgstr "" @@ -40850,7 +40875,7 @@ msgstr "" msgid "declaration of %qD shadows a previous local" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: c/c-decl.c:3073 cp/name-lookup.c:3112 +#: c/c-decl.c:3073 cp/name-lookup.c:3113 #, fuzzy, gcc-internal-format msgid "shadowed declaration is here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" @@ -40860,220 +40885,220 @@ msgstr "няма папярэдняга аб'яўлення для \"%s\"" msgid "nested extern declaration of %qD" msgstr "пустое абвяшчэнне" -#: c/c-decl.c:3367 c/c-decl.c:3381 +#: c/c-decl.c:3366 c/c-decl.c:3380 #, fuzzy, gcc-internal-format msgid "implicit declaration of function %qE; did you mean %qs?" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c/c-decl.c:3373 c/c-decl.c:3386 +#: c/c-decl.c:3372 c/c-decl.c:3385 #, fuzzy, gcc-internal-format msgid "implicit declaration of function %qE" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c/c-decl.c:3405 +#: c/c-decl.c:3404 #, fuzzy, gcc-internal-format msgid "include %qs or provide a declaration of %qE" msgstr "Нерэчаіснае абвяшчэнне" -#: c/c-decl.c:3675 +#: c/c-decl.c:3674 #, fuzzy, gcc-internal-format msgid "incompatible implicit declaration of built-in function %qD" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c/c-decl.c:3685 +#: c/c-decl.c:3684 #, fuzzy, gcc-internal-format msgid "include %qs or provide a declaration of %qD" msgstr "Нерэчаіснае абвяшчэнне" -#: c/c-decl.c:3696 +#: c/c-decl.c:3695 #, fuzzy, gcc-internal-format msgid "incompatible implicit declaration of function %qD" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c/c-decl.c:3757 +#: c/c-decl.c:3756 #, gcc-internal-format msgid "%qE undeclared here (not in a function); did you mean %qs?" msgstr "" -#: c/c-decl.c:3762 +#: c/c-decl.c:3761 #, fuzzy, gcc-internal-format msgid "%qE undeclared here (not in a function)" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:3775 +#: c/c-decl.c:3774 #, fuzzy, gcc-internal-format #| msgid "`%s' undeclared (first use in this function)" msgid "%qE undeclared (first use in this function); did you mean %qs?" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:3780 +#: c/c-decl.c:3779 #, fuzzy, gcc-internal-format #| msgid "`%s' undeclared (first use in this function)" msgid "%qE undeclared (first use in this function)" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:3784 +#: c/c-decl.c:3783 #, fuzzy, gcc-internal-format #| msgid "(Each undeclared identifier is reported only once" msgid "each undeclared identifier is reported only once for each function it appears in" msgstr "(Аб кожным неабвешчаным ідэнтыфікатары паведамляецца" -#: c/c-decl.c:3832 cp/decl.c:3281 +#: c/c-decl.c:3831 cp/decl.c:3263 #, gcc-internal-format msgid "label %qE referenced outside of any function" msgstr "" -#: c/c-decl.c:3868 +#: c/c-decl.c:3867 #, gcc-internal-format msgid "jump into scope of identifier with variably modified type" msgstr "" -#: c/c-decl.c:3871 +#: c/c-decl.c:3870 #, fuzzy, gcc-internal-format msgid "jump skips variable initialization" msgstr "нерэчаісны ініцыялізатар" -#: c/c-decl.c:3872 c/c-decl.c:3927 c/c-decl.c:4017 +#: c/c-decl.c:3871 c/c-decl.c:3926 c/c-decl.c:4016 #, fuzzy, gcc-internal-format #| msgid "label `%D' defined but not used" msgid "label %qD defined here" msgstr "адмеціна `%D' вызначана, але не выкарыстоўваецца" -#: c/c-decl.c:3926 c/c-decl.c:4016 +#: c/c-decl.c:3925 c/c-decl.c:4015 #, gcc-internal-format msgid "jump into statement expression" msgstr "" -#: c/c-decl.c:3949 +#: c/c-decl.c:3948 #, fuzzy, gcc-internal-format #| msgid "duplicate label declaration `%s'" msgid "duplicate label declaration %qE" msgstr "паўторнае абвяшчэньне адмеціны `%s'" -#: c/c-decl.c:4048 cp/decl.c:3687 +#: c/c-decl.c:4047 cp/decl.c:3669 #, fuzzy, gcc-internal-format msgid "duplicate label %qD" msgstr "паўтарэнне \"%s\"" -#: c/c-decl.c:4079 +#: c/c-decl.c:4078 #, gcc-internal-format msgid "traditional C lacks a separate namespace for labels, identifier %qE conflicts" msgstr "" -#: c/c-decl.c:4144 +#: c/c-decl.c:4143 #, gcc-internal-format msgid "switch jumps over variable initialization" msgstr "" -#: c/c-decl.c:4145 c/c-decl.c:4156 +#: c/c-decl.c:4144 c/c-decl.c:4155 #, gcc-internal-format msgid "switch starts here" msgstr "" -#: c/c-decl.c:4155 +#: c/c-decl.c:4154 #, gcc-internal-format msgid "switch jumps into statement expression" msgstr "" -#: c/c-decl.c:4238 +#: c/c-decl.c:4237 #, gcc-internal-format msgid "%qE defined as wrong kind of tag" msgstr "" -#: c/c-decl.c:4424 cp/tree.c:4728 +#: c/c-decl.c:4423 cp/tree.c:4789 #, gcc-internal-format msgid "%qE attribute applied to %qD with void return type" msgstr "" -#: c/c-decl.c:4433 +#: c/c-decl.c:4432 #, gcc-internal-format msgid "%qE attribute can only be applied to functions or to structure, union or enumeration types" msgstr "" -#: c/c-decl.c:4698 +#: c/c-decl.c:4697 #, gcc-internal-format msgid "unnamed struct/union that defines no instances" msgstr "" -#: c/c-decl.c:4709 +#: c/c-decl.c:4708 #, gcc-internal-format msgid "empty declaration with storage class specifier does not redeclare tag" msgstr "" -#: c/c-decl.c:4725 +#: c/c-decl.c:4724 #, gcc-internal-format msgid "empty declaration with type qualifier does not redeclare tag" msgstr "" -#: c/c-decl.c:4737 +#: c/c-decl.c:4736 #, gcc-internal-format msgid "empty declaration with %<_Alignas%> does not redeclare tag" msgstr "" -#: c/c-decl.c:4759 c/c-decl.c:4767 +#: c/c-decl.c:4758 c/c-decl.c:4766 #, fuzzy, gcc-internal-format msgid "useless type name in empty declaration" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: c/c-decl.c:4775 +#: c/c-decl.c:4774 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "% in empty declaration" msgstr "пустое абвяшчэньне" -#: c/c-decl.c:4781 +#: c/c-decl.c:4780 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "%<_Noreturn%> in empty declaration" msgstr "пустое абвяшчэньне" -#: c/c-decl.c:4787 +#: c/c-decl.c:4786 #, gcc-internal-format msgid "% in file-scope empty declaration" msgstr "" -#: c/c-decl.c:4793 +#: c/c-decl.c:4792 #, gcc-internal-format msgid "% in file-scope empty declaration" msgstr "" -#: c/c-decl.c:4800 +#: c/c-decl.c:4799 #, fuzzy, gcc-internal-format msgid "useless storage class specifier in empty declaration" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: c/c-decl.c:4806 +#: c/c-decl.c:4805 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "useless %qs in empty declaration" msgstr "пустое абвяшчэньне" -#: c/c-decl.c:4819 +#: c/c-decl.c:4818 #, fuzzy, gcc-internal-format msgid "useless type qualifier in empty declaration" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: c/c-decl.c:4826 +#: c/c-decl.c:4825 #, gcc-internal-format msgid "useless %<_Alignas%> in empty declaration" msgstr "" -#: c/c-decl.c:4844 +#: c/c-decl.c:4843 #, fuzzy, gcc-internal-format msgid "invalid use of attributes in empty declaration" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: c/c-decl.c:4858 c/c-parser.c:2033 +#: c/c-decl.c:4857 c/c-parser.c:2033 #, gcc-internal-format msgid "empty declaration" msgstr "пустое абвяшчэньне" -#: c/c-decl.c:4929 +#: c/c-decl.c:4928 #, fuzzy, gcc-internal-format msgid "ISO C90 does not support % or type qualifiers in parameter array declarators" msgstr "ISO C89 не падтрымлівае \"long long\"" -#: c/c-decl.c:4933 +#: c/c-decl.c:4932 #, fuzzy, gcc-internal-format msgid "ISO C90 does not support %<[*]%> array declarators" msgstr "ISO C89 не падтрымлівае \"long long\"" @@ -41081,29 +41106,29 @@ msgstr "ISO C89 не падтрымлівае \"long long\"" #. C99 6.7.5.2p4 #. A function definition isn't function prototype scope C99 6.2.1p4. #. C99 6.7.5.2p4 -#: c/c-decl.c:4939 c/c-decl.c:7820 c/c-decl.c:9738 +#: c/c-decl.c:4938 c/c-decl.c:7819 c/c-decl.c:9737 #, gcc-internal-format msgid "%<[*]%> not allowed in other than function prototype scope" msgstr "" -#: c/c-decl.c:5104 +#: c/c-decl.c:5103 #, fuzzy, gcc-internal-format #| msgid "`%s' is usually a function" msgid "%q+D is usually a function" msgstr "`%s' - звычайна функцыя" -#: c/c-decl.c:5113 +#: c/c-decl.c:5112 #, fuzzy, gcc-internal-format msgid "typedef %qD is initialized (use %<__typeof__%> instead)" msgstr "параметр \"%s\" ініцыялізаваны" -#: c/c-decl.c:5118 +#: c/c-decl.c:5117 #, gcc-internal-format msgid "function %qD is initialized like a variable" msgstr "" #. DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE. -#: c/c-decl.c:5124 +#: c/c-decl.c:5123 #, fuzzy, gcc-internal-format #| msgid "parameter `%s' is initialized" msgid "parameter %qD is initialized" @@ -41113,274 +41138,274 @@ msgstr "параметр \"%s\" ініцыялізаваны" #. of VLAs themselves count as VLAs, it does not make #. sense to permit them to be initialized given that #. ordinary VLAs may not be initialized. -#: c/c-decl.c:5143 c/c-decl.c:5158 c/c-typeck.c:8153 +#: c/c-decl.c:5142 c/c-decl.c:5157 c/c-typeck.c:8213 #, gcc-internal-format msgid "variable-sized object may not be initialized" msgstr "" -#: c/c-decl.c:5149 +#: c/c-decl.c:5148 #, fuzzy, gcc-internal-format msgid "variable %qD has initializer but incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:5238 +#: c/c-decl.c:5237 #, gcc-internal-format msgid "inline function %q+D given attribute %qs" msgstr "" -#: c/c-decl.c:5288 +#: c/c-decl.c:5287 #, gcc-internal-format msgid "uninitialized const member in %qT is invalid in C++" msgstr "" -#: c/c-decl.c:5290 +#: c/c-decl.c:5289 #, fuzzy, gcc-internal-format msgid "%qD should be initialized" msgstr "параметр \"%s\" ініцыялізаваны" -#: c/c-decl.c:5371 +#: c/c-decl.c:5370 #, gcc-internal-format msgid "initializer fails to determine size of %q+D" msgstr "" -#: c/c-decl.c:5376 +#: c/c-decl.c:5375 #, fuzzy, gcc-internal-format #| msgid "array size missing in `%D'" msgid "array size missing in %q+D" msgstr "прапушчан памер масіва ў `%D'" -#: c/c-decl.c:5380 +#: c/c-decl.c:5379 #, fuzzy, gcc-internal-format #| msgid "zero-size array `%D'" msgid "zero or negative size array %q+D" msgstr "нулявы памер масіва `%D'" -#: c/c-decl.c:5469 +#: c/c-decl.c:5468 #, fuzzy, gcc-internal-format msgid "storage size of %q+D isn%'t constant" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:5519 +#: c/c-decl.c:5518 #, gcc-internal-format msgid "ignoring % specifier for non-static local variable %q+D" msgstr "" -#: c/c-decl.c:5557 +#: c/c-decl.c:5556 #, gcc-internal-format msgid "cannot put object with volatile field into register" msgstr "" -#: c/c-decl.c:5643 +#: c/c-decl.c:5642 #, fuzzy, gcc-internal-format msgid "uninitialized % is invalid in C++" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: c/c-decl.c:5658 cp/decl.c:8192 +#: c/c-decl.c:5657 cp/decl.c:8198 #, gcc-internal-format msgid "%q+D in declare target directive does not have mappable type" msgstr "" -#: c/c-decl.c:5915 +#: c/c-decl.c:5914 #, gcc-internal-format msgid "ISO C forbids forward parameter declarations" msgstr "" -#: c/c-decl.c:6026 +#: c/c-decl.c:6025 #, gcc-internal-format msgid "defining a type in a compound literal is invalid in C++" msgstr "" -#: c/c-decl.c:6047 c/c-decl.c:6062 +#: c/c-decl.c:6046 c/c-decl.c:6061 #, fuzzy, gcc-internal-format msgid "bit-field %qs width not an integer constant" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-decl.c:6057 +#: c/c-decl.c:6056 #, fuzzy, gcc-internal-format msgid "bit-field %qs width not an integer constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:6068 +#: c/c-decl.c:6067 #, gcc-internal-format msgid "negative width in bit-field %qs" msgstr "" -#: c/c-decl.c:6073 +#: c/c-decl.c:6072 #, gcc-internal-format msgid "zero width for bit-field %qs" msgstr "" -#: c/c-decl.c:6083 +#: c/c-decl.c:6082 #, fuzzy, gcc-internal-format #| msgid "bit-field `%s' has invalid type" msgid "bit-field %qs has invalid type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-decl.c:6089 +#: c/c-decl.c:6088 #, gcc-internal-format msgid "cannot declare bit-field %qs with % type" msgstr "" -#: c/c-decl.c:6100 +#: c/c-decl.c:6099 #, gcc-internal-format msgid "type of bit-field %qs is a GCC extension" msgstr "" -#: c/c-decl.c:6106 +#: c/c-decl.c:6105 #, gcc-internal-format msgid "width of %qs exceeds its type" msgstr "" -#: c/c-decl.c:6119 +#: c/c-decl.c:6118 #, gcc-internal-format msgid "%qs is narrower than values of its type" msgstr "" -#: c/c-decl.c:6134 +#: c/c-decl.c:6133 #, gcc-internal-format msgid "ISO C90 forbids array %qE whose size cannot be evaluated" msgstr "" -#: c/c-decl.c:6137 +#: c/c-decl.c:6136 #, gcc-internal-format msgid "ISO C90 forbids array whose size cannot be evaluated" msgstr "" -#: c/c-decl.c:6144 +#: c/c-decl.c:6143 #, fuzzy, gcc-internal-format msgid "ISO C90 forbids variable length array %qE" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-decl.c:6146 +#: c/c-decl.c:6145 #, fuzzy, gcc-internal-format msgid "ISO C90 forbids variable length array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-decl.c:6357 c/c-decl.c:6753 c/c-decl.c:6763 +#: c/c-decl.c:6356 c/c-decl.c:6752 c/c-decl.c:6762 #, gcc-internal-format msgid "variably modified %qE at file scope" msgstr "" -#: c/c-decl.c:6359 +#: c/c-decl.c:6358 #, gcc-internal-format msgid "variably modified field at file scope" msgstr "" -#: c/c-decl.c:6379 +#: c/c-decl.c:6378 #, gcc-internal-format msgid "type defaults to % in declaration of %qE" msgstr "" -#: c/c-decl.c:6383 +#: c/c-decl.c:6382 #, gcc-internal-format msgid "type defaults to % in type name" msgstr "" -#: c/c-decl.c:6415 +#: c/c-decl.c:6414 #, fuzzy, gcc-internal-format #| msgid "duplicate `const'" msgid "duplicate %" msgstr "паўтарэнне \"const\"" -#: c/c-decl.c:6417 +#: c/c-decl.c:6416 #, fuzzy, gcc-internal-format #| msgid "duplicate `restrict'" msgid "duplicate %" msgstr "паўтарэнне \"restrict\"" -#: c/c-decl.c:6419 +#: c/c-decl.c:6418 #, fuzzy, gcc-internal-format #| msgid "duplicate `volatile'" msgid "duplicate %" msgstr "паўтарэнне \"volatile\"" -#: c/c-decl.c:6421 +#: c/c-decl.c:6420 #, fuzzy, gcc-internal-format #| msgid "duplicate `restrict'" msgid "duplicate %<_Atomic%>" msgstr "паўтарэнне \"restrict\"" -#: c/c-decl.c:6424 +#: c/c-decl.c:6423 #, gcc-internal-format, gfc-internal-format msgid "conflicting named address spaces (%s vs %s)" msgstr "" -#: c/c-decl.c:6447 c/c-parser.c:3048 +#: c/c-decl.c:6446 c/c-parser.c:3048 #, gcc-internal-format msgid "%<_Atomic%>-qualified array type" msgstr "" -#: c/c-decl.c:6461 +#: c/c-decl.c:6460 #, gcc-internal-format msgid "function definition declared %" msgstr "" -#: c/c-decl.c:6463 +#: c/c-decl.c:6462 #, fuzzy, gcc-internal-format msgid "function definition declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: c/c-decl.c:6465 +#: c/c-decl.c:6464 #, gcc-internal-format msgid "function definition declared %" msgstr "" -#: c/c-decl.c:6467 +#: c/c-decl.c:6466 #, fuzzy, gcc-internal-format msgid "function definition declared %qs" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: c/c-decl.c:6485 +#: c/c-decl.c:6484 #, gcc-internal-format msgid "storage class specified for structure field %qE" msgstr "" -#: c/c-decl.c:6488 +#: c/c-decl.c:6487 #, gcc-internal-format msgid "storage class specified for structure field" msgstr "" -#: c/c-decl.c:6492 +#: c/c-decl.c:6491 #, gcc-internal-format msgid "storage class specified for parameter %qE" msgstr "" -#: c/c-decl.c:6495 +#: c/c-decl.c:6494 #, gcc-internal-format msgid "storage class specified for unnamed parameter" msgstr "" -#: c/c-decl.c:6498 cp/decl.c:12158 +#: c/c-decl.c:6497 cp/decl.c:12176 #, gcc-internal-format msgid "storage class specified for typename" msgstr "" -#: c/c-decl.c:6515 +#: c/c-decl.c:6514 #, gcc-internal-format msgid "%qE initialized and declared %" msgstr "" -#: c/c-decl.c:6519 +#: c/c-decl.c:6518 #, gcc-internal-format msgid "%qE has both % and initializer" msgstr "" -#: c/c-decl.c:6524 +#: c/c-decl.c:6523 #, gcc-internal-format msgid "file-scope declaration of %qE specifies %" msgstr "" -#: c/c-decl.c:6528 +#: c/c-decl.c:6527 #, gcc-internal-format msgid "file-scope declaration of %qE specifies %" msgstr "" -#: c/c-decl.c:6533 +#: c/c-decl.c:6532 #, gcc-internal-format msgid "nested function %qE declared %" msgstr "" -#: c/c-decl.c:6536 +#: c/c-decl.c:6535 #, gcc-internal-format msgid "function-scope %qE implicitly auto and declared %qs" msgstr "" @@ -41388,736 +41413,736 @@ msgstr "" #. Only the innermost declarator (making a parameter be of #. array type which is converted to pointer type) #. may have static or type qualifiers. -#: c/c-decl.c:6583 c/c-decl.c:6977 +#: c/c-decl.c:6582 c/c-decl.c:6976 #, gcc-internal-format msgid "static or type qualifiers in non-parameter array declarator" msgstr "" -#: c/c-decl.c:6644 +#: c/c-decl.c:6643 #, gcc-internal-format msgid "declaration of %qE as array of voids" msgstr "" -#: c/c-decl.c:6646 +#: c/c-decl.c:6645 #, gcc-internal-format msgid "declaration of type name as array of voids" msgstr "" -#: c/c-decl.c:6653 +#: c/c-decl.c:6652 #, gcc-internal-format msgid "declaration of %qE as array of functions" msgstr "" -#: c/c-decl.c:6656 +#: c/c-decl.c:6655 #, gcc-internal-format msgid "declaration of type name as array of functions" msgstr "" -#: c/c-decl.c:6664 c/c-decl.c:8792 +#: c/c-decl.c:6663 c/c-decl.c:8791 #, fuzzy, gcc-internal-format msgid "invalid use of structure with flexible array member" msgstr "нявернае выкарыстанне \"restict\"" -#: c/c-decl.c:6696 +#: c/c-decl.c:6695 #, fuzzy, gcc-internal-format msgid "size of array %qE has non-integer type" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:6700 +#: c/c-decl.c:6699 #, fuzzy, gcc-internal-format msgid "size of unnamed array has non-integer type" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:6708 +#: c/c-decl.c:6707 #, fuzzy, gcc-internal-format msgid "size of array %qE has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:6711 +#: c/c-decl.c:6710 #, fuzzy, gcc-internal-format msgid "size of unnamed array has incomplete type" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:6723 +#: c/c-decl.c:6722 #, fuzzy, gcc-internal-format msgid "ISO C forbids zero-size array %qE" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-decl.c:6726 +#: c/c-decl.c:6725 #, fuzzy, gcc-internal-format msgid "ISO C forbids zero-size array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-decl.c:6735 +#: c/c-decl.c:6734 #, fuzzy, gcc-internal-format #| msgid "size of array is negative" msgid "size of array %qE is negative" msgstr "адмоўны памер масіва " -#: c/c-decl.c:6737 +#: c/c-decl.c:6736 #, fuzzy, gcc-internal-format #| msgid "size of array is negative" msgid "size of unnamed array is negative" msgstr "адмоўны памер масіва " -#: c/c-decl.c:6823 +#: c/c-decl.c:6822 #, fuzzy, gcc-internal-format #| msgid "size of array `%s' is too large" msgid "size of array %qE is too large" msgstr "памер масіва \"%s\" вельмі вялікі" -#: c/c-decl.c:6826 +#: c/c-decl.c:6825 #, fuzzy, gcc-internal-format #| msgid "size of array `%s' is too large" msgid "size of unnamed array is too large" msgstr "памер масіва \"%s\" вельмі вялікі" -#: c/c-decl.c:6865 c/c-decl.c:7523 +#: c/c-decl.c:6864 c/c-decl.c:7522 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C90 does not support flexible array members" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" #. C99 6.7.5.2p4 -#: c/c-decl.c:6887 +#: c/c-decl.c:6886 #, fuzzy, gcc-internal-format #| msgid "`%s' is not at beginning of declaration" msgid "%<[*]%> not in a declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: c/c-decl.c:6900 +#: c/c-decl.c:6899 #, fuzzy, gcc-internal-format msgid "array type has incomplete element type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:6906 +#: c/c-decl.c:6905 #, gcc-internal-format msgid "declaration of %qE as multidimensional array must have bounds for all dimensions except the first" msgstr "" -#: c/c-decl.c:6910 +#: c/c-decl.c:6909 #, gcc-internal-format msgid "declaration of multidimensional array must have bounds for all dimensions except the first" msgstr "" -#: c/c-decl.c:7013 +#: c/c-decl.c:7012 #, fuzzy, gcc-internal-format #| msgid "`%s' undeclared (first use in this function)" msgid "%qE declared as function returning a function" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:7016 +#: c/c-decl.c:7015 #, gcc-internal-format msgid "type name declared as function returning a function" msgstr "" -#: c/c-decl.c:7023 +#: c/c-decl.c:7022 #, gcc-internal-format msgid "%qE declared as function returning an array" msgstr "" -#: c/c-decl.c:7026 +#: c/c-decl.c:7025 #, gcc-internal-format msgid "type name declared as function returning an array" msgstr "" -#: c/c-decl.c:7067 +#: c/c-decl.c:7066 #, fuzzy, gcc-internal-format #| msgid "function does not return string type" msgid "function definition has qualified void return type" msgstr "функцыя не вяртае тып string" -#: c/c-decl.c:7071 cp/decl.c:12458 +#: c/c-decl.c:7070 cp/decl.c:12476 #, gcc-internal-format msgid "type qualifiers ignored on function return type" msgstr "" -#: c/c-decl.c:7109 c/c-decl.c:7319 c/c-decl.c:7373 c/c-decl.c:7457 -#: c/c-decl.c:7582 c/c-parser.c:3050 +#: c/c-decl.c:7108 c/c-decl.c:7318 c/c-decl.c:7372 c/c-decl.c:7456 +#: c/c-decl.c:7581 c/c-parser.c:3050 #, gcc-internal-format msgid "%<_Atomic%>-qualified function type" msgstr "" -#: c/c-decl.c:7115 c/c-decl.c:7325 c/c-decl.c:7462 c/c-decl.c:7587 +#: c/c-decl.c:7114 c/c-decl.c:7324 c/c-decl.c:7461 c/c-decl.c:7586 #, gcc-internal-format msgid "ISO C forbids qualified function types" msgstr "" -#: c/c-decl.c:7210 +#: c/c-decl.c:7209 #, gcc-internal-format msgid "%qs combined with % qualifier for %qE" msgstr "" -#: c/c-decl.c:7214 +#: c/c-decl.c:7213 #, gcc-internal-format msgid "%qs combined with % qualifier for %qE" msgstr "" -#: c/c-decl.c:7220 +#: c/c-decl.c:7219 #, gcc-internal-format msgid "%qs specified for auto variable %qE" msgstr "" -#: c/c-decl.c:7236 +#: c/c-decl.c:7235 #, gcc-internal-format msgid "%qs specified for parameter %qE" msgstr "" -#: c/c-decl.c:7239 +#: c/c-decl.c:7238 #, gcc-internal-format msgid "%qs specified for unnamed parameter" msgstr "" -#: c/c-decl.c:7245 +#: c/c-decl.c:7244 #, gcc-internal-format msgid "%qs specified for structure field %qE" msgstr "" -#: c/c-decl.c:7248 +#: c/c-decl.c:7247 #, gcc-internal-format msgid "%qs specified for structure field" msgstr "" -#: c/c-decl.c:7263 +#: c/c-decl.c:7262 #, fuzzy, gcc-internal-format #| msgid "bit-field `%s' has invalid type" msgid "bit-field %qE has atomic type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-decl.c:7265 +#: c/c-decl.c:7264 #, fuzzy, gcc-internal-format #| msgid "bit-field `%s' has invalid type" msgid "bit-field has atomic type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-decl.c:7274 +#: c/c-decl.c:7273 #, gcc-internal-format msgid "alignment specified for typedef %qE" msgstr "" -#: c/c-decl.c:7276 +#: c/c-decl.c:7275 #, gcc-internal-format msgid "alignment specified for % object %qE" msgstr "" -#: c/c-decl.c:7281 +#: c/c-decl.c:7280 #, gcc-internal-format msgid "alignment specified for parameter %qE" msgstr "" -#: c/c-decl.c:7283 +#: c/c-decl.c:7282 #, gcc-internal-format msgid "alignment specified for unnamed parameter" msgstr "" -#: c/c-decl.c:7288 +#: c/c-decl.c:7287 #, gcc-internal-format msgid "alignment specified for bit-field %qE" msgstr "" -#: c/c-decl.c:7290 +#: c/c-decl.c:7289 #, gcc-internal-format msgid "alignment specified for unnamed bit-field" msgstr "" -#: c/c-decl.c:7293 +#: c/c-decl.c:7292 #, fuzzy, gcc-internal-format msgid "alignment specified for function %qE" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: c/c-decl.c:7300 +#: c/c-decl.c:7299 #, gcc-internal-format msgid "%<_Alignas%> specifiers cannot reduce alignment of %qE" msgstr "" -#: c/c-decl.c:7303 +#: c/c-decl.c:7302 #, gcc-internal-format msgid "%<_Alignas%> specifiers cannot reduce alignment of unnamed field" msgstr "" -#: c/c-decl.c:7334 +#: c/c-decl.c:7333 #, gcc-internal-format msgid "typedef %q+D declared %" msgstr "" -#: c/c-decl.c:7336 +#: c/c-decl.c:7335 #, gcc-internal-format msgid "typedef %q+D declared %<_Noreturn%>" msgstr "" -#: c/c-decl.c:7379 +#: c/c-decl.c:7378 #, gcc-internal-format msgid "ISO C forbids const or volatile function types" msgstr "" #. C99 6.7.2.1p8 -#: c/c-decl.c:7390 +#: c/c-decl.c:7389 #, gcc-internal-format msgid "a member of a structure or union cannot have a variably modified type" msgstr "" -#: c/c-decl.c:7407 cp/decl.c:11090 +#: c/c-decl.c:7406 cp/decl.c:11108 #, fuzzy, gcc-internal-format msgid "variable or field %qE declared void" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:7447 +#: c/c-decl.c:7446 #, gcc-internal-format msgid "attributes in parameter array declarator ignored" msgstr "" -#: c/c-decl.c:7489 +#: c/c-decl.c:7488 #, fuzzy, gcc-internal-format msgid "parameter %q+D declared %" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:7491 +#: c/c-decl.c:7490 #, fuzzy, gcc-internal-format msgid "parameter %q+D declared %<_Noreturn%>" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:7504 +#: c/c-decl.c:7503 #, fuzzy, gcc-internal-format msgid "field %qE declared as a function" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:7511 +#: c/c-decl.c:7510 #, fuzzy, gcc-internal-format msgid "field %qE has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:7513 +#: c/c-decl.c:7512 #, fuzzy, gcc-internal-format msgid "unnamed field has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:7553 c/c-decl.c:7564 c/c-decl.c:7567 +#: c/c-decl.c:7552 c/c-decl.c:7563 c/c-decl.c:7566 #, fuzzy, gcc-internal-format msgid "invalid storage class for function %qE" msgstr "Нерэчаісны выбар \"%s\"" -#: c/c-decl.c:7624 +#: c/c-decl.c:7623 #, fuzzy, gcc-internal-format msgid "cannot inline function %" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: c/c-decl.c:7626 +#: c/c-decl.c:7625 #, gcc-internal-format msgid "% declared %<_Noreturn%>" msgstr "" -#: c/c-decl.c:7637 +#: c/c-decl.c:7636 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C99 does not support %<_Noreturn%>" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-decl.c:7640 +#: c/c-decl.c:7639 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C90 does not support %<_Noreturn%>" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-decl.c:7669 +#: c/c-decl.c:7668 #, gcc-internal-format msgid "variable previously declared % redeclared %" msgstr "" -#: c/c-decl.c:7679 +#: c/c-decl.c:7678 #, gcc-internal-format msgid "variable %q+D declared %" msgstr "" -#: c/c-decl.c:7681 +#: c/c-decl.c:7680 #, gcc-internal-format msgid "variable %q+D declared %<_Noreturn%>" msgstr "" -#: c/c-decl.c:7716 +#: c/c-decl.c:7715 #, gcc-internal-format msgid "non-nested function with variably modified type" msgstr "" -#: c/c-decl.c:7718 +#: c/c-decl.c:7717 #, gcc-internal-format msgid "object with variably modified type must have no linkage" msgstr "" -#: c/c-decl.c:7826 c/c-decl.c:9546 +#: c/c-decl.c:7825 c/c-decl.c:9545 #, gcc-internal-format msgid "function declaration isn%'t a prototype" msgstr "" -#: c/c-decl.c:7836 +#: c/c-decl.c:7835 #, gcc-internal-format msgid "parameter names (without types) in function declaration" msgstr "" -#: c/c-decl.c:7881 +#: c/c-decl.c:7880 #, fuzzy, gcc-internal-format msgid "parameter %u (%q+D) has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:7885 +#: c/c-decl.c:7884 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "parameter %u has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:7896 +#: c/c-decl.c:7895 #, fuzzy, gcc-internal-format msgid "parameter %u (%q+D) has void type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:7900 +#: c/c-decl.c:7899 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "parameter %u has void type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:7974 +#: c/c-decl.c:7973 #, gcc-internal-format msgid "% as only parameter may not be qualified" msgstr "" -#: c/c-decl.c:7978 c/c-decl.c:8014 +#: c/c-decl.c:7977 c/c-decl.c:8013 #, fuzzy, gcc-internal-format msgid "% must be the only parameter" msgstr "нявернае выкарыстанне \"restict\"" -#: c/c-decl.c:8008 +#: c/c-decl.c:8007 #, gcc-internal-format msgid "parameter %q+D has just a forward declaration" msgstr "" -#: c/c-decl.c:8054 +#: c/c-decl.c:8053 #, gcc-internal-format msgid "%<%s %E%> declared inside parameter list will not be visible outside of this definition or declaration" msgstr "" -#: c/c-decl.c:8060 +#: c/c-decl.c:8059 #, gcc-internal-format, gfc-internal-format msgid "anonymous %s declared inside parameter list will not be visible outside of this definition or declaration" msgstr "" -#: c/c-decl.c:8168 +#: c/c-decl.c:8167 #, gcc-internal-format msgid "enum type defined here" msgstr "" -#: c/c-decl.c:8174 +#: c/c-decl.c:8173 #, fuzzy, gcc-internal-format #| msgid "previous definition here" msgid "struct defined here" msgstr "папярэдняе вызначэньне" -#: c/c-decl.c:8180 +#: c/c-decl.c:8179 #, fuzzy, gcc-internal-format #| msgid "previous definition here" msgid "union defined here" msgstr "папярэдняе вызначэньне" -#: c/c-decl.c:8257 +#: c/c-decl.c:8256 #, fuzzy, gcc-internal-format msgid "redefinition of %" msgstr "перанакіраванне stdout: %s" -#: c/c-decl.c:8259 +#: c/c-decl.c:8258 #, fuzzy, gcc-internal-format msgid "redefinition of %" msgstr "перанакіраванне stdout: %s" -#: c/c-decl.c:8268 +#: c/c-decl.c:8267 #, fuzzy, gcc-internal-format msgid "nested redefinition of %" msgstr "перанакіраванне stdout: %s" -#: c/c-decl.c:8270 +#: c/c-decl.c:8269 #, fuzzy, gcc-internal-format msgid "nested redefinition of %" msgstr "перанакіраванне stdout: %s" -#: c/c-decl.c:8300 c/c-decl.c:9087 +#: c/c-decl.c:8299 c/c-decl.c:9086 #, gcc-internal-format msgid "defining type in %qs expression is invalid in C++" msgstr "" -#: c/c-decl.c:8367 cp/decl.c:5143 +#: c/c-decl.c:8366 cp/decl.c:5139 #, gcc-internal-format msgid "declaration does not declare anything" msgstr "" -#: c/c-decl.c:8372 +#: c/c-decl.c:8371 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C99 doesn%'t support unnamed structs/unions" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-decl.c:8375 +#: c/c-decl.c:8374 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C90 doesn%'t support unnamed structs/unions" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-decl.c:8468 c/c-decl.c:8486 c/c-decl.c:8547 +#: c/c-decl.c:8467 c/c-decl.c:8485 c/c-decl.c:8546 #, fuzzy, gcc-internal-format msgid "duplicate member %q+D" msgstr "паўтарэнне \"%s\"" -#: c/c-decl.c:8573 +#: c/c-decl.c:8572 #, gcc-internal-format msgid "empty struct has size 0 in C, size 1 in C++" msgstr "" -#: c/c-decl.c:8576 +#: c/c-decl.c:8575 #, gcc-internal-format msgid "empty union has size 0 in C, size 1 in C++" msgstr "" -#: c/c-decl.c:8701 +#: c/c-decl.c:8700 #, gcc-internal-format msgid "union has no named members" msgstr "" -#: c/c-decl.c:8703 +#: c/c-decl.c:8702 #, gcc-internal-format msgid "union has no members" msgstr "" -#: c/c-decl.c:8708 +#: c/c-decl.c:8707 #, gcc-internal-format msgid "struct has no named members" msgstr "" -#: c/c-decl.c:8710 +#: c/c-decl.c:8709 #, gcc-internal-format msgid "struct has no members" msgstr "" -#: c/c-decl.c:8771 cp/decl.c:13430 +#: c/c-decl.c:8770 cp/decl.c:13448 #, gcc-internal-format msgid "flexible array member in union" msgstr "" -#: c/c-decl.c:8777 +#: c/c-decl.c:8776 #, gcc-internal-format msgid "flexible array member not at end of struct" msgstr "" -#: c/c-decl.c:8783 +#: c/c-decl.c:8782 #, gcc-internal-format msgid "flexible array member in a struct with no named members" msgstr "" -#: c/c-decl.c:8814 +#: c/c-decl.c:8813 #, fuzzy, gcc-internal-format #| msgid "%s is too large" msgid "type %qT is too large" msgstr "%s - вельмі вялікі" -#: c/c-decl.c:8919 +#: c/c-decl.c:8918 #, gcc-internal-format msgid "union cannot be made transparent" msgstr "" -#: c/c-decl.c:9059 +#: c/c-decl.c:9058 #, fuzzy, gcc-internal-format msgid "nested redefinition of %" msgstr "перанакіраванне stdout: %s" #. This enum is a named one that has been declared already. -#: c/c-decl.c:9066 +#: c/c-decl.c:9065 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "redeclaration of %" msgstr "абвяшчэньне `%#D'" -#: c/c-decl.c:9145 cp/decl.c:15903 +#: c/c-decl.c:9144 cp/decl.c:15921 #, gcc-internal-format msgid "specified mode too small for enumerated values" msgstr "" -#: c/c-decl.c:9160 +#: c/c-decl.c:9159 #, gcc-internal-format msgid "enumeration values exceed range of largest integer" msgstr "" -#: c/c-decl.c:9280 c/c-decl.c:9296 +#: c/c-decl.c:9279 c/c-decl.c:9295 #, fuzzy, gcc-internal-format msgid "enumerator value for %qE is not an integer constant" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:9291 +#: c/c-decl.c:9290 #, fuzzy, gcc-internal-format msgid "enumerator value for %qE is not an integer constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:9315 +#: c/c-decl.c:9314 #, gcc-internal-format msgid "overflow in enumeration values" msgstr "" -#: c/c-decl.c:9323 +#: c/c-decl.c:9322 #, gcc-internal-format msgid "ISO C restricts enumerator values to range of %" msgstr "" -#: c/c-decl.c:9440 cp/decl.c:5454 cp/decl.c:16454 +#: c/c-decl.c:9439 cp/decl.c:5450 cp/decl.c:16472 #, gcc-internal-format msgid "inline function %qD given attribute %qs" msgstr "" -#: c/c-decl.c:9458 +#: c/c-decl.c:9457 #, gcc-internal-format msgid "return type is an incomplete type" msgstr "" -#: c/c-decl.c:9469 +#: c/c-decl.c:9468 #, fuzzy, gcc-internal-format #| msgid "return type of `%s' is not `int'" msgid "return type defaults to %" msgstr "вяртаемы тып \"%s\" не \"int\"" -#: c/c-decl.c:9497 +#: c/c-decl.c:9496 #, gcc-internal-format msgid "%q+D defined as variadic function without prototype" msgstr "" -#: c/c-decl.c:9555 +#: c/c-decl.c:9554 #, fuzzy, gcc-internal-format #| msgid "no previous prototype for `%s'" msgid "no previous prototype for %qD" msgstr "няма папярэдняга прататыпа для \"%s\"" -#: c/c-decl.c:9564 +#: c/c-decl.c:9563 #, fuzzy, gcc-internal-format msgid "%qD was used with no prototype before its definition" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:9572 cp/decl.c:16589 +#: c/c-decl.c:9571 cp/decl.c:16607 #, fuzzy, gcc-internal-format #| msgid "no previous declaration for `%s'" msgid "no previous declaration for %qD" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c/c-decl.c:9582 +#: c/c-decl.c:9581 #, fuzzy, gcc-internal-format msgid "%qD was used with no declaration before its definition" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:9601 +#: c/c-decl.c:9600 #, fuzzy, gcc-internal-format #| msgid "return type of `%s' is not `int'" msgid "return type of %qD is not %" msgstr "вяртаемы тып \"%s\" не \"int\"" -#: c/c-decl.c:9603 +#: c/c-decl.c:9602 #, gcc-internal-format msgid "%<_Atomic%>-qualified return type of %qD" msgstr "" -#: c/c-decl.c:9610 +#: c/c-decl.c:9609 #, fuzzy, gcc-internal-format #| msgid "`%s' is usually a function" msgid "%qD is normally a non-static function" msgstr "`%s' - звычайна функцыя" -#: c/c-decl.c:9658 +#: c/c-decl.c:9657 #, gcc-internal-format msgid "old-style parameter declarations in prototyped function definition" msgstr "" -#: c/c-decl.c:9673 +#: c/c-decl.c:9672 #, gcc-internal-format msgid "traditional C rejects ISO C style function definitions" msgstr "" -#: c/c-decl.c:9690 +#: c/c-decl.c:9689 #, gcc-internal-format msgid "ISO C does not support omitting parameter names in function definitions before C2X" msgstr "" -#: c/c-decl.c:9730 c/c-decl.c:9734 +#: c/c-decl.c:9729 c/c-decl.c:9733 #, gcc-internal-format msgid "old-style function definition" msgstr "" -#: c/c-decl.c:9747 +#: c/c-decl.c:9746 #, gcc-internal-format msgid "parameter name missing from parameter list" msgstr "" -#: c/c-decl.c:9763 +#: c/c-decl.c:9762 #, gcc-internal-format msgid "%qD declared as a non-parameter" msgstr "" -#: c/c-decl.c:9771 +#: c/c-decl.c:9770 #, fuzzy, gcc-internal-format msgid "multiple parameters named %qD" msgstr "невыкарыстаемы параметр \"%s\"" -#: c/c-decl.c:9780 +#: c/c-decl.c:9779 #, fuzzy, gcc-internal-format msgid "parameter %qD declared with void type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:9809 c/c-decl.c:9814 +#: c/c-decl.c:9808 c/c-decl.c:9813 #, gcc-internal-format msgid "type of %qD defaults to %" msgstr "" -#: c/c-decl.c:9834 +#: c/c-decl.c:9833 #, fuzzy, gcc-internal-format msgid "parameter %qD has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:9841 +#: c/c-decl.c:9840 #, gcc-internal-format msgid "declaration for parameter %qD but no such parameter" msgstr "" -#: c/c-decl.c:9894 +#: c/c-decl.c:9893 #, gcc-internal-format msgid "number of arguments doesn%'t match built-in prototype" msgstr "" -#: c/c-decl.c:9905 +#: c/c-decl.c:9904 #, fuzzy, gcc-internal-format #| msgid "wrong number of arguments specified for `%s' attribute" msgid "number of arguments doesn%'t match prototype" msgstr "памылковая колькасьць аргументаў, зададзеных для атрыбута `%s'" -#: c/c-decl.c:9908 c/c-decl.c:9955 c/c-decl.c:9969 +#: c/c-decl.c:9907 c/c-decl.c:9954 c/c-decl.c:9968 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "prototype declaration" msgstr "пустое абвяшчэньне" -#: c/c-decl.c:9947 +#: c/c-decl.c:9946 #, gcc-internal-format msgid "promoted argument %qD doesn%'t match built-in prototype" msgstr "" -#: c/c-decl.c:9952 +#: c/c-decl.c:9951 #, gcc-internal-format msgid "promoted argument %qD doesn%'t match prototype" msgstr "" -#: c/c-decl.c:9962 +#: c/c-decl.c:9961 #, gcc-internal-format msgid "argument %qD doesn%'t match built-in prototype" msgstr "" -#: c/c-decl.c:9967 +#: c/c-decl.c:9966 #, gcc-internal-format msgid "argument %qD doesn%'t match prototype" msgstr "" -#: c/c-decl.c:10225 cp/decl.c:17414 +#: c/c-decl.c:10224 cp/decl.c:17432 #, gcc-internal-format msgid "no return statement in function returning non-void" msgstr "" -#: c/c-decl.c:10244 cp/decl.c:17498 +#: c/c-decl.c:10243 cp/decl.c:17516 #, fuzzy, gcc-internal-format #| msgid "label `%D' defined but not used" msgid "parameter %qD set but not used" @@ -42126,272 +42151,272 @@ msgstr "адмеціна `%D' вызначана, але не выкарысто #. If we get here, declarations have been used in a for loop without #. the C99 for loop scope. This doesn't make much sense, so don't #. allow it. -#: c/c-decl.c:10340 +#: c/c-decl.c:10339 #, gcc-internal-format msgid "% loop initial declarations are only allowed in C99 or C11 mode" msgstr "" -#: c/c-decl.c:10345 +#: c/c-decl.c:10344 #, gcc-internal-format msgid "use option %<-std=c99%>, %<-std=gnu99%>, %<-std=c11%> or %<-std=gnu11%> to compile your code" msgstr "" -#: c/c-decl.c:10352 +#: c/c-decl.c:10351 #, fuzzy, gcc-internal-format msgid "ISO C90 does not support % loop initial declarations" msgstr "ISO C89 не падтрымлівае \"long long\"" -#: c/c-decl.c:10384 +#: c/c-decl.c:10383 #, gcc-internal-format msgid "declaration of static variable %qD in % loop initial declaration" msgstr "" -#: c/c-decl.c:10388 +#: c/c-decl.c:10387 #, gcc-internal-format msgid "declaration of % variable %qD in % loop initial declaration" msgstr "" -#: c/c-decl.c:10395 +#: c/c-decl.c:10394 #, gcc-internal-format msgid "% declared in % loop initial declaration" msgstr "" -#: c/c-decl.c:10400 +#: c/c-decl.c:10399 #, gcc-internal-format msgid "% declared in % loop initial declaration" msgstr "" -#: c/c-decl.c:10404 +#: c/c-decl.c:10403 #, gcc-internal-format msgid "% declared in % loop initial declaration" msgstr "" -#: c/c-decl.c:10408 +#: c/c-decl.c:10407 #, gcc-internal-format msgid "declaration of non-variable %qD in % loop initial declaration" msgstr "" -#: c/c-decl.c:10700 +#: c/c-decl.c:10699 #, gcc-internal-format msgid "incompatible address space qualifiers %qs and %qs" msgstr "" -#: c/c-decl.c:10759 c/c-decl.c:10766 +#: c/c-decl.c:10758 c/c-decl.c:10765 #, fuzzy, gcc-internal-format #| msgid "duplicate label declaration `%s'" msgid "duplicate %qE declaration specifier" msgstr "паўторнае абвяшчэньне адмеціны `%s'" -#: c/c-decl.c:10794 c/c-decl.c:11178 c/c-decl.c:11573 +#: c/c-decl.c:10793 c/c-decl.c:11177 c/c-decl.c:11572 #, gcc-internal-format msgid "two or more data types in declaration specifiers" msgstr "" -#: c/c-decl.c:10806 cp/parser.c:31446 +#: c/c-decl.c:10805 cp/parser.c:31500 #, fuzzy, gcc-internal-format #| msgid "`long long long' is too long for GCC" msgid "% is too long for GCC" msgstr "`long long long' - вельмі доўга для GCC" -#: c/c-decl.c:10819 +#: c/c-decl.c:10818 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support `long long'" msgid "ISO C90 does not support %" msgstr "ISO C89 не падтрымлівае `long long'" -#: c/c-decl.c:11048 c/c-parser.c:9956 +#: c/c-decl.c:11047 c/c-parser.c:9956 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C90 does not support complex types" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-decl.c:11094 +#: c/c-decl.c:11093 #, fuzzy, gcc-internal-format #| msgid "ISO C does not support complex integer types" msgid "ISO C does not support saturating types" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: c/c-decl.c:11165 c/c-decl.c:11731 +#: c/c-decl.c:11164 c/c-decl.c:11730 #, fuzzy, gcc-internal-format #| msgid "duplicate `%s'" msgid "duplicate %qE" msgstr "паўтарэньне `%s'" -#: c/c-decl.c:11225 +#: c/c-decl.c:11224 #, fuzzy, gcc-internal-format #| msgid "ISO C does not support complex integer types" msgid "ISO C does not support %<__int%d%> types" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: c/c-decl.c:11247 +#: c/c-decl.c:11246 #, fuzzy, gcc-internal-format msgid "%<__int%d%> is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: c/c-decl.c:11290 +#: c/c-decl.c:11289 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C90 does not support boolean types" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-decl.c:11409 +#: c/c-decl.c:11408 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C does not support the %<_Float%d%s%> type" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-decl.c:11459 +#: c/c-decl.c:11458 #, fuzzy, gcc-internal-format msgid "%<_Float%d%s%> is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: c/c-decl.c:11530 +#: c/c-decl.c:11529 #, fuzzy, gcc-internal-format #| msgid "ISO C does not support complex integer types" msgid "ISO C does not support decimal floating-point before C2X" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: c/c-decl.c:11554 c/c-decl.c:11827 c/c-parser.c:8967 +#: c/c-decl.c:11553 c/c-decl.c:11826 c/c-parser.c:8967 #, fuzzy, gcc-internal-format msgid "fixed-point types not supported for this target" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: c/c-decl.c:11556 +#: c/c-decl.c:11555 #, fuzzy, gcc-internal-format #| msgid "ISO C does not support complex integer types" msgid "ISO C does not support fixed-point types" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: c/c-decl.c:11591 +#: c/c-decl.c:11590 #, gcc-internal-format msgid "C++ lookup of %qD would return a field, not a type" msgstr "" -#: c/c-decl.c:11604 +#: c/c-decl.c:11603 #, gcc-internal-format msgid "%qE fails to be a typedef or built in type" msgstr "" -#: c/c-decl.c:11653 +#: c/c-decl.c:11652 #, fuzzy, gcc-internal-format #| msgid "`%s' is not at beginning of declaration" msgid "%qE is not at beginning of declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: c/c-decl.c:11674 +#: c/c-decl.c:11673 #, gcc-internal-format msgid "%qE used with %" msgstr "" -#: c/c-decl.c:11676 +#: c/c-decl.c:11675 #, gcc-internal-format msgid "%qE used with %" msgstr "" -#: c/c-decl.c:11678 +#: c/c-decl.c:11677 #, gcc-internal-format msgid "%qE used with %" msgstr "" -#: c/c-decl.c:11692 c/c-parser.c:8325 +#: c/c-decl.c:11691 c/c-parser.c:8325 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "ISO C99 does not support %qE" msgstr "%s не падтрымлівае %s" -#: c/c-decl.c:11695 c/c-parser.c:8328 +#: c/c-decl.c:11694 c/c-parser.c:8328 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "ISO C90 does not support %qE" msgstr "%s не падтрымлівае %s" -#: c/c-decl.c:11707 +#: c/c-decl.c:11706 #, gcc-internal-format msgid "%<__thread%> before %" msgstr "" -#: c/c-decl.c:11716 +#: c/c-decl.c:11715 #, gcc-internal-format msgid "%<__thread%> before %" msgstr "" -#: c/c-decl.c:11729 +#: c/c-decl.c:11728 #, gcc-internal-format msgid "duplicate %<_Thread_local%> or %<__thread%>" msgstr "" -#: c/c-decl.c:11737 +#: c/c-decl.c:11736 #, gcc-internal-format msgid "multiple storage classes in declaration specifiers" msgstr "" -#: c/c-decl.c:11745 +#: c/c-decl.c:11744 #, gcc-internal-format msgid "%qs used with %qE" msgstr "" -#: c/c-decl.c:11824 +#: c/c-decl.c:11823 #, gcc-internal-format msgid "%<_Sat%> is used without %<_Fract%> or %<_Accum%>" msgstr "" -#: c/c-decl.c:11839 +#: c/c-decl.c:11838 #, fuzzy, gcc-internal-format #| msgid "ISO C does not support plain `complex' meaning `double complex'" msgid "ISO C does not support plain % meaning %" msgstr "ISO C не падтрымлівае просты \"complex\" у значэнні \"double complex\"" -#: c/c-decl.c:11866 +#: c/c-decl.c:11865 #, gcc-internal-format msgid "%<__auto_type%> followed by %<[[]]%> attributes" msgstr "" -#: c/c-decl.c:11892 c/c-decl.c:11908 c/c-decl.c:11934 +#: c/c-decl.c:11891 c/c-decl.c:11907 c/c-decl.c:11933 #, gcc-internal-format msgid "ISO C does not support complex integer types" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: c/c-decl.c:12361 cp/semantics.c:5793 +#: c/c-decl.c:12360 cp/semantics.c:5821 #, gcc-internal-format msgid "%<#pragma omp declare reduction%> combiner refers to variable %qD which is not % nor %" msgstr "" -#: c/c-decl.c:12365 cp/semantics.c:5797 +#: c/c-decl.c:12364 cp/semantics.c:5825 #, gcc-internal-format msgid "%<#pragma omp declare reduction%> initializer refers to variable %qD which is not % nor %" msgstr "" -#: c/c-fold.c:387 c/c-typeck.c:11988 cp/typeck.c:5073 +#: c/c-fold.c:387 c/c-typeck.c:12048 cp/typeck.c:5084 #, gcc-internal-format msgid "left shift of negative value" msgstr "" -#: c/c-fold.c:397 c/c-typeck.c:11997 cp/typeck.c:5081 +#: c/c-fold.c:397 c/c-typeck.c:12057 cp/typeck.c:5092 #, gcc-internal-format msgid "left shift count is negative" msgstr "" -#: c/c-fold.c:398 c/c-typeck.c:11926 cp/typeck.c:5021 +#: c/c-fold.c:398 c/c-typeck.c:11986 cp/typeck.c:5032 #, gcc-internal-format msgid "right shift count is negative" msgstr "" -#: c/c-fold.c:406 c/c-typeck.c:12016 cp/typeck.c:5089 +#: c/c-fold.c:406 c/c-typeck.c:12076 cp/typeck.c:5100 #, gcc-internal-format msgid "left shift count >= width of type" msgstr "" -#: c/c-fold.c:407 c/c-typeck.c:11950 cp/typeck.c:5032 +#: c/c-fold.c:407 c/c-typeck.c:12010 cp/typeck.c:5043 #, gcc-internal-format msgid "right shift count >= width of type" msgstr "" -#: c/c-fold.c:414 c/c-typeck.c:12008 +#: c/c-fold.c:414 c/c-typeck.c:12068 #, gcc-internal-format msgid "left shift count >= width of vector element" msgstr "" -#: c/c-fold.c:415 c/c-typeck.c:11937 +#: c/c-fold.c:415 c/c-typeck.c:11997 #, gcc-internal-format msgid "right shift count >= width of vector element" msgstr "" @@ -42411,7 +42436,7 @@ msgstr "" msgid "to match this %qs" msgstr "" -#: c/c-parser.c:1325 cp/parser.c:31680 +#: c/c-parser.c:1325 cp/parser.c:31734 #, gcc-internal-format msgid "expected end of line" msgstr "" @@ -42422,7 +42447,7 @@ msgstr "" msgid "ISO C forbids an empty translation unit" msgstr "ISO C не дазваляе пусты ізыходны файл" -#: c/c-parser.c:1665 cp/semantics.c:3201 +#: c/c-parser.c:1665 cp/semantics.c:3219 #, gcc-internal-format msgid "%<#pragma omp declare target%> without corresponding %<#pragma omp end declare target%>" msgstr "" @@ -42459,7 +42484,7 @@ msgid "unknown type name %qE" msgstr "невядомая назва рэгістра: %s" #: c/c-parser.c:2001 c/c-parser.c:12508 c/c-parser.c:18876 c/c-parser.c:19393 -#: c/c-parser.c:19910 cp/parser.c:41330 cp/parser.c:45195 +#: c/c-parser.c:19910 cp/parser.c:41383 cp/parser.c:45248 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "expected declaration specifiers" @@ -42481,7 +42506,7 @@ msgstr "" msgid "expected %<;%>, identifier or %<(%>" msgstr "" -#: c/c-parser.c:2066 cp/parser.c:33879 cp/parser.c:33951 +#: c/c-parser.c:2066 cp/parser.c:33933 cp/parser.c:34005 #, fuzzy, gcc-internal-format msgid "prefix attributes are ignored for methods" msgstr "\"%s\" атрыбут ігнарыруецца" @@ -42497,7 +42522,7 @@ msgstr "атрыбуты секцыі не падтрымліваюцца для msgid "unexpected attribute" msgstr "" -#: c/c-parser.c:2132 c/c-parser.c:6220 cp/parser.c:11832 cp/parser.c:12039 +#: c/c-parser.c:2132 c/c-parser.c:6220 cp/parser.c:11853 cp/parser.c:12060 #, gcc-internal-format msgid "% attribute not followed by %<;%>" msgstr "" @@ -42535,7 +42560,7 @@ msgstr "" msgid "%<__auto_type%> may only be used with a single declarator" msgstr "" -#: c/c-parser.c:2415 cp/parser.c:14539 +#: c/c-parser.c:2415 cp/parser.c:14563 #, gcc-internal-format msgid "expected %<,%> or %<;%>" msgstr "" @@ -42596,7 +42621,7 @@ msgstr "" msgid "static assertion failed: %E" msgstr "" -#: c/c-parser.c:2683 cp/semantics.c:10131 +#: c/c-parser.c:2683 cp/semantics.c:10159 #, gcc-internal-format msgid "static assertion failed" msgstr "" @@ -42643,14 +42668,14 @@ msgstr "параметр \"%s\" ініцыялізаваны" #: c/c-parser.c:12166 c/c-parser.c:12212 c/c-parser.c:12998 c/c-parser.c:13031 #: c/c-parser.c:15343 c/c-parser.c:15453 c/c-parser.c:15726 c/c-parser.c:15989 #: c/c-parser.c:17946 c/c-parser.c:20428 c/c-parser.c:20619 -#: c/gimple-parser.c:1776 c/gimple-parser.c:1814 cp/parser.c:8961 -#: cp/parser.c:31683 cp/parser.c:34856 cp/parser.c:37421 cp/parser.c:37589 -#: cp/parser.c:42903 cp/parser.c:44510 +#: c/gimple-parser.c:1776 c/gimple-parser.c:1814 cp/parser.c:8968 +#: cp/parser.c:31737 cp/parser.c:34910 cp/parser.c:37474 cp/parser.c:37642 +#: cp/parser.c:42956 cp/parser.c:44563 #, gcc-internal-format msgid "expected identifier" msgstr "" -#: c/c-parser.c:3238 cp/parser.c:20165 +#: c/c-parser.c:3238 cp/parser.c:20202 #, gcc-internal-format msgid "comma at end of enumerator list" msgstr "" @@ -42737,7 +42762,7 @@ msgstr "" msgid "parentheses must be omitted if attribute argument list is empty" msgstr "" -#: c/c-parser.c:4932 cp/parser.c:27867 +#: c/c-parser.c:4932 cp/parser.c:27902 #, gcc-internal-format msgid "%qE attribute does not take any arguments" msgstr "" @@ -42798,7 +42823,7 @@ msgstr "ISO C не дазваляе дэкларацыі метак (label)" msgid "expected %<}%> before %" msgstr "" -#: c/c-parser.c:5776 cp/parser.c:12162 +#: c/c-parser.c:5776 cp/parser.c:12184 #, gcc-internal-format msgid "% without a previous %" msgstr "" @@ -42813,7 +42838,7 @@ msgstr "" #. delimiter without consuming it, but here we need to consume #. it to proceed further. #: c/c-parser.c:5815 c/c-parser.c:5828 c/c-parser.c:6241 -#: c/gimple-parser.c:2276 cp/parser.c:11782 +#: c/gimple-parser.c:2276 cp/parser.c:11803 #, gcc-internal-format msgid "expected statement" msgstr "" @@ -42838,19 +42863,19 @@ msgstr "" msgid "only attribute % can be applied to a null statement" msgstr "" -#: c/c-parser.c:6348 cp/parser.c:13616 +#: c/c-parser.c:6348 cp/parser.c:13640 #, fuzzy, gcc-internal-format #| msgid "empty body in an else-statement" msgid "suggest braces around empty body in an % statement" msgstr "пустое цела ў else-выражэнні" -#: c/c-parser.c:6390 cp/parser.c:13619 +#: c/c-parser.c:6390 cp/parser.c:13643 #, fuzzy, gcc-internal-format #| msgid "empty body in an else-statement" msgid "suggest braces around empty body in an % statement" msgstr "пустое цела ў else-выражэнні" -#: c/c-parser.c:6521 cp/parser.c:12433 +#: c/c-parser.c:6521 cp/parser.c:12455 #, gcc-internal-format msgid "suggest explicit braces to avoid ambiguous %" msgstr "" @@ -42870,12 +42895,12 @@ msgstr "" msgid "invalid iterating variable in fast enumeration" msgstr "нявернае выкарыстанне \"restict\"" -#: c/c-parser.c:6872 cp/parser.c:12702 +#: c/c-parser.c:6872 cp/parser.c:12724 #, gcc-internal-format msgid "missing loop condition in loop with % pragma" msgstr "" -#: c/c-parser.c:6878 cp/parser.c:12708 +#: c/c-parser.c:6878 cp/parser.c:12730 #, gcc-internal-format msgid "missing loop condition in loop with % pragma" msgstr "" @@ -42890,8 +42915,8 @@ msgstr "" msgid "duplicate % qualifier %qE" msgstr "паўтарэнне \"volatile\"" -#: c/c-parser.c:7037 c/c-parser.c:7048 c/c-parser.c:7059 cp/parser.c:21018 -#: cp/parser.c:21035 cp/parser.c:21049 +#: c/c-parser.c:7037 c/c-parser.c:7048 c/c-parser.c:7059 cp/parser.c:21055 +#: cp/parser.c:21072 cp/parser.c:21086 #, gcc-internal-format msgid "first seen here" msgstr "" @@ -42918,12 +42943,12 @@ msgstr "ISO C не дазваляе пусты ізыходны файл" #. Location of the binary operator. #. Quiet warning. -#: c/c-parser.c:7819 cp/typeck.c:4849 +#: c/c-parser.c:7819 cp/typeck.c:4860 #, gcc-internal-format msgid "division % does not compute the number of array elements" msgstr "" -#: c/c-parser.c:7825 cp/typeck.c:4854 +#: c/c-parser.c:7825 cp/typeck.c:4865 #, gcc-internal-format msgid "first % operand was declared here" msgstr "" @@ -43322,12 +43347,12 @@ msgstr "" msgid "no type or storage class may be specified here," msgstr "" -#: c/c-parser.c:11951 cp/parser.c:34713 +#: c/c-parser.c:11951 cp/parser.c:34767 #, gcc-internal-format msgid "empty property attribute list" msgstr "" -#: c/c-parser.c:11965 cp/parser.c:34726 +#: c/c-parser.c:11965 cp/parser.c:34780 #, fuzzy, gcc-internal-format msgid "missing property attribute" msgstr "прапушчан ініцыялізатар" @@ -43337,51 +43362,51 @@ msgstr "прапушчан ініцыялізатар" msgid "unknown property attribute %<%s%s%>" msgstr "" -#: c/c-parser.c:12007 cp/parser.c:34763 +#: c/c-parser.c:12007 cp/parser.c:34817 #, gcc-internal-format msgid "unknown property attribute" msgstr "" -#: c/c-parser.c:12016 cp/parser.c:34772 +#: c/c-parser.c:12016 cp/parser.c:34826 #, gcc-internal-format msgid "expected %<=%> after Objective-C %qE" msgstr "" -#: c/c-parser.c:12027 cp/parser.c:34786 +#: c/c-parser.c:12027 cp/parser.c:34840 #, gcc-internal-format msgid "expected %qE selector name" msgstr "" -#: c/c-parser.c:12043 cp/parser.c:34805 +#: c/c-parser.c:12043 cp/parser.c:34859 #, gcc-internal-format msgid "setter method names must terminate with %<:%>" msgstr "" -#: c/c-parser.c:12257 cp/parser.c:44841 +#: c/c-parser.c:12257 cp/parser.c:44894 #, gcc-internal-format msgid "%<#pragma GCC unroll%> requires an assignment-expression that evaluates to a non-negative integral constant less than %u" msgstr "" #: c/c-parser.c:12301 c/c-parser.c:19390 c/c-parser.c:19685 c/c-parser.c:19744 -#: c/c-parser.c:19830 cp/parser.c:41327 cp/parser.c:41661 cp/parser.c:41751 -#: cp/parser.c:41824 cp/parser.c:44888 cp/parser.c:44903 cp/parser.c:44918 -#: cp/parser.c:44934 cp/parser.c:44950 cp/parser.c:44966 cp/parser.c:44993 -#: cp/parser.c:45006 cp/parser.c:45029 cp/parser.c:45042 +#: c/c-parser.c:19830 cp/parser.c:41380 cp/parser.c:41714 cp/parser.c:41804 +#: cp/parser.c:41877 cp/parser.c:44941 cp/parser.c:44956 cp/parser.c:44971 +#: cp/parser.c:44987 cp/parser.c:45003 cp/parser.c:45019 cp/parser.c:45046 +#: cp/parser.c:45059 cp/parser.c:45082 cp/parser.c:45095 #, gcc-internal-format msgid "%<#pragma %s%> may only be used in compound statements" msgstr "" -#: c/c-parser.c:12324 cp/parser.c:45019 +#: c/c-parser.c:12324 cp/parser.c:45072 #, gcc-internal-format msgid "%<#pragma acc routine%> must be at file scope" msgstr "" -#: c/c-parser.c:12411 cp/parser.c:45114 +#: c/c-parser.c:12411 cp/parser.c:45167 #, gcc-internal-format msgid "%<#pragma omp scan%> may only be used in a loop construct with % % clause" msgstr "" -#: c/c-parser.c:12418 cp/parser.c:45120 +#: c/c-parser.c:12418 cp/parser.c:45173 #, gcc-internal-format msgid "%<#pragma omp section%> may only be used in %<#pragma omp sections%> construct" msgstr "" @@ -43391,18 +43416,18 @@ msgstr "" msgid "%<#pragma omp requires%> may only be used at file scope" msgstr "" -#: c/c-parser.c:12453 c/c-parser.c:12477 cp/parser.c:45149 cp/parser.c:45182 +#: c/c-parser.c:12453 c/c-parser.c:12477 cp/parser.c:45202 cp/parser.c:45235 #, gcc-internal-format msgid "for, while or do statement expected" msgstr "" -#: c/c-parser.c:12490 cp/parser.c:44878 +#: c/c-parser.c:12490 cp/parser.c:44931 #, gcc-internal-format msgid "%<#pragma GCC pch_preprocess%> must be first" msgstr "" #: c/c-parser.c:12829 c/c-parser.c:15837 c/c-parser.c:21433 c/c-parser.c:21441 -#: cp/parser.c:35224 cp/parser.c:37940 cp/parser.c:43961 cp/parser.c:43969 +#: cp/parser.c:35278 cp/parser.c:37993 cp/parser.c:44014 cp/parser.c:44022 #, fuzzy, gcc-internal-format #| msgid "too many input files" msgid "too many %qs clauses" @@ -43423,54 +43448,54 @@ msgstr "" msgid "%qD is not a variable" msgstr "\"%s\" мае незавершаны тып" -#: c/c-parser.c:13267 cp/semantics.c:7767 +#: c/c-parser.c:13267 cp/semantics.c:7795 #, fuzzy, gcc-internal-format msgid "%qD is not a pointer variable" msgstr "\"%s\" звычайна функцыя" -#: c/c-parser.c:13309 cp/parser.c:35911 +#: c/c-parser.c:13309 cp/parser.c:35964 #, gcc-internal-format msgid "collapse argument needs positive constant integer expression" msgstr "" -#: c/c-parser.c:13386 cp/parser.c:35975 +#: c/c-parser.c:13386 cp/parser.c:36028 #, gcc-internal-format msgid "expected % or %" msgstr "" -#: c/c-parser.c:13388 cp/parser.c:35977 +#: c/c-parser.c:13388 cp/parser.c:36030 #, gcc-internal-format msgid "expected % or %" msgstr "" -#: c/c-parser.c:13508 cp/parser.c:36088 +#: c/c-parser.c:13508 cp/parser.c:36141 #, gcc-internal-format msgid "expected %, %, % or %" msgstr "" -#: c/c-parser.c:13528 c/c-parser.c:19737 c/c-parser.c:19823 cp/parser.c:36106 -#: cp/parser.c:41653 cp/parser.c:41743 +#: c/c-parser.c:13528 c/c-parser.c:19737 c/c-parser.c:19823 cp/parser.c:36159 +#: cp/parser.c:41706 cp/parser.c:41796 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:13581 cp/parser.c:36161 +#: c/c-parser.c:13581 cp/parser.c:36214 #, gcc-internal-format msgid "too many % clauses with %qs modifier" msgstr "" -#: c/c-parser.c:13588 cp/parser.c:36168 +#: c/c-parser.c:13588 cp/parser.c:36221 #, fuzzy, gcc-internal-format #| msgid "too many input files" msgid "too many % clauses" msgstr "вельмі шмат уваходзячых файлаў" -#: c/c-parser.c:13590 cp/parser.c:36170 +#: c/c-parser.c:13590 cp/parser.c:36223 #, gcc-internal-format msgid "too many % clauses without modifier" msgstr "" -#: c/c-parser.c:13596 cp/parser.c:36176 +#: c/c-parser.c:13596 cp/parser.c:36229 #, gcc-internal-format msgid "if any % clause has modifier, then all % clauses have to use modifier" msgstr "" @@ -43492,109 +43517,109 @@ msgstr "" msgid "% value must be positive" msgstr "" -#: c/c-parser.c:13804 cp/semantics.c:7972 +#: c/c-parser.c:13804 cp/semantics.c:8000 #, gcc-internal-format msgid "% value must be positive" msgstr "" -#: c/c-parser.c:13851 cp/semantics.c:8002 +#: c/c-parser.c:13851 cp/semantics.c:8030 #, gcc-internal-format msgid "% value must be non-negative" msgstr "" -#: c/c-parser.c:13885 cp/parser.c:36368 +#: c/c-parser.c:13885 cp/parser.c:36421 #, gcc-internal-format msgid "expected constant integer expression with valid sync-hint value" msgstr "" -#: c/c-parser.c:13925 cp/parser.c:36410 +#: c/c-parser.c:13925 cp/parser.c:36463 #, gcc-internal-format msgid "expected %, %, %, %, %, % or %" msgstr "" -#: c/c-parser.c:13986 cp/parser.c:36475 +#: c/c-parser.c:13986 cp/parser.c:36528 #, gcc-internal-format msgid "expected %, % or %" msgstr "" -#: c/c-parser.c:14052 cp/parser.c:36544 +#: c/c-parser.c:14052 cp/parser.c:36597 #, gcc-internal-format msgid "too many % clauses with %qs category" msgstr "" -#: c/c-parser.c:14055 cp/parser.c:36547 +#: c/c-parser.c:14055 cp/parser.c:36600 #, gcc-internal-format msgid "too many % clauses with unspecified category" msgstr "" -#: c/c-parser.c:14129 cp/semantics.c:7009 +#: c/c-parser.c:14129 cp/semantics.c:7037 #, gcc-internal-format msgid "%qs expression must be integral" msgstr "" -#: c/c-parser.c:14141 c/c-parser.c:14264 cp/semantics.c:7041 +#: c/c-parser.c:14141 c/c-parser.c:14264 cp/semantics.c:7069 #, gcc-internal-format msgid "%qs value must be positive" msgstr "" -#: c/c-parser.c:14203 cp/parser.c:35683 +#: c/c-parser.c:14203 cp/parser.c:35736 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function" msgid "too many % arguments" msgstr "вельмі шмат аргументаў у функцыі" -#: c/c-parser.c:14237 cp/parser.c:35716 +#: c/c-parser.c:14237 cp/parser.c:35769 #, fuzzy, gcc-internal-format #| msgid "no arguments" msgid "unexpected argument" msgstr "няма аргументаў" -#: c/c-parser.c:14404 cp/semantics.c:8137 +#: c/c-parser.c:14404 cp/semantics.c:8165 #, gcc-internal-format msgid "% argument needs positive integral constant" msgstr "" -#: c/c-parser.c:14462 c/c-parser.c:14468 cp/parser.c:36579 cp/parser.c:36589 +#: c/c-parser.c:14462 c/c-parser.c:14468 cp/parser.c:36632 cp/parser.c:36642 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:14502 cp/parser.c:36627 +#: c/c-parser.c:14502 cp/parser.c:36680 #, gcc-internal-format msgid "expected %, % or %" msgstr "" -#: c/c-parser.c:14555 cp/parser.c:36695 +#: c/c-parser.c:14555 cp/parser.c:36748 #, gcc-internal-format msgid "ordered argument needs positive constant integer expression" msgstr "" -#: c/c-parser.c:14680 c/c-parser.c:20999 cp/parser.c:43612 +#: c/c-parser.c:14680 c/c-parser.c:20999 cp/parser.c:43665 #, gcc-internal-format msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%> or identifier" msgstr "" -#: c/c-parser.c:14800 cp/parser.c:36953 +#: c/c-parser.c:14800 cp/parser.c:37006 #, gcc-internal-format msgid "both % and % modifiers specified" msgstr "" -#: c/c-parser.c:14854 cp/parser.c:36969 +#: c/c-parser.c:14854 cp/parser.c:37022 #, gcc-internal-format msgid "schedule % does not take a % parameter" msgstr "" -#: c/c-parser.c:14858 cp/parser.c:36972 +#: c/c-parser.c:14858 cp/parser.c:37025 #, gcc-internal-format msgid "schedule % does not take a % parameter" msgstr "" -#: c/c-parser.c:14870 cp/semantics.c:7076 +#: c/c-parser.c:14870 cp/semantics.c:7104 #, gcc-internal-format msgid "chunk size value must be positive" msgstr "" -#: c/c-parser.c:14893 cp/parser.c:36992 +#: c/c-parser.c:14893 cp/parser.c:37045 #, fuzzy, gcc-internal-format #| msgid "invalid %%-code" msgid "invalid schedule kind" @@ -43605,17 +43630,17 @@ msgstr "нерэчаісны %%-код" msgid "% value must be positive" msgstr "" -#: c/c-parser.c:15059 cp/semantics.c:7172 +#: c/c-parser.c:15059 cp/semantics.c:7200 #, gcc-internal-format msgid "% value must be positive" msgstr "" -#: c/c-parser.c:15104 cp/semantics.c:7291 +#: c/c-parser.c:15104 cp/semantics.c:7319 #, gcc-internal-format msgid "% clause alignment expression must be positive constant integer expression" msgstr "" -#: c/c-parser.c:15149 cp/semantics.c:7389 +#: c/c-parser.c:15149 cp/semantics.c:7417 #, gcc-internal-format msgid "% clause allocator expression has type %qT rather than %" msgstr "" @@ -43635,24 +43660,24 @@ msgstr "" msgid "% clause expression must be positive constant integer expression" msgstr "" -#: c/c-parser.c:15580 cp/parser.c:37721 +#: c/c-parser.c:15580 cp/parser.c:37774 #, gcc-internal-format msgid "% modifier incompatible with %qs" msgstr "" -#: c/c-parser.c:15627 cp/parser.c:37769 cp/parser.c:37998 cp/parser.c:38048 +#: c/c-parser.c:15627 cp/parser.c:37822 cp/parser.c:38051 cp/parser.c:38101 #, fuzzy, gcc-internal-format #| msgid "invalid %%d operand" msgid "invalid depend kind" msgstr "нерэчаісны %%d аперанд" -#: c/c-parser.c:15714 cp/parser.c:37844 +#: c/c-parser.c:15714 cp/parser.c:37897 #, fuzzy, gcc-internal-format #| msgid "invalid mask" msgid "invalid map kind" msgstr "нерэчаісная маска" -#: c/c-parser.c:15812 cp/parser.c:37945 +#: c/c-parser.c:15812 cp/parser.c:37998 #, gcc-internal-format msgid "invalid dist_schedule kind" msgstr "" @@ -43667,83 +43692,83 @@ msgstr "Нерэчаісны выбар %s" msgid "expected %, % or %" msgstr "" -#: c/c-parser.c:16009 cp/semantics.c:7547 +#: c/c-parser.c:16009 cp/semantics.c:7575 #, gcc-internal-format msgid "% clause event handle has type %qT rather than %" msgstr "" -#: c/c-parser.c:16206 cp/parser.c:38282 +#: c/c-parser.c:16206 cp/parser.c:38335 #, gcc-internal-format msgid "expected %<#pragma acc%> clause" msgstr "" -#: c/c-parser.c:16217 c/c-parser.c:16549 cp/parser.c:38293 cp/parser.c:38664 +#: c/c-parser.c:16217 c/c-parser.c:16549 cp/parser.c:38346 cp/parser.c:38717 #, fuzzy, gcc-internal-format #| msgid "complex invalid for `%s'" msgid "%qs is not valid for %qs" msgstr "complex нерэчаісны для \"%s\"" -#: c/c-parser.c:16261 cp/parser.c:38340 +#: c/c-parser.c:16261 cp/parser.c:38393 #, gcc-internal-format msgid "clauses in % trait should be separated by %<,%>" msgstr "" -#: c/c-parser.c:16406 cp/parser.c:38518 +#: c/c-parser.c:16406 cp/parser.c:38571 #, gcc-internal-format msgid "%qs must be the first clause of %qs" msgstr "" -#: c/c-parser.c:16538 cp/parser.c:38653 +#: c/c-parser.c:16538 cp/parser.c:38706 #, gcc-internal-format msgid "expected %<#pragma omp%> clause" msgstr "" -#: c/c-parser.c:16671 cp/parser.c:42180 +#: c/c-parser.c:16671 cp/parser.c:42233 #, gcc-internal-format msgid "no valid clauses specified in %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:16681 cp/parser.c:42190 +#: c/c-parser.c:16681 cp/parser.c:42243 #, gcc-internal-format msgid "array section in %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:16701 cp/parser.c:42210 +#: c/c-parser.c:16701 cp/parser.c:42263 #, gcc-internal-format msgid "%qD must be a global variable in %<#pragma acc declare link%>" msgstr "" -#: c/c-parser.c:16712 cp/parser.c:42221 +#: c/c-parser.c:16712 cp/parser.c:42274 #, gcc-internal-format msgid "invalid OpenACC clause at file scope" msgstr "" -#: c/c-parser.c:16719 cp/parser.c:42228 +#: c/c-parser.c:16719 cp/parser.c:42281 #, gcc-internal-format msgid "invalid use of % variable %qD in %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:16727 cp/parser.c:42236 +#: c/c-parser.c:16727 cp/parser.c:42289 #, gcc-internal-format msgid "invalid use of % variable %qD in %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:16738 cp/parser.c:42258 +#: c/c-parser.c:16738 cp/parser.c:42311 #, gcc-internal-format msgid "%qD must be a variable declared in the same scope as %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:16748 cp/parser.c:42268 +#: c/c-parser.c:16748 cp/parser.c:42321 #, gcc-internal-format msgid "variable %qD used more than once with %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:16841 cp/parser.c:42365 +#: c/c-parser.c:16841 cp/parser.c:42418 #, gcc-internal-format msgid "expected % after %<#pragma acc %s%>" msgstr "" -#: c/c-parser.c:16857 cp/parser.c:42382 +#: c/c-parser.c:16857 cp/parser.c:42435 #, gcc-internal-format msgid "%<#pragma acc %s data%> has no data movement clause" msgstr "" @@ -43758,7 +43783,7 @@ msgstr "" msgid "expected function name" msgstr "" -#: c/c-parser.c:17128 cp/parser.c:44205 +#: c/c-parser.c:17128 cp/parser.c:44258 #, fuzzy, gcc-internal-format #| msgid "`%D' is not a function," msgid "%qD does not refer to a function" @@ -43769,27 +43794,27 @@ msgstr "`%D' - гэта ня функцыя," msgid "%<#pragma acc routine%> not immediately followed by function declaration or definition" msgstr "" -#: c/c-parser.c:17191 cp/parser.c:44256 cp/parser.c:44301 +#: c/c-parser.c:17191 cp/parser.c:44309 cp/parser.c:44354 #, gcc-internal-format msgid "%<#pragma acc routine%> not immediately followed by a single function declaration or definition" msgstr "" -#: c/c-parser.c:17222 cp/parser.c:44330 +#: c/c-parser.c:17222 cp/parser.c:44383 #, gcc-internal-format msgid "%<#pragma acc routine%> must be applied before use" msgstr "" -#: c/c-parser.c:17223 cp/parser.c:44332 +#: c/c-parser.c:17223 cp/parser.c:44385 #, gcc-internal-format msgid "%<#pragma acc routine%> must be applied before definition" msgstr "" -#: c/c-parser.c:17267 cp/parser.c:42583 +#: c/c-parser.c:17267 cp/parser.c:42636 #, gcc-internal-format msgid "%<#pragma acc update%> must contain at least one % or % or % clause" msgstr "" -#: c/c-parser.c:17322 cp/parser.c:38743 +#: c/c-parser.c:17322 cp/parser.c:38796 #, gcc-internal-format msgid "expected %" msgstr "" @@ -43799,83 +43824,83 @@ msgstr "" msgid "% clause allocator expression has type %qT rather than %" msgstr "" -#: c/c-parser.c:17353 cp/parser.c:38758 +#: c/c-parser.c:17353 cp/parser.c:38811 #, gcc-internal-format msgid "%<#pragma omp allocate%> not yet supported" msgstr "" -#: c/c-parser.c:17452 cp/parser.c:38851 +#: c/c-parser.c:17452 cp/parser.c:38904 #, gcc-internal-format msgid "expected %, %, %, or % clause" msgstr "" -#: c/c-parser.c:17474 cp/parser.c:38873 +#: c/c-parser.c:17474 cp/parser.c:38926 #, gcc-internal-format msgid "expected %, %, %, %, %, %, %, % or % clause" msgstr "" -#: c/c-parser.c:17488 cp/parser.c:38887 +#: c/c-parser.c:17488 cp/parser.c:38940 #, fuzzy, gcc-internal-format #| msgid "too many input files" msgid "too many atomic clauses" msgstr "вельмі шмат уваходзячых файлаў" -#: c/c-parser.c:17495 cp/parser.c:38894 +#: c/c-parser.c:17495 cp/parser.c:38947 #, gcc-internal-format msgid "too many memory order clauses" msgstr "" -#: c/c-parser.c:17552 cp/parser.c:38951 +#: c/c-parser.c:17552 cp/parser.c:39004 #, gcc-internal-format msgid "%<#pragma omp atomic read%> incompatible with % or % clauses" msgstr "" -#: c/c-parser.c:17561 cp/parser.c:38960 +#: c/c-parser.c:17561 cp/parser.c:39013 #, gcc-internal-format msgid "%<#pragma omp atomic write%> incompatible with % or % clauses" msgstr "" -#: c/c-parser.c:17571 cp/parser.c:38969 +#: c/c-parser.c:17571 cp/parser.c:39022 #, gcc-internal-format msgid "%<#pragma omp atomic update%> incompatible with % or % clauses" msgstr "" -#: c/c-parser.c:17837 cp/parser.c:39174 cp/parser.c:39200 +#: c/c-parser.c:17837 cp/parser.c:39227 cp/parser.c:39253 #, gcc-internal-format msgid "invalid form of %<#pragma omp atomic%>" msgstr "" -#: c/c-parser.c:17841 cp/parser.c:39231 cp/parser.c:39247 +#: c/c-parser.c:17841 cp/parser.c:39284 cp/parser.c:39300 #, gcc-internal-format msgid "invalid operator for %<#pragma omp atomic%>" msgstr "" -#: c/c-parser.c:17890 cp/semantics.c:9721 cp/semantics.c:9731 +#: c/c-parser.c:17890 cp/semantics.c:9749 cp/semantics.c:9759 #, gcc-internal-format msgid "%<#pragma omp atomic capture%> uses two different expressions for memory" msgstr "" -#: c/c-parser.c:17990 cp/semantics.c:9796 +#: c/c-parser.c:17990 cp/semantics.c:9824 #, gcc-internal-format msgid "% expression is not lvalue expression" msgstr "" -#: c/c-parser.c:18047 cp/parser.c:39431 +#: c/c-parser.c:18047 cp/parser.c:39484 #, gcc-internal-format msgid "expected %, %, % or %" msgstr "" -#: c/c-parser.c:18059 cp/parser.c:39447 +#: c/c-parser.c:18059 cp/parser.c:39500 #, gcc-internal-format msgid "expected %, % or % clause" msgstr "" -#: c/c-parser.c:18095 cp/parser.c:39480 +#: c/c-parser.c:18095 cp/parser.c:39533 #, gcc-internal-format msgid "expected %, % or %" msgstr "" -#: c/c-parser.c:18102 cp/parser.c:39487 +#: c/c-parser.c:18102 cp/parser.c:39540 #, gcc-internal-format msgid "% list specified together with memory order clause" msgstr "" @@ -43885,32 +43910,32 @@ msgstr "" msgid "expected %<(%> or end of line" msgstr "" -#: c/c-parser.c:18161 cp/parser.c:40092 +#: c/c-parser.c:18161 cp/parser.c:40145 #, gcc-internal-format msgid "expected % or % clause" msgstr "" -#: c/c-parser.c:18166 cp/parser.c:40098 +#: c/c-parser.c:18166 cp/parser.c:40151 #, gcc-internal-format msgid "expected %<#pragma omp scan%>" msgstr "" -#: c/c-parser.c:18222 cp/parser.c:40149 +#: c/c-parser.c:18222 cp/parser.c:40202 #, gcc-internal-format msgid "% clause parameter is less than %" msgstr "" -#: c/c-parser.c:18233 cp/parser.c:40160 +#: c/c-parser.c:18233 cp/parser.c:40213 #, gcc-internal-format msgid "% clause may not be specified together with % clause with a parameter" msgstr "" -#: c/c-parser.c:18251 cp/parser.c:40188 +#: c/c-parser.c:18251 cp/parser.c:40241 #, fuzzy, gcc-internal-format msgid "for statement expected" msgstr "вельмі шмат аргументаў у функцыі" -#: c/c-parser.c:18330 cp/semantics.c:9306 cp/semantics.c:9397 +#: c/c-parser.c:18330 cp/semantics.c:9334 cp/semantics.c:9425 #, gcc-internal-format msgid "expected iteration declaration or initialization" msgstr "" @@ -43920,72 +43945,72 @@ msgstr "" msgid "not enough perfectly nested loops" msgstr "" -#: c/c-parser.c:18464 cp/parser.c:40502 +#: c/c-parser.c:18464 cp/parser.c:40555 #, gcc-internal-format msgid "collapsed loops not perfectly nested" msgstr "" -#: c/c-parser.c:18547 cp/parser.c:40298 cp/parser.c:40340 cp/pt.c:17886 +#: c/c-parser.c:18547 cp/parser.c:40351 cp/parser.c:40393 cp/pt.c:17969 #, gcc-internal-format msgid "iteration variable %qD should not be firstprivate" msgstr "" -#: c/c-parser.c:18681 cp/parser.c:40621 +#: c/c-parser.c:18681 cp/parser.c:40674 #, gcc-internal-format msgid "% clause with parameter may not be specified on %qs construct" msgstr "" -#: c/c-parser.c:18895 cp/parser.c:40839 +#: c/c-parser.c:18895 cp/parser.c:40892 #, gcc-internal-format msgid "%<#pragma omp ordered%> with % clause may only be used in compound statements" msgstr "" -#: c/c-parser.c:19105 cp/parser.c:41040 +#: c/c-parser.c:19105 cp/parser.c:41093 #, gcc-internal-format msgid "expected % after %qs" msgstr "" -#: c/c-parser.c:19381 cp/parser.c:41318 +#: c/c-parser.c:19381 cp/parser.c:41371 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:19634 cp/parser.c:41591 +#: c/c-parser.c:19634 cp/parser.c:41644 #, gcc-internal-format msgid "%<#pragma omp target data%> with map-type other than %, %, % or % on % clause" msgstr "" -#: c/c-parser.c:19650 cp/parser.c:41607 +#: c/c-parser.c:19650 cp/parser.c:41660 #, gcc-internal-format msgid "%<#pragma omp target data%> must contain at least one %, % or % clause" msgstr "" -#: c/c-parser.c:19698 cp/parser.c:41837 +#: c/c-parser.c:19698 cp/parser.c:41890 #, gcc-internal-format msgid "%<#pragma omp target update%> must contain at least one % or % clauses" msgstr "" -#: c/c-parser.c:19772 cp/parser.c:41690 +#: c/c-parser.c:19772 cp/parser.c:41743 #, gcc-internal-format msgid "%<#pragma omp target enter data%> with map-type other than % or % on % clause" msgstr "" -#: c/c-parser.c:19784 cp/parser.c:41702 +#: c/c-parser.c:19784 cp/parser.c:41755 #, gcc-internal-format msgid "%<#pragma omp target enter data%> must contain at least one % clause" msgstr "" -#: c/c-parser.c:19859 cp/parser.c:41781 +#: c/c-parser.c:19859 cp/parser.c:41834 #, gcc-internal-format msgid "%<#pragma omp target exit data%> with map-type other than %, % or % on % clause" msgstr "" -#: c/c-parser.c:19872 cp/parser.c:41794 +#: c/c-parser.c:19872 cp/parser.c:41847 #, gcc-internal-format msgid "%<#pragma omp target exit data%> must contain at least one % clause" msgstr "" -#: c/c-parser.c:20095 cp/parser.c:42055 +#: c/c-parser.c:20095 cp/parser.c:42108 #, gcc-internal-format msgid "%<#pragma omp target%> with map-type other than %, %, % or % on % clause" msgstr "" @@ -44000,57 +44025,57 @@ msgstr "" msgid "%<#pragma omp declare %s%> must be followed by function declaration or definition" msgstr "" -#: c/c-parser.c:20270 cp/parser.c:42731 +#: c/c-parser.c:20270 cp/parser.c:42784 #, gcc-internal-format msgid "expected trait selector name" msgstr "" -#: c/c-parser.c:20323 cp/parser.c:42783 +#: c/c-parser.c:20323 cp/parser.c:42836 #, gcc-internal-format msgid "selector %qs not allowed for context selector set %qs" msgstr "" -#: c/c-parser.c:20348 cp/parser.c:42807 +#: c/c-parser.c:20348 cp/parser.c:42860 #, gcc-internal-format msgid "selector %qs does not accept any properties" msgstr "" -#: c/c-parser.c:20375 cp/parser.c:42846 cp/pt.c:11516 +#: c/c-parser.c:20375 cp/parser.c:42899 cp/pt.c:11539 #, gcc-internal-format msgid "score argument must be constant integer expression" msgstr "" -#: c/c-parser.c:20378 cp/parser.c:42849 cp/pt.c:11533 +#: c/c-parser.c:20378 cp/parser.c:42902 cp/pt.c:11556 #, gcc-internal-format msgid "score argument must be non-negative" msgstr "" -#: c/c-parser.c:20402 cp/parser.c:42877 cp/pt.c:11519 +#: c/c-parser.c:20402 cp/parser.c:42930 cp/pt.c:11542 #, gcc-internal-format msgid "property must be constant integer expression or string literal" msgstr "" -#: c/c-parser.c:20447 cp/parser.c:42921 +#: c/c-parser.c:20447 cp/parser.c:42974 #, gcc-internal-format msgid "expected identifier or string literal" msgstr "" -#: c/c-parser.c:20469 cp/parser.c:42943 cp/pt.c:11523 +#: c/c-parser.c:20469 cp/parser.c:42996 cp/pt.c:11546 #, gcc-internal-format msgid "property must be constant integer expression" msgstr "" -#: c/c-parser.c:20480 cp/parser.c:42954 +#: c/c-parser.c:20480 cp/parser.c:43007 #, gcc-internal-format msgid "properties for % selector may not be specified in %" msgstr "" -#: c/c-parser.c:20567 cp/parser.c:43040 +#: c/c-parser.c:20567 cp/parser.c:43093 #, gcc-internal-format msgid "expected %, %, % or %" msgstr "" -#: c/c-parser.c:20642 cp/parser.c:43148 +#: c/c-parser.c:20642 cp/parser.c:43201 #, gcc-internal-format msgid "expected %" msgstr "" @@ -44061,12 +44086,12 @@ msgstr "" msgid "variant %qD is not a function" msgstr "`%D' - гэта ня функцыя," -#: c/c-parser.c:20668 cp/decl.c:7567 +#: c/c-parser.c:20668 cp/decl.c:7563 #, fuzzy, gcc-internal-format msgid "variant %qD and base %qD have incompatible types" msgstr "\"%s\" мае незавершаны тып" -#: c/c-parser.c:20680 cp/decl.c:7576 +#: c/c-parser.c:20680 cp/decl.c:7572 #, gcc-internal-format msgid "variant %qD is a built-in" msgstr "" @@ -44076,32 +44101,32 @@ msgstr "" msgid "%<#pragma omp declare %s%> not immediately followed by a function declaration or definition" msgstr "" -#: c/c-parser.c:20731 cp/parser.c:43193 +#: c/c-parser.c:20731 cp/parser.c:43246 #, gcc-internal-format msgid "%<#pragma omp declare %s%> not immediately followed by a single function declaration or definition" msgstr "" -#: c/c-parser.c:20840 cp/parser.c:43298 +#: c/c-parser.c:20840 cp/parser.c:43351 #, gcc-internal-format msgid "%qD specified both in declare target % and % clauses" msgstr "" -#: c/c-parser.c:20889 cp/parser.c:43347 +#: c/c-parser.c:20889 cp/parser.c:43400 #, gcc-internal-format msgid "directive with only % clauses ignored" msgstr "" -#: c/c-parser.c:20908 cp/parser.c:43372 +#: c/c-parser.c:20908 cp/parser.c:43425 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:20915 cp/parser.c:43379 +#: c/c-parser.c:20915 cp/parser.c:43432 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:20921 cp/parser.c:43386 +#: c/c-parser.c:20921 cp/parser.c:43439 #, gcc-internal-format msgid "%<#pragma omp end declare target%> without corresponding %<#pragma omp declare target%>" msgstr "" @@ -44156,42 +44181,42 @@ msgstr "" msgid "one of the initializer call arguments should be %<&omp_priv%>" msgstr "" -#: c/c-parser.c:21331 cp/parser.c:43854 +#: c/c-parser.c:21331 cp/parser.c:43907 #, gcc-internal-format msgid "expected %, %, % or %" msgstr "" -#: c/c-parser.c:21395 cp/parser.c:43917 +#: c/c-parser.c:21395 cp/parser.c:43970 #, gcc-internal-format msgid "expected %, % or %" msgstr "" -#: c/c-parser.c:21415 cp/parser.c:43943 +#: c/c-parser.c:21415 cp/parser.c:43996 #, gcc-internal-format msgid "expected %, %, %, % or % clause" msgstr "" -#: c/c-parser.c:21424 cp/parser.c:43952 +#: c/c-parser.c:21424 cp/parser.c:44005 #, gcc-internal-format msgid "%qs clause on % directive not supported yet" msgstr "" -#: c/c-parser.c:21436 cp/parser.c:43964 +#: c/c-parser.c:21436 cp/parser.c:44017 #, gcc-internal-format msgid "%qs clause used lexically after first target construct or offloading API" msgstr "" -#: c/c-parser.c:21448 cp/parser.c:43976 +#: c/c-parser.c:21448 cp/parser.c:44029 #, gcc-internal-format msgid "more than one % clause in a single compilation unit" msgstr "" -#: c/c-parser.c:21457 cp/parser.c:43985 +#: c/c-parser.c:21457 cp/parser.c:44038 #, gcc-internal-format msgid "% clause used lexically after first % construct without memory order clause" msgstr "" -#: c/c-parser.c:21471 cp/parser.c:43999 +#: c/c-parser.c:21471 cp/parser.c:44052 #, gcc-internal-format msgid "% requires at least one clause" msgstr "" @@ -44206,27 +44231,27 @@ msgstr "" msgid "variable sized type %qT in % clause" msgstr "" -#: c/c-parser.c:21736 cp/semantics.c:8745 +#: c/c-parser.c:21736 cp/semantics.c:8773 #, gcc-internal-format msgid "%qE declared % after first use" msgstr "" -#: c/c-parser.c:21738 cp/semantics.c:8747 +#: c/c-parser.c:21738 cp/semantics.c:8775 #, gcc-internal-format msgid "automatic variable %qE cannot be %" msgstr "" -#: c/c-parser.c:21742 cp/semantics.c:8749 +#: c/c-parser.c:21742 cp/semantics.c:8777 #, fuzzy, gcc-internal-format msgid "% %qE has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-parser.c:21921 cp/parser.c:44732 +#: c/c-parser.c:21921 cp/parser.c:44785 #, gcc-internal-format msgid "%<__transaction_cancel%> without transactional memory support enabled" msgstr "" -#: c/c-parser.c:21927 cp/parser.c:44738 +#: c/c-parser.c:21927 cp/parser.c:44791 #, gcc-internal-format msgid "%<__transaction_cancel%> within a %<__transaction_relaxed%>" msgstr "" @@ -44236,7 +44261,7 @@ msgstr "" msgid "outer %<__transaction_cancel%> not within outer %<__transaction_atomic%> or a % function" msgstr "" -#: c/c-parser.c:21944 cp/parser.c:44756 +#: c/c-parser.c:21944 cp/parser.c:44809 #, gcc-internal-format msgid "%<__transaction_cancel%> not within %<__transaction_atomic%>" msgstr "" @@ -44252,7 +44277,7 @@ msgstr "" msgid "%qD has an incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:241 c/c-typeck.c:10615 c/c-typeck.c:10657 cp/call.c:4552 +#: c/c-typeck.c:241 c/c-typeck.c:10675 c/c-typeck.c:10717 cp/call.c:4555 #, gcc-internal-format msgid "invalid use of void expression" msgstr "" @@ -44293,127 +44318,127 @@ msgstr "" msgid "function types not truly compatible in ISO C" msgstr "" -#: c/c-typeck.c:770 +#: c/c-typeck.c:776 #, gcc-internal-format msgid "cannot mix operands of decimal floating and vector types" msgstr "" -#: c/c-typeck.c:775 +#: c/c-typeck.c:781 #, gcc-internal-format msgid "cannot mix operands of decimal floating and complex types" msgstr "" -#: c/c-typeck.c:780 +#: c/c-typeck.c:786 #, gcc-internal-format msgid "cannot mix operands of decimal floating and other floating types" msgstr "" -#: c/c-typeck.c:1325 +#: c/c-typeck.c:1331 #, gcc-internal-format msgid "pointers to arrays with different qualifiers are incompatible in ISO C" msgstr "" -#: c/c-typeck.c:1329 +#: c/c-typeck.c:1335 #, gcc-internal-format msgid "types are not quite compatible" msgstr "" -#: c/c-typeck.c:1333 +#: c/c-typeck.c:1339 #, gcc-internal-format msgid "pointer target types incompatible in C++" msgstr "" -#: c/c-typeck.c:1666 +#: c/c-typeck.c:1672 #, gcc-internal-format msgid "function return types not compatible due to %" msgstr "" -#: c/c-typeck.c:1924 +#: c/c-typeck.c:1930 #, gcc-internal-format msgid "converting an array compound literal to a pointer is ill-formed in C++" msgstr "" -#: c/c-typeck.c:2457 c/c-typeck.c:9170 +#: c/c-typeck.c:2507 c/c-typeck.c:9230 #, gcc-internal-format msgid "%qT has no member named %qE; did you mean %qE?" msgstr "" -#: c/c-typeck.c:2461 c/c-typeck.c:9174 +#: c/c-typeck.c:2511 c/c-typeck.c:9234 #, gcc-internal-format msgid "%qT has no member named %qE" msgstr "" -#: c/c-typeck.c:2470 +#: c/c-typeck.c:2520 #, gcc-internal-format msgid "accessing a member %qE of an atomic structure %qE" msgstr "" -#: c/c-typeck.c:2473 +#: c/c-typeck.c:2523 #, gcc-internal-format msgid "accessing a member %qE of an atomic union %qE" msgstr "" -#: c/c-typeck.c:2533 +#: c/c-typeck.c:2583 #, gcc-internal-format msgid "%qE is a pointer; did you mean to use %<->%>?" msgstr "" -#: c/c-typeck.c:2539 +#: c/c-typeck.c:2589 #, gcc-internal-format msgid "request for member %qE in something not a structure or union" msgstr "" -#: c/c-typeck.c:2587 +#: c/c-typeck.c:2637 #, gcc-internal-format msgid "dereferencing % pointer" msgstr "" -#: c/c-typeck.c:2642 +#: c/c-typeck.c:2692 #, gcc-internal-format msgid "subscripted value is neither array nor pointer nor vector" msgstr "" -#: c/c-typeck.c:2652 cp/typeck.c:3588 cp/typeck.c:3681 +#: c/c-typeck.c:2702 cp/typeck.c:3599 cp/typeck.c:3692 #, gcc-internal-format msgid "array subscript is not an integer" msgstr "" -#: c/c-typeck.c:2658 +#: c/c-typeck.c:2708 #, gcc-internal-format msgid "subscripted value is pointer to function" msgstr "" -#: c/c-typeck.c:2712 +#: c/c-typeck.c:2762 #, fuzzy, gcc-internal-format msgid "ISO C forbids subscripting % array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-typeck.c:2715 +#: c/c-typeck.c:2765 #, fuzzy, gcc-internal-format msgid "ISO C90 forbids subscripting non-lvalue array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-typeck.c:2829 +#: c/c-typeck.c:2879 #, gcc-internal-format msgid "enum constant defined here" msgstr "" -#: c/c-typeck.c:2936 cp/typeck.c:1801 +#: c/c-typeck.c:2986 cp/typeck.c:1812 #, gcc-internal-format msgid "% on array function parameter %qE will return size of %qT" msgstr "" -#: c/c-typeck.c:3089 +#: c/c-typeck.c:3139 #, gcc-internal-format msgid "called object %qE is not a function or function pointer" msgstr "" -#: c/c-typeck.c:3094 +#: c/c-typeck.c:3144 #, gcc-internal-format msgid "called object %qD is not a function or function pointer" msgstr "" -#: c/c-typeck.c:3100 +#: c/c-typeck.c:3150 #, gcc-internal-format msgid "called object is not a function or function pointer" msgstr "" @@ -44421,1603 +44446,1603 @@ msgstr "" #. This situation leads to run-time undefined behavior. We can't, #. therefore, simply error unless we can prove that all possible #. executions of the program must execute the code. -#: c/c-typeck.c:3130 +#: c/c-typeck.c:3180 #, gcc-internal-format msgid "function called through a non-compatible type" msgstr "" -#: c/c-typeck.c:3135 c/c-typeck.c:3187 +#: c/c-typeck.c:3185 c/c-typeck.c:3237 #, gcc-internal-format msgid "function with qualified void return type called" msgstr "" -#: c/c-typeck.c:3242 +#: c/c-typeck.c:3292 #, gcc-internal-format, gfc-internal-format msgid "type of formal parameter %d is incomplete" msgstr "" -#: c/c-typeck.c:3256 +#: c/c-typeck.c:3306 #, gcc-internal-format msgid "passing argument %d of %qE as integer rather than floating due to prototype" msgstr "" -#: c/c-typeck.c:3262 +#: c/c-typeck.c:3312 #, gcc-internal-format msgid "passing argument %d of %qE as integer rather than complex due to prototype" msgstr "" -#: c/c-typeck.c:3268 +#: c/c-typeck.c:3318 #, gcc-internal-format msgid "passing argument %d of %qE as complex rather than floating due to prototype" msgstr "" -#: c/c-typeck.c:3274 +#: c/c-typeck.c:3324 #, gcc-internal-format msgid "passing argument %d of %qE as floating rather than integer due to prototype" msgstr "" -#: c/c-typeck.c:3280 +#: c/c-typeck.c:3330 #, gcc-internal-format msgid "passing argument %d of %qE as complex rather than integer due to prototype" msgstr "" -#: c/c-typeck.c:3286 +#: c/c-typeck.c:3336 #, gcc-internal-format msgid "passing argument %d of %qE as floating rather than complex due to prototype" msgstr "" -#: c/c-typeck.c:3300 +#: c/c-typeck.c:3350 #, gcc-internal-format msgid "passing argument %d of %qE as % rather than % due to prototype" msgstr "" -#: c/c-typeck.c:3326 +#: c/c-typeck.c:3376 #, gcc-internal-format msgid "passing argument %d of %qE as %qT rather than %qT due to prototype" msgstr "" -#: c/c-typeck.c:3351 +#: c/c-typeck.c:3401 #, gcc-internal-format msgid "passing argument %d of %qE with different width due to prototype" msgstr "" -#: c/c-typeck.c:3375 +#: c/c-typeck.c:3425 #, gcc-internal-format msgid "passing argument %d of %qE as unsigned due to prototype" msgstr "" -#: c/c-typeck.c:3380 +#: c/c-typeck.c:3430 #, gcc-internal-format msgid "passing argument %d of %qE as signed due to prototype" msgstr "" -#: c/c-typeck.c:3533 +#: c/c-typeck.c:3583 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function `%s'" msgid "too many arguments to method %qE" msgstr "вельмі шмат аргумэнтаў у функцыі `%s'" -#: c/c-typeck.c:3543 +#: c/c-typeck.c:3593 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function `%s'" msgid "too many arguments to built-in function %qE expecting %d" msgstr "вельмі шмат аргумэнтаў у функцыі `%s'" -#: c/c-typeck.c:3615 +#: c/c-typeck.c:3665 #, gcc-internal-format msgid "implicit conversion from %qT to %qT when passing argument to function" msgstr "" -#: c/c-typeck.c:3683 +#: c/c-typeck.c:3733 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function `%s'" msgid "too few arguments to built-in function %qE expecting %u" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: c/c-typeck.c:3858 c/c-typeck.c:3886 cp/typeck.c:5119 cp/typeck.c:5388 +#: c/c-typeck.c:3908 c/c-typeck.c:3936 cp/typeck.c:5130 cp/typeck.c:5399 #, gcc-internal-format msgid "comparison with string literal results in unspecified behavior" msgstr "" -#: c/c-typeck.c:3866 c/c-typeck.c:3877 cp/typeck.c:5146 cp/typeck.c:5170 +#: c/c-typeck.c:3916 c/c-typeck.c:3927 cp/typeck.c:5157 cp/typeck.c:5181 #, gcc-internal-format msgid "comparison between pointer and zero character constant" msgstr "" -#: c/c-typeck.c:3869 c/c-typeck.c:3880 cp/typeck.c:5149 cp/typeck.c:5173 +#: c/c-typeck.c:3919 c/c-typeck.c:3930 cp/typeck.c:5160 cp/typeck.c:5184 #, gcc-internal-format msgid "did you mean to dereference the pointer?" msgstr "" -#: c/c-typeck.c:3900 +#: c/c-typeck.c:3950 #, gcc-internal-format msgid "comparison between %qT and %qT" msgstr "" -#: c/c-typeck.c:3951 +#: c/c-typeck.c:4001 #, gcc-internal-format msgid "pointer of type % used in subtraction" msgstr "" -#: c/c-typeck.c:3954 +#: c/c-typeck.c:4004 #, gcc-internal-format msgid "pointer to a function used in subtraction" msgstr "" -#: c/c-typeck.c:3988 +#: c/c-typeck.c:4038 #, gcc-internal-format msgid "arithmetic on pointer to an incomplete type" msgstr "" -#: c/c-typeck.c:3997 cp/typeck.c:6086 +#: c/c-typeck.c:4047 cp/typeck.c:6097 #, gcc-internal-format msgid "arithmetic on pointer to an empty aggregate" msgstr "" -#: c/c-typeck.c:4430 +#: c/c-typeck.c:4490 #, gcc-internal-format msgid "%<~%> on a boolean expression" msgstr "" -#: c/c-typeck.c:4434 +#: c/c-typeck.c:4494 #, gcc-internal-format msgid "did you mean to use logical not?" msgstr "" -#: c/c-typeck.c:4444 +#: c/c-typeck.c:4504 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support complex types" msgid "ISO C does not support %<~%> for complex conjugation" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-typeck.c:4468 +#: c/c-typeck.c:4528 #, fuzzy, gcc-internal-format msgid "wrong type argument to absu" msgstr "не хапае аргументаў у функцыі" -#: c/c-typeck.c:4493 +#: c/c-typeck.c:4553 #, gcc-internal-format msgid "wrong type argument to unary exclamation mark" msgstr "" -#: c/c-typeck.c:4551 +#: c/c-typeck.c:4611 #, gcc-internal-format msgid "increment of enumeration value is invalid in C++" msgstr "" -#: c/c-typeck.c:4554 +#: c/c-typeck.c:4614 #, gcc-internal-format msgid "decrement of enumeration value is invalid in C++" msgstr "" -#: c/c-typeck.c:4561 +#: c/c-typeck.c:4621 #, gcc-internal-format msgid "increment of a boolean expression" msgstr "" -#: c/c-typeck.c:4564 +#: c/c-typeck.c:4624 #, gcc-internal-format msgid "decrement of a boolean expression" msgstr "" -#: c/c-typeck.c:4580 +#: c/c-typeck.c:4640 #, fuzzy, gcc-internal-format #| msgid "ISO C does not support `++' and `--' on complex types" msgid "ISO C does not support %<++%> and %<--%> on complex types" msgstr "ISO C не падтрымлівае \"++\" і \"--\" для тыпу complex" -#: c/c-typeck.c:4606 c/c-typeck.c:4640 +#: c/c-typeck.c:4666 c/c-typeck.c:4700 #, fuzzy, gcc-internal-format msgid "wrong type argument to increment" msgstr "не хапае аргументаў у функцыі" -#: c/c-typeck.c:4608 c/c-typeck.c:4643 +#: c/c-typeck.c:4668 c/c-typeck.c:4703 #, gcc-internal-format msgid "wrong type argument to decrement" msgstr "" -#: c/c-typeck.c:4628 +#: c/c-typeck.c:4688 #, fuzzy, gcc-internal-format msgid "increment of pointer to an incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:4632 +#: c/c-typeck.c:4692 #, fuzzy, gcc-internal-format msgid "decrement of pointer to an incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:4739 +#: c/c-typeck.c:4799 #, gcc-internal-format msgid "taking address of expression of type %" msgstr "" -#: c/c-typeck.c:4798 +#: c/c-typeck.c:4858 #, fuzzy, gcc-internal-format msgid "cannot take address of bit-field %qD" msgstr "не магу атрымаць адрас бітавага поля \"%s\"" -#: c/c-typeck.c:4811 +#: c/c-typeck.c:4871 #, fuzzy, gcc-internal-format msgid "cannot take address of scalar with reverse storage order" msgstr "не магу атрымаць адрас бітавага поля \"%s\"" -#: c/c-typeck.c:4819 +#: c/c-typeck.c:4879 #, gcc-internal-format msgid "address of array with reverse scalar storage order requested" msgstr "" -#: c/c-typeck.c:5004 +#: c/c-typeck.c:5064 #, gcc-internal-format msgid "global register variable %qD used in nested function" msgstr "" -#: c/c-typeck.c:5007 +#: c/c-typeck.c:5067 #, gcc-internal-format msgid "register variable %qD used in nested function" msgstr "" -#: c/c-typeck.c:5012 +#: c/c-typeck.c:5072 #, gcc-internal-format msgid "address of global register variable %qD requested" msgstr "" -#: c/c-typeck.c:5014 +#: c/c-typeck.c:5074 #, gcc-internal-format msgid "address of register variable %qD requested" msgstr "" -#: c/c-typeck.c:5153 +#: c/c-typeck.c:5213 #, gcc-internal-format msgid "non-lvalue array in conditional expression" msgstr "" -#: c/c-typeck.c:5235 +#: c/c-typeck.c:5295 #, gcc-internal-format msgid "implicit conversion from %qT to %qT to match other result of conditional" msgstr "" -#: c/c-typeck.c:5294 c/c-typeck.c:5300 +#: c/c-typeck.c:5354 c/c-typeck.c:5360 #, gcc-internal-format msgid "operand of % changes signedness from %qT to %qT due to unsignedness of other operand" msgstr "" -#: c/c-typeck.c:5317 +#: c/c-typeck.c:5377 #, gcc-internal-format msgid "ISO C forbids conditional expr with only one void side" msgstr "" -#: c/c-typeck.c:5334 +#: c/c-typeck.c:5394 #, gcc-internal-format msgid "pointers to disjoint address spaces used in conditional expression" msgstr "" -#: c/c-typeck.c:5345 c/c-typeck.c:5362 +#: c/c-typeck.c:5405 c/c-typeck.c:5422 #, gcc-internal-format msgid "pointer to array loses qualifier in conditional expression" msgstr "" -#: c/c-typeck.c:5350 c/c-typeck.c:5367 +#: c/c-typeck.c:5410 c/c-typeck.c:5427 #, gcc-internal-format msgid "ISO C forbids conditional expr between % and function pointer" msgstr "" -#: c/c-typeck.c:5380 +#: c/c-typeck.c:5440 #, gcc-internal-format msgid "pointer type mismatch between %qT and %qT of %qD and %qD in conditional expression" msgstr "" -#: c/c-typeck.c:5385 +#: c/c-typeck.c:5445 #, gcc-internal-format msgid "pointer type mismatch in conditional expression" msgstr "" -#: c/c-typeck.c:5394 c/c-typeck.c:5405 +#: c/c-typeck.c:5454 c/c-typeck.c:5465 #, gcc-internal-format msgid "pointer/integer type mismatch in conditional expression" msgstr "" -#: c/c-typeck.c:5419 +#: c/c-typeck.c:5479 #, gcc-internal-format msgid "type mismatch in conditional expression" msgstr "" -#: c/c-typeck.c:5534 +#: c/c-typeck.c:5594 #, gcc-internal-format msgid "ignoring return value of %qD, declared with attribute %: %E" msgstr "" -#: c/c-typeck.c:5538 +#: c/c-typeck.c:5598 #, gcc-internal-format msgid "ignoring return value of %qD, declared with attribute %" msgstr "" -#: c/c-typeck.c:5556 +#: c/c-typeck.c:5616 #, gcc-internal-format msgid "ignoring return value of type %qT, declared with attribute %: %E" msgstr "" -#: c/c-typeck.c:5561 +#: c/c-typeck.c:5621 #, gcc-internal-format msgid "ignoring return value of type %qT, declared with attribute %" msgstr "" -#: c/c-typeck.c:5570 cp/cvt.c:1098 +#: c/c-typeck.c:5630 cp/cvt.c:1098 #, gcc-internal-format msgid "in call to %qD, declared here" msgstr "" -#: c/c-typeck.c:5619 +#: c/c-typeck.c:5679 #, gcc-internal-format msgid "left-hand operand of comma expression has no effect" msgstr "" -#: c/c-typeck.c:5637 c/c-typeck.c:11178 +#: c/c-typeck.c:5697 c/c-typeck.c:11238 #, gcc-internal-format msgid "right-hand operand of comma expression has no effect" msgstr "" -#: c/c-typeck.c:5708 +#: c/c-typeck.c:5768 msgid "cast adds %q#v qualifier to function type" msgstr "" -#: c/c-typeck.c:5714 +#: c/c-typeck.c:5774 msgid "cast discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:5749 +#: c/c-typeck.c:5809 #, gcc-internal-format msgid "to be safe all intermediate pointers in cast from %qT to %qT must be % qualified" msgstr "" -#: c/c-typeck.c:5843 +#: c/c-typeck.c:5903 #, gcc-internal-format msgid "cast specifies array type" msgstr "" -#: c/c-typeck.c:5849 +#: c/c-typeck.c:5909 #, gcc-internal-format msgid "cast specifies function type" msgstr "" -#: c/c-typeck.c:5864 +#: c/c-typeck.c:5924 #, gcc-internal-format msgid "ISO C forbids casting nonscalar to the same type" msgstr "" -#: c/c-typeck.c:5884 +#: c/c-typeck.c:5944 #, gcc-internal-format msgid "ISO C forbids casts to union type" msgstr "" -#: c/c-typeck.c:5894 +#: c/c-typeck.c:5954 #, gcc-internal-format msgid "cast to union type from type not present in union" msgstr "" -#: c/c-typeck.c:5929 +#: c/c-typeck.c:5989 #, gcc-internal-format, gfc-internal-format msgid "cast to %s address space pointer from disjoint generic address space pointer" msgstr "" -#: c/c-typeck.c:5934 +#: c/c-typeck.c:5994 #, gcc-internal-format, gfc-internal-format msgid "cast to generic address space pointer from disjoint %s address space pointer" msgstr "" -#: c/c-typeck.c:5939 +#: c/c-typeck.c:5999 #, gcc-internal-format, gfc-internal-format msgid "cast to %s address space pointer from disjoint %s address space pointer" msgstr "" -#: c/c-typeck.c:5959 +#: c/c-typeck.c:6019 #, gcc-internal-format msgid "cast increases required alignment of target type" msgstr "" -#: c/c-typeck.c:5970 +#: c/c-typeck.c:6030 #, gcc-internal-format msgid "cast from pointer to integer of different size" msgstr "" -#: c/c-typeck.c:5975 +#: c/c-typeck.c:6035 #, gcc-internal-format msgid "cast from function call of type %qT to non-matching type %qT" msgstr "" -#: c/c-typeck.c:5984 cp/typeck.c:8438 +#: c/c-typeck.c:6044 cp/typeck.c:8445 #, gcc-internal-format msgid "cast to pointer from integer of different size" msgstr "" -#: c/c-typeck.c:5998 +#: c/c-typeck.c:6058 #, gcc-internal-format msgid "ISO C forbids conversion of function pointer to object pointer type" msgstr "" -#: c/c-typeck.c:6007 +#: c/c-typeck.c:6067 #, gcc-internal-format msgid "ISO C forbids conversion of object pointer to function pointer type" msgstr "" -#: c/c-typeck.c:6017 +#: c/c-typeck.c:6077 #, gcc-internal-format msgid "cast between incompatible function types from %qT to %qT" msgstr "" -#: c/c-typeck.c:6112 +#: c/c-typeck.c:6172 #, gcc-internal-format msgid "defining a type in a cast is invalid in C++" msgstr "" -#: c/c-typeck.c:6153 +#: c/c-typeck.c:6213 #, gcc-internal-format msgid "assignment to expression with array type" msgstr "" -#: c/c-typeck.c:6279 +#: c/c-typeck.c:6339 #, gcc-internal-format msgid "enum conversion in assignment is invalid in C++" msgstr "" -#: c/c-typeck.c:6481 c/c-typeck.c:6503 c/c-typeck.c:6529 +#: c/c-typeck.c:6541 c/c-typeck.c:6563 c/c-typeck.c:6589 #, fuzzy, gcc-internal-format #| msgid "initialization" msgid "(near initialization for %qs)" msgstr "ініцыялізацыя" -#: c/c-typeck.c:6544 +#: c/c-typeck.c:6604 #, gcc-internal-format msgid "array initialized from parenthesized string constant" msgstr "" -#: c/c-typeck.c:6587 c/c-typeck.c:6833 +#: c/c-typeck.c:6647 c/c-typeck.c:6893 #, gcc-internal-format msgid "expected %qT but argument is of type %qT" msgstr "" -#: c/c-typeck.c:6621 +#: c/c-typeck.c:6681 #, gcc-internal-format msgid "%qD argument %d type is %qT where %qT is expected in a call to built-in function declared without prototype" msgstr "" -#: c/c-typeck.c:6624 +#: c/c-typeck.c:6684 #, gcc-internal-format msgid "%qD argument %d promotes to %qT where %qT is expected in a call to built-in function declared without prototype" msgstr "" -#: c/c-typeck.c:6629 +#: c/c-typeck.c:6689 #, gcc-internal-format msgid "built-in %qD declared here" msgstr "" -#: c/c-typeck.c:6828 +#: c/c-typeck.c:6888 #, gcc-internal-format msgid "enum conversion when passing argument %d of %qE is invalid in C++" msgstr "" -#: c/c-typeck.c:6837 +#: c/c-typeck.c:6897 #, gcc-internal-format msgid "enum conversion from %qT to %qT in assignment is invalid in C++" msgstr "" -#: c/c-typeck.c:6841 +#: c/c-typeck.c:6901 #, gcc-internal-format msgid "enum conversion from %qT to %qT in initialization is invalid in C++" msgstr "" -#: c/c-typeck.c:6846 +#: c/c-typeck.c:6906 #, gcc-internal-format msgid "enum conversion from %qT to %qT in return is invalid in C++" msgstr "" -#: c/c-typeck.c:6864 +#: c/c-typeck.c:6924 #, fuzzy, gcc-internal-format #| msgid "converting from `%T' to `%T'" msgid "implicit conversion from %qT to %qT" msgstr "пераўтварэньне з `%T' у `%T'" -#: c/c-typeck.c:7042 c/c-typeck.c:7397 +#: c/c-typeck.c:7102 c/c-typeck.c:7457 msgid "passing argument %d of %qE makes %q#v qualified function pointer from unqualified" msgstr "" -#: c/c-typeck.c:7045 c/c-typeck.c:7400 +#: c/c-typeck.c:7105 c/c-typeck.c:7460 msgid "assignment makes %q#v qualified function pointer from unqualified" msgstr "" -#: c/c-typeck.c:7048 c/c-typeck.c:7402 +#: c/c-typeck.c:7108 c/c-typeck.c:7462 msgid "initialization makes %q#v qualified function pointer from unqualified" msgstr "" -#: c/c-typeck.c:7051 c/c-typeck.c:7404 +#: c/c-typeck.c:7111 c/c-typeck.c:7464 msgid "return makes %q#v qualified function pointer from unqualified" msgstr "" -#: c/c-typeck.c:7059 c/c-typeck.c:7292 c/c-typeck.c:7335 +#: c/c-typeck.c:7119 c/c-typeck.c:7352 c/c-typeck.c:7395 msgid "passing argument %d of %qE discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:7061 c/c-typeck.c:7294 c/c-typeck.c:7337 +#: c/c-typeck.c:7121 c/c-typeck.c:7354 c/c-typeck.c:7397 msgid "assignment discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:7063 c/c-typeck.c:7296 c/c-typeck.c:7339 +#: c/c-typeck.c:7123 c/c-typeck.c:7356 c/c-typeck.c:7399 msgid "initialization discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:7065 c/c-typeck.c:7298 c/c-typeck.c:7341 +#: c/c-typeck.c:7125 c/c-typeck.c:7358 c/c-typeck.c:7401 msgid "return discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:7074 +#: c/c-typeck.c:7134 #, gcc-internal-format msgid "ISO C prohibits argument conversion to union type" msgstr "" -#: c/c-typeck.c:7142 +#: c/c-typeck.c:7202 #, gcc-internal-format msgid "request for implicit conversion from %qT to %qT not permitted in C++" msgstr "" -#: c/c-typeck.c:7155 +#: c/c-typeck.c:7215 #, gcc-internal-format msgid "passing argument %d of %qE from pointer to non-enclosed address space" msgstr "" -#: c/c-typeck.c:7165 +#: c/c-typeck.c:7225 #, gcc-internal-format msgid "assignment from pointer to non-enclosed address space" msgstr "" -#: c/c-typeck.c:7175 +#: c/c-typeck.c:7235 #, gcc-internal-format msgid "initialization from pointer to non-enclosed address space" msgstr "" -#: c/c-typeck.c:7185 +#: c/c-typeck.c:7245 #, gcc-internal-format msgid "return from pointer to non-enclosed address space" msgstr "" -#: c/c-typeck.c:7208 +#: c/c-typeck.c:7268 #, gcc-internal-format msgid "argument %d of %qE might be a candidate for a format attribute" msgstr "" -#: c/c-typeck.c:7214 +#: c/c-typeck.c:7274 #, gcc-internal-format msgid "assignment left-hand side might be a candidate for a format attribute" msgstr "" -#: c/c-typeck.c:7219 +#: c/c-typeck.c:7279 #, gcc-internal-format msgid "initialization left-hand side might be a candidate for a format attribute" msgstr "" -#: c/c-typeck.c:7224 cp/typeck.c:9547 +#: c/c-typeck.c:7284 cp/typeck.c:9554 #, gcc-internal-format msgid "return type might be a candidate for a format attribute" msgstr "" -#: c/c-typeck.c:7245 +#: c/c-typeck.c:7305 #, gcc-internal-format msgid "passing argument %d of %qE from incompatible scalar storage order" msgstr "" -#: c/c-typeck.c:7250 +#: c/c-typeck.c:7310 #, gcc-internal-format msgid "assignment to %qT from pointer type %qT with incompatible scalar storage order" msgstr "" -#: c/c-typeck.c:7255 +#: c/c-typeck.c:7315 #, gcc-internal-format msgid "initialization of %qT from pointer type %qT with incompatible scalar storage order" msgstr "" -#: c/c-typeck.c:7260 +#: c/c-typeck.c:7320 #, gcc-internal-format msgid "returning %qT from pointer type with incompatible scalar storage order %qT" msgstr "" -#: c/c-typeck.c:7309 +#: c/c-typeck.c:7369 #, gcc-internal-format msgid "ISO C forbids passing argument %d of %qE between function pointer and %" msgstr "" -#: c/c-typeck.c:7312 +#: c/c-typeck.c:7372 #, gcc-internal-format msgid "ISO C forbids assignment between function pointer and %" msgstr "" -#: c/c-typeck.c:7314 +#: c/c-typeck.c:7374 #, gcc-internal-format msgid "ISO C forbids initialization between function pointer and %" msgstr "" -#: c/c-typeck.c:7316 +#: c/c-typeck.c:7376 #, gcc-internal-format msgid "ISO C forbids return between function pointer and %" msgstr "" -#: c/c-typeck.c:7360 +#: c/c-typeck.c:7420 #, gcc-internal-format msgid "pointer targets in passing argument %d of %qE differ in signedness" msgstr "" -#: c/c-typeck.c:7368 +#: c/c-typeck.c:7428 #, gcc-internal-format msgid "pointer targets in assignment from %qT to %qT differ in signedness" msgstr "" -#: c/c-typeck.c:7373 +#: c/c-typeck.c:7433 #, gcc-internal-format msgid "pointer targets in initialization of %qT from %qT differ in signedness" msgstr "" -#: c/c-typeck.c:7378 +#: c/c-typeck.c:7438 #, gcc-internal-format msgid "pointer targets in returning %qT from a function with return type %qT differ in signedness" msgstr "" -#: c/c-typeck.c:7420 +#: c/c-typeck.c:7480 #, gcc-internal-format msgid "passing argument %d of %qE from incompatible pointer type" msgstr "" -#: c/c-typeck.c:7428 +#: c/c-typeck.c:7488 #, fuzzy, gcc-internal-format msgid "assignment to %qT from pointer to %qD with incompatible type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:7433 +#: c/c-typeck.c:7493 #, gcc-internal-format msgid "assignment to %qT from incompatible pointer type %qT" msgstr "" -#: c/c-typeck.c:7439 +#: c/c-typeck.c:7499 #, fuzzy, gcc-internal-format msgid "initialization of %qT from pointer to %qD with incompatible type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:7444 +#: c/c-typeck.c:7504 #, gcc-internal-format msgid "initialization of %qT from incompatible pointer type %qT" msgstr "" -#: c/c-typeck.c:7451 +#: c/c-typeck.c:7511 #, gcc-internal-format msgid "returning pointer to %qD of type %qT from a function with incompatible type %qT" msgstr "" -#: c/c-typeck.c:7456 +#: c/c-typeck.c:7516 #, gcc-internal-format msgid "returning %qT from a function with incompatible return type %qT" msgstr "" -#: c/c-typeck.c:7495 +#: c/c-typeck.c:7555 #, gcc-internal-format msgid "passing argument %d of %qE makes pointer from integer without a cast" msgstr "" -#: c/c-typeck.c:7502 +#: c/c-typeck.c:7562 #, gcc-internal-format msgid "assignment to %qT from %qT makes pointer from integer without a cast" msgstr "" -#: c/c-typeck.c:7507 +#: c/c-typeck.c:7567 #, gcc-internal-format msgid "initialization of %qT from %qT makes pointer from integer without a cast" msgstr "" -#: c/c-typeck.c:7511 +#: c/c-typeck.c:7571 #, gcc-internal-format msgid "returning %qT from a function with return type %qT makes pointer from integer without a cast" msgstr "" -#: c/c-typeck.c:7531 +#: c/c-typeck.c:7591 #, gcc-internal-format msgid "passing argument %d of %qE makes integer from pointer without a cast" msgstr "" -#: c/c-typeck.c:7538 +#: c/c-typeck.c:7598 #, gcc-internal-format msgid "assignment to %qT from %qT makes integer from pointer without a cast" msgstr "" -#: c/c-typeck.c:7543 +#: c/c-typeck.c:7603 #, gcc-internal-format msgid "initialization of %qT from %qT makes integer from pointer without a cast" msgstr "" -#: c/c-typeck.c:7547 +#: c/c-typeck.c:7607 #, gcc-internal-format msgid "returning %qT from a function with return type %qT makes integer from pointer without a cast" msgstr "" -#: c/c-typeck.c:7574 +#: c/c-typeck.c:7634 #, gcc-internal-format msgid "incompatible type for argument %d of %qE" msgstr "" -#: c/c-typeck.c:7585 +#: c/c-typeck.c:7645 #, gcc-internal-format msgid "incompatible types when assigning to type %qT from type %qT" msgstr "" -#: c/c-typeck.c:7595 +#: c/c-typeck.c:7655 #, gcc-internal-format msgid "incompatible types when initializing type %qT using type %qT" msgstr "" -#: c/c-typeck.c:7605 +#: c/c-typeck.c:7665 #, gcc-internal-format msgid "incompatible types when returning type %qT but %qT was expected" msgstr "" -#: c/c-typeck.c:7673 +#: c/c-typeck.c:7733 #, gcc-internal-format msgid "traditional C rejects automatic aggregate initialization" msgstr "" -#: c/c-typeck.c:7913 c/c-typeck.c:8807 cp/typeck2.c:1082 +#: c/c-typeck.c:7973 c/c-typeck.c:8867 cp/typeck2.c:1082 #, gcc-internal-format msgid "initialization of a flexible array member" msgstr "" -#: c/c-typeck.c:7929 cp/typeck2.c:1099 +#: c/c-typeck.c:7989 cp/typeck2.c:1099 #, gcc-internal-format msgid "cannot initialize array of %qT from a string literal with type array of %qT" msgstr "" -#: c/c-typeck.c:7969 +#: c/c-typeck.c:8029 #, gcc-internal-format msgid "array of inappropriate type initialized from string constant" msgstr "" -#: c/c-typeck.c:8037 cp/typeck.c:2182 +#: c/c-typeck.c:8097 cp/typeck.c:2193 #, gcc-internal-format msgid "invalid use of non-lvalue array" msgstr "" -#: c/c-typeck.c:8056 c/c-typeck.c:8080 c/c-typeck.c:8083 c/c-typeck.c:8091 -#: c/c-typeck.c:8131 c/c-typeck.c:9660 c/c-typeck.c:9710 +#: c/c-typeck.c:8116 c/c-typeck.c:8140 c/c-typeck.c:8143 c/c-typeck.c:8151 +#: c/c-typeck.c:8191 c/c-typeck.c:9720 c/c-typeck.c:9770 #, gcc-internal-format msgid "initializer element is not constant" msgstr "" -#: c/c-typeck.c:8065 +#: c/c-typeck.c:8125 #, gcc-internal-format msgid "array initialized from non-constant array expression" msgstr "" -#: c/c-typeck.c:8096 c/c-typeck.c:8144 c/c-typeck.c:9720 +#: c/c-typeck.c:8156 c/c-typeck.c:8204 c/c-typeck.c:9780 #, fuzzy, gcc-internal-format msgid "initializer element is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-typeck.c:8138 c/c-typeck.c:9715 +#: c/c-typeck.c:8198 c/c-typeck.c:9775 #, gcc-internal-format msgid "initializer element is not computable at load time" msgstr "" -#: c/c-typeck.c:8157 +#: c/c-typeck.c:8217 #, gcc-internal-format msgid "invalid initializer" msgstr "нерэчаісны ініцыялізатар" -#: c/c-typeck.c:8435 cp/decl.c:6976 +#: c/c-typeck.c:8495 cp/decl.c:6972 #, gcc-internal-format msgid "opaque vector types cannot be initialized" msgstr "" -#: c/c-typeck.c:8655 +#: c/c-typeck.c:8715 #, gcc-internal-format msgid "extra brace group at end of initializer" msgstr "" -#: c/c-typeck.c:8738 +#: c/c-typeck.c:8798 #, gcc-internal-format msgid "braces around scalar initializer" msgstr "" -#: c/c-typeck.c:8804 c/c-typeck.c:10243 cp/typeck2.c:1109 cp/typeck2.c:1367 +#: c/c-typeck.c:8864 c/c-typeck.c:10303 cp/typeck2.c:1109 cp/typeck2.c:1364 #, gcc-internal-format msgid "initialization of flexible array member in a nested context" msgstr "" -#: c/c-typeck.c:8841 +#: c/c-typeck.c:8901 #, gcc-internal-format msgid "missing braces around initializer" msgstr "" -#: c/c-typeck.c:8864 +#: c/c-typeck.c:8924 #, fuzzy, gcc-internal-format msgid "missing initializer for field %qD of %qT" msgstr "прапушчан ініцыялізатар" -#: c/c-typeck.c:8888 +#: c/c-typeck.c:8948 #, gcc-internal-format msgid "empty scalar initializer" msgstr "" -#: c/c-typeck.c:8893 +#: c/c-typeck.c:8953 #, gcc-internal-format msgid "extra elements in scalar initializer" msgstr "" -#: c/c-typeck.c:9012 c/c-typeck.c:9094 +#: c/c-typeck.c:9072 c/c-typeck.c:9154 #, gcc-internal-format msgid "array index in non-array initializer" msgstr "" -#: c/c-typeck.c:9017 c/c-typeck.c:9156 +#: c/c-typeck.c:9077 c/c-typeck.c:9216 #, gcc-internal-format msgid "field name not in record or union initializer" msgstr "" -#: c/c-typeck.c:9067 +#: c/c-typeck.c:9127 #, fuzzy, gcc-internal-format msgid "array index in initializer not of integer type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:9076 c/c-typeck.c:9085 +#: c/c-typeck.c:9136 c/c-typeck.c:9145 #, fuzzy, gcc-internal-format msgid "array index in initializer is not an integer constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-typeck.c:9090 c/c-typeck.c:9092 +#: c/c-typeck.c:9150 c/c-typeck.c:9152 #, gcc-internal-format msgid "nonconstant array index in initializer" msgstr "" -#: c/c-typeck.c:9096 c/c-typeck.c:9099 +#: c/c-typeck.c:9156 c/c-typeck.c:9159 #, gcc-internal-format msgid "array index in initializer exceeds array bounds" msgstr "" -#: c/c-typeck.c:9118 +#: c/c-typeck.c:9178 #, gcc-internal-format msgid "empty index range in initializer" msgstr "" -#: c/c-typeck.c:9127 +#: c/c-typeck.c:9187 #, gcc-internal-format msgid "array index range in initializer exceeds array bounds" msgstr "" -#: c/c-typeck.c:9229 c/c-typeck.c:9259 c/c-typeck.c:9803 +#: c/c-typeck.c:9289 c/c-typeck.c:9319 c/c-typeck.c:9863 #, gcc-internal-format msgid "initialized field with side-effects overwritten" msgstr "" -#: c/c-typeck.c:9233 c/c-typeck.c:9263 c/c-typeck.c:9806 +#: c/c-typeck.c:9293 c/c-typeck.c:9323 c/c-typeck.c:9866 #, gcc-internal-format msgid "initialized field overwritten" msgstr "" -#: c/c-typeck.c:9737 +#: c/c-typeck.c:9797 #, gcc-internal-format msgid "enum conversion in initialization is invalid in C++" msgstr "" -#: c/c-typeck.c:10118 +#: c/c-typeck.c:10178 #, gcc-internal-format msgid "excess elements in % array initializer" msgstr "" -#: c/c-typeck.c:10125 c/c-typeck.c:10202 +#: c/c-typeck.c:10185 c/c-typeck.c:10262 #, gcc-internal-format msgid "excess elements in struct initializer" msgstr "" -#: c/c-typeck.c:10146 +#: c/c-typeck.c:10206 #, gcc-internal-format msgid "positional initialization of field in % declared with % attribute" msgstr "" -#: c/c-typeck.c:10217 cp/typeck2.c:1086 +#: c/c-typeck.c:10277 cp/typeck2.c:1086 #, gcc-internal-format msgid "non-static initialization of a flexible array member" msgstr "" -#: c/c-typeck.c:10312 +#: c/c-typeck.c:10372 #, gcc-internal-format msgid "excess elements in union initializer" msgstr "" -#: c/c-typeck.c:10334 +#: c/c-typeck.c:10394 #, gcc-internal-format msgid "traditional C rejects initialization of unions" msgstr "" -#: c/c-typeck.c:10396 +#: c/c-typeck.c:10456 #, gcc-internal-format msgid "excess elements in array initializer" msgstr "" -#: c/c-typeck.c:10430 +#: c/c-typeck.c:10490 #, gcc-internal-format msgid "excess elements in vector initializer" msgstr "" -#: c/c-typeck.c:10462 +#: c/c-typeck.c:10522 #, gcc-internal-format msgid "excess elements in scalar initializer" msgstr "" -#: c/c-typeck.c:10704 +#: c/c-typeck.c:10764 #, fuzzy, gcc-internal-format #| msgid "ISO C forbids `goto *expr;'" msgid "ISO C forbids %" msgstr "ISO C не падтрымлівае \"goto *expr;\"" -#: c/c-typeck.c:10731 c/gimple-parser.c:2404 cp/typeck.c:10039 +#: c/c-typeck.c:10791 c/gimple-parser.c:2404 cp/typeck.c:10046 #, fuzzy, gcc-internal-format #| msgid "function does not return string type" msgid "function declared % has a % statement" msgstr "функцыя не вяртае тып string" -#: c/c-typeck.c:10759 c/c-typeck.c:10763 +#: c/c-typeck.c:10819 c/c-typeck.c:10823 #, gcc-internal-format msgid "% with no value, in function returning non-void" msgstr "" -#: c/c-typeck.c:10777 c/gimple-parser.c:2414 +#: c/c-typeck.c:10837 c/gimple-parser.c:2414 #, gcc-internal-format msgid "% with a value, in function returning void" msgstr "" -#: c/c-typeck.c:10780 +#: c/c-typeck.c:10840 #, gcc-internal-format msgid "ISO C forbids % with expression, in function returning void" msgstr "" -#: c/c-typeck.c:10857 +#: c/c-typeck.c:10917 #, fuzzy, gcc-internal-format msgid "function returns address of label" msgstr "ISO C не дазваляе пусты ізыходны файл" -#: c/c-typeck.c:10947 cp/semantics.c:1420 +#: c/c-typeck.c:11007 cp/semantics.c:1439 #, gcc-internal-format msgid "switch quantity not an integer" msgstr "" -#: c/c-typeck.c:10972 +#: c/c-typeck.c:11032 #, gcc-internal-format msgid "% switch expression not converted to % in ISO C" msgstr "" -#: c/c-typeck.c:11010 c/c-typeck.c:11018 +#: c/c-typeck.c:11070 c/c-typeck.c:11078 #, fuzzy, gcc-internal-format msgid "case label is not an integer constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-typeck.c:11024 cp/parser.c:11953 +#: c/c-typeck.c:11084 cp/parser.c:11974 #, gcc-internal-format msgid "case label not within a switch statement" msgstr "" -#: c/c-typeck.c:11026 +#: c/c-typeck.c:11086 #, gcc-internal-format msgid "% label not within a switch statement" msgstr "" -#: c/c-typeck.c:11102 cp/parser.c:13452 +#: c/c-typeck.c:11162 cp/parser.c:13476 #, gcc-internal-format msgid "break statement not within loop or switch" msgstr "" -#: c/c-typeck.c:11105 c/c-typeck.c:11125 cp/decl.c:3661 cp/parser.c:13462 -#: cp/parser.c:13483 +#: c/c-typeck.c:11165 c/c-typeck.c:11185 cp/decl.c:3643 cp/parser.c:13486 +#: cp/parser.c:13507 #, gcc-internal-format msgid "invalid exit from OpenMP structured block" msgstr "" -#: c/c-typeck.c:11108 cp/parser.c:13465 +#: c/c-typeck.c:11168 cp/parser.c:13489 #, gcc-internal-format msgid "break statement used with OpenMP for loop" msgstr "" -#: c/c-typeck.c:11122 cp/parser.c:13475 +#: c/c-typeck.c:11182 cp/parser.c:13499 #, gcc-internal-format msgid "continue statement not within a loop" msgstr "" -#: c/c-typeck.c:11160 cp/cp-gimplify.c:218 +#: c/c-typeck.c:11220 cp/cp-gimplify.c:218 #, gcc-internal-format msgid "statement with no effect" msgstr "" -#: c/c-typeck.c:11204 +#: c/c-typeck.c:11264 #, gcc-internal-format msgid "expression statement has incomplete type" msgstr "" -#: c/c-typeck.c:12038 c/c-typeck.c:12206 cp/typeck.c:5402 +#: c/c-typeck.c:12098 c/c-typeck.c:12266 cp/typeck.c:5413 #, gcc-internal-format msgid "comparing vectors with different element types" msgstr "" -#: c/c-typeck.c:12046 c/c-typeck.c:12214 cp/typeck.c:5415 +#: c/c-typeck.c:12106 c/c-typeck.c:12274 cp/typeck.c:5426 #, gcc-internal-format msgid "comparing vectors with different number of elements" msgstr "" -#: c/c-typeck.c:12071 c/c-typeck.c:12239 cp/typeck.c:5450 +#: c/c-typeck.c:12131 c/c-typeck.c:12299 cp/typeck.c:5461 #, gcc-internal-format msgid "could not find an integer type of the same size as %qT" msgstr "" -#: c/c-typeck.c:12085 cp/typeck.c:5108 +#: c/c-typeck.c:12145 cp/typeck.c:5119 #, gcc-internal-format msgid "comparing floating-point with %<==%> or % is unsafe" msgstr "" -#: c/c-typeck.c:12103 c/c-typeck.c:12124 +#: c/c-typeck.c:12163 c/c-typeck.c:12184 #, gcc-internal-format msgid "the comparison will always evaluate as % for the address of %qD will never be NULL" msgstr "" -#: c/c-typeck.c:12109 c/c-typeck.c:12130 +#: c/c-typeck.c:12169 c/c-typeck.c:12190 #, gcc-internal-format msgid "the comparison will always evaluate as % for the address of %qD will never be NULL" msgstr "" -#: c/c-typeck.c:12151 c/c-typeck.c:12280 +#: c/c-typeck.c:12211 c/c-typeck.c:12340 #, gcc-internal-format msgid "comparison of pointers to disjoint address spaces" msgstr "" -#: c/c-typeck.c:12158 c/c-typeck.c:12164 +#: c/c-typeck.c:12218 c/c-typeck.c:12224 #, fuzzy, gcc-internal-format msgid "ISO C forbids comparison of % with function pointer" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-typeck.c:12171 c/c-typeck.c:12290 +#: c/c-typeck.c:12231 c/c-typeck.c:12350 #, gcc-internal-format msgid "comparison of distinct pointer types lacks a cast" msgstr "" -#: c/c-typeck.c:12183 c/c-typeck.c:12188 c/c-typeck.c:12316 c/c-typeck.c:12321 +#: c/c-typeck.c:12243 c/c-typeck.c:12248 c/c-typeck.c:12376 c/c-typeck.c:12381 #, gcc-internal-format msgid "comparison between pointer and integer" msgstr "" -#: c/c-typeck.c:12268 +#: c/c-typeck.c:12328 #, gcc-internal-format msgid "comparison of complete and incomplete pointers" msgstr "" -#: c/c-typeck.c:12270 +#: c/c-typeck.c:12330 #, gcc-internal-format msgid "ISO C forbids ordered comparisons of pointers to functions" msgstr "" -#: c/c-typeck.c:12275 +#: c/c-typeck.c:12335 #, gcc-internal-format msgid "ordered comparison of pointer with null pointer" msgstr "" -#: c/c-typeck.c:12298 c/c-typeck.c:12301 c/c-typeck.c:12308 c/c-typeck.c:12311 +#: c/c-typeck.c:12358 c/c-typeck.c:12361 c/c-typeck.c:12368 c/c-typeck.c:12371 #, gcc-internal-format msgid "ordered comparison of pointer with integer zero" msgstr "" -#: c/c-typeck.c:12380 +#: c/c-typeck.c:12440 #, gcc-internal-format msgid "implicit conversion from %qT to %qT to match other operand of binary expression" msgstr "" -#: c/c-typeck.c:12695 +#: c/c-typeck.c:12755 #, gcc-internal-format msgid "used array that cannot be converted to pointer where scalar is required" msgstr "" -#: c/c-typeck.c:12699 +#: c/c-typeck.c:12759 #, gcc-internal-format msgid "used struct type value where scalar is required" msgstr "" -#: c/c-typeck.c:12703 +#: c/c-typeck.c:12763 #, gcc-internal-format msgid "used union type value where scalar is required" msgstr "" -#: c/c-typeck.c:12719 +#: c/c-typeck.c:12779 #, gcc-internal-format msgid "used vector type where scalar is required" msgstr "" -#: c/c-typeck.c:12909 cp/semantics.c:9869 +#: c/c-typeck.c:12969 cp/semantics.c:9897 #, gcc-internal-format msgid "%<#pragma omp cancel%> must specify one of %, %, % or % clauses" msgstr "" -#: c/c-typeck.c:12920 c/c-typeck.c:12930 cp/semantics.c:9880 -#: cp/semantics.c:9890 +#: c/c-typeck.c:12980 c/c-typeck.c:12990 cp/semantics.c:9908 +#: cp/semantics.c:9918 #, gcc-internal-format msgid "expected % % clause modifier" msgstr "" -#: c/c-typeck.c:12965 cp/semantics.c:9925 +#: c/c-typeck.c:13025 cp/semantics.c:9953 #, gcc-internal-format msgid "%<#pragma omp cancellation point%> must specify one of %, %, % or % clauses" msgstr "" -#: c/c-typeck.c:13009 c/c-typeck.c:14596 c/c-typeck.c:14683 c/c-typeck.c:14756 +#: c/c-typeck.c:13069 c/c-typeck.c:14656 c/c-typeck.c:14743 c/c-typeck.c:14816 #, gcc-internal-format msgid "%<_Atomic%> %qE in %qs clause" msgstr "" -#: c/c-typeck.c:13021 c/c-typeck.c:14528 c/c-typeck.c:14669 -#: cp/semantics.c:4930 cp/semantics.c:7473 cp/semantics.c:7667 +#: c/c-typeck.c:13081 c/c-typeck.c:14588 c/c-typeck.c:14729 +#: cp/semantics.c:4958 cp/semantics.c:7501 cp/semantics.c:7695 #, gcc-internal-format msgid "bit-field %qE in %qs clause" msgstr "" -#: c/c-typeck.c:13030 c/c-typeck.c:14693 cp/semantics.c:4940 -#: cp/semantics.c:7686 +#: c/c-typeck.c:13090 c/c-typeck.c:14753 cp/semantics.c:4968 +#: cp/semantics.c:7714 #, gcc-internal-format msgid "%qE is a member of a union" msgstr "" -#: c/c-typeck.c:13038 c/c-typeck.c:14702 +#: c/c-typeck.c:13098 c/c-typeck.c:14762 #, fuzzy, gcc-internal-format msgid "cannot dereference %qE in %qs clause" msgstr "Не магу знайсці файл для класа %s." -#: c/c-typeck.c:13049 cp/semantics.c:4956 cp/semantics.c:7715 +#: c/c-typeck.c:13109 cp/semantics.c:4984 cp/semantics.c:7743 #, gcc-internal-format msgid "%qD is not a variable in %qs clause" msgstr "" -#: c/c-typeck.c:13053 c/c-typeck.c:14721 cp/semantics.c:4960 -#: cp/semantics.c:7719 +#: c/c-typeck.c:13113 c/c-typeck.c:14781 cp/semantics.c:4988 +#: cp/semantics.c:7747 #, gcc-internal-format msgid "%qE is not a variable in %qs clause" msgstr "" -#: c/c-typeck.c:13060 +#: c/c-typeck.c:13120 #, gcc-internal-format msgid "%<_Atomic%> %qD in %qs clause" msgstr "" -#: c/c-typeck.c:13069 c/c-typeck.c:14728 c/c-typeck.c:14846 -#: cp/semantics.c:4978 cp/semantics.c:7726 cp/semantics.c:7907 +#: c/c-typeck.c:13129 c/c-typeck.c:14788 c/c-typeck.c:14906 +#: cp/semantics.c:5006 cp/semantics.c:7754 cp/semantics.c:7935 #, gcc-internal-format msgid "%qD is threadprivate variable in %qs clause" msgstr "" -#: c/c-typeck.c:13105 cp/semantics.c:5012 +#: c/c-typeck.c:13165 cp/semantics.c:5040 #, gcc-internal-format msgid "low bound %qE of array section does not have integral type" msgstr "" -#: c/c-typeck.c:13112 cp/semantics.c:5019 +#: c/c-typeck.c:13172 cp/semantics.c:5047 #, gcc-internal-format msgid "length %qE of array section does not have integral type" msgstr "" -#: c/c-typeck.c:13135 cp/semantics.c:5052 +#: c/c-typeck.c:13195 cp/semantics.c:5080 #, gcc-internal-format msgid "expected single pointer in %qs clause" msgstr "" -#: c/c-typeck.c:13152 c/c-typeck.c:13218 c/c-typeck.c:13495 -#: cp/semantics.c:5069 cp/semantics.c:5135 +#: c/c-typeck.c:13212 c/c-typeck.c:13278 c/c-typeck.c:13555 +#: cp/semantics.c:5097 cp/semantics.c:5163 #, gcc-internal-format msgid "zero length array section in %qs clause" msgstr "" -#: c/c-typeck.c:13171 cp/semantics.c:5088 +#: c/c-typeck.c:13231 cp/semantics.c:5116 #, gcc-internal-format msgid "for unknown bound array type length expression must be specified" msgstr "" -#: c/c-typeck.c:13179 cp/semantics.c:5096 +#: c/c-typeck.c:13239 cp/semantics.c:5124 #, gcc-internal-format msgid "negative low bound in array section in %qs clause" msgstr "" -#: c/c-typeck.c:13188 c/c-typeck.c:13309 cp/semantics.c:5105 -#: cp/semantics.c:5226 +#: c/c-typeck.c:13248 c/c-typeck.c:13369 cp/semantics.c:5133 +#: cp/semantics.c:5254 #, gcc-internal-format msgid "negative length in array section in %qs clause" msgstr "" -#: c/c-typeck.c:13205 cp/semantics.c:5122 +#: c/c-typeck.c:13265 cp/semantics.c:5150 #, gcc-internal-format msgid "low bound %qE above array section size in %qs clause" msgstr "" -#: c/c-typeck.c:13246 cp/semantics.c:5163 +#: c/c-typeck.c:13306 cp/semantics.c:5191 #, gcc-internal-format msgid "length %qE above array section size in %qs clause" msgstr "" -#: c/c-typeck.c:13261 cp/semantics.c:5178 +#: c/c-typeck.c:13321 cp/semantics.c:5206 #, gcc-internal-format msgid "high bound %qE above array section size in %qs clause" msgstr "" -#: c/c-typeck.c:13297 cp/semantics.c:5214 +#: c/c-typeck.c:13357 cp/semantics.c:5242 #, gcc-internal-format msgid "for array function parameter length expression must be specified" msgstr "" -#: c/c-typeck.c:13301 cp/semantics.c:5218 +#: c/c-typeck.c:13361 cp/semantics.c:5246 #, gcc-internal-format msgid "for pointer type length expression must be specified" msgstr "" -#: c/c-typeck.c:13319 c/c-typeck.c:13434 cp/semantics.c:5236 -#: cp/semantics.c:5365 +#: c/c-typeck.c:13379 c/c-typeck.c:13494 cp/semantics.c:5264 +#: cp/semantics.c:5393 #, gcc-internal-format msgid "array section is not contiguous in %qs clause" msgstr "" -#: c/c-typeck.c:13327 cp/semantics.c:5244 +#: c/c-typeck.c:13387 cp/semantics.c:5272 #, gcc-internal-format msgid "%qE does not have pointer or array type" msgstr "" -#: c/c-typeck.c:13713 cp/semantics.c:6318 +#: c/c-typeck.c:13773 cp/semantics.c:6346 #, gcc-internal-format msgid "iterator %qD has neither integral nor pointer type" msgstr "" -#: c/c-typeck.c:13720 +#: c/c-typeck.c:13780 #, gcc-internal-format msgid "iterator %qD has %<_Atomic%> qualified type" msgstr "" -#: c/c-typeck.c:13726 cp/semantics.c:6325 +#: c/c-typeck.c:13786 cp/semantics.c:6353 #, gcc-internal-format msgid "iterator %qD has const qualified type" msgstr "" -#: c/c-typeck.c:13739 cp/semantics.c:6341 +#: c/c-typeck.c:13799 cp/semantics.c:6369 #, fuzzy, gcc-internal-format msgid "iterator step with non-integral type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-typeck.c:13759 cp/semantics.c:6377 +#: c/c-typeck.c:13819 cp/semantics.c:6405 #, gcc-internal-format msgid "iterator %qD has zero step" msgstr "" -#: c/c-typeck.c:13786 +#: c/c-typeck.c:13846 #, gcc-internal-format msgid "type of iterator %qD refers to outer iterator %qD" msgstr "" -#: c/c-typeck.c:13793 cp/semantics.c:6411 +#: c/c-typeck.c:13853 cp/semantics.c:6439 #, gcc-internal-format msgid "begin expression refers to outer iterator %qD" msgstr "" -#: c/c-typeck.c:13799 cp/semantics.c:6417 +#: c/c-typeck.c:13859 cp/semantics.c:6445 #, gcc-internal-format msgid "end expression refers to outer iterator %qD" msgstr "" -#: c/c-typeck.c:13805 cp/semantics.c:6423 +#: c/c-typeck.c:13865 cp/semantics.c:6451 #, gcc-internal-format msgid "step expression refers to outer iterator %qD" msgstr "" -#: c/c-typeck.c:13842 cp/semantics.c:6471 +#: c/c-typeck.c:13902 cp/semantics.c:6499 #, gcc-internal-format msgid "expected pointer in %qs clause" msgstr "" -#: c/c-typeck.c:13924 cp/semantics.c:6546 +#: c/c-typeck.c:13984 cp/semantics.c:6574 #, gcc-internal-format msgid "% and non-% % clauses on the same construct" msgstr "" -#: c/c-typeck.c:13946 cp/semantics.c:6566 +#: c/c-typeck.c:14006 cp/semantics.c:6594 #, gcc-internal-format msgid "% % clause with array section" msgstr "" -#: c/c-typeck.c:13972 c/c-typeck.c:13982 +#: c/c-typeck.c:14032 c/c-typeck.c:14042 #, gcc-internal-format msgid "%qD in % clause is a zero size array" msgstr "" -#: c/c-typeck.c:14002 +#: c/c-typeck.c:14062 #, gcc-internal-format msgid "%<_Atomic%> %qE in % clause" msgstr "" -#: c/c-typeck.c:14014 +#: c/c-typeck.c:14074 #, gcc-internal-format msgid "zero sized type %qT in %qs clause" msgstr "" -#: c/c-typeck.c:14022 +#: c/c-typeck.c:14082 #, gcc-internal-format msgid "variable sized type %qT in %qs clause" msgstr "" -#: c/c-typeck.c:14072 +#: c/c-typeck.c:14132 #, gcc-internal-format msgid "%qE has invalid type for %" msgstr "" -#: c/c-typeck.c:14081 cp/semantics.c:6210 +#: c/c-typeck.c:14141 cp/semantics.c:6238 #, gcc-internal-format msgid "user defined reduction not found for %qE" msgstr "" -#: c/c-typeck.c:14169 +#: c/c-typeck.c:14229 #, gcc-internal-format msgid "variable length element type in array % clause" msgstr "" -#: c/c-typeck.c:14187 c/c-typeck.c:14920 cp/semantics.c:8362 +#: c/c-typeck.c:14247 c/c-typeck.c:14980 cp/semantics.c:8390 #, gcc-internal-format msgid "% clause must not be used together with %" msgstr "" -#: c/c-typeck.c:14199 cp/semantics.c:8430 +#: c/c-typeck.c:14259 cp/semantics.c:8458 #, gcc-internal-format msgid "%qE must be % for %" msgstr "" -#: c/c-typeck.c:14213 cp/semantics.c:6607 +#: c/c-typeck.c:14273 cp/semantics.c:6635 #, gcc-internal-format msgid "modifier should not be specified in % clause on % or % constructs" msgstr "" -#: c/c-typeck.c:14221 +#: c/c-typeck.c:14281 #, gcc-internal-format msgid "linear clause applied to non-integral non-pointer variable with type %qT" msgstr "" -#: c/c-typeck.c:14229 +#: c/c-typeck.c:14289 #, gcc-internal-format msgid "%<_Atomic%> %qD in % clause" msgstr "" -#: c/c-typeck.c:14248 cp/semantics.c:6681 +#: c/c-typeck.c:14308 cp/semantics.c:6709 #, gcc-internal-format msgid "% clause step %qE is neither constant nor a parameter" msgstr "" -#: c/c-typeck.c:14278 c/c-typeck.c:14839 c/c-typeck.c:15063 -#: cp/semantics.c:6768 cp/semantics.c:7900 cp/semantics.c:8198 +#: c/c-typeck.c:14338 c/c-typeck.c:14899 c/c-typeck.c:15123 +#: cp/semantics.c:6796 cp/semantics.c:7928 cp/semantics.c:8226 #, gcc-internal-format msgid "%qE is not a variable in clause %qs" msgstr "" -#: c/c-typeck.c:14293 cp/semantics.c:6783 +#: c/c-typeck.c:14353 cp/semantics.c:6811 #, gcc-internal-format msgid "%qD appears more than once in reduction clauses" msgstr "" -#: c/c-typeck.c:14306 c/c-typeck.c:14338 c/c-typeck.c:14369 +#: c/c-typeck.c:14366 c/c-typeck.c:14398 c/c-typeck.c:14429 #, gcc-internal-format msgid "%qE appears more than once in data clauses" msgstr "" -#: c/c-typeck.c:14314 c/c-typeck.c:14345 c/c-typeck.c:14617 c/c-typeck.c:14767 -#: c/c-typeck.c:14774 c/c-typeck.c:14792 c/c-typeck.c:14802 c/c-typeck.c:14809 -#: cp/semantics.c:6796 cp/semantics.c:6804 cp/semantics.c:6861 -#: cp/semantics.c:6868 cp/semantics.c:6912 cp/semantics.c:7600 -#: cp/semantics.c:7777 cp/semantics.c:7784 cp/semantics.c:7801 -#: cp/semantics.c:7811 cp/semantics.c:7818 +#: c/c-typeck.c:14374 c/c-typeck.c:14405 c/c-typeck.c:14677 c/c-typeck.c:14827 +#: c/c-typeck.c:14834 c/c-typeck.c:14852 c/c-typeck.c:14862 c/c-typeck.c:14869 +#: cp/semantics.c:6824 cp/semantics.c:6832 cp/semantics.c:6889 +#: cp/semantics.c:6896 cp/semantics.c:6940 cp/semantics.c:7628 +#: cp/semantics.c:7805 cp/semantics.c:7812 cp/semantics.c:7829 +#: cp/semantics.c:7839 cp/semantics.c:7846 #, gcc-internal-format msgid "%qD appears more than once in data clauses" msgstr "" -#: c/c-typeck.c:14317 c/c-typeck.c:14348 c/c-typeck.c:14777 c/c-typeck.c:14812 -#: cp/semantics.c:6807 cp/semantics.c:6871 cp/semantics.c:7787 -#: cp/semantics.c:7821 +#: c/c-typeck.c:14377 c/c-typeck.c:14408 c/c-typeck.c:14837 c/c-typeck.c:14872 +#: cp/semantics.c:6835 cp/semantics.c:6899 cp/semantics.c:7815 +#: cp/semantics.c:7849 #, gcc-internal-format msgid "%qD appears both in data and map clauses" msgstr "" -#: c/c-typeck.c:14331 cp/semantics.c:6853 +#: c/c-typeck.c:14391 cp/semantics.c:6881 #, gcc-internal-format msgid "%qE is not a variable in clause %" msgstr "" -#: c/c-typeck.c:14362 cp/semantics.c:6904 +#: c/c-typeck.c:14422 cp/semantics.c:6932 #, gcc-internal-format msgid "%qE is not a variable in clause %" msgstr "" -#: c/c-typeck.c:14381 cp/semantics.c:7243 +#: c/c-typeck.c:14441 cp/semantics.c:7271 #, gcc-internal-format msgid "%qE is not a variable in % clause" msgstr "" -#: c/c-typeck.c:14388 +#: c/c-typeck.c:14448 #, gcc-internal-format msgid "%qE in % clause is neither a pointer nor an array" msgstr "" -#: c/c-typeck.c:14395 +#: c/c-typeck.c:14455 #, gcc-internal-format msgid "%<_Atomic%> %qD in % clause" msgstr "" -#: c/c-typeck.c:14402 +#: c/c-typeck.c:14462 #, gcc-internal-format msgid "%qE appears more than once in % clauses" msgstr "" -#: c/c-typeck.c:14415 cp/semantics.c:7314 +#: c/c-typeck.c:14475 cp/semantics.c:7342 #, gcc-internal-format msgid "%qE is not a variable in % clause" msgstr "" -#: c/c-typeck.c:14421 +#: c/c-typeck.c:14481 #, gcc-internal-format msgid "%qE appears more than once in % clauses" msgstr "" -#: c/c-typeck.c:14434 cp/semantics.c:7353 +#: c/c-typeck.c:14494 cp/semantics.c:7381 #, gcc-internal-format msgid "%qE is not a variable in % clause" msgstr "" -#: c/c-typeck.c:14440 +#: c/c-typeck.c:14500 #, gcc-internal-format msgid "%qE appears more than once in % clauses" msgstr "" -#: c/c-typeck.c:14509 cp/semantics.c:7439 +#: c/c-typeck.c:14569 cp/semantics.c:7467 #, gcc-internal-format msgid "% clause with % dependence type on array section" msgstr "" -#: c/c-typeck.c:14520 cp/semantics.c:7464 +#: c/c-typeck.c:14580 cp/semantics.c:7492 #, gcc-internal-format msgid "%qE is not lvalue expression nor array section in % clause" msgstr "" -#: c/c-typeck.c:14536 cp/semantics.c:7483 +#: c/c-typeck.c:14596 cp/semantics.c:7511 #, gcc-internal-format msgid "%qE does not have % type in % clause with % dependence type" msgstr "" -#: c/c-typeck.c:14545 cp/semantics.c:7494 +#: c/c-typeck.c:14605 cp/semantics.c:7522 #, gcc-internal-format msgid "%qE should not have % type in % clause with dependence type other than %" msgstr "" -#: c/c-typeck.c:14588 cp/semantics.c:7575 +#: c/c-typeck.c:14648 cp/semantics.c:7603 #, gcc-internal-format msgid "array section does not have mappable type in %qs clause" msgstr "" -#: c/c-typeck.c:14613 c/c-typeck.c:14789 cp/semantics.c:7596 -#: cp/semantics.c:7798 +#: c/c-typeck.c:14673 c/c-typeck.c:14849 cp/semantics.c:7624 +#: cp/semantics.c:7826 #, gcc-internal-format msgid "%qD appears more than once in motion clauses" msgstr "" -#: c/c-typeck.c:14621 c/c-typeck.c:14795 cp/semantics.c:7604 -#: cp/semantics.c:7804 +#: c/c-typeck.c:14681 c/c-typeck.c:14855 cp/semantics.c:7632 +#: cp/semantics.c:7832 #, gcc-internal-format msgid "%qD appears more than once in map clauses" msgstr "" -#: c/c-typeck.c:14676 cp/semantics.c:7674 +#: c/c-typeck.c:14736 cp/semantics.c:7702 #, gcc-internal-format msgid "%qE does not have a mappable type in %qs clause" msgstr "" -#: c/c-typeck.c:14747 c/c-typeck.c:14853 cp/semantics.c:7756 -#: cp/semantics.c:7914 +#: c/c-typeck.c:14807 c/c-typeck.c:14913 cp/semantics.c:7784 +#: cp/semantics.c:7942 #, gcc-internal-format msgid "%qD does not have a mappable type in %qs clause" msgstr "" -#: c/c-typeck.c:14834 cp/semantics.c:7894 +#: c/c-typeck.c:14894 cp/semantics.c:7922 #, gcc-internal-format msgid "%qE is neither a variable nor a function name in clause %qs" msgstr "" -#: c/c-typeck.c:14862 cp/semantics.c:7924 +#: c/c-typeck.c:14922 cp/semantics.c:7952 #, gcc-internal-format msgid "%qE appears more than once on the same % directive" msgstr "" -#: c/c-typeck.c:14876 cp/semantics.c:7940 +#: c/c-typeck.c:14936 cp/semantics.c:7968 #, gcc-internal-format msgid "%qD is not an argument in % clause" msgstr "" -#: c/c-typeck.c:14879 cp/semantics.c:7943 +#: c/c-typeck.c:14939 cp/semantics.c:7971 #, gcc-internal-format msgid "%qE is not an argument in % clause" msgstr "" -#: c/c-typeck.c:14896 +#: c/c-typeck.c:14956 #, gcc-internal-format msgid "%qs variable is not a pointer" msgstr "" -#: c/c-typeck.c:14903 +#: c/c-typeck.c:14963 #, gcc-internal-format msgid "%qs variable is neither a pointer nor an array" msgstr "" -#: c/c-typeck.c:14933 c/c-typeck.c:15024 cp/semantics.c:8340 +#: c/c-typeck.c:14993 c/c-typeck.c:15084 cp/semantics.c:8368 #, gcc-internal-format msgid "% clause must not be used together with %" msgstr "" -#: c/c-typeck.c:14953 cp/semantics.c:7526 +#: c/c-typeck.c:15013 cp/semantics.c:7554 #, gcc-internal-format msgid "too many %qs clauses on a task construct" msgstr "" -#: c/c-typeck.c:15046 cp/semantics.c:8166 +#: c/c-typeck.c:15106 cp/semantics.c:8194 #, gcc-internal-format msgid "% clause is incompatible with %" msgstr "" -#: c/c-typeck.c:15113 cp/semantics.c:8501 +#: c/c-typeck.c:15173 cp/semantics.c:8529 #, gcc-internal-format msgid "%qE is predetermined %qs for %qs" msgstr "" -#: c/c-typeck.c:15123 +#: c/c-typeck.c:15183 #, gcc-internal-format msgid "% qualified %qE may appear only in % or % clauses" msgstr "" -#: c/c-typeck.c:15142 cp/semantics.c:8292 +#: c/c-typeck.c:15202 cp/semantics.c:8320 #, gcc-internal-format msgid "% clause value is bigger than % clause value" msgstr "" -#: c/c-typeck.c:15154 cp/semantics.c:8305 +#: c/c-typeck.c:15214 cp/semantics.c:8333 #, gcc-internal-format msgid "% schedule modifier specified together with % clause" msgstr "" -#: c/c-typeck.c:15165 c/c-typeck.c:15173 cp/semantics.c:8314 -#: cp/semantics.c:8332 +#: c/c-typeck.c:15225 c/c-typeck.c:15233 cp/semantics.c:8342 +#: cp/semantics.c:8360 #, gcc-internal-format msgid "%qs clause specified together with % % clause" msgstr "" -#: c/c-typeck.c:15218 cp/semantics.c:8272 +#: c/c-typeck.c:15278 cp/semantics.c:8300 #, gcc-internal-format msgid "% clause step is a parameter %qD not specified in % clause" msgstr "" -#: c/c-typeck.c:15255 cp/semantics.c:8322 +#: c/c-typeck.c:15315 cp/semantics.c:8350 #, gcc-internal-format msgid "% clause must not be used together with % clause" msgstr "" -#: c/c-typeck.c:15265 cp/semantics.c:8351 +#: c/c-typeck.c:15325 cp/semantics.c:8379 #, gcc-internal-format msgid "% clause must not be used together with % clause" msgstr "" -#: c/c-typeck.c:15283 cp/semantics.c:8526 +#: c/c-typeck.c:15343 cp/semantics.c:8554 #, gcc-internal-format msgid "the event handle of a % clause should not be in a data-sharing clause" msgstr "" -#: c/c-typeck.c:15457 +#: c/c-typeck.c:15517 #, gcc-internal-format msgid "cannot use % with reverse storage order" msgstr "" -#: c/c-typeck.c:15462 +#: c/c-typeck.c:15522 #, fuzzy, gcc-internal-format msgid "second argument to % is of incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:15468 +#: c/c-typeck.c:15528 #, gcc-internal-format msgid "C++ requires promoted type, not enum type, in %" msgstr "" @@ -46230,7 +46255,7 @@ msgstr "пераўтварэньне з `%T' у `%T'" msgid " no known conversion for argument %d from %qH to %qI" msgstr "" -#: cp/call.c:3729 cp/pt.c:6885 +#: cp/call.c:3729 cp/pt.c:6906 #, gcc-internal-format, gfc-internal-format msgid " candidate expects %d argument, %d provided" msgid_plural " candidate expects %d arguments, %d provided" @@ -46339,670 +46364,674 @@ msgstr "" msgid "conversion from %qH to %qI in a converted constant expression" msgstr "" -#: cp/call.c:4641 +#: cp/call.c:4644 #, gcc-internal-format msgid "no matching function for call to %<%D(%A)%>" msgstr "" -#: cp/call.c:4644 +#: cp/call.c:4647 #, gcc-internal-format msgid "call of overloaded %<%D(%A)%> is ambiguous" msgstr "" #. It's no good looking for an overloaded operator() on a #. pointer-to-member-function. -#: cp/call.c:4869 +#: cp/call.c:4872 #, gcc-internal-format msgid "pointer-to-member function %qE cannot be called without an object; consider using %<.*%> or %<->*%>" msgstr "" -#: cp/call.c:4941 +#: cp/call.c:4944 #, gcc-internal-format msgid "no match for call to %<(%T) (%A)%>" msgstr "" -#: cp/call.c:4955 +#: cp/call.c:4958 #, fuzzy, gcc-internal-format msgid "call of %<(%T) (%A)%> is ambiguous" msgstr "памер \"%s\" - %d байт" -#: cp/call.c:5007 +#: cp/call.c:5010 #, gcc-internal-format msgid "ambiguous overload for " msgstr "" -#: cp/call.c:5008 +#: cp/call.c:5011 #, gcc-internal-format msgid "no match for " msgstr "" -#: cp/call.c:5011 +#: cp/call.c:5014 #, gcc-internal-format msgid " (operand types are %qT, %qT, and %qT)" msgstr "" -#: cp/call.c:5013 +#: cp/call.c:5016 #, gcc-internal-format msgid " (operand types are %qT and %qT)" msgstr "" -#: cp/call.c:5015 +#: cp/call.c:5018 #, gcc-internal-format msgid " (operand type is %qT)" msgstr "" -#: cp/call.c:5032 +#: cp/call.c:5035 #, fuzzy, gcc-internal-format msgid "ternary %" msgstr "Унутраная памылка: %s" -#: cp/call.c:5036 +#: cp/call.c:5039 #, gcc-internal-format msgid "ternary % in %<%E ? %E : %E%>" msgstr "" -#: cp/call.c:5045 cp/call.c:5089 cp/call.c:5099 +#: cp/call.c:5048 cp/call.c:5092 cp/call.c:5102 #, gcc-internal-format msgid "%" msgstr "" -#: cp/call.c:5048 +#: cp/call.c:5051 #, gcc-internal-format msgid "% in %<%E%s%>" msgstr "" -#: cp/call.c:5055 +#: cp/call.c:5058 #, gcc-internal-format msgid "%" msgstr "" -#: cp/call.c:5058 +#: cp/call.c:5061 #, gcc-internal-format msgid "% in %<%E[%E]%>" msgstr "" -#: cp/call.c:5066 +#: cp/call.c:5069 #, fuzzy, gcc-internal-format #| msgid "%s\n" msgid "%qs" msgstr "%s\n" -#: cp/call.c:5069 +#: cp/call.c:5072 #, gcc-internal-format msgid "%qs in %<%s %E%>" msgstr "" -#: cp/call.c:5075 +#: cp/call.c:5078 #, gcc-internal-format msgid "%" msgstr "" -#: cp/call.c:5078 +#: cp/call.c:5081 #, gcc-internal-format msgid "% in %<%s%E%>" msgstr "" -#: cp/call.c:5093 +#: cp/call.c:5096 #, gcc-internal-format msgid "% in %<%E %s %E%>" msgstr "" -#: cp/call.c:5102 +#: cp/call.c:5105 #, gcc-internal-format msgid "% in %<%s%E%>" msgstr "" -#: cp/call.c:5212 +#: cp/call.c:5215 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids omitting the middle term of a % expression" msgstr "ISO C не дазваляе пусты ізыходны файл" -#: cp/call.c:5279 +#: cp/call.c:5282 #, gcc-internal-format msgid "inferred scalar type %qT is not an integer or floating-point type of the same size as %qT" msgstr "" -#: cp/call.c:5296 cp/call.c:5303 +#: cp/call.c:5299 cp/call.c:5306 msgid "conversion of scalar %qH to vector %qI involves truncation" msgstr "" -#: cp/call.c:5359 +#: cp/call.c:5362 #, gcc-internal-format msgid "incompatible vector types in conditional expression: %qT, %qT and %qT" msgstr "" -#: cp/call.c:5439 +#: cp/call.c:5442 #, gcc-internal-format msgid "second operand to the conditional operator is of type %, but the third operand is neither a throw-expression nor of type %" msgstr "" -#: cp/call.c:5444 +#: cp/call.c:5447 #, gcc-internal-format msgid "third operand to the conditional operator is of type %, but the second operand is neither a throw-expression nor of type %" msgstr "" -#: cp/call.c:5493 cp/call.c:5608 cp/call.c:5779 +#: cp/call.c:5496 cp/call.c:5611 cp/call.c:5782 #, gcc-internal-format msgid "operands to % have different types %qT and %qT" msgstr "" -#: cp/call.c:5497 +#: cp/call.c:5500 #, gcc-internal-format msgid " and each type can be converted to the other" msgstr "" -#: cp/call.c:5684 +#: cp/call.c:5687 msgid "implicit conversion from %qH to %qI to match other result of conditional" msgstr "" -#: cp/call.c:5700 +#: cp/call.c:5703 #, gcc-internal-format msgid "enumerated mismatch in conditional expression: %qT vs %qT" msgstr "" -#: cp/call.c:5713 +#: cp/call.c:5716 #, gcc-internal-format msgid "conditional expression between enumeration type %qT and floating-point type %qT is deprecated" msgstr "" -#: cp/call.c:5718 +#: cp/call.c:5721 #, gcc-internal-format msgid "conditional expression between floating-point type %qT and enumeration type %qT is deprecated" msgstr "" -#: cp/call.c:5734 +#: cp/call.c:5737 #, gcc-internal-format msgid "enumerated and non-enumerated type in conditional expression" msgstr "" -#: cp/call.c:6415 +#: cp/call.c:6419 #, gcc-internal-format msgid "no %<%D(int)%> declared for postfix %qs, trying prefix operator instead" msgstr "" -#: cp/call.c:6417 +#: cp/call.c:6421 #, gcc-internal-format msgid "no %<%D(int)%> declared for postfix %qs" msgstr "" -#: cp/call.c:6497 +#: cp/call.c:6501 #, gcc-internal-format msgid "in C++20 this comparison calls the current function recursively with reversed arguments" msgstr "" -#: cp/call.c:6548 +#: cp/call.c:6552 #, fuzzy, gcc-internal-format #| msgid "return type of `%s' is not `int'" msgid "return type of %qD is not %qs" msgstr "вяртаемы тып \"%s\" не \"int\"" -#: cp/call.c:6550 +#: cp/call.c:6554 #, gcc-internal-format msgid "used as rewritten candidate for comparison of %qT and %qT" msgstr "" -#: cp/call.c:6621 +#: cp/call.c:6625 #, gcc-internal-format msgid "comparison between %q#T and %q#T" msgstr "" -#: cp/call.c:7005 +#: cp/call.c:7009 #, gcc-internal-format msgid "exception cleanup for this placement new selects non-placement %" msgstr "" -#: cp/call.c:7008 +#: cp/call.c:7012 #, gcc-internal-format msgid "%qD is a usual (non-placement) deallocation function in C++14 (or with %<-fsized-deallocation%>)" msgstr "" -#: cp/call.c:7047 +#: cp/call.c:7051 #, gcc-internal-format msgid "%qD is a usual (non-placement) deallocation function" msgstr "" -#: cp/call.c:7221 +#: cp/call.c:7225 #, gcc-internal-format msgid "no corresponding deallocation function for %qD" msgstr "" -#: cp/call.c:7227 +#: cp/call.c:7231 #, fuzzy, gcc-internal-format #| msgid "impossible operator '%s'" msgid "no suitable % for %qT" msgstr "немагчымы апэратар '%s'" -#: cp/call.c:7263 +#: cp/call.c:7267 #, gcc-internal-format msgid "%q#D is private within this context" msgstr "" -#: cp/call.c:7264 cp/decl.c:8260 +#: cp/call.c:7268 cp/decl.c:8266 #, fuzzy, gcc-internal-format msgid "declared private here" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/call.c:7269 +#: cp/call.c:7273 #, fuzzy, gcc-internal-format msgid "%q#D is protected within this context" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/call.c:7270 cp/decl.c:8261 +#: cp/call.c:7274 cp/decl.c:8267 #, fuzzy, gcc-internal-format #| msgid "called from here" msgid "declared protected here" msgstr "выклікана адсюль" -#: cp/call.c:7277 +#: cp/call.c:7281 #, gcc-internal-format msgid "%q#D is inaccessible within this context" msgstr "" -#: cp/call.c:7358 +#: cp/call.c:7362 #, gcc-internal-format msgid "passing NULL to non-pointer argument %P of %qD" msgstr "" -#: cp/call.c:7361 cp/call.c:7380 cp/decl.c:9950 cp/typeck.c:4188 +#: cp/call.c:7365 cp/call.c:7384 cp/decl.c:9962 cp/typeck.c:4199 #, fuzzy, gcc-internal-format #| msgid " from here" msgid " declared here" msgstr " адсюль" -#: cp/call.c:7365 +#: cp/call.c:7369 #, gcc-internal-format msgid "converting to non-pointer type %qT from NULL" msgstr "" -#: cp/call.c:7377 +#: cp/call.c:7381 #, gcc-internal-format msgid "converting % to pointer type for argument %P of %qD" msgstr "" -#: cp/call.c:7384 +#: cp/call.c:7388 #, gcc-internal-format msgid "converting % to pointer type %qT" msgstr "" -#: cp/call.c:7451 +#: cp/call.c:7455 #, gcc-internal-format msgid " initializing argument %P of %qD" msgstr "" -#: cp/call.c:7471 +#: cp/call.c:7475 #, gcc-internal-format msgid "conversions to arrays of unknown bound are only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/call.c:7521 +#: cp/call.c:7525 #, fuzzy, gcc-internal-format msgid "too many braces around initializer for %qT" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/call.c:7532 +#: cp/call.c:7536 msgid "converting to %qH from %qI requires direct-initialization" msgstr "" -#: cp/call.c:7541 +#: cp/call.c:7545 msgid "invalid user-defined conversion from %qH to %qI" msgstr "" -#: cp/call.c:7578 cp/cvt.c:227 +#: cp/call.c:7582 cp/cvt.c:227 #, fuzzy #| msgid "converting from `%T' to `%T'" msgid "invalid conversion from %qH to %qI" msgstr "пераўтварэньне з `%T' у `%T'" -#: cp/call.c:7620 cp/call.c:7627 +#: cp/call.c:7624 cp/call.c:7631 #, gcc-internal-format msgid "converting to %qT from initializer list would use explicit constructor %qD" msgstr "" -#: cp/call.c:7623 +#: cp/call.c:7627 #, gcc-internal-format msgid "in C++11 and above a default constructor can be explicit" msgstr "" -#: cp/call.c:7893 +#: cp/call.c:7897 msgid "cannot bind rvalue reference of type %qH to lvalue of type %qI" msgstr "" -#: cp/call.c:7897 +#: cp/call.c:7906 +msgid "cannot bind non-const lvalue reference of type %qH to a value of type %qI" +msgstr "" + +#: cp/call.c:7911 msgid "cannot bind non-const lvalue reference of type %qH to an rvalue of type %qI" msgstr "" -#: cp/call.c:7908 +#: cp/call.c:7923 msgid "cannot bind reference of type %qH to %qI due to different array bounds" msgstr "" -#: cp/call.c:7911 +#: cp/call.c:7926 msgid "binding reference of type %qH to %qI discards qualifiers" msgstr "" -#: cp/call.c:7950 +#: cp/call.c:7965 #, fuzzy, gcc-internal-format msgid "cannot bind bit-field %qE to %qT" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/call.c:7953 cp/call.c:7971 +#: cp/call.c:7968 cp/call.c:7986 #, gcc-internal-format msgid "cannot bind packed field %qE to %qT" msgstr "" -#: cp/call.c:7956 +#: cp/call.c:7971 #, fuzzy, gcc-internal-format msgid "cannot bind rvalue %qE to %qT" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/call.c:8151 +#: cp/call.c:8166 msgid "implicit conversion from %qH to %qI when passing argument to function" msgstr "" -#: cp/call.c:8175 cp/cvt.c:1978 +#: cp/call.c:8190 cp/cvt.c:1978 #, gcc-internal-format msgid "scoped enum %qT passed through %<...%> as %qT before %<-fabi-version=6%>, %qT after" msgstr "" -#: cp/call.c:8219 +#: cp/call.c:8234 #, gcc-internal-format msgid "passing objects of non-trivially-copyable type %q#T through %<...%> is conditionally supported" msgstr "" -#: cp/call.c:8255 +#: cp/call.c:8270 #, gcc-internal-format msgid "cannot receive reference type %qT through %<...%>" msgstr "" -#: cp/call.c:8265 +#: cp/call.c:8280 #, gcc-internal-format msgid "receiving objects of non-trivially-copyable type %q#T through %<...%> is conditionally-supported" msgstr "" -#: cp/call.c:8333 +#: cp/call.c:8348 #, fuzzy, gcc-internal-format msgid "recursive evaluation of default argument for %q#D" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: cp/call.c:8342 +#: cp/call.c:8357 #, gcc-internal-format msgid "call to %qD uses the default argument for parameter %P, which is not yet defined" msgstr "" -#: cp/call.c:8442 +#: cp/call.c:8457 #, gcc-internal-format msgid "argument of function call might be a candidate for a format attribute" msgstr "" -#: cp/call.c:8504 +#: cp/call.c:8519 #, gcc-internal-format msgid "use of multiversioned function without a default" msgstr "" -#: cp/call.c:9083 +#: cp/call.c:9103 #, gcc-internal-format msgid "passing %qT as % argument discards qualifiers" msgstr "" -#: cp/call.c:9086 cp/call.c:11715 +#: cp/call.c:9106 cp/call.c:11736 #, gcc-internal-format msgid " in call to %qD" msgstr "" -#: cp/call.c:9111 +#: cp/call.c:9131 #, gcc-internal-format msgid "%qT is not an accessible base of %qT" msgstr "" -#: cp/call.c:9293 +#: cp/call.c:9313 #, gcc-internal-format msgid "passing arguments to ellipsis of inherited constructor %qD" msgstr "" -#: cp/call.c:9425 +#: cp/call.c:9445 #, gcc-internal-format msgid "assignment from temporary % does not extend the lifetime of the underlying array" msgstr "" -#: cp/call.c:9825 +#: cp/call.c:9845 #, gcc-internal-format msgid "%qD writing to an object of type %#qT with no trivial copy-assignment" msgstr "" -#: cp/call.c:9828 +#: cp/call.c:9848 #, gcc-internal-format msgid "%qD writing to an object of non-trivial type %#qT%s" msgstr "" -#: cp/call.c:9833 +#: cp/call.c:9853 #, gcc-internal-format msgid "%qD writing to an object of type %#qT with %qs member %qD" msgstr "" -#: cp/call.c:9838 +#: cp/call.c:9858 #, gcc-internal-format msgid "%qD writing to an object of type %#qT containing a pointer to data member%s" msgstr "" -#: cp/call.c:9853 +#: cp/call.c:9873 #, gcc-internal-format msgid "; use assignment or value-initialization instead" msgstr "" -#: cp/call.c:9855 +#: cp/call.c:9875 #, gcc-internal-format msgid "; use assignment instead" msgstr "" -#: cp/call.c:9857 +#: cp/call.c:9877 #, gcc-internal-format msgid "; use value-initialization instead" msgstr "" -#: cp/call.c:9860 +#: cp/call.c:9880 #, gcc-internal-format msgid "%qD clearing an object of type %#qT with no trivial copy-assignment%s" msgstr "" -#: cp/call.c:9863 +#: cp/call.c:9883 #, gcc-internal-format msgid "%qD clearing an object of non-trivial type %#qT%s" msgstr "" -#: cp/call.c:9865 +#: cp/call.c:9885 #, gcc-internal-format msgid "%qD clearing an object of type %#qT containing a pointer-to-member%s" msgstr "" -#: cp/call.c:9886 +#: cp/call.c:9906 #, gcc-internal-format msgid "; use copy-assignment or copy-initialization instead" msgstr "" -#: cp/call.c:9888 +#: cp/call.c:9908 #, gcc-internal-format msgid "; use copy-assignment instead" msgstr "" -#: cp/call.c:9890 +#: cp/call.c:9910 #, gcc-internal-format msgid "; use copy-initialization instead" msgstr "" -#: cp/call.c:9893 +#: cp/call.c:9913 #, gcc-internal-format msgid "%qD writing to an object of type %#qT with no trivial copy-assignment%s" msgstr "" -#: cp/call.c:9896 +#: cp/call.c:9916 #, gcc-internal-format msgid "%qD writing to an object of non-trivially copyable type %#qT%s" msgstr "" -#: cp/call.c:9899 +#: cp/call.c:9919 #, gcc-internal-format msgid "%qD writing to an object with a deleted copy constructor" msgstr "" -#: cp/call.c:9910 +#: cp/call.c:9930 #, gcc-internal-format msgid "%qD copying an object of non-trivial type %#qT from an array of %#qT" msgstr "" -#: cp/call.c:9922 +#: cp/call.c:9942 #, gcc-internal-format msgid "%qD copying an object of type %#qT with %qs member %qD from an array of %#qT; use assignment or copy-initialization instead" msgstr "" -#: cp/call.c:9939 +#: cp/call.c:9959 #, gcc-internal-format msgid "%qD writing to an object of a non-trivial type %#qT leaves %wu bytes unchanged" msgstr "" -#: cp/call.c:9942 +#: cp/call.c:9962 #, gcc-internal-format msgid "%qD writing to an object of a non-trivial type %#qT leaves %wu byte unchanged" msgstr "" -#: cp/call.c:9952 +#: cp/call.c:9972 #, gcc-internal-format msgid "%qD moving an object of non-trivially copyable type %#qT; use % and % instead" msgstr "" -#: cp/call.c:9955 +#: cp/call.c:9975 #, gcc-internal-format msgid "%qD moving an object of type %#qT with deleted copy constructor; use % and % instead" msgstr "" -#: cp/call.c:9958 +#: cp/call.c:9978 #, gcc-internal-format msgid "%qD moving an object of type %#qT with deleted destructor" msgstr "" -#: cp/call.c:9967 +#: cp/call.c:9987 #, gcc-internal-format msgid "%qD moving an object of non-trivial type %#qT and size %E into a region of size %E" msgstr "" -#: cp/call.c:9989 +#: cp/call.c:10009 #, gcc-internal-format msgid "%#qT declared here" msgstr "" -#: cp/call.c:10089 +#: cp/call.c:10109 #, gcc-internal-format msgid "constructor delegates to itself" msgstr "" -#: cp/call.c:10363 cp/typeck.c:9482 +#: cp/call.c:10383 cp/typeck.c:9489 msgid "cannot convert %qH to %qI" msgstr "" -#: cp/call.c:10385 +#: cp/call.c:10405 #, gcc-internal-format msgid "no matching function for call to %<%T::operator %T(%A)%#V%>" msgstr "" -#: cp/call.c:10417 +#: cp/call.c:10437 #, gcc-internal-format msgid "no matching function for call to %<%T::%s%E(%A)%#V%>" msgstr "" -#: cp/call.c:10464 +#: cp/call.c:10484 #, gcc-internal-format msgid "call to non-function %qD" msgstr "" -#: cp/call.c:10502 cp/pt.c:16264 cp/typeck.c:3162 +#: cp/call.c:10522 cp/pt.c:16347 cp/typeck.c:3173 #, gcc-internal-format msgid "cannot call constructor %<%T::%D%> directly" msgstr "" -#: cp/call.c:10504 +#: cp/call.c:10524 #, gcc-internal-format msgid "for a function-style cast, remove the redundant %<::%D%>" msgstr "" -#: cp/call.c:10696 +#: cp/call.c:10716 #, gcc-internal-format msgid "no matching function for call to %<%s(%A)%>" msgstr "" -#: cp/call.c:10699 +#: cp/call.c:10719 #, gcc-internal-format msgid "call of overloaded %<%s(%A)%> is ambiguous" msgstr "" -#: cp/call.c:10722 +#: cp/call.c:10742 #, gcc-internal-format msgid "pure virtual %q#D called from non-static data member initializer" msgstr "" -#: cp/call.c:10727 +#: cp/call.c:10747 #, gcc-internal-format msgid "pure virtual %q#D called from constructor" msgstr "" -#: cp/call.c:10728 +#: cp/call.c:10748 #, gcc-internal-format msgid "pure virtual %q#D called from destructor" msgstr "" -#: cp/call.c:10751 +#: cp/call.c:10771 #, gcc-internal-format msgid "cannot call member function %qD without object" msgstr "" -#: cp/call.c:11713 +#: cp/call.c:11734 #, gcc-internal-format msgid "passing %qT chooses %qT over %qT" msgstr "" -#: cp/call.c:11782 +#: cp/call.c:11803 #, gcc-internal-format msgid "choosing %qD over %qD" msgstr "" -#: cp/call.c:11783 +#: cp/call.c:11804 #, fuzzy #| msgid "converting from `%T' to `%T'" msgid " for conversion from %qH to %qI" msgstr "пераўтварэньне з `%T' у `%T'" -#: cp/call.c:11786 +#: cp/call.c:11807 #, gcc-internal-format msgid " because conversion sequence for the argument is better" msgstr "" -#: cp/call.c:12036 +#: cp/call.c:12057 #, gcc-internal-format msgid "default argument mismatch in overload resolution" msgstr "" -#: cp/call.c:12040 +#: cp/call.c:12061 #, gcc-internal-format msgid " candidate 1: %q#F" msgstr "" -#: cp/call.c:12042 +#: cp/call.c:12063 #, gcc-internal-format msgid " candidate 2: %q#F" msgstr "" -#: cp/call.c:12088 +#: cp/call.c:12109 #, gcc-internal-format msgid "ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:" msgstr "" -#: cp/call.c:12475 +#: cp/call.c:12496 #, gcc-internal-format msgid "a temporary bound to %qD only persists until the constructor exits" msgstr "" -#: cp/call.c:12630 +#: cp/call.c:12651 msgid "invalid initialization of non-const reference of type %qH from an rvalue of type %qI" msgstr "" -#: cp/call.c:12634 +#: cp/call.c:12655 msgid "invalid initialization of reference of type %qH from expression of type %qI" msgstr "" @@ -47026,1137 +47055,1137 @@ msgstr "" msgid "cannot convert from base class %qT to derived class %qT via virtual base %qT" msgstr "" -#: cp/class.c:371 +#: cp/class.c:378 #, gcc-internal-format msgid "cannot convert from %qT to base class %qT because %qT is incomplete" msgstr "" -#: cp/class.c:1184 +#: cp/class.c:1191 #, fuzzy, gcc-internal-format msgid "%q#D conflicts with version inherited from %qT" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: cp/class.c:1187 +#: cp/class.c:1194 #, gcc-internal-format msgid "version inherited from %qT declared here" msgstr "" -#: cp/class.c:1205 +#: cp/class.c:1212 #, gcc-internal-format msgid "%q#D cannot be overloaded with %q#D" msgstr "" -#: cp/class.c:1207 cp/decl.c:1744 cp/decl.c:1756 cp/decl.c:1781 cp/decl.c:1804 -#: cp/name-lookup.c:2735 cp/name-lookup.c:3061 +#: cp/class.c:1214 cp/decl.c:1744 cp/decl.c:1756 cp/decl.c:1781 cp/decl.c:1804 +#: cp/name-lookup.c:2736 cp/name-lookup.c:3062 #, fuzzy, gcc-internal-format #| msgid "previous declaration `%D'" msgid "previous declaration %q#D" msgstr "папярэдняе абвяшчэньне `%D'" -#: cp/class.c:1249 +#: cp/class.c:1256 #, gcc-internal-format msgid "conflicting access specifications for method %q+D, ignored" msgstr "" -#: cp/class.c:1252 +#: cp/class.c:1259 #, gcc-internal-format msgid "conflicting access specifications for field %qE, ignored" msgstr "" -#: cp/class.c:1321 +#: cp/class.c:1328 #, gcc-internal-format msgid "%qD invalid in %q#T because of local method %q#D with same name" msgstr "" -#: cp/class.c:1325 +#: cp/class.c:1332 #, gcc-internal-format msgid "local method %q#D declared here" msgstr "" -#: cp/class.c:1331 +#: cp/class.c:1338 #, gcc-internal-format msgid "%qD invalid in %q#T because of local member %q#D with same name" msgstr "" -#: cp/class.c:1335 +#: cp/class.c:1342 #, fuzzy, gcc-internal-format msgid "local member %q#D declared here" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/class.c:1410 +#: cp/class.c:1417 #, gcc-internal-format msgid "%qD inherits the %E ABI tag that %qT (used in its return type) has" msgstr "" -#: cp/class.c:1413 cp/class.c:1420 cp/class.c:1427 cp/class.c:1439 +#: cp/class.c:1420 cp/class.c:1427 cp/class.c:1434 cp/class.c:1446 #: cp/cvt.c:1100 #, gcc-internal-format msgid "%qT declared here" msgstr "" -#: cp/class.c:1418 +#: cp/class.c:1425 #, gcc-internal-format msgid "%qD inherits the %E ABI tag that %qT (used in its type) has" msgstr "" -#: cp/class.c:1425 +#: cp/class.c:1432 #, gcc-internal-format msgid "%qT does not have the %E ABI tag that base %qT has" msgstr "" -#: cp/class.c:1433 +#: cp/class.c:1440 #, gcc-internal-format msgid "%qT does not have the %E ABI tag that %qT (used in the type of %qD) has" msgstr "" -#: cp/class.c:1744 +#: cp/class.c:1751 #, gcc-internal-format msgid "cannot derive from % base %qT in derived type %qT" msgstr "" -#: cp/class.c:2218 +#: cp/class.c:2225 #, gcc-internal-format msgid "all member functions in class %qT are private" msgstr "" -#: cp/class.c:2230 +#: cp/class.c:2237 #, gcc-internal-format msgid "%q#T only defines a private destructor and has no friends" msgstr "" -#: cp/class.c:2271 +#: cp/class.c:2278 #, gcc-internal-format msgid "%q#T only defines private constructors and has no friends" msgstr "" -#: cp/class.c:2275 +#: cp/class.c:2282 #, gcc-internal-format msgid "%q#D is public, but requires an existing %q#T object" msgstr "" -#: cp/class.c:2567 +#: cp/class.c:2574 #, gcc-internal-format msgid "no unique final overrider for %qD in %qT" msgstr "" -#: cp/class.c:2929 +#: cp/class.c:2936 #, gcc-internal-format msgid "%qD can be marked override" msgstr "" -#: cp/class.c:2932 +#: cp/class.c:2939 #, gcc-internal-format msgid "%q+#D marked %, but does not override" msgstr "" -#: cp/class.c:2947 +#: cp/class.c:2954 #, gcc-internal-format msgid "%q+#D marked %, but is not virtual" msgstr "" -#: cp/class.c:3010 +#: cp/class.c:3017 #, gcc-internal-format msgid "%qD was hidden" msgstr "" -#: cp/class.c:3011 +#: cp/class.c:3018 #, gcc-internal-format msgid " by %qD" msgstr "" -#: cp/class.c:3046 +#: cp/class.c:3053 #, gcc-internal-format msgid "%q#D invalid; an anonymous union may only have public non-static data members" msgstr "" -#: cp/class.c:3056 cp/parser.c:21822 +#: cp/class.c:3063 cp/parser.c:21859 #, gcc-internal-format msgid "this flexibility is deprecated and will be removed" msgstr "" -#: cp/class.c:3252 +#: cp/class.c:3259 #, gcc-internal-format msgid "the ellipsis in %qD is not inherited" msgstr "" -#: cp/class.c:3444 +#: cp/class.c:3451 #, fuzzy, gcc-internal-format msgid "bit-field %q#D with non-integral type %qT" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: cp/class.c:3460 +#: cp/class.c:3467 #, fuzzy, gcc-internal-format msgid "bit-field %q+D width not an integer constant" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: cp/class.c:3465 +#: cp/class.c:3472 #, gcc-internal-format msgid "negative width in bit-field %q+D" msgstr "" -#: cp/class.c:3470 +#: cp/class.c:3477 #, gcc-internal-format msgid "zero width for bit-field %q+D" msgstr "" -#: cp/class.c:3480 +#: cp/class.c:3487 #, gcc-internal-format msgid "width of %qD exceeds its type" msgstr "" -#: cp/class.c:3486 +#: cp/class.c:3493 #, gcc-internal-format msgid "%qD is too small to hold all values of %q#T" msgstr "" -#: cp/class.c:3547 +#: cp/class.c:3554 #, gcc-internal-format msgid "member %q+#D with constructor not allowed in union" msgstr "" -#: cp/class.c:3550 +#: cp/class.c:3557 #, gcc-internal-format msgid "member %q+#D with destructor not allowed in union" msgstr "" -#: cp/class.c:3552 +#: cp/class.c:3559 #, gcc-internal-format msgid "member %q+#D with copy assignment operator not allowed in union" msgstr "" -#: cp/class.c:3556 +#: cp/class.c:3563 #, gcc-internal-format msgid "unrestricted unions only available with %<-std=c++11%> or %<-std=gnu++11%>" msgstr "" -#: cp/class.c:3672 +#: cp/class.c:3679 #, gcc-internal-format msgid "in C++98 %q+D may not be static because it is a member of a union" msgstr "" -#: cp/class.c:3685 +#: cp/class.c:3692 #, gcc-internal-format msgid "non-static data member %q+D in a union may not have reference type %qT" msgstr "" -#: cp/class.c:3698 +#: cp/class.c:3705 #, fuzzy, gcc-internal-format msgid "data member %q+D invalidly declared function type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/class.c:3704 +#: cp/class.c:3711 #, fuzzy, gcc-internal-format msgid "data member %q+D invalidly declared method type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/class.c:3775 +#: cp/class.c:3782 #, gcc-internal-format msgid "ignoring packed attribute because of unpacked non-POD field %q#D" msgstr "" -#: cp/class.c:3827 +#: cp/class.c:3834 #, gcc-internal-format msgid "member %q+D cannot be declared as a % reference" msgstr "" -#: cp/class.c:3830 +#: cp/class.c:3837 #, gcc-internal-format msgid "member %q+D cannot be declared both % and %" msgstr "" -#: cp/class.c:3861 +#: cp/class.c:3868 #, gcc-internal-format msgid "multiple fields in union %qT initialized" msgstr "" -#: cp/class.c:3863 +#: cp/class.c:3870 #, gcc-internal-format msgid "initialized member %q+D declared here" msgstr "" -#: cp/class.c:3906 +#: cp/class.c:3913 #, gcc-internal-format msgid "field %q#D with same name as class" msgstr "" -#: cp/class.c:3934 +#: cp/class.c:3941 #, gcc-internal-format msgid "%q#T has pointer data members" msgstr "" -#: cp/class.c:3939 +#: cp/class.c:3946 #, gcc-internal-format msgid " but does not declare %<%T(const %T&)%>" msgstr "" -#: cp/class.c:3941 +#: cp/class.c:3948 #, gcc-internal-format msgid " or %" msgstr "" -#: cp/class.c:3945 +#: cp/class.c:3952 #, gcc-internal-format msgid " but does not declare %" msgstr "" -#: cp/class.c:3947 +#: cp/class.c:3954 #, fuzzy, gcc-internal-format msgid "pointer member %q+D declared here" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/class.c:4404 +#: cp/class.c:4411 #, gcc-internal-format msgid "alignment of %qD increased in %<-fabi-version=9%> (GCC 5.2)" msgstr "" -#: cp/class.c:4407 +#: cp/class.c:4414 #, gcc-internal-format msgid "alignment of %qD will increase in %<-fabi-version=9%>" msgstr "" -#: cp/class.c:4735 +#: cp/class.c:4742 #, fuzzy, gcc-internal-format msgid "initializer specified for non-virtual method %q+D" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/class.c:4768 +#: cp/class.c:4775 #, fuzzy, gcc-internal-format msgid "destructor for %qT is ambiguous" msgstr "памер \"%s\" - %d байт" -#: cp/class.c:5224 +#: cp/class.c:5231 #, gcc-internal-format msgid "method overrides both % and %qE methods" msgstr "" -#: cp/class.c:5245 +#: cp/class.c:5252 #, gcc-internal-format msgid "method declared %qE overriding %qE method" msgstr "" -#: cp/class.c:5901 cp/constexpr.c:245 +#: cp/class.c:5908 cp/constexpr.c:246 #, gcc-internal-format msgid "enclosing class of % non-static member function %q+#D is not a literal type" msgstr "" -#: cp/class.c:5927 +#: cp/class.c:5934 #, gcc-internal-format msgid "%q+T is not literal because:" msgstr "" -#: cp/class.c:5930 +#: cp/class.c:5937 #, gcc-internal-format msgid " %qT is a closure type, which is only literal in C++17 and later" msgstr "" -#: cp/class.c:5933 +#: cp/class.c:5940 #, gcc-internal-format msgid " %q+T has a non-trivial destructor" msgstr "" -#: cp/class.c:5936 +#: cp/class.c:5943 #, gcc-internal-format msgid " %q+T does not have % destructor" msgstr "" -#: cp/class.c:5944 +#: cp/class.c:5951 #, gcc-internal-format msgid " %q+T is not an aggregate, does not have a trivial default constructor, and has no % constructor that is not a copy or move constructor" msgstr "" -#: cp/class.c:5977 +#: cp/class.c:5984 #, gcc-internal-format msgid " base class %qT of %q+T is non-literal" msgstr "" -#: cp/class.c:5992 +#: cp/class.c:5999 #, gcc-internal-format msgid " non-static data member %qD has non-literal type" msgstr "" -#: cp/class.c:5999 +#: cp/class.c:6006 #, gcc-internal-format msgid " non-static data member %qD has volatile type" msgstr "" -#: cp/class.c:6120 +#: cp/class.c:6127 #, gcc-internal-format msgid "base class %q#T has accessible non-virtual destructor" msgstr "" -#: cp/class.c:6149 +#: cp/class.c:6156 #, gcc-internal-format msgid "non-static reference %q#D in class without a constructor" msgstr "" -#: cp/class.c:6155 +#: cp/class.c:6162 #, gcc-internal-format msgid "non-static const member %q#D in class without a constructor" msgstr "" -#: cp/class.c:6474 +#: cp/class.c:6481 #, gcc-internal-format msgid "direct base %qT inaccessible in %qT due to ambiguity" msgstr "" -#: cp/class.c:6486 +#: cp/class.c:6493 #, gcc-internal-format msgid "virtual base %qT inaccessible in %qT due to ambiguity" msgstr "" -#: cp/class.c:6736 +#: cp/class.c:6743 #, gcc-internal-format msgid "offset of %qD is not ABI-compliant and may change in a future version of GCC" msgstr "" -#: cp/class.c:6915 +#: cp/class.c:6922 #, fuzzy, gcc-internal-format #| msgid "size of `%s' is larger than %d bytes" msgid "size of type %qT is too large (%qE bytes)" msgstr "памер \"%s\" больш чам %d байт" -#: cp/class.c:7201 +#: cp/class.c:7208 #, gcc-internal-format msgid "invalid use of %q#T with a zero-size array in %q#D" msgstr "" -#: cp/class.c:7203 +#: cp/class.c:7210 #, gcc-internal-format msgid "invalid use of %q#T with a flexible array member in %q#T" msgstr "" -#: cp/class.c:7208 +#: cp/class.c:7215 #, fuzzy, gcc-internal-format msgid "array member %q#D declared here" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/class.c:7236 +#: cp/class.c:7243 #, gcc-internal-format msgid "zero-size array member %qD not at end of %q#T" msgstr "" -#: cp/class.c:7238 +#: cp/class.c:7245 #, gcc-internal-format msgid "zero-size array member %qD in an otherwise empty %q#T" msgstr "" -#: cp/class.c:7247 cp/class.c:7278 +#: cp/class.c:7254 cp/class.c:7285 #, fuzzy, gcc-internal-format #| msgid "previous definition of `%#T'" msgid "in the definition of %q#T" msgstr "папярэдняе вызначэньне `%#T'" -#: cp/class.c:7255 +#: cp/class.c:7262 #, gcc-internal-format msgid "flexible array member %qD not at end of %q#T" msgstr "" -#: cp/class.c:7257 +#: cp/class.c:7264 #, gcc-internal-format msgid "flexible array member %qD in an otherwise empty %q#T" msgstr "" -#: cp/class.c:7276 +#: cp/class.c:7283 #, gcc-internal-format msgid "next member %q#D declared here" msgstr "" -#: cp/class.c:7390 cp/parser.c:25610 +#: cp/class.c:7397 cp/parser.c:25645 #, fuzzy, gcc-internal-format #| msgid "previous definition of `%#T'" msgid "redefinition of %q#T" msgstr "папярэдняе вызначэньне `%#T'" -#: cp/class.c:7527 +#: cp/class.c:7534 #, gcc-internal-format msgid "%q#T has virtual functions and accessible non-virtual destructor" msgstr "" -#: cp/class.c:7555 +#: cp/class.c:7562 #, gcc-internal-format msgid "type transparent %q#T does not have any fields" msgstr "" -#: cp/class.c:7561 +#: cp/class.c:7568 #, gcc-internal-format msgid "type transparent class %qT has base classes" msgstr "" -#: cp/class.c:7565 +#: cp/class.c:7572 #, gcc-internal-format msgid "type transparent class %qT has virtual functions" msgstr "" -#: cp/class.c:7571 +#: cp/class.c:7578 #, gcc-internal-format msgid "type transparent %q#T cannot be made transparent because the type of the first field has a different ABI from the class overall" msgstr "" -#: cp/class.c:7728 +#: cp/class.c:7735 #, gcc-internal-format msgid "definition of %qD does not match %<#include %>" msgstr "" -#: cp/class.c:7739 +#: cp/class.c:7746 #, gcc-internal-format msgid "trying to finish struct, but kicked out due to previous parse errors" msgstr "" -#: cp/class.c:8246 +#: cp/class.c:8253 #, fuzzy, gcc-internal-format #| msgid "language %s not recognized" msgid "language string %<\"%E\"%> not recognized" msgstr "мова %s не распазнана" -#: cp/class.c:8336 +#: cp/class.c:8343 #, gcc-internal-format msgid "cannot resolve overloaded function %qD based on conversion to type %qT" msgstr "" -#: cp/class.c:8494 +#: cp/class.c:8501 #, gcc-internal-format msgid "no matches converting function %qD to type %q#T" msgstr "" -#: cp/class.c:8521 +#: cp/class.c:8528 #, gcc-internal-format msgid "converting overloaded function %qD to type %q#T is ambiguous" msgstr "" -#: cp/class.c:8548 +#: cp/class.c:8555 #, fuzzy, gcc-internal-format msgid "assuming pointer to member %qD" msgstr "прапушчан ініцыялізатар" -#: cp/class.c:8551 +#: cp/class.c:8558 #, gcc-internal-format msgid "(a pointer to member can only be formed with %<&%E%>)" msgstr "" -#: cp/class.c:8627 cp/class.c:8669 +#: cp/class.c:8634 cp/class.c:8676 #, gcc-internal-format msgid "not enough type information" msgstr "" -#: cp/class.c:8647 +#: cp/class.c:8654 #, gcc-internal-format msgid "cannot convert %qE from type %qT to type %qT" msgstr "" -#: cp/class.c:8921 +#: cp/class.c:8928 #, gcc-internal-format msgid "declaration of %q#D changes meaning of %qD" msgstr "" -#: cp/class.c:8924 +#: cp/class.c:8931 #, gcc-internal-format msgid "%qD declared here as %q#D" msgstr "" -#: cp/constexpr.c:106 +#: cp/constexpr.c:107 #, gcc-internal-format msgid "the type %qT of % variable %qD is not literal" msgstr "" -#: cp/constexpr.c:117 +#: cp/constexpr.c:118 #, gcc-internal-format msgid "variable %qD of non-literal type %qT in % function" msgstr "" -#: cp/constexpr.c:129 +#: cp/constexpr.c:130 #, gcc-internal-format msgid "% variable %qD has variably-modified type %qT" msgstr "" -#: cp/constexpr.c:193 +#: cp/constexpr.c:194 #, gcc-internal-format msgid "inherited constructor %qD is not %" msgstr "" -#: cp/constexpr.c:206 +#: cp/constexpr.c:207 #, gcc-internal-format msgid "invalid type for parameter %d of % function %q+#D" msgstr "" -#: cp/constexpr.c:218 +#: cp/constexpr.c:219 #, gcc-internal-format msgid "lambdas are implicitly % only in C++17 and later" msgstr "" -#: cp/constexpr.c:229 +#: cp/constexpr.c:230 #, fuzzy, gcc-internal-format msgid "invalid return type %qT of % function %q+D" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/constexpr.c:256 +#: cp/constexpr.c:257 #, gcc-internal-format msgid "%q#T has virtual base classes" msgstr "" -#: cp/constexpr.c:517 +#: cp/constexpr.c:518 #, gcc-internal-format msgid "% constructor does not have empty body" msgstr "" -#: cp/constexpr.c:780 +#: cp/constexpr.c:781 #, gcc-internal-format msgid "% constructor for union %qT must initialize exactly one non-static data member" msgstr "" -#: cp/constexpr.c:841 +#: cp/constexpr.c:842 #, gcc-internal-format msgid "member %qD must be initialized by mem-initializer in % constructor" msgstr "" -#: cp/constexpr.c:883 +#: cp/constexpr.c:884 #, gcc-internal-format msgid "body of % function %qD not a return-statement" msgstr "" -#: cp/constexpr.c:972 +#: cp/constexpr.c:973 #, gcc-internal-format msgid "%qD is not usable as a % function because:" msgstr "" -#: cp/constexpr.c:1445 cp/constexpr.c:2747 +#: cp/constexpr.c:1446 cp/constexpr.c:2783 #, gcc-internal-format msgid "% call flows off the end of the function" msgstr "" -#: cp/constexpr.c:1450 cp/constexpr.c:1460 cp/constexpr.c:2942 +#: cp/constexpr.c:1451 cp/constexpr.c:1461 cp/constexpr.c:2997 #, fuzzy, gcc-internal-format msgid "%q+E is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:1735 cp/constexpr.c:7953 +#: cp/constexpr.c:1771 cp/constexpr.c:8016 #, fuzzy, gcc-internal-format #| msgid "can't initialize friend function `%s'" msgid "call to internal function %qE" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/constexpr.c:1790 +#: cp/constexpr.c:1826 #, fuzzy, gcc-internal-format msgid "modifying a const object %qE is not allowed in a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:1792 +#: cp/constexpr.c:1828 #, gcc-internal-format msgid "originally declared % here" msgstr "" -#: cp/constexpr.c:2010 cp/constexpr.c:2065 cp/constexpr.c:2097 -#: cp/constexpr.c:2118 +#: cp/constexpr.c:2046 cp/constexpr.c:2101 cp/constexpr.c:2133 +#: cp/constexpr.c:2154 #, gcc-internal-format msgid "reference % failed" msgstr "" -#: cp/constexpr.c:2011 +#: cp/constexpr.c:2047 #, gcc-internal-format msgid "dynamic type %qT of its operand does not have a base class of type %qT" msgstr "" -#: cp/constexpr.c:2035 +#: cp/constexpr.c:2071 #, fuzzy, gcc-internal-format #| msgid "parameter `%s' is initialized" msgid "virtual table pointer is used uninitialized" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/constexpr.c:2066 cp/constexpr.c:2098 +#: cp/constexpr.c:2102 cp/constexpr.c:2134 #, gcc-internal-format msgid "static type %qT of its operand is a non-public base class of dynamic type %qT" msgstr "" -#: cp/constexpr.c:2120 +#: cp/constexpr.c:2156 #, gcc-internal-format msgid "%qT is an ambiguous base class of dynamic type %qT of its operand" msgstr "" -#: cp/constexpr.c:2123 +#: cp/constexpr.c:2159 #, gcc-internal-format msgid "dynamic type %qT of its operand does not have an unambiguous public base class %qT" msgstr "" -#: cp/constexpr.c:2198 cp/constexpr.c:2467 cp/constexpr.c:7985 +#: cp/constexpr.c:2234 cp/constexpr.c:2503 cp/constexpr.c:8048 #, gcc-internal-format msgid "call to non-% function %qD" msgstr "" -#: cp/constexpr.c:2315 +#: cp/constexpr.c:2351 #, gcc-internal-format msgid "expression %qE does not designate a % function" msgstr "" -#: cp/constexpr.c:2388 +#: cp/constexpr.c:2424 #, gcc-internal-format msgid "array deallocation of object allocated with non-array allocation" msgstr "" -#: cp/constexpr.c:2392 cp/constexpr.c:2414 +#: cp/constexpr.c:2428 cp/constexpr.c:2450 #, gcc-internal-format msgid "allocation performed here" msgstr "" -#: cp/constexpr.c:2410 +#: cp/constexpr.c:2446 #, gcc-internal-format msgid "non-array deallocation of object allocated with array allocation" msgstr "" -#: cp/constexpr.c:2427 +#: cp/constexpr.c:2463 #, gcc-internal-format msgid "deallocation of already deallocated storage" msgstr "" -#: cp/constexpr.c:2434 +#: cp/constexpr.c:2470 #, gcc-internal-format msgid "deallocation of storage that was not previously allocated" msgstr "" -#: cp/constexpr.c:2541 +#: cp/constexpr.c:2577 #, gcc-internal-format msgid "%qD called in a constant expression before its definition is complete" msgstr "" -#: cp/constexpr.c:2548 +#: cp/constexpr.c:2584 #, gcc-internal-format msgid "%qD called in a constant expression" msgstr "" -#: cp/constexpr.c:2552 +#: cp/constexpr.c:2588 #, fuzzy, gcc-internal-format msgid "%qD used before its definition" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/constexpr.c:2643 +#: cp/constexpr.c:2679 #, gcc-internal-format msgid "call has circular dependency" msgstr "" -#: cp/constexpr.c:2654 +#: cp/constexpr.c:2690 #, gcc-internal-format msgid "% evaluation depth exceeds maximum of %d (use %<-fconstexpr-depth=%> to increase the maximum)" msgstr "" -#: cp/constexpr.c:2982 +#: cp/constexpr.c:3037 #, gcc-internal-format msgid "right operand of shift expression %q+E is negative" msgstr "" -#: cp/constexpr.c:2989 +#: cp/constexpr.c:3044 #, gcc-internal-format msgid "right operand of shift expression %q+E is greater than or equal to the precision %wu of the left operand" msgstr "" -#: cp/constexpr.c:3012 +#: cp/constexpr.c:3067 #, gcc-internal-format msgid "left operand of shift expression %q+E is negative" msgstr "" -#: cp/constexpr.c:3031 +#: cp/constexpr.c:3086 #, gcc-internal-format msgid "shift expression %q+E overflows" msgstr "" -#: cp/constexpr.c:3189 +#: cp/constexpr.c:3244 #, gcc-internal-format msgid "arithmetic involving a null pointer in %qE" msgstr "" -#: cp/constexpr.c:3578 +#: cp/constexpr.c:3633 #, gcc-internal-format msgid "array subscript value %qE is outside the bounds of array %qD of type %qT" msgstr "" -#: cp/constexpr.c:3581 +#: cp/constexpr.c:3636 #, gcc-internal-format msgid "nonzero array subscript %qE is used with array %qD of type %qT with unknown bounds" msgstr "" -#: cp/constexpr.c:3586 +#: cp/constexpr.c:3641 #, gcc-internal-format msgid "array subscript value %qE is outside the bounds of array type %qT" msgstr "" -#: cp/constexpr.c:3589 +#: cp/constexpr.c:3644 #, gcc-internal-format msgid "nonzero array subscript %qE is used with array of type %qT with unknown bounds" msgstr "" -#: cp/constexpr.c:3772 +#: cp/constexpr.c:3827 #, fuzzy, gcc-internal-format msgid "accessing uninitialized array element" msgstr "прапушчан ініцыялізатар" -#: cp/constexpr.c:3820 +#: cp/constexpr.c:3875 #, gcc-internal-format msgid "dereferencing a null pointer in %qE" msgstr "" -#: cp/constexpr.c:3837 cp/constexpr.c:3936 cp/constexpr.c:6051 -#: cp/constexpr.c:6148 cp/constexpr.c:7905 +#: cp/constexpr.c:3892 cp/constexpr.c:3991 cp/constexpr.c:6114 +#: cp/constexpr.c:6211 cp/constexpr.c:7968 #, fuzzy, gcc-internal-format msgid "%qE is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:3843 +#: cp/constexpr.c:3898 #, fuzzy, gcc-internal-format msgid "mutable %qD is not usable in a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:3874 cp/constexpr.c:3896 +#: cp/constexpr.c:3929 cp/constexpr.c:3951 #, fuzzy, gcc-internal-format msgid "accessing uninitialized member %qD" msgstr "прапушчан ініцыялізатар" -#: cp/constexpr.c:3876 +#: cp/constexpr.c:3931 #, gcc-internal-format msgid "accessing %qD member instead of initialized %qD member in constant expression" msgstr "" -#: cp/constexpr.c:4007 +#: cp/constexpr.c:4062 #, gcc-internal-format msgid "%qs is not a constant expression because %qT is a union type" msgstr "" -#: cp/constexpr.c:4010 +#: cp/constexpr.c:4065 #, gcc-internal-format msgid "%qs is not a constant expression because %qT contains a union type" msgstr "" -#: cp/constexpr.c:4021 +#: cp/constexpr.c:4076 #, gcc-internal-format msgid "%qs is not a constant expression because %qT is a pointer type" msgstr "" -#: cp/constexpr.c:4024 +#: cp/constexpr.c:4079 #, gcc-internal-format msgid "%qs is not a constant expression because %qT contains a pointer type" msgstr "" -#: cp/constexpr.c:4035 +#: cp/constexpr.c:4090 #, gcc-internal-format msgid "%qs is not a constant expression because %qT is a reference type" msgstr "" -#: cp/constexpr.c:4038 +#: cp/constexpr.c:4093 #, gcc-internal-format msgid "%qs is not a constant expression because %qT contains a reference type" msgstr "" -#: cp/constexpr.c:4049 +#: cp/constexpr.c:4104 #, gcc-internal-format msgid "%qs is not a constant expression because %qT is a pointer to member type" msgstr "" -#: cp/constexpr.c:4053 +#: cp/constexpr.c:4108 #, gcc-internal-format msgid "%qs is not a constant expression because %qT contains a pointer to member type" msgstr "" -#: cp/constexpr.c:4064 +#: cp/constexpr.c:4119 #, gcc-internal-format msgid "%qs is not a constant expression because %qT is volatile" msgstr "" -#: cp/constexpr.c:4067 +#: cp/constexpr.c:4122 #, gcc-internal-format msgid "%qs is not a constant expression because %qT contains a volatile subobject" msgstr "" -#: cp/constexpr.c:4108 +#: cp/constexpr.c:4163 #, gcc-internal-format msgid "%qs cannot be constant evaluated on the target" msgstr "" -#: cp/constexpr.c:4117 cp/constexpr.c:4127 +#: cp/constexpr.c:4172 cp/constexpr.c:4182 #, gcc-internal-format msgid "%qs cannot be constant evaluated because the type is too large" msgstr "" -#: cp/constexpr.c:4147 +#: cp/constexpr.c:4202 #, gcc-internal-format msgid "%qs cannot be constant evaluated because the argument cannot be encoded" msgstr "" -#: cp/constexpr.c:4171 +#: cp/constexpr.c:4226 #, gcc-internal-format msgid "%qs accessing uninitialized byte at offset %d" msgstr "" -#: cp/constexpr.c:4183 +#: cp/constexpr.c:4238 #, gcc-internal-format msgid "%qs cannot be constant evaluated because the argument cannot be interpreted" msgstr "" -#: cp/constexpr.c:4906 cp/constexpr.c:6718 +#: cp/constexpr.c:4961 cp/constexpr.c:6781 #, gcc-internal-format msgid "dereferencing a null pointer" msgstr "" -#: cp/constexpr.c:4926 +#: cp/constexpr.c:4981 #, gcc-internal-format msgid "accessing value of %qE through a %qT glvalue in a constant expression" msgstr "" -#: cp/constexpr.c:4971 +#: cp/constexpr.c:5026 #, fuzzy, gcc-internal-format msgid "the content of uninitialized storage is not usable in a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:4973 cp/constexpr.c:4980 +#: cp/constexpr.c:5028 cp/constexpr.c:5035 #, fuzzy, gcc-internal-format #| msgid "called from here" msgid "allocated here" msgstr "выклікана адсюль" -#: cp/constexpr.c:4978 +#: cp/constexpr.c:5033 #, fuzzy, gcc-internal-format msgid "use of allocated storage after deallocation in a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:4983 +#: cp/constexpr.c:5038 #, fuzzy, gcc-internal-format msgid "the value of %qD is not usable in a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:4990 +#: cp/constexpr.c:5045 #, fuzzy, gcc-internal-format #| msgid "invalid initializer" msgid "%qD used in its own initializer" msgstr "нерэчаісны ініцыялізатар" -#: cp/constexpr.c:4995 +#: cp/constexpr.c:5050 #, fuzzy, gcc-internal-format #| msgid "`%D' is not a function," msgid "%q#D is not const" msgstr "`%D' - гэта ня функцыя," -#: cp/constexpr.c:4998 +#: cp/constexpr.c:5053 #, gcc-internal-format msgid "%q#D is volatile" msgstr "" -#: cp/constexpr.c:5003 cp/constexpr.c:5010 +#: cp/constexpr.c:5058 cp/constexpr.c:5065 #, fuzzy, gcc-internal-format msgid "%qD was not initialized with a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:5016 +#: cp/constexpr.c:5071 #, fuzzy, gcc-internal-format msgid "%qD was not declared %" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/constexpr.c:5019 +#: cp/constexpr.c:5074 #, gcc-internal-format msgid "%qD does not have integral or enumeration type" msgstr "" -#: cp/constexpr.c:5265 +#: cp/constexpr.c:5320 #, fuzzy, gcc-internal-format msgid "modification of %qE is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:5334 +#: cp/constexpr.c:5389 #, gcc-internal-format msgid "change of the active member of a union from %qD to %qD" msgstr "" -#: cp/constexpr.c:5347 +#: cp/constexpr.c:5402 #, gcc-internal-format msgid "change of the active member of a union from %qD to %qD during initialization" msgstr "" -#: cp/constexpr.c:5739 cp/constexpr.c:6976 +#: cp/constexpr.c:5802 cp/constexpr.c:7039 #, fuzzy, gcc-internal-format msgid "statement is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:5845 +#: cp/constexpr.c:5908 #, gcc-internal-format msgid "% loop iteration count exceeds limit of %d (use %<-fconstexpr-loop-limit=%> to increase the limit)" msgstr "" -#: cp/constexpr.c:5947 +#: cp/constexpr.c:6010 #, fuzzy, gcc-internal-format msgid "inline assembly is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:5948 +#: cp/constexpr.c:6011 #, gcc-internal-format msgid "only unevaluated inline assembly is allowed in a % function in C++20" msgstr "" -#: cp/constexpr.c:6013 +#: cp/constexpr.c:6076 #, fuzzy, gcc-internal-format msgid "value %qE of type %qT is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:6026 +#: cp/constexpr.c:6089 #, gcc-internal-format msgid "% evaluation operation count exceeds limit of %wd (use %<-fconstexpr-ops-limit=%> to increase the limit)" msgstr "" -#: cp/constexpr.c:6208 cp/constexpr.c:8583 +#: cp/constexpr.c:6271 cp/constexpr.c:8646 #, fuzzy, gcc-internal-format msgid "temporary of non-literal type %qT in a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:6636 cp/constexpr.c:8110 +#: cp/constexpr.c:6699 cp/constexpr.c:8173 #, fuzzy, gcc-internal-format msgid "% is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:6664 +#: cp/constexpr.c:6727 #, gcc-internal-format msgid "conversion from pointer type %qT to arithmetic type %qT in a constant expression" msgstr "" -#: cp/constexpr.c:6693 +#: cp/constexpr.c:6756 #, gcc-internal-format msgid "cast from %qT is not allowed" msgstr "" -#: cp/constexpr.c:6729 +#: cp/constexpr.c:6792 #, gcc-internal-format msgid "%(%E)%> is not a constant expression" msgstr "" -#: cp/constexpr.c:6834 cp/constexpr.c:8409 cp/constexpr.c:8787 +#: cp/constexpr.c:6897 cp/constexpr.c:8472 cp/constexpr.c:8850 #, fuzzy, gcc-internal-format msgid "expression %qE is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:6929 +#: cp/constexpr.c:6992 #, gcc-internal-format msgid "unexpected template-id %qE" msgstr "" -#: cp/constexpr.c:6935 +#: cp/constexpr.c:6998 #, gcc-internal-format msgid "function concept must be called" msgstr "" -#: cp/constexpr.c:6960 +#: cp/constexpr.c:7023 #, fuzzy, gcc-internal-format msgid "address of a call to %qs is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:6979 +#: cp/constexpr.c:7042 #, gcc-internal-format msgid "unexpected expression %qE of kind %s" msgstr "" -#: cp/constexpr.c:7209 +#: cp/constexpr.c:7272 #, gcc-internal-format msgid "%qE is not a constant expression because it refers to mutable subobjects of %qT" msgstr "" -#: cp/constexpr.c:7217 +#: cp/constexpr.c:7280 #, gcc-internal-format msgid "%qE is not a constant expression because it refers to an incompletely initialized variable" msgstr "" -#: cp/constexpr.c:7232 +#: cp/constexpr.c:7295 #, gcc-internal-format msgid "%qE is not a constant expression because it refers to a result of %" msgstr "" -#: cp/constexpr.c:7243 +#: cp/constexpr.c:7306 #, gcc-internal-format msgid "%qE is not a constant expression because allocated storage has not been deallocated" msgstr "" -#: cp/constexpr.c:7265 +#: cp/constexpr.c:7328 #, gcc-internal-format msgid "immediate evaluation returns address of immediate function %qD" msgstr "" -#: cp/constexpr.c:7845 +#: cp/constexpr.c:7908 #, gcc-internal-format msgid "lvalue-to-rvalue conversion of a volatile lvalue %qE with type %qT" msgstr "" -#: cp/constexpr.c:8075 +#: cp/constexpr.c:8138 #, fuzzy, gcc-internal-format msgid "lambda capture of %qE is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:8078 +#: cp/constexpr.c:8141 #, gcc-internal-format msgid "because it is used as a glvalue" msgstr "" -#: cp/constexpr.c:8130 +#: cp/constexpr.c:8193 #, gcc-internal-format msgid "% from integer to pointer" msgstr "" -#: cp/constexpr.c:8163 +#: cp/constexpr.c:8226 #, gcc-internal-format msgid "address-of an object %qE with thread local or automatic storage is not a constant expression" msgstr "" -#: cp/constexpr.c:8202 +#: cp/constexpr.c:8265 #, fuzzy, gcc-internal-format msgid "use of % in a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:8356 +#: cp/constexpr.c:8419 #, gcc-internal-format msgid "lambda-expression is not a constant expression before C++17" msgstr "" -#: cp/constexpr.c:8423 +#: cp/constexpr.c:8486 #, fuzzy, gcc-internal-format #| msgid "virtual functions cannot be friends" msgid "virtual functions cannot be % before C++20" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/constexpr.c:8438 +#: cp/constexpr.c:8501 #, gcc-internal-format msgid "% is not a constant expression because %qE is of polymorphic type" msgstr "" -#: cp/constexpr.c:8502 +#: cp/constexpr.c:8565 #, fuzzy, gcc-internal-format msgid "cast to non-integral type %qT in a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:8552 +#: cp/constexpr.c:8615 #, fuzzy, gcc-internal-format msgid "%qD declared % in % context" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/constexpr.c:8559 +#: cp/constexpr.c:8622 #, gcc-internal-format msgid "%qD declared % in % context" msgstr "" -#: cp/constexpr.c:8632 +#: cp/constexpr.c:8695 #, fuzzy, gcc-internal-format msgid "division by zero is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:8728 +#: cp/constexpr.c:8791 #, fuzzy, gcc-internal-format msgid "% is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:8795 +#: cp/constexpr.c:8858 #, fuzzy, gcc-internal-format msgid "non-constant array initialization" msgstr "нерэчаісны ініцыялізатар" -#: cp/constexpr.c:8825 +#: cp/constexpr.c:8888 #, fuzzy, gcc-internal-format msgid "% is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:8834 +#: cp/constexpr.c:8897 #, fuzzy, gcc-internal-format msgid "label definition is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/constexpr.c:8853 +#: cp/constexpr.c:8916 #, gcc-internal-format, gfc-internal-format msgid "unexpected AST of kind %s" msgstr "" @@ -48166,52 +48195,52 @@ msgstr "" msgid "both branches of % statement marked as %qs" msgstr "" -#: cp/cp-gimplify.c:1325 +#: cp/cp-gimplify.c:1333 #, gcc-internal-format msgid "% will always call %" msgstr "" -#: cp/cp-gimplify.c:1328 +#: cp/cp-gimplify.c:1336 #, gcc-internal-format msgid "in C++11 destructors default to %" msgstr "" -#: cp/cp-gimplify.c:1340 +#: cp/cp-gimplify.c:1348 #, gcc-internal-format msgid "in C++11 this % will call % because destructors default to %" msgstr "" -#: cp/cp-gimplify.c:2793 +#: cp/cp-gimplify.c:2773 #, gcc-internal-format msgid "ignoring attribute %qE after earlier %qE" msgstr "" -#: cp/cp-gimplify.c:2815 cp/cp-gimplify.c:2827 cp/decl.c:4066 cp/method.c:978 +#: cp/cp-gimplify.c:2795 cp/cp-gimplify.c:2807 cp/decl.c:4048 cp/method.c:978 #, fuzzy, gcc-internal-format msgid "%qD is not a type" msgstr "\"%s\" мае незавершаны тып" -#: cp/cp-gimplify.c:2833 +#: cp/cp-gimplify.c:2813 #, fuzzy, gcc-internal-format msgid "%qD is not a class type" msgstr "\"%s\" мае незавершаны тып" -#: cp/cp-gimplify.c:2850 +#: cp/cp-gimplify.c:2830 #, gcc-internal-format msgid "%qD does not have % type" msgstr "" -#: cp/cp-gimplify.c:2861 +#: cp/cp-gimplify.c:2841 #, fuzzy, gcc-internal-format msgid "%qD does not have integral type" msgstr "\"%s\" мае незавершаны тып" -#: cp/cp-gimplify.c:2873 +#: cp/cp-gimplify.c:2853 #, gcc-internal-format msgid "% does not contain only non-static data members %<_M_file_name%>, %<_M_function_name%>, %<_M_line%> and %<_M_column%>" msgstr "" -#: cp/cp-gimplify.c:2977 +#: cp/cp-gimplify.c:2957 #, gcc-internal-format msgid "evaluating %qs" msgstr "" @@ -48253,7 +48282,7 @@ msgstr "" msgid "conversion from %qH to %qI discards qualifiers" msgstr "" -#: cp/cvt.c:498 cp/typeck.c:7969 +#: cp/cvt.c:498 cp/typeck.c:7976 #, gcc-internal-format msgid "casting %qT to %qT does not dereference pointer" msgstr "" @@ -48641,7 +48670,7 @@ msgstr "папярэдняе абвяшчэньне `%D'" msgid "redeclaration %qD differs in %qs from previous declaration" msgstr "гэта папярэдняе абвяшчэньне" -#: cp/decl.c:1303 cp/decl.c:15319 +#: cp/decl.c:1303 cp/decl.c:15337 #, fuzzy, gcc-internal-format #| msgid "previous declaration `%D'" msgid "previous declaration %qD" @@ -48775,8 +48804,8 @@ msgstr "няма папярэдняга аб'яўлення для \"%s\"" msgid "%q#D previously defined here" msgstr "папярэдняе вызначэньне" -#: cp/decl.c:1901 cp/name-lookup.c:3187 cp/name-lookup.c:3216 -#: cp/name-lookup.c:3240 +#: cp/decl.c:1901 cp/name-lookup.c:3188 cp/name-lookup.c:3217 +#: cp/name-lookup.c:3241 #, fuzzy, gcc-internal-format msgid "%q#D previously declared here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" @@ -48812,54 +48841,54 @@ msgstr "нехапае аргументаў у функцыі \"%s\"" msgid "previous specification in %q#D here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:2047 +#: cp/decl.c:2045 #, fuzzy, gcc-internal-format msgid "declaration %qD conflicts with builtin" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: cp/decl.c:2055 +#: cp/decl.c:2053 #, fuzzy, gcc-internal-format msgid "declaration %qD conflicts with import" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: cp/decl.c:2056 +#: cp/decl.c:2054 #, fuzzy, gcc-internal-format msgid "import declared %q#D here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:2064 +#: cp/decl.c:2062 #, fuzzy, gcc-internal-format #| msgid "conflicts with previous declaration `%#D'" msgid "conflicting exporting declaration %qD" msgstr "канфлікт з папярэднім абвяшчэньнем `%#D'" -#: cp/decl.c:2065 +#: cp/decl.c:2063 #, fuzzy, gcc-internal-format msgid "previous declaration %q#D here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:2090 +#: cp/decl.c:2088 #, fuzzy, gcc-internal-format #| msgid "previous definition here" msgid "previous definition of %qD here" msgstr "папярэдняе вызначэньне" -#: cp/decl.c:2091 +#: cp/decl.c:2089 #, fuzzy, gcc-internal-format msgid "previous declaration of %qD here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:2104 +#: cp/decl.c:2102 #, gcc-internal-format msgid "function %qD declared %<[[noreturn]]%> but its first declaration was not" msgstr "" -#: cp/decl.c:2149 +#: cp/decl.c:2147 #, fuzzy, gcc-internal-format msgid "redundant redeclaration of %qD in same scope" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:2166 +#: cp/decl.c:2164 #, gcc-internal-format msgid "deleted definition of %qD is not first declaration" msgstr "" @@ -48872,50 +48901,50 @@ msgstr "" #. that specialization that would cause an implicit #. instantiation to take place, in every translation unit in #. which such a use occurs. -#: cp/decl.c:2640 +#: cp/decl.c:2635 #, fuzzy, gcc-internal-format msgid "explicit specialization of %qD after first use" msgstr "ініцыялізацыя" -#: cp/decl.c:2779 +#: cp/decl.c:2774 #, fuzzy, gcc-internal-format #| msgid "section of `%s' conflicts with previous declaration" msgid "%qD: visibility attribute ignored because it conflicts with previous declaration" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" #. Reject two definitions. -#: cp/decl.c:3052 cp/decl.c:3081 cp/decl.c:3123 cp/decl.c:3140 cp/decl.c:3243 +#: cp/decl.c:3034 cp/decl.c:3063 cp/decl.c:3105 cp/decl.c:3122 cp/decl.c:3225 #, fuzzy, gcc-internal-format #| msgid "previous definition of `%#T'" msgid "redefinition of %q#D" msgstr "папярэдняе вызначэньне `%#T'" -#: cp/decl.c:3068 +#: cp/decl.c:3050 #, fuzzy, gcc-internal-format msgid "%qD conflicts with used function" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: cp/decl.c:3078 +#: cp/decl.c:3060 #, fuzzy, gcc-internal-format msgid "%q#D not declared in class" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:3092 cp/decl.c:3150 +#: cp/decl.c:3074 cp/decl.c:3132 #, gcc-internal-format msgid "%q+D redeclared inline with % attribute" msgstr "" -#: cp/decl.c:3095 cp/decl.c:3153 +#: cp/decl.c:3077 cp/decl.c:3135 #, gcc-internal-format msgid "%q+D redeclared inline without % attribute" msgstr "" -#: cp/decl.c:3102 cp/decl.c:3160 +#: cp/decl.c:3084 cp/decl.c:3142 #, gcc-internal-format msgid "deduction guide %q+D redeclared" msgstr "" -#: cp/decl.c:3109 +#: cp/decl.c:3091 #, gcc-internal-format msgid "comparison operator %q+D defaulted after its first declaration" msgstr "" @@ -48923,2334 +48952,2349 @@ msgstr "" #. is_primary= #. is_partial= #. is_friend_decl= -#: cp/decl.c:3174 +#: cp/decl.c:3156 #, gcc-internal-format msgid "redeclaration of friend %q#D may not have default template arguments" msgstr "" -#: cp/decl.c:3189 +#: cp/decl.c:3171 #, gcc-internal-format msgid "thread-local declaration of %q#D follows non-thread-local declaration" msgstr "" -#: cp/decl.c:3192 +#: cp/decl.c:3174 #, gcc-internal-format msgid "non-thread-local declaration of %q#D follows thread-local declaration" msgstr "" -#: cp/decl.c:3207 cp/decl.c:3251 cp/name-lookup.c:2730 cp/name-lookup.c:3214 -#: cp/name-lookup.c:3238 +#: cp/decl.c:3189 cp/decl.c:3233 cp/name-lookup.c:2731 cp/name-lookup.c:3215 +#: cp/name-lookup.c:3239 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "redeclaration of %q#D" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:3234 +#: cp/decl.c:3216 #, gcc-internal-format msgid "redundant redeclaration of % static data member %qD" msgstr "" -#: cp/decl.c:3300 +#: cp/decl.c:3282 #, gcc-internal-format msgid "local label %qE conflicts with existing label" msgstr "" -#: cp/decl.c:3301 +#: cp/decl.c:3283 #, gcc-internal-format msgid "previous label" msgstr "" -#: cp/decl.c:3395 +#: cp/decl.c:3377 #, gcc-internal-format msgid " from here" msgstr " адсюль" -#: cp/decl.c:3418 cp/decl.c:3646 +#: cp/decl.c:3400 cp/decl.c:3628 #, gcc-internal-format msgid " exits OpenMP structured block" msgstr "" -#: cp/decl.c:3446 +#: cp/decl.c:3428 #, fuzzy, gcc-internal-format msgid " crosses initialization of %q#D" msgstr "ініцыялізацыя" -#: cp/decl.c:3449 +#: cp/decl.c:3431 #, gcc-internal-format msgid " enters scope of %q#D, which has non-trivial destructor" msgstr "" -#: cp/decl.c:3463 cp/decl.c:3617 +#: cp/decl.c:3445 cp/decl.c:3599 #, gcc-internal-format msgid " enters % block" msgstr "" -#: cp/decl.c:3469 cp/decl.c:3599 cp/decl.c:3619 +#: cp/decl.c:3451 cp/decl.c:3581 cp/decl.c:3601 #, gcc-internal-format msgid " enters % block" msgstr "" -#: cp/decl.c:3475 cp/decl.c:3629 +#: cp/decl.c:3457 cp/decl.c:3611 #, gcc-internal-format msgid " enters OpenMP structured block" msgstr "" -#: cp/decl.c:3481 cp/decl.c:3621 +#: cp/decl.c:3463 cp/decl.c:3603 #, gcc-internal-format msgid " enters synchronized or atomic statement" msgstr "" -#: cp/decl.c:3488 cp/decl.c:3623 +#: cp/decl.c:3470 cp/decl.c:3605 #, gcc-internal-format msgid " enters % statement" msgstr "" -#: cp/decl.c:3606 +#: cp/decl.c:3588 #, fuzzy, gcc-internal-format msgid " skips initialization of %q#D" msgstr "ініцыялізацыя" -#: cp/decl.c:3609 +#: cp/decl.c:3591 #, gcc-internal-format msgid " enters scope of %q#D which has non-trivial destructor" msgstr "" -#: cp/decl.c:4073 cp/parser.c:6807 +#: cp/decl.c:4055 cp/parser.c:6807 #, gcc-internal-format msgid "%qD used without template arguments" msgstr "" -#: cp/decl.c:4084 +#: cp/decl.c:4061 +#, fuzzy, gcc-internal-format +msgid "%qD is a function, not a type" +msgstr "\"%s\" звычайна функцыя" + +#: cp/decl.c:4072 #, fuzzy, gcc-internal-format msgid "%q#T is not a class" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:4112 cp/decl.c:4198 +#: cp/decl.c:4100 cp/decl.c:4186 #, gcc-internal-format msgid "no class template named %q#T in %q#T" msgstr "" -#: cp/decl.c:4113 +#: cp/decl.c:4101 #, fuzzy, gcc-internal-format msgid "no type named %q#T in %q#T" msgstr "вяртаемы тып \"%s\" не \"int\"" -#: cp/decl.c:4126 +#: cp/decl.c:4114 #, fuzzy, gcc-internal-format msgid "lookup of %qT in %qT is ambiguous" msgstr "памер \"%s\" - %d байт" -#: cp/decl.c:4135 +#: cp/decl.c:4123 #, gcc-internal-format msgid "% names %q#T, which is not a class template" msgstr "" -#: cp/decl.c:4142 +#: cp/decl.c:4130 #, gcc-internal-format msgid "% names %q#T, which is not a type" msgstr "" -#: cp/decl.c:4207 +#: cp/decl.c:4195 #, fuzzy, gcc-internal-format msgid "template parameters do not match template %qD" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:4543 +#: cp/decl.c:4531 #, gcc-internal-format msgid "%<-faligned-new=%d%> is not a power of two" msgstr "" -#: cp/decl.c:5042 +#: cp/decl.c:5038 #, gcc-internal-format msgid "member %q+#D with constructor not allowed in anonymous aggregate" msgstr "" -#: cp/decl.c:5045 +#: cp/decl.c:5041 #, gcc-internal-format msgid "member %q+#D with destructor not allowed in anonymous aggregate" msgstr "" -#: cp/decl.c:5048 +#: cp/decl.c:5044 #, gcc-internal-format msgid "member %q+#D with copy assignment operator not allowed in anonymous aggregate" msgstr "" -#: cp/decl.c:5067 +#: cp/decl.c:5063 #, fuzzy, gcc-internal-format msgid "attribute ignored in declaration of %q#T" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:5070 +#: cp/decl.c:5066 #, gcc-internal-format msgid "attribute for %q#T must follow the %qs keyword" msgstr "" -#: cp/decl.c:5112 +#: cp/decl.c:5108 #, gcc-internal-format msgid "multiple types in one declaration" msgstr "" -#: cp/decl.c:5117 +#: cp/decl.c:5113 #, fuzzy, gcc-internal-format msgid "redeclaration of C++ built-in type %qT" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:5134 +#: cp/decl.c:5130 #, gcc-internal-format msgid "% can only be specified for variables or function declarations" msgstr "" -#: cp/decl.c:5167 +#: cp/decl.c:5163 #, gcc-internal-format msgid "missing type-name in typedef-declaration" msgstr "" -#: cp/decl.c:5175 +#: cp/decl.c:5171 #, gcc-internal-format msgid "ISO C++ prohibits anonymous structs" msgstr "" -#: cp/decl.c:5182 +#: cp/decl.c:5178 #, fuzzy, gcc-internal-format msgid "% can only be specified for functions" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/decl.c:5185 +#: cp/decl.c:5181 #, gcc-internal-format msgid "% can only be specified for functions" msgstr "" -#: cp/decl.c:5190 +#: cp/decl.c:5186 #, gcc-internal-format msgid "% can only be specified inside a class" msgstr "" -#: cp/decl.c:5193 +#: cp/decl.c:5189 #, gcc-internal-format msgid "% can only be specified for constructors" msgstr "" -#: cp/decl.c:5196 +#: cp/decl.c:5192 #, gcc-internal-format msgid "a storage class can only be specified for objects and functions" msgstr "" -#: cp/decl.c:5200 +#: cp/decl.c:5196 #, gcc-internal-format msgid "% can only be specified for objects and functions" msgstr "" -#: cp/decl.c:5204 +#: cp/decl.c:5200 #, gcc-internal-format msgid "% can only be specified for objects and functions" msgstr "" -#: cp/decl.c:5208 +#: cp/decl.c:5204 #, gcc-internal-format msgid "%<__restrict%> can only be specified for objects and functions" msgstr "" -#: cp/decl.c:5212 +#: cp/decl.c:5208 #, gcc-internal-format msgid "%<__thread%> can only be specified for objects and functions" msgstr "" -#: cp/decl.c:5216 +#: cp/decl.c:5212 #, gcc-internal-format msgid "% was ignored in this declaration" msgstr "" -#: cp/decl.c:5219 cp/decl.c:5222 cp/decl.c:5225 +#: cp/decl.c:5215 cp/decl.c:5218 cp/decl.c:5221 #, fuzzy, gcc-internal-format msgid "%qs cannot be used for type declarations" msgstr "\"%s\" звычайна функцыя" -#: cp/decl.c:5247 +#: cp/decl.c:5243 #, fuzzy, gcc-internal-format msgid "attribute ignored in explicit instantiation %q#T" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:5250 +#: cp/decl.c:5246 #, fuzzy, gcc-internal-format msgid "no attribute can be applied to an explicit instantiation" msgstr "\"%s\" звычайна функцыя" -#: cp/decl.c:5322 +#: cp/decl.c:5318 #, gcc-internal-format msgid "ignoring attributes applied to class type %qT outside of definition" msgstr "" #. A template type parameter or other dependent type. -#: cp/decl.c:5326 +#: cp/decl.c:5322 #, gcc-internal-format msgid "ignoring attributes applied to dependent type %qT without an associated declaration" msgstr "" -#: cp/decl.c:5390 cp/decl2.c:859 +#: cp/decl.c:5386 cp/decl2.c:859 #, fuzzy, gcc-internal-format msgid "typedef %qD is initialized (use %qs instead)" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/decl.c:5403 +#: cp/decl.c:5399 #, gcc-internal-format msgid "declaration of %q#D has % and is initialized" msgstr "" -#: cp/decl.c:5441 +#: cp/decl.c:5437 #, gcc-internal-format msgid "definition of %q#D is marked %" msgstr "" -#: cp/decl.c:5465 +#: cp/decl.c:5461 #, gcc-internal-format msgid "%q+#D is not a static data member of %q#T" msgstr "" -#: cp/decl.c:5473 +#: cp/decl.c:5469 #, fuzzy, gcc-internal-format msgid "non-member-template declaration of %qD" msgstr "пустое абвяшчэнне" -#: cp/decl.c:5474 +#: cp/decl.c:5470 #, fuzzy, gcc-internal-format msgid "does not match member template declaration here" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:5486 +#: cp/decl.c:5482 #, gcc-internal-format msgid "ISO C++ does not permit %<%T::%D%> to be defined as %<%T::%D%>" msgstr "" -#: cp/decl.c:5498 +#: cp/decl.c:5494 #, fuzzy, gcc-internal-format msgid "duplicate initialization of %qD" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:5546 +#: cp/decl.c:5542 #, gcc-internal-format msgid "declaration of %q#D outside of class is not definition" msgstr "" -#: cp/decl.c:5563 +#: cp/decl.c:5559 #, gcc-internal-format msgid "block-scope extern declaration %q#D not permitted in module purview" msgstr "" -#: cp/decl.c:5598 +#: cp/decl.c:5594 #, fuzzy, gcc-internal-format #| msgid "`%s' undeclared (first use in this function)" msgid "%qD declared % in %qs function" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:5603 +#: cp/decl.c:5599 #, fuzzy, gcc-internal-format msgid "%qD declared % in %qs function" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:5675 +#: cp/decl.c:5671 #, fuzzy, gcc-internal-format msgid "variable %q#D has initializer but incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:5681 cp/decl.c:6834 +#: cp/decl.c:5677 cp/decl.c:6830 #, fuzzy, gcc-internal-format msgid "elements of array %q#D have incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:5691 +#: cp/decl.c:5687 #, gcc-internal-format msgid "aggregate %q#D has incomplete type and cannot be defined" msgstr "" -#: cp/decl.c:5758 +#: cp/decl.c:5754 #, gcc-internal-format msgid "%qD declared as reference but not initialized" msgstr "" -#: cp/decl.c:5841 +#: cp/decl.c:5837 #, gcc-internal-format msgid "name used in a GNU-style designated initializer for an array" msgstr "" -#: cp/decl.c:5847 +#: cp/decl.c:5843 #, gcc-internal-format msgid "name %qD used in a GNU-style designated initializer for an array" msgstr "" -#: cp/decl.c:5866 +#: cp/decl.c:5862 #, gcc-internal-format msgid "non-trivial designated initializers not supported" msgstr "" -#: cp/decl.c:5870 +#: cp/decl.c:5866 #, fuzzy, gcc-internal-format msgid "C99 designator %qE is not an integral constant-expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:5926 +#: cp/decl.c:5922 #, gcc-internal-format msgid "initializer fails to determine size of %qD" msgstr "" -#: cp/decl.c:5933 +#: cp/decl.c:5929 #, fuzzy, gcc-internal-format #| msgid "array size missing in `%D'" msgid "array size missing in %qD" msgstr "прапушчан памер масіва ў `%D'" -#: cp/decl.c:5945 +#: cp/decl.c:5941 #, fuzzy, gcc-internal-format #| msgid "zero-size array `%D'" msgid "zero-size array %qD" msgstr "нулявы памер масіва `%D'" -#: cp/decl.c:5985 +#: cp/decl.c:5981 #, gcc-internal-format msgid "storage size of %qD isn%'t known" msgstr "" -#: cp/decl.c:6010 +#: cp/decl.c:6006 #, fuzzy, gcc-internal-format msgid "storage size of %qD isn%'t constant" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/decl.c:6061 +#: cp/decl.c:6057 #, gcc-internal-format msgid "sorry: semantics of inline variable %q#D are wrong (you%'ll wind up with multiple copies)" msgstr "" -#: cp/decl.c:6065 +#: cp/decl.c:6061 #, gcc-internal-format msgid "sorry: semantics of inline function static data %q#D are wrong (you%'ll wind up with multiple copies)" msgstr "" -#: cp/decl.c:6071 +#: cp/decl.c:6067 #, gcc-internal-format msgid "you can work around this by removing the initializer" msgstr "" -#: cp/decl.c:6113 +#: cp/decl.c:6109 #, fuzzy, gcc-internal-format msgid "uninitialized %" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/decl.c:6120 +#: cp/decl.c:6116 #, gcc-internal-format msgid "uninitialized variable %qD in % function" msgstr "" -#: cp/decl.c:6129 +#: cp/decl.c:6125 #, gcc-internal-format msgid "uninitialized variable %qD in % context" msgstr "" -#: cp/decl.c:6137 +#: cp/decl.c:6133 #, gcc-internal-format msgid "%q#T has no user-provided default constructor" msgstr "" -#: cp/decl.c:6141 +#: cp/decl.c:6137 #, gcc-internal-format msgid "constructor is not user-provided because it is explicitly defaulted in the class body" msgstr "" -#: cp/decl.c:6144 +#: cp/decl.c:6140 #, gcc-internal-format msgid "and the implicitly-defined constructor does not initialize %q#D" msgstr "" -#: cp/decl.c:6312 +#: cp/decl.c:6308 #, fuzzy, gcc-internal-format msgid "invalid type %qT as initializer for a vector of type %qT" msgstr "нерэчаісны ініцыялізатар" -#: cp/decl.c:6369 +#: cp/decl.c:6365 #, gcc-internal-format msgid "initializer for %qT must be brace-enclosed" msgstr "" -#: cp/decl.c:6407 +#: cp/decl.c:6403 #, gcc-internal-format msgid "%<[%E] =%> used in a GNU-style designated initializer for class %qT" msgstr "" -#: cp/decl.c:6415 +#: cp/decl.c:6411 #, gcc-internal-format msgid "%qT has no non-static data member named %qD" msgstr "" -#: cp/decl.c:6443 +#: cp/decl.c:6439 #, fuzzy, gcc-internal-format #| msgid "invalid initializer" msgid "invalid initializer for %q#D" msgstr "нерэчаісны ініцыялізатар" -#: cp/decl.c:6494 +#: cp/decl.c:6490 #, gcc-internal-format msgid "C99 designator %qE outside aggregate initializer" msgstr "" -#: cp/decl.c:6533 cp/decl.c:6793 cp/typeck2.c:1380 cp/typeck2.c:1694 -#: cp/typeck2.c:1742 cp/typeck2.c:1789 +#: cp/decl.c:6529 cp/decl.c:6789 cp/typeck2.c:1377 cp/typeck2.c:1691 +#: cp/typeck2.c:1739 cp/typeck2.c:1786 #, fuzzy, gcc-internal-format msgid "too many initializers for %qT" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/decl.c:6574 +#: cp/decl.c:6570 #, fuzzy, gcc-internal-format msgid "braces around scalar initializer for type %qT" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/decl.c:6584 +#: cp/decl.c:6580 #, gcc-internal-format msgid "too many braces around scalar initializer for type %qT" msgstr "" -#: cp/decl.c:6702 +#: cp/decl.c:6698 #, fuzzy, gcc-internal-format msgid "missing braces around initializer for %qT" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/decl.c:6822 +#: cp/decl.c:6818 #, fuzzy, gcc-internal-format msgid "structured binding has incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:6836 +#: cp/decl.c:6832 #, fuzzy, gcc-internal-format msgid "elements of array %q#T have incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:6849 +#: cp/decl.c:6845 #, gcc-internal-format msgid "variable-sized compound literal" msgstr "" -#: cp/decl.c:6904 +#: cp/decl.c:6900 #, fuzzy, gcc-internal-format msgid "%q#D has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:6925 +#: cp/decl.c:6921 #, gcc-internal-format msgid "scalar object %qD requires one element in initializer" msgstr "" -#: cp/decl.c:6970 +#: cp/decl.c:6966 #, gcc-internal-format msgid "in C++98 %qD must be initialized by constructor, not by %<{...}%>" msgstr "" -#: cp/decl.c:7102 +#: cp/decl.c:7098 #, gcc-internal-format msgid "array %qD initialized by parenthesized string literal %qE" msgstr "" -#: cp/decl.c:7137 +#: cp/decl.c:7133 #, gcc-internal-format msgid "initializer invalid for static member with constructor" msgstr "" -#: cp/decl.c:7139 +#: cp/decl.c:7135 #, gcc-internal-format msgid "non-constant in-class initialization invalid for static member %qD" msgstr "" -#: cp/decl.c:7142 +#: cp/decl.c:7138 #, gcc-internal-format msgid "non-constant in-class initialization invalid for non-inline static member %qD" msgstr "" -#: cp/decl.c:7147 +#: cp/decl.c:7143 #, gcc-internal-format msgid "(an out of class initialization is required)" msgstr "" -#: cp/decl.c:7332 +#: cp/decl.c:7328 #, fuzzy, gcc-internal-format msgid "reference %qD is initialized with itself" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/decl.c:7590 +#: cp/decl.c:7586 #, fuzzy, gcc-internal-format msgid "could not find variant declaration" msgstr "Не магу знайсці дэкларацыю інтэрфейса для \"%s\"" -#: cp/decl.c:7614 +#: cp/decl.c:7610 #, gcc-internal-format msgid "% on constructor %qD" msgstr "" -#: cp/decl.c:7619 +#: cp/decl.c:7615 #, gcc-internal-format msgid "% on destructor %qD" msgstr "" -#: cp/decl.c:7624 +#: cp/decl.c:7620 #, gcc-internal-format msgid "% on defaulted %qD" msgstr "" -#: cp/decl.c:7629 +#: cp/decl.c:7625 #, fuzzy, gcc-internal-format #| msgid "declaration of template `%#D'" msgid "% on deleted %qD" msgstr "абвяшчэньне шаблёну `%#D'" -#: cp/decl.c:7634 +#: cp/decl.c:7630 #, gcc-internal-format msgid "% on virtual %qD" msgstr "" -#: cp/decl.c:7684 +#: cp/decl.c:7680 #, gcc-internal-format msgid "assignment (not initialization) in declaration" msgstr "" -#: cp/decl.c:7702 cp/decl.c:14061 +#: cp/decl.c:7698 cp/decl.c:14079 #, gcc-internal-format msgid "ISO C++17 does not allow % storage class specifier" msgstr "" -#: cp/decl.c:7706 cp/decl.c:14065 +#: cp/decl.c:7702 cp/decl.c:14083 #, gcc-internal-format msgid "% storage class specifier used" msgstr "" -#: cp/decl.c:7759 +#: cp/decl.c:7758 #, gcc-internal-format msgid "initializer for % has function type; did you forget the %<()%>?" msgstr "" -#: cp/decl.c:7867 +#: cp/decl.c:7866 #, gcc-internal-format msgid "variable concept has no initializer" msgstr "" -#: cp/decl.c:7926 +#: cp/decl.c:7925 #, fuzzy, gcc-internal-format msgid "shadowing previous type declaration of %q#D" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:7969 +#: cp/decl.c:7968 #, gcc-internal-format msgid "% can only be applied to a variable with static or thread storage duration" msgstr "" -#: cp/decl.c:8140 +#: cp/decl.c:8146 #, gcc-internal-format msgid "function %q#D is initialized like a variable" msgstr "" -#: cp/decl.c:8246 +#: cp/decl.c:8252 #, gcc-internal-format msgid "cannot decompose class type %qT because it has an anonymous struct member" msgstr "" -#: cp/decl.c:8249 +#: cp/decl.c:8255 #, gcc-internal-format msgid "cannot decompose class type %qT because it has an anonymous union member" msgstr "" -#: cp/decl.c:8256 +#: cp/decl.c:8262 #, gcc-internal-format msgid "cannot decompose inaccessible member %qD of %qT" msgstr "" -#: cp/decl.c:8282 +#: cp/decl.c:8288 #, gcc-internal-format msgid "cannot decompose class type %qT: both it and its base class %qT have non-static data members" msgstr "" -#: cp/decl.c:8291 +#: cp/decl.c:8297 #, gcc-internal-format msgid "cannot decompose class type %qT: its base classes %qT and %qT have non-static data members" msgstr "" -#: cp/decl.c:8501 +#: cp/decl.c:8507 #, fuzzy, gcc-internal-format msgid "structured binding refers to incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:8517 +#: cp/decl.c:8523 #, gcc-internal-format msgid "cannot decompose variable length array %qT" msgstr "" -#: cp/decl.c:8526 cp/decl.c:8611 +#: cp/decl.c:8532 cp/decl.c:8617 #, gcc-internal-format, gfc-internal-format msgid "%u name provided for structured binding" msgid_plural "%u names provided for structured binding" msgstr[0] "" msgstr[1] "" -#: cp/decl.c:8530 +#: cp/decl.c:8536 #, gcc-internal-format, gfc-internal-format msgid "only %u name provided for structured binding" msgid_plural "only %u names provided for structured binding" msgstr[0] "" msgstr[1] "" -#: cp/decl.c:8533 +#: cp/decl.c:8539 #, gcc-internal-format msgid "while %qT decomposes into %wu element" msgid_plural "while %qT decomposes into %wu elements" msgstr[0] "" msgstr[1] "" -#: cp/decl.c:8578 +#: cp/decl.c:8584 #, gcc-internal-format msgid "cannot decompose variable length vector %qT" msgstr "" -#: cp/decl.c:8604 +#: cp/decl.c:8610 #, fuzzy, gcc-internal-format msgid "%::value%> is not an integral constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:8613 +#: cp/decl.c:8619 #, gcc-internal-format msgid "while %qT decomposes into %E elements" msgstr "" -#: cp/decl.c:8634 +#: cp/decl.c:8640 +#, gcc-internal-format +msgid "%::type%> is %" +msgstr "" + +#: cp/decl.c:8646 #, gcc-internal-format msgid "in initialization of structured binding variable %qD" msgstr "" -#: cp/decl.c:8663 +#: cp/decl.c:8675 #, gcc-internal-format msgid "cannot decompose union type %qT" msgstr "" -#: cp/decl.c:8668 +#: cp/decl.c:8680 #, gcc-internal-format msgid "cannot decompose non-array non-class type %qT" msgstr "" -#: cp/decl.c:8673 +#: cp/decl.c:8685 #, gcc-internal-format msgid "cannot decompose lambda closure type %qT" msgstr "" -#: cp/decl.c:8679 +#: cp/decl.c:8691 #, gcc-internal-format msgid "structured binding refers to incomplete class type %qT" msgstr "" -#: cp/decl.c:8688 +#: cp/decl.c:8700 #, gcc-internal-format msgid "cannot decompose class type %qT without non-static data members" msgstr "" -#: cp/decl.c:9155 +#: cp/decl.c:9167 #, gcc-internal-format msgid "non-local variable %qD declared %<__thread%> needs dynamic initialization" msgstr "" -#: cp/decl.c:9158 +#: cp/decl.c:9170 #, gcc-internal-format msgid "non-local variable %qD declared %<__thread%> has a non-trivial destructor" msgstr "" -#: cp/decl.c:9163 +#: cp/decl.c:9175 #, gcc-internal-format msgid "C++11 % allows dynamic initialization and destruction" msgstr "" -#: cp/decl.c:9400 +#: cp/decl.c:9412 #, gcc-internal-format msgid "initializer fails to determine size of %qT" msgstr "" -#: cp/decl.c:9404 +#: cp/decl.c:9416 #, fuzzy, gcc-internal-format #| msgid "array size missing in `%D'" msgid "array size missing in %qT" msgstr "прапушчан памер масіва ў `%D'" -#: cp/decl.c:9407 +#: cp/decl.c:9419 #, fuzzy, gcc-internal-format #| msgid "zero-size array `%D'" msgid "zero-size array %qT" msgstr "нулявы памер масіва `%D'" -#: cp/decl.c:9423 +#: cp/decl.c:9435 #, gcc-internal-format msgid "destructor for alien class %qT cannot be a member" msgstr "" -#: cp/decl.c:9425 +#: cp/decl.c:9437 #, gcc-internal-format msgid "constructor for alien class %qT cannot be a member" msgstr "" -#: cp/decl.c:9451 +#: cp/decl.c:9463 #, gcc-internal-format msgid "%qD declared as a % variable" msgstr "" -#: cp/decl.c:9453 +#: cp/decl.c:9465 #, gcc-internal-format msgid "% and % function specifiers on %qD invalid in variable declaration" msgstr "" -#: cp/decl.c:9459 +#: cp/decl.c:9471 #, gcc-internal-format msgid "%qD declared as a % parameter" msgstr "" -#: cp/decl.c:9462 +#: cp/decl.c:9474 #, gcc-internal-format msgid "%qD declared as an % parameter" msgstr "" -#: cp/decl.c:9464 +#: cp/decl.c:9476 #, gcc-internal-format msgid "% and % function specifiers on %qD invalid in parameter declaration" msgstr "" -#: cp/decl.c:9470 +#: cp/decl.c:9482 #, gcc-internal-format msgid "%qD declared as a % type" msgstr "" -#: cp/decl.c:9473 +#: cp/decl.c:9485 #, gcc-internal-format msgid "%qD declared as an % type" msgstr "" -#: cp/decl.c:9475 +#: cp/decl.c:9487 #, gcc-internal-format msgid "% and % function specifiers on %qD invalid in type declaration" msgstr "" -#: cp/decl.c:9481 +#: cp/decl.c:9493 #, gcc-internal-format msgid "%qD declared as a % field" msgstr "" -#: cp/decl.c:9484 +#: cp/decl.c:9496 #, gcc-internal-format msgid "%qD declared as an % field" msgstr "" -#: cp/decl.c:9486 +#: cp/decl.c:9498 #, gcc-internal-format msgid "% and % function specifiers on %qD invalid in field declaration" msgstr "" -#: cp/decl.c:9493 +#: cp/decl.c:9505 #, gcc-internal-format msgid "%q+D declared as a friend" msgstr "" -#: cp/decl.c:9500 +#: cp/decl.c:9512 #, fuzzy, gcc-internal-format msgid "%q+D declared with an exception specification" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:9532 +#: cp/decl.c:9544 #, gcc-internal-format msgid "definition of %qD is not in namespace enclosing %qT" msgstr "" -#: cp/decl.c:9572 +#: cp/decl.c:9584 #, gcc-internal-format msgid "static member function %q#D declared with type qualifiers" msgstr "" -#: cp/decl.c:9583 +#: cp/decl.c:9595 #, gcc-internal-format msgid "concept %q#D declared with function parameters" msgstr "" -#: cp/decl.c:9590 +#: cp/decl.c:9602 #, gcc-internal-format msgid "concept %q#D declared with a deduced return type" msgstr "" -#: cp/decl.c:9593 +#: cp/decl.c:9605 #, gcc-internal-format msgid "concept %q#D with non-% return type %qT" msgstr "" -#: cp/decl.c:9669 +#: cp/decl.c:9681 #, gcc-internal-format msgid "concept %qD has no definition" msgstr "" -#: cp/decl.c:9691 +#: cp/decl.c:9703 #, fuzzy, gcc-internal-format #| msgid "virtual functions cannot be friends" msgid "a function concept cannot be constrained" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:9701 +#: cp/decl.c:9713 #, gcc-internal-format msgid "constraints on a non-templated function" msgstr "" -#: cp/decl.c:9746 +#: cp/decl.c:9758 #, fuzzy, gcc-internal-format msgid "defining explicit specialization %qD in friend declaration" msgstr "ініцыялізацыя" -#: cp/decl.c:9757 +#: cp/decl.c:9769 #, fuzzy, gcc-internal-format msgid "invalid use of template-id %qD in declaration of primary template" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:9776 +#: cp/decl.c:9788 #, gcc-internal-format msgid "default arguments are not allowed in declaration of friend template specialization %qD" msgstr "" -#: cp/decl.c:9785 +#: cp/decl.c:9797 #, gcc-internal-format msgid "% is not allowed in declaration of friend template specialization %qD" msgstr "" -#: cp/decl.c:9802 +#: cp/decl.c:9814 #, gcc-internal-format msgid "friend declaration of %qD specifies default arguments and isn%'t a definition" msgstr "" -#: cp/decl.c:9847 +#: cp/decl.c:9859 #, gcc-internal-format msgid "cannot declare %<::main%> to be a template" msgstr "" -#: cp/decl.c:9850 +#: cp/decl.c:9862 #, gcc-internal-format msgid "cannot declare %<::main%> to be inline" msgstr "" -#: cp/decl.c:9853 cp/decl.c:9856 +#: cp/decl.c:9865 cp/decl.c:9868 #, gcc-internal-format msgid "cannot declare %<::main%> to be %qs" msgstr "" -#: cp/decl.c:9858 +#: cp/decl.c:9870 #, gcc-internal-format msgid "cannot declare %<::main%> to be static" msgstr "" -#: cp/decl.c:9920 +#: cp/decl.c:9932 #, gcc-internal-format msgid "static member function %qD cannot have cv-qualifier" msgstr "" -#: cp/decl.c:9921 +#: cp/decl.c:9933 #, gcc-internal-format msgid "non-member function %qD cannot have cv-qualifier" msgstr "" -#: cp/decl.c:9929 +#: cp/decl.c:9941 #, gcc-internal-format msgid "static member function %qD cannot have ref-qualifier" msgstr "" -#: cp/decl.c:9930 +#: cp/decl.c:9942 #, gcc-internal-format msgid "non-member function %qD cannot have ref-qualifier" msgstr "" -#: cp/decl.c:9940 +#: cp/decl.c:9952 #, gcc-internal-format msgid "deduction guide %qD must be declared at namespace scope" msgstr "" -#: cp/decl.c:9948 +#: cp/decl.c:9960 #, gcc-internal-format msgid "deduction guide %qD must be declared in the same scope as %qT" msgstr "" -#: cp/decl.c:9955 +#: cp/decl.c:9967 #, gcc-internal-format msgid "deduction guide %qD must not have a function body" msgstr "" -#: cp/decl.c:9968 +#: cp/decl.c:9980 #, gcc-internal-format msgid "literal operator with C linkage" msgstr "" -#: cp/decl.c:9978 +#: cp/decl.c:9990 #, fuzzy, gcc-internal-format msgid "%qD has invalid argument list" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:9986 +#: cp/decl.c:9998 #, gcc-internal-format msgid "integer suffix %qs shadowed by implementation" msgstr "" -#: cp/decl.c:9992 +#: cp/decl.c:10004 #, gcc-internal-format msgid "floating-point suffix %qs shadowed by implementation" msgstr "" -#: cp/decl.c:9999 +#: cp/decl.c:10011 #, gcc-internal-format msgid "literal operator suffixes not preceded by %<_%> are reserved for future standardization" msgstr "" -#: cp/decl.c:10004 +#: cp/decl.c:10016 #, gcc-internal-format msgid "%qD must be a non-member function" msgstr "" -#: cp/decl.c:10087 +#: cp/decl.c:10099 #, fuzzy, gcc-internal-format #| msgid "`main' must return `int'" msgid "%<::main%> must return %" msgstr "`main' павінна вяртаць `int'" -#: cp/decl.c:10127 +#: cp/decl.c:10139 #, gcc-internal-format msgid "definition of implicitly-declared %qD" msgstr "" -#: cp/decl.c:10132 +#: cp/decl.c:10144 #, gcc-internal-format msgid "definition of explicitly-defaulted %q+D" msgstr "" -#: cp/decl.c:10134 +#: cp/decl.c:10146 #, fuzzy, gcc-internal-format msgid "%q#D explicitly defaulted here" msgstr "ініцыялізацыя" -#: cp/decl.c:10151 +#: cp/decl.c:10163 #, gcc-internal-format msgid "no %q#D member function declared in class %qT" msgstr "" -#: cp/decl.c:10344 +#: cp/decl.c:10356 #, gcc-internal-format msgid "cannot declare %<::main%> to be a global variable" msgstr "" -#: cp/decl.c:10353 +#: cp/decl.c:10365 #, fuzzy, gcc-internal-format msgid "a non-template variable cannot be %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:10360 +#: cp/decl.c:10371 +#, gcc-internal-format +msgid "concept must be defined at namespace scope" +msgstr "" + +#: cp/decl.c:10378 #, gcc-internal-format msgid "concept must have type %" msgstr "" -#: cp/decl.c:10363 +#: cp/decl.c:10381 #, fuzzy, gcc-internal-format #| msgid "virtual functions cannot be friends" msgid "a variable concept cannot be constrained" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:10487 +#: cp/decl.c:10505 #, gcc-internal-format msgid "in-class initialization of static data member %q#D of incomplete type" msgstr "" -#: cp/decl.c:10491 +#: cp/decl.c:10509 #, gcc-internal-format msgid "% needed for in-class initialization of static data member %q#D of non-integral type" msgstr "" -#: cp/decl.c:10495 +#: cp/decl.c:10513 #, gcc-internal-format msgid "in-class initialization of static data member %q#D of non-literal type" msgstr "" -#: cp/decl.c:10506 +#: cp/decl.c:10524 #, gcc-internal-format msgid "invalid in-class initialization of static data member of non-integral type %qT" msgstr "" -#: cp/decl.c:10511 +#: cp/decl.c:10529 #, gcc-internal-format msgid "ISO C++ forbids in-class initialization of non-const static member %qD" msgstr "" -#: cp/decl.c:10516 +#: cp/decl.c:10534 #, gcc-internal-format msgid "ISO C++ forbids initialization of member constant %qD of non-integral type %qT" msgstr "" -#: cp/decl.c:10627 +#: cp/decl.c:10645 #, fuzzy, gcc-internal-format #| msgid "size of array `%D' has non-integer type" msgid "size of array %qD has non-integral type %qT" msgstr "памер масіва `%D' не цэлалікавы тып" -#: cp/decl.c:10630 +#: cp/decl.c:10648 #, fuzzy, gcc-internal-format msgid "size of array has non-integral type %qT" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:10661 cp/decl.c:10733 +#: cp/decl.c:10679 cp/decl.c:10751 #, fuzzy, gcc-internal-format msgid "size of array %qD is not an integral constant-expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:10665 cp/decl.c:10736 +#: cp/decl.c:10683 cp/decl.c:10754 #, gcc-internal-format msgid "size of array is not an integral constant-expression" msgstr "" -#: cp/decl.c:10716 +#: cp/decl.c:10734 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids zero-size array %qD" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:10719 +#: cp/decl.c:10737 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids zero-size array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:10743 +#: cp/decl.c:10761 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids variable length array %qD" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:10746 +#: cp/decl.c:10764 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids variable length array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:10752 +#: cp/decl.c:10770 #, gcc-internal-format msgid "variable length array %qD is used" msgstr "" -#: cp/decl.c:10755 +#: cp/decl.c:10773 #, gcc-internal-format msgid "variable length array is used" msgstr "" -#: cp/decl.c:10807 +#: cp/decl.c:10825 #, gcc-internal-format msgid "overflow in array dimension" msgstr "" -#: cp/decl.c:10867 +#: cp/decl.c:10885 #, gcc-internal-format msgid "%qD declared as array of %qT" msgstr "" -#: cp/decl.c:10869 cp/pt.c:15991 +#: cp/decl.c:10887 cp/pt.c:16074 #, gcc-internal-format msgid "creating array of %qT" msgstr "" -#: cp/decl.c:10879 +#: cp/decl.c:10897 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %qD as array of void" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:10881 +#: cp/decl.c:10899 #, gcc-internal-format msgid "creating array of void" msgstr "" -#: cp/decl.c:10886 +#: cp/decl.c:10904 #, gcc-internal-format msgid "declaration of %qD as array of functions" msgstr "" -#: cp/decl.c:10888 +#: cp/decl.c:10906 #, gcc-internal-format msgid "creating array of functions" msgstr "" -#: cp/decl.c:10893 +#: cp/decl.c:10911 #, gcc-internal-format msgid "declaration of %qD as array of references" msgstr "" -#: cp/decl.c:10895 +#: cp/decl.c:10913 #, gcc-internal-format msgid "creating array of references" msgstr "" -#: cp/decl.c:10900 +#: cp/decl.c:10918 #, gcc-internal-format msgid "declaration of %qD as array of function members" msgstr "" -#: cp/decl.c:10903 +#: cp/decl.c:10921 #, gcc-internal-format msgid "creating array of function members" msgstr "" -#: cp/decl.c:10921 +#: cp/decl.c:10939 #, gcc-internal-format msgid "declaration of %qD as multidimensional array must have bounds for all dimensions except the first" msgstr "" -#: cp/decl.c:10925 +#: cp/decl.c:10943 #, gcc-internal-format msgid "multidimensional array must have bounds for all dimensions except the first" msgstr "" -#: cp/decl.c:11007 +#: cp/decl.c:11025 #, gcc-internal-format msgid "return type specification for constructor invalid" msgstr "" -#: cp/decl.c:11010 +#: cp/decl.c:11028 #, fuzzy, gcc-internal-format msgid "qualifiers are not allowed on constructor declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/decl.c:11021 +#: cp/decl.c:11039 #, gcc-internal-format msgid "return type specification for destructor invalid" msgstr "" -#: cp/decl.c:11024 +#: cp/decl.c:11042 #, fuzzy, gcc-internal-format msgid "qualifiers are not allowed on destructor declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/decl.c:11037 +#: cp/decl.c:11055 #, gcc-internal-format msgid "return type specified for %" msgstr "" -#: cp/decl.c:11040 +#: cp/decl.c:11058 #, gcc-internal-format msgid "qualifiers are not allowed on declaration of %" msgstr "" -#: cp/decl.c:11049 +#: cp/decl.c:11067 #, gcc-internal-format msgid "return type specified for deduction guide" msgstr "" -#: cp/decl.c:11052 +#: cp/decl.c:11070 #, gcc-internal-format msgid "qualifiers are not allowed on declaration of deduction guide" msgstr "" -#: cp/decl.c:11056 +#: cp/decl.c:11074 #, gcc-internal-format msgid "template template parameter %qT in declaration of deduction guide" msgstr "" -#: cp/decl.c:11065 +#: cp/decl.c:11083 #, gcc-internal-format msgid "% in declaration of deduction guide" msgstr "" -#: cp/decl.c:11086 +#: cp/decl.c:11104 #, gcc-internal-format msgid "unnamed variable or field declared void" msgstr "" -#: cp/decl.c:11094 +#: cp/decl.c:11112 #, gcc-internal-format msgid "variable or field declared void" msgstr "" -#: cp/decl.c:11109 +#: cp/decl.c:11127 #, gcc-internal-format msgid "% specifier invalid for variable %qD declared at block scope" msgstr "" -#: cp/decl.c:11114 +#: cp/decl.c:11132 #, gcc-internal-format msgid "inline variables are only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/decl.c:11361 +#: cp/decl.c:11379 #, fuzzy, gcc-internal-format msgid "invalid use of qualified-name %<::%D%>" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:11364 cp/decl.c:11386 +#: cp/decl.c:11382 cp/decl.c:11404 #, fuzzy, gcc-internal-format msgid "invalid use of qualified-name %<%T::%D%>" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:11367 +#: cp/decl.c:11385 #, fuzzy, gcc-internal-format msgid "invalid use of qualified-name %<%D::%D%>" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:11377 +#: cp/decl.c:11395 #, gcc-internal-format msgid "%q#T is not a class or namespace" msgstr "" -#: cp/decl.c:11401 +#: cp/decl.c:11419 #, fuzzy, gcc-internal-format msgid "declaration of %qE as non-function" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:11408 +#: cp/decl.c:11426 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %qE as non-member" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:11436 +#: cp/decl.c:11454 #, gcc-internal-format msgid "declarator-id missing; using reserved word %qD" msgstr "" -#: cp/decl.c:11487 +#: cp/decl.c:11505 #, gcc-internal-format msgid "function definition does not declare parameters" msgstr "" -#: cp/decl.c:11495 cp/decl.c:11504 cp/decl.c:13312 +#: cp/decl.c:11513 cp/decl.c:11522 cp/decl.c:13330 #, fuzzy, gcc-internal-format msgid "declaration of %qD as non-function" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:11512 +#: cp/decl.c:11530 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %qD as %" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:11517 +#: cp/decl.c:11535 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %qD as parameter" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:11552 +#: cp/decl.c:11570 #, gcc-internal-format msgid "both %qs and %qs specified" msgstr "" -#: cp/decl.c:11559 cp/decl.c:11566 cp/decl.c:11573 cp/decl.c:11580 +#: cp/decl.c:11577 cp/decl.c:11584 cp/decl.c:11591 cp/decl.c:11598 #, fuzzy, gcc-internal-format #| msgid "`%s' is not at beginning of declaration" msgid "%qs cannot appear in a typedef declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/decl.c:11591 +#: cp/decl.c:11609 #, gcc-internal-format msgid "can use at most one of the % and % specifiers" msgstr "" -#: cp/decl.c:11601 +#: cp/decl.c:11619 #, fuzzy, gcc-internal-format msgid "two or more data types in declaration of %qs" msgstr "пустое абвяшчэнне" -#: cp/decl.c:11609 +#: cp/decl.c:11627 #, fuzzy, gcc-internal-format #| msgid "conflicts with previous declaration `%#D'" msgid "conflicting specifiers in declaration of %qs" msgstr "канфлікт з папярэднім абвяшчэньнем `%#D'" -#: cp/decl.c:11656 +#: cp/decl.c:11674 #, fuzzy, gcc-internal-format #| msgid "ISO C does not support plain `complex' meaning `double complex'" msgid "ISO C++ does not support plain % meaning %" msgstr "ISO C не падтрымлівае просты \"complex\" у значэнні \"double complex\"" -#: cp/decl.c:11705 cp/decl.c:11709 cp/decl.c:11712 +#: cp/decl.c:11723 cp/decl.c:11727 cp/decl.c:11730 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids declaration of %qs with no type" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:11729 +#: cp/decl.c:11747 #, fuzzy, gcc-internal-format #| msgid "__builtin_saveregs not supported by this target" msgid "%<__int%d%> is not supported by this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: cp/decl.c:11737 +#: cp/decl.c:11755 #, fuzzy, gcc-internal-format #| msgid "ISO C++ does not support `long long'" msgid "ISO C++ does not support %<__int%d%> for %qs" msgstr "ISO C++ не падтрымлівае \"long long\"" -#: cp/decl.c:11791 +#: cp/decl.c:11809 #, gcc-internal-format msgid "% and % specified together" msgstr "" -#: cp/decl.c:11797 +#: cp/decl.c:11815 #, gcc-internal-format msgid "% and % specified together" msgstr "" -#: cp/decl.c:11805 cp/decl.c:11811 +#: cp/decl.c:11823 cp/decl.c:11829 #, gcc-internal-format msgid "%qs specified with %qT" msgstr "" -#: cp/decl.c:11816 +#: cp/decl.c:11834 #, gcc-internal-format msgid "%qs specified with %" msgstr "" -#: cp/decl.c:11818 +#: cp/decl.c:11836 #, gcc-internal-format msgid "%qs specified with %" msgstr "" -#: cp/decl.c:11885 +#: cp/decl.c:11903 #, fuzzy, gcc-internal-format #| msgid "complex invalid for `%s'" msgid "complex invalid for %qs" msgstr "complex нерэчаісны для \"%s\"" -#: cp/decl.c:11924 +#: cp/decl.c:11942 #, gcc-internal-format msgid "template placeholder type %qT must be followed by a simple declarator-id" msgstr "" -#: cp/decl.c:11945 +#: cp/decl.c:11963 #, gcc-internal-format msgid "member %qD cannot be declared both % and %" msgstr "" -#: cp/decl.c:11954 +#: cp/decl.c:11972 #, gcc-internal-format msgid "member %qD can be declared both % and % only in %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/decl.c:11967 +#: cp/decl.c:11985 #, gcc-internal-format msgid "typedef declaration invalid in parameter declaration" msgstr "" -#: cp/decl.c:11974 +#: cp/decl.c:11992 #, gcc-internal-format msgid "storage class specified for template parameter %qs" msgstr "" -#: cp/decl.c:11984 cp/decl.c:12156 +#: cp/decl.c:12002 cp/decl.c:12174 #, gcc-internal-format msgid "storage class specified for parameter %qs" msgstr "" -#: cp/decl.c:11992 cp/decl.c:12001 cp/decl.c:12007 cp/decl.c:12013 +#: cp/decl.c:12010 cp/decl.c:12019 cp/decl.c:12025 cp/decl.c:12031 #, fuzzy, gcc-internal-format msgid "a parameter cannot be declared %qs" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:12023 +#: cp/decl.c:12041 #, fuzzy, gcc-internal-format #| msgid "Invalid declaration" msgid "% outside class declaration" msgstr "Нерэчаіснае абвяшчэнне" -#: cp/decl.c:12033 cp/decl.c:12036 cp/decl.c:12038 cp/decl.c:12041 -#: cp/decl.c:12051 cp/decl.c:12061 cp/decl.c:12071 cp/decl.c:12075 +#: cp/decl.c:12051 cp/decl.c:12054 cp/decl.c:12056 cp/decl.c:12059 +#: cp/decl.c:12069 cp/decl.c:12079 cp/decl.c:12089 cp/decl.c:12093 #, gcc-internal-format msgid "structured binding declaration cannot be %qs" msgstr "" -#: cp/decl.c:12045 cp/decl.c:12067 +#: cp/decl.c:12063 cp/decl.c:12085 #, gcc-internal-format msgid "structured binding declaration can be %qs only in %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/decl.c:12055 +#: cp/decl.c:12073 #, gcc-internal-format msgid "%-qualified structured binding is deprecated" msgstr "" -#: cp/decl.c:12079 +#: cp/decl.c:12097 #, gcc-internal-format msgid "structured binding declaration cannot be C++98 %" msgstr "" -#: cp/decl.c:12090 +#: cp/decl.c:12108 #, gcc-internal-format msgid "structured binding declaration cannot have type %qT" msgstr "" -#: cp/decl.c:12093 +#: cp/decl.c:12111 #, gcc-internal-format msgid "type must be cv-qualified % or reference to cv-qualified %" msgstr "" -#: cp/decl.c:12128 +#: cp/decl.c:12146 #, fuzzy, gcc-internal-format #| msgid "duplicate label declaration `%s'" msgid "multiple storage classes in declaration of %qs" msgstr "паўторнае абвяшчэньне адмеціны `%s'" -#: cp/decl.c:12154 +#: cp/decl.c:12172 #, gcc-internal-format msgid "storage class specified for %qs" msgstr "" -#: cp/decl.c:12168 +#: cp/decl.c:12186 #, gcc-internal-format msgid "nested function %qs declared %" msgstr "" -#: cp/decl.c:12173 +#: cp/decl.c:12191 #, gcc-internal-format msgid "top-level declaration of %qs specifies %" msgstr "" -#: cp/decl.c:12181 +#: cp/decl.c:12199 #, gcc-internal-format msgid "function-scope %qs implicitly auto and declared %<__thread%>" msgstr "" -#: cp/decl.c:12195 +#: cp/decl.c:12213 #, gcc-internal-format msgid "storage class specifiers invalid in friend function declarations" msgstr "" -#: cp/decl.c:12226 +#: cp/decl.c:12244 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "attribute ignored" msgstr "\"%s\" атрыбут ігнарыруецца" -#: cp/decl.c:12227 +#: cp/decl.c:12245 #, gcc-internal-format msgid "an attribute that appertains to a type-specifier is ignored" msgstr "" -#: cp/decl.c:12285 +#: cp/decl.c:12303 #, fuzzy, gcc-internal-format msgid "unnecessary parentheses in declaration of %qs" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:12291 +#: cp/decl.c:12309 #, gcc-internal-format msgid "remove parentheses" msgstr "" -#: cp/decl.c:12340 +#: cp/decl.c:12358 #, gcc-internal-format msgid "requires-clause on return type" msgstr "" -#: cp/decl.c:12360 +#: cp/decl.c:12378 #, gcc-internal-format msgid "%qs function uses % type specifier without trailing return type" msgstr "" -#: cp/decl.c:12364 +#: cp/decl.c:12382 #, gcc-internal-format msgid "deduced return type only available with %<-std=c++14%> or %<-std=gnu++14%>" msgstr "" -#: cp/decl.c:12369 +#: cp/decl.c:12387 #, fuzzy, gcc-internal-format #| msgid "virtual functions cannot be friends" msgid "virtual function cannot have deduced return type" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:12376 +#: cp/decl.c:12394 #, gcc-internal-format msgid "%qs function with trailing return type has %qT as its type rather than plain %" msgstr "" -#: cp/decl.c:12385 +#: cp/decl.c:12403 #, gcc-internal-format msgid "%qs function with trailing return type has % as its type rather than plain %" msgstr "" -#: cp/decl.c:12390 +#: cp/decl.c:12408 #, fuzzy, gcc-internal-format msgid "invalid use of %" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:12401 +#: cp/decl.c:12419 #, gcc-internal-format msgid "deduced class type %qD in function return type" msgstr "" -#: cp/decl.c:12410 +#: cp/decl.c:12428 #, gcc-internal-format msgid "deduction guide for %qT must have trailing return type" msgstr "" -#: cp/decl.c:12423 +#: cp/decl.c:12441 #, gcc-internal-format msgid "trailing return type %qT of deduction guide is not a specialization of %qT" msgstr "" -#: cp/decl.c:12437 +#: cp/decl.c:12455 #, gcc-internal-format msgid "trailing return type only available with %<-std=c++11%> or %<-std=gnu++11%>" msgstr "" -#: cp/decl.c:12440 +#: cp/decl.c:12458 #, gcc-internal-format msgid "%qs function with trailing return type not declared with % type specifier" msgstr "" -#: cp/decl.c:12464 +#: cp/decl.c:12482 #, gcc-internal-format msgid "%-qualified return type is deprecated" msgstr "" -#: cp/decl.c:12476 +#: cp/decl.c:12494 #, fuzzy, gcc-internal-format #| msgid "`%s' undeclared (first use in this function)" msgid "%qs declared as function returning a function" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:12482 +#: cp/decl.c:12500 #, gcc-internal-format msgid "%qs declared as function returning an array" msgstr "" -#: cp/decl.c:12489 +#: cp/decl.c:12507 #, gcc-internal-format msgid "% on function return type is not allowed" msgstr "" -#: cp/decl.c:12500 cp/pt.c:29580 +#: cp/decl.c:12518 cp/pt.c:29643 #, gcc-internal-format msgid "%qT as type rather than plain %" msgstr "" -#: cp/decl.c:12506 cp/pt.c:29586 +#: cp/decl.c:12524 cp/pt.c:29649 #, gcc-internal-format msgid "% cannot be cv-qualified" msgstr "" -#: cp/decl.c:12538 +#: cp/decl.c:12556 #, gcc-internal-format msgid "destructor cannot be static member function" msgstr "" -#: cp/decl.c:12540 +#: cp/decl.c:12558 #, gcc-internal-format msgid "constructor cannot be static member function" msgstr "" -#: cp/decl.c:12545 +#: cp/decl.c:12563 #, gcc-internal-format msgid "destructors may not be cv-qualified" msgstr "" -#: cp/decl.c:12546 +#: cp/decl.c:12564 #, gcc-internal-format msgid "constructors may not be cv-qualified" msgstr "" -#: cp/decl.c:12554 +#: cp/decl.c:12572 #, gcc-internal-format msgid "destructors may not be ref-qualified" msgstr "" -#: cp/decl.c:12555 +#: cp/decl.c:12573 #, gcc-internal-format msgid "constructors may not be ref-qualified" msgstr "" -#: cp/decl.c:12573 +#: cp/decl.c:12591 #, fuzzy, gcc-internal-format msgid "constructors cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:12590 +#: cp/decl.c:12608 #, gcc-internal-format msgid "virtual functions cannot be friends" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:12595 +#: cp/decl.c:12613 #, gcc-internal-format msgid "friend declaration not in class definition" msgstr "" -#: cp/decl.c:12599 +#: cp/decl.c:12617 #, fuzzy, gcc-internal-format msgid "cannot define friend function %qs in a local class definition" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/decl.c:12609 +#: cp/decl.c:12627 #, gcc-internal-format msgid "friend function definition %qs cannot have a name qualified with %<::%>" msgstr "" -#: cp/decl.c:12613 +#: cp/decl.c:12631 #, gcc-internal-format msgid "friend function definition %qs cannot have a name qualified with %<%D::%>" msgstr "" -#: cp/decl.c:12626 +#: cp/decl.c:12644 #, gcc-internal-format msgid "a conversion function cannot have a trailing return type" msgstr "" -#: cp/decl.c:12653 +#: cp/decl.c:12671 #, gcc-internal-format msgid "destructors may not have parameters" msgstr "" -#: cp/decl.c:12693 +#: cp/decl.c:12711 #, fuzzy, gcc-internal-format msgid "cannot declare pointer to %q#T" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:12706 cp/decl.c:12713 +#: cp/decl.c:12724 cp/decl.c:12731 #, fuzzy, gcc-internal-format msgid "cannot declare reference to %q#T" msgstr "Не магу знайсці файл для класа %s." -#: cp/decl.c:12715 +#: cp/decl.c:12733 #, gcc-internal-format msgid "cannot declare pointer to %q#T member" msgstr "" -#: cp/decl.c:12744 +#: cp/decl.c:12762 #, gcc-internal-format msgid "cannot declare reference to qualified function type %qT" msgstr "" -#: cp/decl.c:12745 +#: cp/decl.c:12763 #, fuzzy, gcc-internal-format msgid "cannot declare pointer to qualified function type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:12818 +#: cp/decl.c:12836 #, gcc-internal-format msgid "cannot declare reference to %q#T, which is not a typedef or a template type argument" msgstr "" -#: cp/decl.c:12889 +#: cp/decl.c:12907 #, gcc-internal-format msgid "template-id %qD used as a declarator" msgstr "" -#: cp/decl.c:12915 +#: cp/decl.c:12933 #, gcc-internal-format msgid "member functions are implicitly friends of their class" msgstr "" -#: cp/decl.c:12920 +#: cp/decl.c:12938 #, gcc-internal-format msgid "extra qualification %<%T::%> on member %qs" msgstr "" -#: cp/decl.c:12950 +#: cp/decl.c:12968 #, gcc-internal-format msgid "cannot define member function %<%T::%s%> within %qT" msgstr "" -#: cp/decl.c:12952 +#: cp/decl.c:12970 #, gcc-internal-format msgid "cannot declare member function %<%T::%s%> within %qT" msgstr "" -#: cp/decl.c:12960 +#: cp/decl.c:12978 #, gcc-internal-format msgid "cannot declare member %<%T::%s%> within %qT" msgstr "" -#: cp/decl.c:13000 +#: cp/decl.c:13018 #, gcc-internal-format msgid "non-parameter %qs cannot be a parameter pack" msgstr "" -#: cp/decl.c:13009 +#: cp/decl.c:13027 #, gcc-internal-format msgid "data member may not have variably modified type %qT" msgstr "" -#: cp/decl.c:13012 +#: cp/decl.c:13030 #, gcc-internal-format msgid "parameter may not have variably modified type %qT" msgstr "" -#: cp/decl.c:13023 +#: cp/decl.c:13041 #, fuzzy, gcc-internal-format #| msgid "duplicate label declaration `%s'" msgid "% outside class declaration" msgstr "паўторнае абвяшчэньне адмеціны `%s'" -#: cp/decl.c:13026 +#: cp/decl.c:13044 #, fuzzy, gcc-internal-format msgid "% in friend declaration" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:13029 +#: cp/decl.c:13047 #, gcc-internal-format msgid "only declarations of constructors and conversion operators can be %" msgstr "" -#: cp/decl.c:13039 +#: cp/decl.c:13057 #, fuzzy, gcc-internal-format msgid "non-member %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:13046 +#: cp/decl.c:13064 #, gcc-internal-format msgid "non-object member %qs cannot be declared %" msgstr "" -#: cp/decl.c:13052 +#: cp/decl.c:13070 #, fuzzy, gcc-internal-format msgid "function %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:13058 +#: cp/decl.c:13076 #, gcc-internal-format msgid "% %qs cannot be declared %" msgstr "" -#: cp/decl.c:13064 +#: cp/decl.c:13082 #, fuzzy, gcc-internal-format msgid "% %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:13070 +#: cp/decl.c:13088 #, fuzzy, gcc-internal-format msgid "reference %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:13086 +#: cp/decl.c:13104 #, gcc-internal-format msgid "typedef may not be a function definition" msgstr "" -#: cp/decl.c:13089 +#: cp/decl.c:13107 #, gcc-internal-format msgid "typedef may not be a member function definition" msgstr "" -#: cp/decl.c:13115 +#: cp/decl.c:13133 #, fuzzy, gcc-internal-format msgid "% not allowed in alias declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/decl.c:13118 +#: cp/decl.c:13136 #, gcc-internal-format msgid "typedef declared %" msgstr "" -#: cp/decl.c:13123 +#: cp/decl.c:13141 #, gcc-internal-format msgid "requires-clause on typedef" msgstr "" -#: cp/decl.c:13127 +#: cp/decl.c:13145 #, gcc-internal-format msgid "typedef name may not be a nested-name-specifier" msgstr "" -#: cp/decl.c:13153 +#: cp/decl.c:13171 #, gcc-internal-format msgid "ISO C++ forbids nested type %qD with same name as enclosing class" msgstr "" -#: cp/decl.c:13242 +#: cp/decl.c:13260 #, fuzzy, gcc-internal-format msgid "% specified for friend class declaration" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:13250 +#: cp/decl.c:13268 #, fuzzy, gcc-internal-format msgid "template parameters cannot be friends" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:13252 +#: cp/decl.c:13270 #, gcc-internal-format msgid "friend declaration requires class-key, i.e. %" msgstr "" -#: cp/decl.c:13256 +#: cp/decl.c:13274 #, gcc-internal-format msgid "friend declaration requires class-key, i.e. %" msgstr "" -#: cp/decl.c:13269 +#: cp/decl.c:13287 #, gcc-internal-format msgid "trying to make class %qT a friend of global scope" msgstr "" -#: cp/decl.c:13289 +#: cp/decl.c:13307 #, gcc-internal-format msgid "invalid qualifiers on non-member function type" msgstr "" -#: cp/decl.c:13293 +#: cp/decl.c:13311 #, gcc-internal-format msgid "requires-clause on type-id" msgstr "" -#: cp/decl.c:13303 +#: cp/decl.c:13321 #, gcc-internal-format msgid "abstract declarator %qT used as declaration" msgstr "" -#: cp/decl.c:13318 +#: cp/decl.c:13336 #, fuzzy, gcc-internal-format msgid "requires-clause on declaration of non-function type %qT" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:13337 +#: cp/decl.c:13355 #, fuzzy, gcc-internal-format msgid "cannot use %<::%> in parameter declaration" msgstr "Не магу знайсці дэкларацыю пратакола для \"%s\"" -#: cp/decl.c:13346 cp/parser.c:19160 +#: cp/decl.c:13364 cp/parser.c:19197 #, gcc-internal-format msgid "cannot declare a parameter with %" msgstr "" -#: cp/decl.c:13351 +#: cp/decl.c:13369 #, gcc-internal-format msgid "class template placeholder %qE not permitted in this context" msgstr "" -#: cp/decl.c:13354 +#: cp/decl.c:13372 #, fuzzy, gcc-internal-format msgid "use % for an abbreviated function template" msgstr "\"%s\" звычайна функцыя" -#: cp/decl.c:13359 +#: cp/decl.c:13377 #, gcc-internal-format msgid "% parameter not permitted in this context" msgstr "" -#: cp/decl.c:13362 +#: cp/decl.c:13380 #, fuzzy, gcc-internal-format msgid "parameter declared %" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/decl.c:13413 cp/parser.c:3429 +#: cp/decl.c:13431 cp/parser.c:3429 #, fuzzy, gcc-internal-format msgid "invalid use of template-name %qE without an argument list" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:13417 +#: cp/decl.c:13435 #, gcc-internal-format msgid "non-static data member declared with placeholder %qT" msgstr "" -#: cp/decl.c:13438 +#: cp/decl.c:13456 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids flexible array member %qs" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:13441 +#: cp/decl.c:13459 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids flexible array members" msgstr "ISO C не дазваляе дэкларацыі метак (label)" #. Something like struct S { int N::j; }; -#: cp/decl.c:13457 +#: cp/decl.c:13475 #, fuzzy, gcc-internal-format #| msgid "invalid use of `::'" msgid "invalid use of %<::%>" msgstr "нерэчаіснае выкарыстаньне `::'" -#: cp/decl.c:13478 +#: cp/decl.c:13496 #, fuzzy, gcc-internal-format msgid "declaration of function %qD in invalid context" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:13488 +#: cp/decl.c:13506 #, fuzzy, gcc-internal-format msgid "function %qD declared % inside a union" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:13498 +#: cp/decl.c:13516 #, gcc-internal-format msgid "%qD cannot be declared %, since it is always static" msgstr "" -#: cp/decl.c:13512 +#: cp/decl.c:13530 #, gcc-internal-format msgid "expected qualified name in friend declaration for destructor %qD" msgstr "" -#: cp/decl.c:13519 +#: cp/decl.c:13537 #, fuzzy, gcc-internal-format #| msgid "declaration of template `%#D'" msgid "declaration of %qD as member of %qT" msgstr "абвяшчэньне шаблёну `%#D'" -#: cp/decl.c:13526 cp/decl.c:13539 +#: cp/decl.c:13544 cp/decl.c:13557 #, gcc-internal-format msgid "a destructor cannot be %qs" msgstr "" -#: cp/decl.c:13532 +#: cp/decl.c:13550 #, gcc-internal-format msgid "% destructors only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/decl.c:13545 +#: cp/decl.c:13563 #, gcc-internal-format msgid "expected qualified name in friend declaration for constructor %qD" msgstr "" -#: cp/decl.c:13554 +#: cp/decl.c:13572 #, gcc-internal-format msgid "a constructor cannot be %" msgstr "" -#: cp/decl.c:13560 +#: cp/decl.c:13578 #, fuzzy, gcc-internal-format msgid "a concept cannot be a member function" msgstr "\"%s\" звычайна функцыя" -#: cp/decl.c:13568 cp/decl.c:13898 +#: cp/decl.c:13586 cp/decl.c:13916 #, fuzzy, gcc-internal-format #| msgid "[cannot find %s]" msgid "%qD cannot be %qs" msgstr "[нельга знайсці %s]" -#: cp/decl.c:13577 +#: cp/decl.c:13595 #, gcc-internal-format msgid "specialization of variable template %qD declared as function" msgstr "" -#: cp/decl.c:13580 +#: cp/decl.c:13598 #, fuzzy, gcc-internal-format msgid "variable template declared here" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:13642 +#: cp/decl.c:13660 #, fuzzy, gcc-internal-format msgid "field %qD has incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:13647 +#: cp/decl.c:13665 #, fuzzy, gcc-internal-format msgid "name %qT has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:13667 +#: cp/decl.c:13685 #, fuzzy, gcc-internal-format msgid "%qE is neither function nor member function; cannot be declared friend" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:13670 +#: cp/decl.c:13688 #, gcc-internal-format msgid "unnamed field is neither function nor member function; cannot be declared friend" msgstr "" -#: cp/decl.c:13723 cp/decl.c:13734 +#: cp/decl.c:13741 cp/decl.c:13752 #, gcc-internal-format msgid "static data member %qE declared %qs" msgstr "" -#: cp/decl.c:13728 +#: cp/decl.c:13746 #, gcc-internal-format msgid "% static data member %qD must have an initializer" msgstr "" -#: cp/decl.c:13762 cp/decl.c:13770 cp/decl.c:13777 cp/decl.c:13784 +#: cp/decl.c:13780 cp/decl.c:13788 cp/decl.c:13795 cp/decl.c:13802 #, gcc-internal-format msgid "non-static data member %qE declared %qs" msgstr "" -#: cp/decl.c:13839 +#: cp/decl.c:13857 #, gcc-internal-format msgid "storage class % invalid for function %qs" msgstr "" -#: cp/decl.c:13842 +#: cp/decl.c:13860 #, gcc-internal-format msgid "storage class % invalid for function %qs" msgstr "" -#: cp/decl.c:13848 +#: cp/decl.c:13866 #, gcc-internal-format msgid "storage class %<__thread%> invalid for function %qs" msgstr "" -#: cp/decl.c:13852 +#: cp/decl.c:13870 #, gcc-internal-format msgid "storage class % invalid for function %qs" msgstr "" -#: cp/decl.c:13857 +#: cp/decl.c:13875 #, gcc-internal-format msgid "virt-specifiers in %qs not allowed outside a class definition" msgstr "" -#: cp/decl.c:13869 +#: cp/decl.c:13887 #, gcc-internal-format msgid "% specifier invalid for function %qs declared out of global scope" msgstr "" -#: cp/decl.c:13873 +#: cp/decl.c:13891 #, gcc-internal-format msgid "% specifier invalid for function %qs declared out of global scope" msgstr "" -#: cp/decl.c:13881 +#: cp/decl.c:13899 #, gcc-internal-format msgid "virtual non-class function %qs" msgstr "" -#: cp/decl.c:13888 +#: cp/decl.c:13906 #, gcc-internal-format msgid "%qs defined in a non-class scope" msgstr "" -#: cp/decl.c:13889 +#: cp/decl.c:13907 #, fuzzy, gcc-internal-format msgid "%qs declared in a non-class scope" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:13932 +#: cp/decl.c:13950 #, gcc-internal-format msgid "cannot declare member function %qD to have static linkage" msgstr "" -#: cp/decl.c:13941 +#: cp/decl.c:13959 #, gcc-internal-format msgid "cannot declare static function inside another function" msgstr "" -#: cp/decl.c:13980 +#: cp/decl.c:13998 #, gcc-internal-format msgid "% may not be used when defining (as opposed to declaring) a static data member" msgstr "" -#: cp/decl.c:13987 +#: cp/decl.c:14005 #, gcc-internal-format msgid "static member %qD declared %" msgstr "" -#: cp/decl.c:13993 +#: cp/decl.c:14011 #, gcc-internal-format msgid "cannot explicitly declare member %q#D to have extern linkage" msgstr "" -#: cp/decl.c:14001 +#: cp/decl.c:14019 #, gcc-internal-format msgid "declaration of % variable %qD is not a definition" msgstr "" -#: cp/decl.c:14008 +#: cp/decl.c:14026 #, gcc-internal-format msgid "a variable cannot be declared %" msgstr "" -#: cp/decl.c:14028 +#: cp/decl.c:14046 #, fuzzy, gcc-internal-format msgid "declaration of %q#D has no initializer" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:14040 +#: cp/decl.c:14058 #, gcc-internal-format msgid "%qs initialized and declared %" msgstr "" -#: cp/decl.c:14045 +#: cp/decl.c:14063 #, gcc-internal-format msgid "%qs has both % and initializer" msgstr "" -#: cp/decl.c:14217 +#: cp/decl.c:14235 #, fuzzy, gcc-internal-format msgid "default argument %qE uses %qD" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: cp/decl.c:14220 +#: cp/decl.c:14238 #, fuzzy, gcc-internal-format msgid "default argument %qE uses local variable %qD" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: cp/decl.c:14310 +#: cp/decl.c:14328 #, fuzzy, gcc-internal-format msgid "invalid use of cv-qualified type %qT in parameter declaration" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:14314 +#: cp/decl.c:14332 #, fuzzy, gcc-internal-format msgid "invalid use of type % in parameter declaration" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:14336 +#: cp/decl.c:14354 #, gcc-internal-format msgid "%-qualified parameter is deprecated" msgstr "" -#: cp/decl.c:14344 +#: cp/decl.c:14362 #, fuzzy, gcc-internal-format msgid "parameter %qD invalidly declared method type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/decl.c:14369 +#: cp/decl.c:14387 #, gcc-internal-format msgid "parameter %qD includes pointer to array of unknown bound %qT" msgstr "" -#: cp/decl.c:14371 +#: cp/decl.c:14389 #, gcc-internal-format msgid "parameter %qD includes reference to array of unknown bound %qT" msgstr "" -#: cp/decl.c:14630 +#: cp/decl.c:14648 #, gcc-internal-format msgid "invalid constructor; you probably meant %<%T (const %T&)%>" msgstr "" -#: cp/decl.c:14709 +#: cp/decl.c:14727 #, fuzzy, gcc-internal-format msgid "%qD may not be declared within a namespace" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:14716 +#: cp/decl.c:14734 #, fuzzy, gcc-internal-format msgid "%qD may not be declared as static" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:14746 +#: cp/decl.c:14764 #, gcc-internal-format msgid "%qD must be a non-static member function" msgstr "" -#: cp/decl.c:14752 +#: cp/decl.c:14770 #, gcc-internal-format msgid "%qD must be either a non-static member function or a non-member function" msgstr "" -#: cp/decl.c:14762 +#: cp/decl.c:14780 #, gcc-internal-format msgid "%qD must have an argument of class or enumerated type" msgstr "" #. 13.4.0.3 -#: cp/decl.c:14788 +#: cp/decl.c:14806 #, gcc-internal-format msgid "ISO C++ prohibits overloading %" msgstr "" #. Variadic. -#: cp/decl.c:14799 +#: cp/decl.c:14817 #, gcc-internal-format msgid "%qD must not have variable number of arguments" msgstr "" -#: cp/decl.c:14825 +#: cp/decl.c:14843 #, gcc-internal-format msgid "%qD must have either zero or one argument" msgstr "" -#: cp/decl.c:14826 +#: cp/decl.c:14844 #, gcc-internal-format msgid "%qD must have either one or two arguments" msgstr "" -#: cp/decl.c:14838 +#: cp/decl.c:14856 #, gcc-internal-format msgid "postfix %qD must have % as its argument" msgstr "" -#: cp/decl.c:14839 +#: cp/decl.c:14857 #, gcc-internal-format msgid "postfix %qD must have % as its second argument" msgstr "" -#: cp/decl.c:14850 +#: cp/decl.c:14868 #, fuzzy, gcc-internal-format #| msgid "no arguments" msgid "%qD must have no arguments" msgstr "няма аргументаў" -#: cp/decl.c:14851 cp/decl.c:14861 +#: cp/decl.c:14869 cp/decl.c:14879 #, gcc-internal-format msgid "%qD must have exactly one argument" msgstr "" -#: cp/decl.c:14862 +#: cp/decl.c:14880 #, gcc-internal-format msgid "%qD must have exactly two arguments" msgstr "" -#: cp/decl.c:14876 +#: cp/decl.c:14894 #, fuzzy, gcc-internal-format msgid "%qD cannot have default arguments" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: cp/decl.c:14900 +#: cp/decl.c:14918 #, gcc-internal-format msgid "converting %qT to % will never use a type conversion operator" msgstr "" -#: cp/decl.c:14907 +#: cp/decl.c:14925 #, gcc-internal-format msgid "converting %qT to a reference to the same type will never use a type conversion operator" msgstr "" -#: cp/decl.c:14909 +#: cp/decl.c:14927 #, gcc-internal-format msgid "converting %qT to the same type will never use a type conversion operator" msgstr "" -#: cp/decl.c:14918 +#: cp/decl.c:14936 #, gcc-internal-format msgid "converting %qT to a reference to a base class %qT will never use a type conversion operator" msgstr "" -#: cp/decl.c:14920 +#: cp/decl.c:14938 #, gcc-internal-format msgid "converting %qT to a base class %qT will never use a type conversion operator" msgstr "" -#: cp/decl.c:14936 +#: cp/decl.c:14954 #, gcc-internal-format msgid "user-defined %qD always evaluates both arguments" msgstr "" -#: cp/decl.c:14955 +#: cp/decl.c:14973 #, gcc-internal-format msgid "prefix %qD should return %qT" msgstr "" -#: cp/decl.c:14962 +#: cp/decl.c:14980 #, gcc-internal-format msgid "postfix %qD should return %qT" msgstr "" -#: cp/decl.c:14974 +#: cp/decl.c:14992 #, gcc-internal-format msgid "%qD should return by value" msgstr "" -#: cp/decl.c:15029 +#: cp/decl.c:15047 #, fuzzy, gcc-internal-format msgid "using template type parameter %qT after %qs" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:15052 +#: cp/decl.c:15070 #, gcc-internal-format msgid "using alias template specialization %qT after %qs" msgstr "" -#: cp/decl.c:15055 +#: cp/decl.c:15073 #, gcc-internal-format msgid "using typedef-name %qD after %qs" msgstr "" -#: cp/decl.c:15057 +#: cp/decl.c:15075 #, fuzzy, gcc-internal-format #| msgid "this is a previous declaration" msgid "%qD has a previous declaration here" msgstr "гэта папярэдняе абвяшчэньне" -#: cp/decl.c:15065 +#: cp/decl.c:15083 #, gcc-internal-format msgid "%qT referred to as %qs" msgstr "" -#: cp/decl.c:15066 cp/decl.c:15073 +#: cp/decl.c:15084 cp/decl.c:15091 #, fuzzy, gcc-internal-format #| msgid "this is a previous declaration" msgid "%qT has a previous declaration here" msgstr "гэта папярэдняе абвяшчэньне" -#: cp/decl.c:15072 +#: cp/decl.c:15090 #, gcc-internal-format msgid "%qT referred to as enum" msgstr "" @@ -51262,106 +51306,106 @@ msgstr "" #. void f(class C); // No template header here #. #. then the required template argument is missing. -#: cp/decl.c:15087 +#: cp/decl.c:15105 #, fuzzy, gcc-internal-format msgid "template argument required for %<%s %T%>" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/decl.c:15130 cp/name-lookup.c:5736 cp/name-lookup.c:5871 -#: cp/parser.c:6817 cp/parser.c:29391 +#: cp/decl.c:15148 cp/name-lookup.c:5753 cp/name-lookup.c:5888 +#: cp/parser.c:6817 cp/parser.c:29445 #, fuzzy, gcc-internal-format msgid "reference to %qD is ambiguous" msgstr "памер \"%s\" - %d байт" -#: cp/decl.c:15151 cp/name-lookup.c:5434 +#: cp/decl.c:15169 cp/name-lookup.c:5451 #, gcc-internal-format msgid "%qD has the same name as the class in which it is declared" msgstr "" -#: cp/decl.c:15179 cp/friend.c:302 cp/parser.c:3254 cp/parser.c:6526 -#: cp/pt.c:9740 +#: cp/decl.c:15197 cp/friend.c:302 cp/parser.c:3254 cp/parser.c:6526 +#: cp/pt.c:9764 #, fuzzy, gcc-internal-format msgid "%qT is not a template" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:15184 +#: cp/decl.c:15202 #, gcc-internal-format msgid "perhaps you want to explicitly add %<%T::%>" msgstr "" -#: cp/decl.c:15287 +#: cp/decl.c:15305 #, fuzzy, gcc-internal-format msgid "use of enum %q#D without previous declaration" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: cp/decl.c:15318 +#: cp/decl.c:15336 #, fuzzy, gcc-internal-format #| msgid "declaration of template `%#D'" msgid "redeclaration of %qT as a non-template" msgstr "абвяшчэньне шаблёну `%#D'" -#: cp/decl.c:15329 cp/semantics.c:3336 +#: cp/decl.c:15347 cp/semantics.c:3354 #, gcc-internal-format msgid "cannot declare %qD in a different module" msgstr "" -#: cp/decl.c:15457 +#: cp/decl.c:15475 #, gcc-internal-format msgid "derived union %qT invalid" msgstr "" -#: cp/decl.c:15464 +#: cp/decl.c:15482 #, gcc-internal-format msgid "%qT defined with multiple direct bases" msgstr "" -#: cp/decl.c:15475 +#: cp/decl.c:15493 #, gcc-internal-format msgid "%qT defined with direct virtual base" msgstr "" -#: cp/decl.c:15500 +#: cp/decl.c:15518 #, gcc-internal-format msgid "base type %qT fails to be a struct or class type" msgstr "" -#: cp/decl.c:15530 +#: cp/decl.c:15548 #, gcc-internal-format msgid "recursive type %qT undefined" msgstr "" -#: cp/decl.c:15532 +#: cp/decl.c:15550 #, fuzzy, gcc-internal-format msgid "duplicate base type %qT invalid" msgstr "паўтарэнне \"restrict\"" -#: cp/decl.c:15677 +#: cp/decl.c:15695 #, gcc-internal-format msgid "scoped/unscoped mismatch in enum %q#T" msgstr "" -#: cp/decl.c:15680 cp/decl.c:15688 cp/decl.c:15698 cp/decl.c:16300 -#: cp/parser.c:20064 +#: cp/decl.c:15698 cp/decl.c:15706 cp/decl.c:15716 cp/decl.c:16318 +#: cp/parser.c:20101 #, gcc-internal-format msgid "previous definition here" msgstr "папярэдняе вызначэньне" -#: cp/decl.c:15685 +#: cp/decl.c:15703 #, gcc-internal-format msgid "underlying type mismatch in enum %q#T" msgstr "" -#: cp/decl.c:15695 +#: cp/decl.c:15713 #, gcc-internal-format msgid "different underlying type in enum %q#T" msgstr "" -#: cp/decl.c:15706 +#: cp/decl.c:15724 #, gcc-internal-format msgid "cannot define %qD in different module" msgstr "" -#: cp/decl.c:15780 +#: cp/decl.c:15798 #, gcc-internal-format msgid "underlying type %qT of %qT must be an integral type" msgstr "" @@ -51370,78 +51414,78 @@ msgstr "" #. #. IF no integral type can represent all the enumerator values, the #. enumeration is ill-formed. -#: cp/decl.c:15927 +#: cp/decl.c:15945 #, gcc-internal-format msgid "no integral type can represent all of the enumerator values for %qT" msgstr "" -#: cp/decl.c:16102 +#: cp/decl.c:16120 #, gcc-internal-format msgid "enumerator value for %qD must have integral or unscoped enumeration type" msgstr "" -#: cp/decl.c:16112 +#: cp/decl.c:16130 #, fuzzy, gcc-internal-format msgid "enumerator value for %qD is not an integer constant" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:16161 +#: cp/decl.c:16179 #, gcc-internal-format msgid "incremented enumerator value is too large for %" msgstr "" -#: cp/decl.c:16162 +#: cp/decl.c:16180 #, gcc-internal-format msgid "incremented enumerator value is too large for %" msgstr "" -#: cp/decl.c:16173 +#: cp/decl.c:16191 #, gcc-internal-format msgid "overflow in enumeration values at %qD" msgstr "" -#: cp/decl.c:16193 +#: cp/decl.c:16211 #, gcc-internal-format msgid "enumerator value %qE is outside the range of underlying type %qT" msgstr "" -#: cp/decl.c:16298 cp/parser.c:20062 +#: cp/decl.c:16316 cp/parser.c:20099 #, fuzzy, gcc-internal-format #| msgid "previous definition of `%#T'" msgid "multiple definition of %q#T" msgstr "папярэдняе вызначэньне `%#T'" -#: cp/decl.c:16338 +#: cp/decl.c:16356 #, fuzzy, gcc-internal-format msgid "return type %q#T is incomplete" msgstr "вяртаемы тып \"%s\" не \"int\"" -#: cp/decl.c:16498 cp/typeck.c:10213 +#: cp/decl.c:16516 cp/typeck.c:10220 #, gcc-internal-format msgid "% should return a reference to %<*this%>" msgstr "" -#: cp/decl.c:17347 +#: cp/decl.c:17365 #, gcc-internal-format msgid "no return statements in function returning %qT" msgstr "" -#: cp/decl.c:17349 cp/typeck.c:10093 +#: cp/decl.c:17367 cp/typeck.c:10100 #, gcc-internal-format msgid "only plain % return type can be deduced to %" msgstr "" -#: cp/decl.c:17411 +#: cp/decl.c:17429 #, gcc-internal-format msgid "no return statement in % function returning non-void" msgstr "" -#: cp/decl.c:17593 +#: cp/decl.c:17611 #, fuzzy, gcc-internal-format msgid "%qD is already defined in class %qT" msgstr "не знойдзен клас \"%s\"" -#: cp/decl.c:17984 +#: cp/decl.c:18002 #, gcc-internal-format msgid "use of %qD before deduction of %" msgstr "" @@ -51481,7 +51525,7 @@ msgstr "" msgid "deleting %qT is undefined" msgstr "метка \"%s\" ужываецца, але не вызначана" -#: cp/decl2.c:580 cp/pt.c:5824 +#: cp/decl2.c:580 cp/pt.c:5841 #, fuzzy, gcc-internal-format msgid "template declaration of %q#D" msgstr "пустое абвяшчэнне" @@ -51491,7 +51535,7 @@ msgstr "пустое абвяшчэнне" msgid "template parameter lists provided don%'t match the template parameters of %qD" msgstr "" -#: cp/decl2.c:635 cp/pt.c:5781 +#: cp/decl2.c:635 cp/pt.c:5798 #, gcc-internal-format msgid "destructor %qD declared as member template" msgstr "" @@ -51820,22 +51864,22 @@ msgstr "" #. We mark a lambda conversion op as deleted if we can't #. generate it properly; see maybe_add_lambda_conv_op. -#: cp/decl2.c:5618 +#: cp/decl2.c:5619 #, gcc-internal-format msgid "converting lambda that uses %<...%> to function pointer" msgstr "" -#: cp/decl2.c:5621 +#: cp/decl2.c:5622 #, gcc-internal-format msgid "use of deleted function %qD" msgstr "" -#: cp/decl2.c:5671 +#: cp/decl2.c:5672 #, gcc-internal-format msgid "use of function %qD with unsatisfied constraints" msgstr "" -#: cp/decl2.c:5703 +#: cp/decl2.c:5704 #, gcc-internal-format msgid "use of built-in parameter pack %qD outside of a template" msgstr "" @@ -51941,7 +51985,7 @@ msgstr "памер \"%s\" - %d байт" msgid "%qD is not a member of %qT; did you mean %qs?" msgstr "" -#: cp/error.c:4550 cp/typeck.c:2550 +#: cp/error.c:4550 cp/typeck.c:2561 #, gcc-internal-format msgid "%qD is not a member of %qT" msgstr "" @@ -51951,7 +51995,7 @@ msgstr "" msgid "%qD is not a member of %qD; did you mean %qs?" msgstr "" -#: cp/error.c:4576 cp/typeck.c:3146 +#: cp/error.c:4576 cp/typeck.c:3157 #, gcc-internal-format msgid "%qD is not a member of %qD" msgstr "" @@ -52137,410 +52181,410 @@ msgstr "" msgid "recursive instantiation of default member initializer for %qD" msgstr "" -#: cp/init.c:633 +#: cp/init.c:640 #, gcc-internal-format msgid "default member initializer for %qD required before the end of its enclosing class" msgstr "" -#: cp/init.c:697 +#: cp/init.c:704 #, fuzzy, gcc-internal-format msgid "initializer for flexible array member %q#D" msgstr "прапушчан ініцыялізатар" -#: cp/init.c:755 +#: cp/init.c:762 #, gcc-internal-format msgid "initializing %qD from %qE does not extend the lifetime of the underlying array" msgstr "" -#: cp/init.c:781 +#: cp/init.c:788 #, fuzzy, gcc-internal-format msgid "%qD should be initialized in the member initialization list" msgstr "нерэчаісны ініцыялізатар" -#: cp/init.c:802 +#: cp/init.c:809 #, fuzzy, gcc-internal-format msgid "%qD is initialized with itself" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/init.c:918 +#: cp/init.c:925 #, fuzzy, gcc-internal-format msgid "invalid initializer for array member %q#D" msgstr "нерэчаісны ініцыялізатар" -#: cp/init.c:933 cp/init.c:959 cp/init.c:2504 cp/method.c:2261 +#: cp/init.c:940 cp/init.c:966 cp/init.c:2511 cp/method.c:2261 #, fuzzy, gcc-internal-format msgid "uninitialized const member in %q#T" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/init.c:935 cp/init.c:953 cp/init.c:961 cp/init.c:2489 cp/init.c:2517 +#: cp/init.c:942 cp/init.c:960 cp/init.c:968 cp/init.c:2496 cp/init.c:2524 #: cp/method.c:2264 cp/method.c:2275 #, fuzzy, gcc-internal-format msgid "%q#D should be initialized" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/init.c:951 cp/init.c:2476 cp/method.c:2272 +#: cp/init.c:958 cp/init.c:2483 cp/method.c:2272 #, fuzzy, gcc-internal-format msgid "uninitialized reference member in %q#T" msgstr "прапушчан ініцыялізатар" -#: cp/init.c:1128 +#: cp/init.c:1135 #, gcc-internal-format msgid "%qD will be initialized after" msgstr "" -#: cp/init.c:1131 +#: cp/init.c:1138 #, fuzzy, gcc-internal-format msgid "base %qT will be initialized after" msgstr "Клас \"%s\" ужо існуе" -#: cp/init.c:1135 +#: cp/init.c:1142 #, gcc-internal-format msgid " %q#D" msgstr "" -#: cp/init.c:1137 +#: cp/init.c:1144 #, gcc-internal-format msgid " base %qT" msgstr "" -#: cp/init.c:1139 +#: cp/init.c:1146 #, fuzzy, gcc-internal-format #| msgid "invalid initializer" msgid " when initialized here" msgstr "нерэчаісны ініцыялізатар" -#: cp/init.c:1156 +#: cp/init.c:1163 #, fuzzy, gcc-internal-format msgid "multiple initializations given for %qD" msgstr "ініцыялізацыя" -#: cp/init.c:1160 +#: cp/init.c:1167 #, gcc-internal-format msgid "multiple initializations given for base %qT" msgstr "" -#: cp/init.c:1247 +#: cp/init.c:1254 #, gcc-internal-format msgid "initializations for multiple members of %qT" msgstr "" -#: cp/init.c:1344 +#: cp/init.c:1351 #, gcc-internal-format msgid "base class %q#T should be explicitly initialized in the copy constructor" msgstr "" -#: cp/init.c:1575 cp/init.c:1594 +#: cp/init.c:1582 cp/init.c:1601 #, gcc-internal-format msgid "class %qT does not have any field named %qD" msgstr "" -#: cp/init.c:1581 +#: cp/init.c:1588 #, gcc-internal-format msgid "%q#D is a static data member; it can only be initialized at its definition" msgstr "" -#: cp/init.c:1588 +#: cp/init.c:1595 #, gcc-internal-format msgid "%q#D is not a non-static data member of %qT" msgstr "" -#: cp/init.c:1627 +#: cp/init.c:1634 #, gcc-internal-format msgid "unnamed initializer for %qT, which has no base classes" msgstr "" -#: cp/init.c:1635 +#: cp/init.c:1642 #, gcc-internal-format msgid "unnamed initializer for %qT, which uses multiple inheritance" msgstr "" -#: cp/init.c:1682 +#: cp/init.c:1689 #, gcc-internal-format msgid "%qD is both a direct base and an indirect virtual base" msgstr "" -#: cp/init.c:1690 +#: cp/init.c:1697 #, gcc-internal-format msgid "type %qT is not a direct or virtual base of %qT" msgstr "" -#: cp/init.c:1693 +#: cp/init.c:1700 #, gcc-internal-format msgid "type %qT is not a direct base of %qT" msgstr "" -#: cp/init.c:1805 cp/init.c:4511 cp/typeck2.c:1238 +#: cp/init.c:1812 cp/init.c:4518 cp/typeck2.c:1238 #, gcc-internal-format msgid "array must be initialized with a brace-enclosed initializer" msgstr "" -#: cp/init.c:2115 cp/semantics.c:3604 +#: cp/init.c:2122 cp/semantics.c:3622 #, fuzzy, gcc-internal-format msgid "%qT is not a class type" msgstr "\"%s\" мае незавершаны тып" -#: cp/init.c:2159 +#: cp/init.c:2166 #, gcc-internal-format msgid "incomplete type %qT does not have member %qD" msgstr "" -#: cp/init.c:2173 +#: cp/init.c:2180 #, fuzzy, gcc-internal-format msgid "invalid pointer to bit-field %qD" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/init.c:2259 cp/typeck.c:2018 +#: cp/init.c:2266 cp/typeck.c:2029 #, fuzzy, gcc-internal-format msgid "invalid use of non-static member function %qD" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/init.c:2266 cp/semantics.c:2092 +#: cp/init.c:2273 cp/semantics.c:2111 #, fuzzy, gcc-internal-format msgid "invalid use of non-static data member %qD" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/init.c:2473 +#: cp/init.c:2480 #, gcc-internal-format msgid "uninitialized reference member in %q#T using % without new-initializer" msgstr "" -#: cp/init.c:2481 +#: cp/init.c:2488 #, gcc-internal-format msgid "uninitialized reference member in base %q#T of %q#T using % without new-initializer" msgstr "" -#: cp/init.c:2485 +#: cp/init.c:2492 #, gcc-internal-format msgid "uninitialized reference member in base %q#T of %q#T" msgstr "" -#: cp/init.c:2501 +#: cp/init.c:2508 #, gcc-internal-format msgid "uninitialized const member in %q#T using % without new-initializer" msgstr "" -#: cp/init.c:2509 +#: cp/init.c:2516 #, gcc-internal-format msgid "uninitialized const member in base %q#T of %q#T using % without new-initializer" msgstr "" -#: cp/init.c:2513 +#: cp/init.c:2520 #, gcc-internal-format msgid "uninitialized const member in base %q#T of %q#T" msgstr "" -#: cp/init.c:2623 +#: cp/init.c:2630 #, gcc-internal-format msgid "placement new constructing an object of type %<%T [%wu]%> and size %qwu in a region of type %qT and size %qwi" msgstr "" -#: cp/init.c:2626 +#: cp/init.c:2633 #, gcc-internal-format msgid "placement new constructing an object of type %<%T [%wu]%> and size %qwu in a region of type %qT and size at most %qwu" msgstr "" -#: cp/init.c:2636 +#: cp/init.c:2643 #, gcc-internal-format msgid "placement new constructing an array of objects of type %qT and size %qwu in a region of type %qT and size %qwi" msgstr "" -#: cp/init.c:2639 +#: cp/init.c:2646 #, gcc-internal-format msgid "placement new constructing an array of objects of type %qT and size %qwu in a region of type %qT and size at most %qwu" msgstr "" -#: cp/init.c:2648 +#: cp/init.c:2655 #, gcc-internal-format msgid "placement new constructing an object of type %qT and size %qwu in a region of type %qT and size %qwi" msgstr "" -#: cp/init.c:2651 +#: cp/init.c:2658 #, gcc-internal-format msgid "placement new constructing an object of type %qT and size %qwu in a region of type %qT and size at most %qwu" msgstr "" -#: cp/init.c:2668 +#: cp/init.c:2675 #, gcc-internal-format msgid "at offset %wi from %qD declared here" msgstr "" -#: cp/init.c:2672 +#: cp/init.c:2679 #, gcc-internal-format msgid "at offset [%wi, %wi] from %qD declared here" msgstr "" -#: cp/init.c:2887 +#: cp/init.c:2894 #, gcc-internal-format msgid "integer overflow in array size" msgstr "" -#: cp/init.c:2897 +#: cp/init.c:2904 #, gcc-internal-format msgid "array size in new-expression must be constant" msgstr "" -#: cp/init.c:2915 +#: cp/init.c:2922 #, gcc-internal-format msgid "variably modified type not allowed in new-expression" msgstr "" -#: cp/init.c:2931 +#: cp/init.c:2938 #, gcc-internal-format msgid "non-constant array new length must be specified directly, not by %" msgstr "" -#: cp/init.c:2933 +#: cp/init.c:2940 #, gcc-internal-format msgid "non-constant array new length must be specified without parentheses around the type-id" msgstr "" -#: cp/init.c:2943 +#: cp/init.c:2950 #, gcc-internal-format msgid "invalid type % for %" msgstr "" -#: cp/init.c:2949 +#: cp/init.c:2956 #, gcc-internal-format msgid "% of % does not extend the lifetime of the underlying array" msgstr "" -#: cp/init.c:2991 +#: cp/init.c:2998 #, fuzzy, gcc-internal-format msgid "uninitialized const in % of %q#T" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/init.c:3135 +#: cp/init.c:3142 #, fuzzy, gcc-internal-format #| msgid "field '%s' not found in class" msgid "no suitable %qD found in class %qT" msgstr "поле \"%s\" не знойдзена ў класе" -#: cp/init.c:3142 cp/search.c:1058 +#: cp/init.c:3149 cp/search.c:1058 #, fuzzy, gcc-internal-format msgid "request for member %qD is ambiguous" msgstr "памер \"%s\" - %d байт" -#: cp/init.c:3216 +#: cp/init.c:3223 #, gcc-internal-format msgid "% of type %qT with extended alignment %d" msgstr "" -#: cp/init.c:3219 +#: cp/init.c:3226 #, gcc-internal-format msgid "uses %qD, which does not have an alignment parameter" msgstr "" -#: cp/init.c:3222 +#: cp/init.c:3229 #, gcc-internal-format msgid "use %<-faligned-new%> to enable C++17 over-aligned new support" msgstr "" -#: cp/init.c:3419 +#: cp/init.c:3426 #, gcc-internal-format msgid "parenthesized initializer in array new" msgstr "" -#: cp/init.c:3712 +#: cp/init.c:3719 #, gcc-internal-format msgid "size in array new must have integral type" msgstr "" -#: cp/init.c:3741 +#: cp/init.c:3748 #, gcc-internal-format msgid "new cannot be applied to a reference type" msgstr "" -#: cp/init.c:3750 +#: cp/init.c:3757 #, gcc-internal-format msgid "new cannot be applied to a function type" msgstr "" -#: cp/init.c:3869 +#: cp/init.c:3876 #, gcc-internal-format msgid "possible problem detected in invocation of operator %" msgstr "" -#: cp/init.c:3873 +#: cp/init.c:3880 #, gcc-internal-format msgid "neither the destructor nor the class-specific operator % will be called, even if they are declared when the class is defined" msgstr "" -#: cp/init.c:4420 +#: cp/init.c:4427 #, gcc-internal-format msgid "initializer ends prematurely" msgstr "" -#: cp/init.c:4726 +#: cp/init.c:4733 #, gcc-internal-format msgid "unknown array size in delete" msgstr "" -#: cp/init.c:4760 +#: cp/init.c:4767 #, gcc-internal-format msgid "possible problem detected in invocation of %" msgstr "" -#: cp/init.c:4765 +#: cp/init.c:4772 #, gcc-internal-format msgid "neither the destructor nor the class-specific % will be called, even if they are declared when the class is defined" msgstr "" -#: cp/init.c:4780 +#: cp/init.c:4787 #, gcc-internal-format msgid "deleting object of abstract class type %qT which has non-virtual destructor will cause undefined behavior" msgstr "" -#: cp/init.c:4785 +#: cp/init.c:4792 #, gcc-internal-format msgid "deleting object of polymorphic class type %qT which has non-virtual destructor might cause undefined behavior" msgstr "" -#: cp/init.c:5089 +#: cp/init.c:5096 #, gcc-internal-format msgid "type to vector delete is neither pointer or array type" msgstr "" -#: cp/lambda.c:528 +#: cp/lambda.c:529 #, gcc-internal-format msgid "array of runtime bound cannot be captured by copy, only by reference" msgstr "" -#: cp/lambda.c:543 +#: cp/lambda.c:544 #, gcc-internal-format msgid "capture of variably-modified type %qT that is not an N3639 array of runtime bound" msgstr "" -#: cp/lambda.c:547 +#: cp/lambda.c:548 #, gcc-internal-format msgid "because the array element type %qT has variable size" msgstr "" -#: cp/lambda.c:571 +#: cp/lambda.c:572 #, gcc-internal-format msgid "cannot capture %qE by reference" msgstr "" -#: cp/lambda.c:581 +#: cp/lambda.c:582 #, fuzzy, gcc-internal-format msgid "capture by copy of incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/lambda.c:633 +#: cp/lambda.c:637 #, gcc-internal-format msgid "trying to capture %qD in instantiation of generic lambda" msgstr "" -#: cp/lambda.c:709 +#: cp/lambda.c:713 #, gcc-internal-format msgid "implicit capture of %qE via %<[=]%> is deprecated in C++20" msgstr "" -#: cp/lambda.c:711 +#: cp/lambda.c:715 #, gcc-internal-format msgid "add explicit % or %<*this%> capture" msgstr "" -#: cp/lambda.c:825 +#: cp/lambda.c:829 #, gcc-internal-format msgid "% was not captured for this lambda function" msgstr "" @@ -52596,62 +52640,62 @@ msgstr "" msgid "(if you use %<-fpermissive%>, G++ will accept your code, but allowing the use of an undeclared name is deprecated)" msgstr "" -#: cp/mangle.c:2357 +#: cp/mangle.c:2350 #, gcc-internal-format msgid "mangling %, use % instead" msgstr "" -#: cp/mangle.c:2361 +#: cp/mangle.c:2354 #, gcc-internal-format msgid "mangling %<__underlying_type%>" msgstr "" -#: cp/mangle.c:2668 +#: cp/mangle.c:2661 #, gcc-internal-format msgid "mangling unknown fixed point type" msgstr "" -#: cp/mangle.c:3428 +#: cp/mangle.c:3439 #, gcc-internal-format msgid "use of built-in trait %qE in function signature; use library traits instead" msgstr "" -#: cp/mangle.c:3433 +#: cp/mangle.c:3444 #, gcc-internal-format, gfc-internal-format msgid "mangling %C" msgstr "" -#: cp/mangle.c:3509 +#: cp/mangle.c:3520 #, gcc-internal-format msgid "omitted middle operand to % operand cannot be mangled" msgstr "" -#: cp/mangle.c:4074 +#: cp/mangle.c:4085 #, gcc-internal-format msgid "mangled name for %qD will change in C++17 because the exception specification is part of a function type" msgstr "" -#: cp/mangle.c:4120 +#: cp/mangle.c:4131 #, gcc-internal-format msgid "the mangled name of %qD changed between %<%s=%d%> (%qD) and %<%s=%d%> (%qD)" msgstr "" -#: cp/mangle.c:4126 +#: cp/mangle.c:4137 #, gcc-internal-format msgid "the mangled name of %qD changes between %<%s=%d%> (%qD) and %<%s=%d%> (%qD)" msgstr "" -#: cp/mangle.c:4398 +#: cp/mangle.c:4409 #, gcc-internal-format msgid "the mangled name of a thunk for %qD changes between %<-fabi-version=%d%> and %<-fabi-version=%d%>" msgstr "" -#: cp/mangle.c:4403 +#: cp/mangle.c:4414 #, gcc-internal-format msgid "the mangled name of %qD changes between %<-fabi-version=%d%> and %<-fabi-version=%d%>" msgstr "" -#: cp/mangle.c:4408 +#: cp/mangle.c:4419 #, gcc-internal-format msgid "the mangled name of the initialization guard variable for %qD changes between %<-fabi-version=%d%> and %<-fabi-version=%d%>" msgstr "" @@ -52832,307 +52876,307 @@ msgstr "" msgid "%q#F is implicitly deleted because its exception-specification does not match the implicit exception-specification %qX" msgstr "" -#: cp/method.c:3136 +#: cp/method.c:3153 #, gcc-internal-format msgid "defaulted declaration %q+D does not match the expected signature" msgstr "" -#: cp/method.c:3139 +#: cp/method.c:3156 #, gcc-internal-format msgid "expected signature: %qD" msgstr "" -#: cp/method.c:3171 +#: cp/method.c:3188 #, gcc-internal-format msgid "explicitly defaulted function %q+D cannot be declared %qs because the implicit declaration is not %qs:" msgstr "" -#: cp/method.c:3191 +#: cp/method.c:3208 #, fuzzy, gcc-internal-format msgid "a template cannot be defaulted" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/method.c:3226 +#: cp/method.c:3243 #, fuzzy, gcc-internal-format msgid "%qD cannot be defaulted" msgstr "YYDEBUG не вызначан." -#: cp/method.c:3235 +#: cp/method.c:3252 #, gcc-internal-format msgid "defaulted function %q+D with default argument" msgstr "" -#: cp/name-lookup.c:2727 +#: cp/name-lookup.c:2728 #, gcc-internal-format msgid "redeclaration of %q#D with different template parameters" msgstr "" -#: cp/name-lookup.c:2733 +#: cp/name-lookup.c:2734 #, fuzzy, gcc-internal-format #| msgid "conflicts with previous declaration `%#D'" msgid "%q#D conflicts with a previous declaration" msgstr "канфлікт з папярэднім абвяшчэньнем `%#D'" -#: cp/name-lookup.c:2910 +#: cp/name-lookup.c:2911 #, fuzzy, gcc-internal-format msgid "%q#D hides constructor for %q#D" msgstr "дэструктару неабходны \"%#D\"" -#: cp/name-lookup.c:3059 +#: cp/name-lookup.c:3060 #, fuzzy, gcc-internal-format msgid "conflicting C language linkage declaration %q#D" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/name-lookup.c:3064 +#: cp/name-lookup.c:3065 #, fuzzy, gcc-internal-format msgid "due to different exception specifications" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/name-lookup.c:3162 +#: cp/name-lookup.c:3163 #, fuzzy, gcc-internal-format msgid "lambda parameter %qD previously declared as a capture" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/name-lookup.c:3185 +#: cp/name-lookup.c:3186 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %q#D shadows a parameter" msgstr "абвяшчэньне `%#D'" -#: cp/name-lookup.c:3319 +#: cp/name-lookup.c:3320 #, gcc-internal-format msgid "declaration of %qD shadows a member of %qT" msgstr "" -#: cp/name-lookup.c:3746 +#: cp/name-lookup.c:3763 #, gcc-internal-format msgid "friend declaration %qD in local class without prior local declaration" msgstr "" -#: cp/name-lookup.c:4226 +#: cp/name-lookup.c:4243 #, gcc-internal-format msgid "%s %<%s(%E)%> %p %d" msgstr "" -#: cp/name-lookup.c:4229 +#: cp/name-lookup.c:4246 #, gcc-internal-format msgid "%s %s %p %d" msgstr "" -#: cp/name-lookup.c:4844 +#: cp/name-lookup.c:4861 #, gcc-internal-format msgid "%q#D does not have external linkage" msgstr "" -#: cp/name-lookup.c:4846 cp/parser.c:11133 cp/parser.c:11143 -#: cp/semantics.c:3788 cp/semantics.c:3800 +#: cp/name-lookup.c:4863 cp/parser.c:11154 cp/parser.c:11164 +#: cp/semantics.c:3806 cp/semantics.c:3818 #, fuzzy, gcc-internal-format msgid "%q#D declared here" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/name-lookup.c:5588 +#: cp/name-lookup.c:5605 #, gcc-internal-format msgid "%<%T%s%D%> names destructor" msgstr "" -#: cp/name-lookup.c:5604 +#: cp/name-lookup.c:5621 #, gcc-internal-format msgid "using-declaration for non-member at class scope" msgstr "" -#: cp/name-lookup.c:5612 +#: cp/name-lookup.c:5629 #, gcc-internal-format msgid "% with enumeration scope %q#T only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/name-lookup.c:5628 cp/pt.c:18214 +#: cp/name-lookup.c:5645 cp/pt.c:18297 #, gcc-internal-format msgid "%qT is not a class, namespace, or enumeration" msgstr "" -#: cp/name-lookup.c:5638 +#: cp/name-lookup.c:5655 #, gcc-internal-format msgid "non-member using-declaration names constructor of %qT" msgstr "" -#: cp/name-lookup.c:5649 cp/name-lookup.c:5707 +#: cp/name-lookup.c:5666 cp/name-lookup.c:5724 #, gcc-internal-format msgid "using-declaration for member at non-class scope" msgstr "" -#: cp/name-lookup.c:5672 +#: cp/name-lookup.c:5689 #, fuzzy, gcc-internal-format #| msgid "%s: Not a directory" msgid "%qT is not a direct base of %qT" msgstr "%s: не дырэкторыя" -#: cp/name-lookup.c:5717 +#: cp/name-lookup.c:5734 #, gcc-internal-format msgid "did you mean %?" msgstr "" -#: cp/name-lookup.c:5729 +#: cp/name-lookup.c:5746 #, fuzzy, gcc-internal-format msgid "%qD has not been declared in %qD" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/name-lookup.c:5743 +#: cp/name-lookup.c:5760 #, fuzzy, gcc-internal-format #| msgid "declaration of template `%#D'" msgid "using-declaration may not name namespace %qD" msgstr "абвяшчэньне шаблёну `%#D'" -#: cp/name-lookup.c:5754 +#: cp/name-lookup.c:5771 #, fuzzy, gcc-internal-format msgid "%<%T::%D%> names constructor in %qT" msgstr "дэструктару неабходны \"%#D\"" -#: cp/name-lookup.c:5850 +#: cp/name-lookup.c:5867 #, gcc-internal-format msgid "declaration of %qD not in a namespace surrounding %qD" msgstr "" -#: cp/name-lookup.c:5891 +#: cp/name-lookup.c:5908 #, fuzzy, gcc-internal-format msgid "explicit qualification in declaration of %qD" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/name-lookup.c:5901 +#: cp/name-lookup.c:5918 #, gcc-internal-format msgid "%qD should have been declared inside %qD" msgstr "" -#: cp/name-lookup.c:5954 +#: cp/name-lookup.c:5971 #, fuzzy, gcc-internal-format msgid "%qD has not been declared within %qD" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/name-lookup.c:5956 +#: cp/name-lookup.c:5973 #, gcc-internal-format msgid "only here as a %" msgstr "" -#: cp/name-lookup.c:6010 +#: cp/name-lookup.c:6027 #, gcc-internal-format msgid "%qD attribute requires a single NTBS argument" msgstr "" -#: cp/name-lookup.c:6017 +#: cp/name-lookup.c:6034 #, gcc-internal-format msgid "%qD attribute is meaningless since members of the anonymous namespace get local symbols" msgstr "" -#: cp/name-lookup.c:6027 cp/name-lookup.c:6054 +#: cp/name-lookup.c:6044 cp/name-lookup.c:6071 #, gcc-internal-format msgid "ignoring %qD attribute on anonymous namespace" msgstr "" -#: cp/name-lookup.c:6033 +#: cp/name-lookup.c:6050 #, gcc-internal-format msgid "ignoring %qD attribute on non-inline namespace" msgstr "" -#: cp/name-lookup.c:6070 cp/name-lookup.c:8581 +#: cp/name-lookup.c:6087 cp/name-lookup.c:8598 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "%qD attribute directive ignored" msgstr "\"%s\" атрыбут ігнарыруецца" -#: cp/name-lookup.c:6398 +#: cp/name-lookup.c:6415 #, gcc-internal-format msgid "maximum limit of %d namespaces searched for %qE" msgstr "" -#: cp/name-lookup.c:6450 +#: cp/name-lookup.c:6467 #, gcc-internal-format msgid "suggested alternative:" msgid_plural "suggested alternatives:" msgstr[0] "" msgstr[1] "" -#: cp/name-lookup.c:6456 +#: cp/name-lookup.c:6473 #, gcc-internal-format msgid " %qE" msgstr "" -#: cp/name-lookup.c:6985 +#: cp/name-lookup.c:7002 #, gcc-internal-format msgid "% is defined in header %qs; did you forget to %<#include %s%>?" msgstr "" -#: cp/name-lookup.c:6991 +#: cp/name-lookup.c:7008 #, gcc-internal-format msgid "% is only available from %s onwards" msgstr "" -#: cp/name-lookup.c:7427 +#: cp/name-lookup.c:7444 #, gcc-internal-format msgid "the macro %qs had not yet been defined" msgstr "" -#: cp/name-lookup.c:7430 +#: cp/name-lookup.c:7447 #, gcc-internal-format msgid "it was later defined here" msgstr "" -#: cp/name-lookup.c:8213 +#: cp/name-lookup.c:8230 #, gcc-internal-format msgid "declaration of % does not match %<#include %>, isn%'t a template" msgstr "" -#: cp/name-lookup.c:8575 +#: cp/name-lookup.c:8592 #, gcc-internal-format msgid "% using directive no longer supported" msgstr "" -#: cp/name-lookup.c:8578 +#: cp/name-lookup.c:8595 #, gcc-internal-format msgid "you can use an inline namespace instead" msgstr "" #. We only allow depth 255. -#: cp/name-lookup.c:8669 +#: cp/name-lookup.c:8686 #, gcc-internal-format, gfc-internal-format msgid "cannot nest more than %d namespaces" msgstr "" -#: cp/name-lookup.c:8766 +#: cp/name-lookup.c:8783 #, fuzzy, gcc-internal-format msgid "% is ambiguous" msgstr "памер \"%s\" - %d байт" -#: cp/name-lookup.c:8782 +#: cp/name-lookup.c:8799 #, fuzzy, gcc-internal-format msgid "namespace alias %qD not allowed here, assuming %qD" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/name-lookup.c:8862 +#: cp/name-lookup.c:8879 #, gcc-internal-format msgid "inline namespace must be specified at initial definition" msgstr "" -#: cp/name-lookup.c:8863 +#: cp/name-lookup.c:8880 #, fuzzy, gcc-internal-format msgid "%qD defined here" msgstr "YYDEBUG не вызначан." -#: cp/name-lookup.c:8915 +#: cp/name-lookup.c:8932 #, gcc-internal-format msgid "%s namespace %qD conflicts with reachable definition" msgstr "" -#: cp/name-lookup.c:8917 +#: cp/name-lookup.c:8934 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "previous definition here" msgid "reachable %s definition here" msgstr "папярэдняе вызначэньне" -#: cp/name-lookup.c:8997 +#: cp/name-lookup.c:9014 #, gcc-internal-format msgid "XXX entering %" msgstr "" -#: cp/name-lookup.c:9006 +#: cp/name-lookup.c:9023 #, gcc-internal-format msgid "XXX leaving %" msgstr "" @@ -53157,7 +53201,7 @@ msgstr "" msgid "% is not set to true" msgstr "" -#: cp/parser.c:1415 cp/parser.c:42693 +#: cp/parser.c:1415 cp/parser.c:42746 #, gcc-internal-format msgid "%<#pragma omp declare %s%> not immediately followed by function declaration or definition" msgstr "" @@ -53182,7 +53226,7 @@ msgstr "" msgid "request for member %qE in non-class type %qT" msgstr "" -#: cp/parser.c:3106 cp/parser.c:20001 +#: cp/parser.c:3106 cp/parser.c:20038 #, gcc-internal-format msgid "%<%T::%E%> has not been declared" msgstr "" @@ -53262,7 +53306,7 @@ msgstr "Нерэчаісны выбар %s" msgid "ISO C++ forbids using a floating-point literal in a constant-expression" msgstr "" -#: cp/parser.c:3301 cp/pt.c:19710 +#: cp/parser.c:3301 cp/pt.c:19792 #, gcc-internal-format msgid "a cast to a type other than an integral or enumeration type cannot appear in a constant-expression" msgstr "" @@ -53399,7 +53443,7 @@ msgstr "" msgid "% only available with %<-std=c++20%> or %<-fconcepts%>" msgstr "" -#: cp/parser.c:3496 cp/parser.c:28706 +#: cp/parser.c:3496 cp/parser.c:28760 #, gcc-internal-format msgid "% only available with %<-std=c++20%> or %<-fconcepts%>" msgstr "" @@ -53524,7 +53568,7 @@ msgstr "" msgid "global module fragment contents must be from preprocessor inclusion" msgstr "" -#: cp/parser.c:4935 cp/parser.c:14325 +#: cp/parser.c:4935 cp/parser.c:14349 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "expected declaration" @@ -53576,7 +53620,7 @@ msgstr "" msgid "fold-expressions only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:5638 cp/parser.c:5817 cp/parser.c:5995 cp/semantics.c:3942 +#: cp/parser.c:5638 cp/parser.c:5817 cp/parser.c:5995 cp/semantics.c:3960 #, gcc-internal-format msgid "expected primary-expression" msgstr "" @@ -53606,7 +53650,7 @@ msgstr "" msgid "% keyword not permitted in destructor name" msgstr "" -#: cp/parser.c:6329 cp/parser.c:8350 +#: cp/parser.c:6329 cp/parser.c:8357 #, gcc-internal-format msgid "%<~auto%> only available with %<-std=c++14%> or %<-std=gnu++14%>" msgstr "" @@ -53626,12 +53670,12 @@ msgstr "" msgid "typedef-name %qD used as destructor declarator" msgstr "" -#: cp/parser.c:6500 cp/parser.c:22400 +#: cp/parser.c:6500 cp/parser.c:22437 #, gcc-internal-format msgid "expected unqualified-id" msgstr "" -#: cp/parser.c:6527 cp/typeck.c:2843 cp/typeck.c:2846 cp/typeck.c:2863 +#: cp/parser.c:6527 cp/typeck.c:2854 cp/typeck.c:2857 cp/typeck.c:2874 #, fuzzy, gcc-internal-format msgid "%qD is not a template" msgstr "\"%s\" мае незавершаны тып" @@ -53666,7 +53710,7 @@ msgstr "" msgid "expected nested-name-specifier" msgstr "" -#: cp/parser.c:7143 cp/parser.c:9595 +#: cp/parser.c:7143 cp/parser.c:9602 #, gcc-internal-format msgid "types may not be defined in casts" msgstr "" @@ -53682,7 +53726,7 @@ msgstr "" msgid "wrong number of arguments to %<__builtin_addressof%>" msgstr "памылковая колькасьць аргументаў, зададзеных для атрыбута `%s'" -#: cp/parser.c:7336 cp/pt.c:20360 +#: cp/parser.c:7336 cp/pt.c:20442 #, fuzzy, gcc-internal-format #| msgid "wrong number of arguments specified for `%s' attribute" msgid "wrong number of arguments to %<__builtin_launder%>" @@ -53698,1126 +53742,1131 @@ msgstr "ISO C не дазваляе дэкларацыі метак (label)" msgid "two consecutive %<[%> shall only introduce an attribute" msgstr "" -#: cp/parser.c:8088 cp/typeck.c:2731 +#: cp/parser.c:8095 cp/typeck.c:2742 #, fuzzy, gcc-internal-format #| msgid "invalid use of `%D'" msgid "invalid use of %qD" msgstr "нерэчаіснае выкарыстаньне `%D'" -#: cp/parser.c:8097 +#: cp/parser.c:8104 #, gcc-internal-format msgid "%<%D::%D%> is not a class member" msgstr "" -#: cp/parser.c:8402 +#: cp/parser.c:8409 #, gcc-internal-format msgid "non-scalar type" msgstr "" -#: cp/parser.c:8512 +#: cp/parser.c:8519 #, fuzzy, gcc-internal-format msgid "ISO C++ does not allow % with a non-type" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/parser.c:8607 +#: cp/parser.c:8614 #, gcc-internal-format msgid "types may not be defined in % expressions" msgstr "" -#: cp/parser.c:8881 cp/parser.c:31202 +#: cp/parser.c:8888 cp/parser.c:31256 #, gcc-internal-format msgid "types may not be defined in %qs expressions" msgstr "" -#: cp/parser.c:8946 +#: cp/parser.c:8953 #, gcc-internal-format msgid "%<__builtin_has_attribute%> with dependent argument not supported yet" msgstr "" -#: cp/parser.c:9032 +#: cp/parser.c:9039 #, gcc-internal-format msgid "types may not be defined in a new-expression" msgstr "" -#: cp/parser.c:9048 +#: cp/parser.c:9055 #, gcc-internal-format msgid "array bound forbidden after parenthesized type-id" msgstr "" -#: cp/parser.c:9050 +#: cp/parser.c:9057 #, gcc-internal-format msgid "try removing the parentheses around the type-id" msgstr "" -#: cp/parser.c:9082 +#: cp/parser.c:9089 #, gcc-internal-format msgid "initialization of new-expression for type % requires exactly one element" msgstr "" -#: cp/parser.c:9127 +#: cp/parser.c:9134 #, gcc-internal-format msgid "expected expression-list or type-id" msgstr "" -#: cp/parser.c:9156 +#: cp/parser.c:9163 #, gcc-internal-format msgid "types may not be defined in a new-type-id" msgstr "" -#: cp/parser.c:9291 +#: cp/parser.c:9298 #, gcc-internal-format msgid "expression in new-declarator must have integral or enumeration type" msgstr "" -#: cp/parser.c:9700 +#: cp/parser.c:9707 #, gcc-internal-format msgid "use of old-style cast to %q#T" msgstr "" -#: cp/parser.c:9849 +#: cp/parser.c:9856 #, gcc-internal-format msgid "%<>>%> operator is treated as two right angle brackets in C++11" msgstr "" -#: cp/parser.c:9852 +#: cp/parser.c:9859 #, gcc-internal-format msgid "suggest parentheses around %<>>%> expression" msgstr "" -#: cp/parser.c:10060 +#: cp/parser.c:10067 #, gcc-internal-format msgid "ISO C++ does not allow % with omitted middle operand" msgstr "" -#: cp/parser.c:10349 +#: cp/parser.c:10356 #, gcc-internal-format msgid "top-level comma expression in array subscript is deprecated" msgstr "" -#: cp/parser.c:10499 +#: cp/parser.c:10506 #, gcc-internal-format msgid "types may not be defined within %<__builtin_offsetof%>" msgstr "" -#: cp/parser.c:10798 +#: cp/parser.c:10809 +#, gcc-internal-format +msgid "lambda-expression in template parameter type" +msgstr "" + +#: cp/parser.c:10819 #, gcc-internal-format msgid "lambda-expression in unevaluated context only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:10808 +#: cp/parser.c:10829 #, gcc-internal-format msgid "lambda-expression in template-argument only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:10960 +#: cp/parser.c:10981 #, gcc-internal-format msgid "non-local lambda expression cannot have a capture-default" msgstr "" -#: cp/parser.c:10982 +#: cp/parser.c:11003 #, gcc-internal-format msgid "expected end of capture-list" msgstr "" -#: cp/parser.c:10997 +#: cp/parser.c:11018 #, gcc-internal-format msgid "explicit by-copy capture of % redundant with by-copy capture default" msgstr "" -#: cp/parser.c:11002 cp/parser.c:11023 cp/parser.c:11215 +#: cp/parser.c:11023 cp/parser.c:11044 cp/parser.c:11236 #, gcc-internal-format msgid "already captured %qD in lambda expression" msgstr "" -#: cp/parser.c:11017 +#: cp/parser.c:11038 #, gcc-internal-format msgid "%<*this%> capture only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:11037 +#: cp/parser.c:11058 #, fuzzy, gcc-internal-format msgid "% cannot be captured by reference" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:11056 +#: cp/parser.c:11077 #, gcc-internal-format msgid "pack init-capture only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:11067 +#: cp/parser.c:11088 #, gcc-internal-format msgid "%<&%> should come before %<...%>" msgstr "" -#: cp/parser.c:11098 +#: cp/parser.c:11119 #, gcc-internal-format msgid "lambda capture initializers only available with %<-std=c++14%> or %<-std=gnu++14%>" msgstr "" -#: cp/parser.c:11105 +#: cp/parser.c:11126 #, gcc-internal-format msgid "empty initializer for lambda init-capture" msgstr "" -#: cp/parser.c:11129 +#: cp/parser.c:11150 #, gcc-internal-format msgid "capture of non-variable %qE" msgstr "" -#: cp/parser.c:11139 +#: cp/parser.c:11160 #, gcc-internal-format msgid "capture of variable %qD with non-automatic storage duration" msgstr "" -#: cp/parser.c:11177 +#: cp/parser.c:11198 #, gcc-internal-format msgid "too many %<...%> in lambda capture" msgstr "" -#: cp/parser.c:11188 +#: cp/parser.c:11209 #, gcc-internal-format msgid "explicit by-copy capture of %qD redundant with by-copy capture default" msgstr "" -#: cp/parser.c:11193 +#: cp/parser.c:11214 #, gcc-internal-format msgid "explicit by-reference capture of %qD redundant with by-reference capture default" msgstr "" -#: cp/parser.c:11272 +#: cp/parser.c:11293 #, gcc-internal-format msgid "lambda templates are only available with %<-std=c++14%> or %<-std=gnu++14%>" msgstr "" -#: cp/parser.c:11276 +#: cp/parser.c:11297 #, gcc-internal-format msgid "lambda templates are only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:11344 +#: cp/parser.c:11365 #, fuzzy, gcc-internal-format #| msgid "wrong number of arguments specified for `%s' attribute" msgid "default argument specified for lambda parameter" msgstr "памылковая колькасьць аргументаў, зададзеных для атрыбута `%s'" -#: cp/parser.c:11364 +#: cp/parser.c:11385 #, gcc-internal-format msgid "parameter declaration before lambda declaration specifiers only optional with %<-std=c++2b%> or %<-std=gnu++2b%>" msgstr "" -#: cp/parser.c:11376 +#: cp/parser.c:11397 #, fuzzy, gcc-internal-format msgid "duplicate %" msgstr "паўтарэнне \"%s\"" -#: cp/parser.c:11383 +#: cp/parser.c:11404 #, gcc-internal-format msgid "parameter declaration before lambda transaction qualifier only optional with %<-std=c++2b%> or %<-std=gnu++2b%>" msgstr "" -#: cp/parser.c:11396 +#: cp/parser.c:11417 #, gcc-internal-format msgid "parameter declaration before lambda exception specification only optional with %<-std=c++2b%> or %<-std=gnu++2b%>" msgstr "" -#: cp/parser.c:11414 +#: cp/parser.c:11435 #, gcc-internal-format msgid "parameter declaration before lambda trailing return type only optional with %<-std=c++2b%> or %<-std=gnu++2b%>" msgstr "" -#: cp/parser.c:11456 +#: cp/parser.c:11477 #, gcc-internal-format msgid "% lambda only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:11845 cp/parser.c:12046 +#: cp/parser.c:11866 cp/parser.c:12067 #, gcc-internal-format msgid "attributes at the beginning of statement are ignored" msgstr "" -#: cp/parser.c:11885 +#: cp/parser.c:11906 #, fuzzy, gcc-internal-format #| msgid "empty body in an else-statement" msgid "expected labeled-statement" msgstr "пустое цела ў else-выражэнні" -#: cp/parser.c:11934 +#: cp/parser.c:11955 #, gcc-internal-format msgid "case label %qE not within a switch statement" msgstr "" -#: cp/parser.c:12053 +#: cp/parser.c:12074 #, gcc-internal-format msgid "need % before %qE because %qT is a dependent scope" msgstr "" -#: cp/parser.c:12062 +#: cp/parser.c:12083 #, gcc-internal-format msgid "%<%T::%D%> names the constructor, not the type" msgstr "" -#: cp/parser.c:12110 +#: cp/parser.c:12131 #, gcc-internal-format msgid "compound-statement in % function" msgstr "" -#: cp/parser.c:12275 +#: cp/parser.c:12297 #, gcc-internal-format msgid "% only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:12302 +#: cp/parser.c:12324 #, gcc-internal-format msgid "init-statement in selection statements only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:12470 cp/parser.c:31686 +#: cp/parser.c:12492 cp/parser.c:31740 #, fuzzy, gcc-internal-format #| msgid "empty body in an else-statement" msgid "expected selection-statement" msgstr "пустое цела ў else-выражэнні" -#: cp/parser.c:12511 +#: cp/parser.c:12533 #, gcc-internal-format msgid "condition declares an array" msgstr "" -#: cp/parser.c:12513 +#: cp/parser.c:12535 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function" msgid "condition declares a function" msgstr "не хапае аргументаў у функцыі" -#: cp/parser.c:12553 +#: cp/parser.c:12575 #, gcc-internal-format msgid "types may not be defined in conditions" msgstr "" #. Anything else is an error. -#: cp/parser.c:12634 cp/parser.c:21692 cp/parser.c:24161 +#: cp/parser.c:12656 cp/parser.c:21729 cp/parser.c:24198 #, fuzzy, gcc-internal-format #| msgid "invalid initializer" msgid "expected initializer" msgstr "нерэчаісны ініцыялізатар" -#: cp/parser.c:12918 +#: cp/parser.c:12942 #, gcc-internal-format msgid "loop variable %qD of type %qT binds to a temporary constructed from type %qT" msgstr "" #. rval -#: cp/parser.c:12925 +#: cp/parser.c:12949 #, gcc-internal-format msgid "use non-reference type %qT to make the copy explicit or %qT to prevent copying" msgstr "" -#: cp/parser.c:12950 +#: cp/parser.c:12974 #, gcc-internal-format msgid "loop variable %qD creates a copy from type %qT" msgstr "" -#: cp/parser.c:12955 +#: cp/parser.c:12979 #, gcc-internal-format msgid "use reference type to prevent copying" msgstr "" -#: cp/parser.c:13098 +#: cp/parser.c:13122 #, gcc-internal-format msgid "range-based % expression of type %qT has incomplete type" msgstr "" -#: cp/parser.c:13182 +#: cp/parser.c:13206 #, gcc-internal-format msgid "inconsistent begin/end types in range-based % statement: %qT and %qT" msgstr "" -#: cp/parser.c:13325 cp/parser.c:31689 +#: cp/parser.c:13349 cp/parser.c:31743 #, fuzzy, gcc-internal-format #| msgid "empty body in an else-statement" msgid "expected iteration-statement" msgstr "пустое цела ў else-выражэнні" -#: cp/parser.c:13371 +#: cp/parser.c:13395 #, gcc-internal-format msgid "range-based % loops with initializer only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:13395 +#: cp/parser.c:13419 #, gcc-internal-format msgid "range-based % loops only available with %<-std=c++11%> or %<-std=gnu++11%>" msgstr "" -#: cp/parser.c:13526 +#: cp/parser.c:13550 #, gcc-internal-format msgid "% in % function" msgstr "" #. Issue a warning about this use of a GNU extension. -#: cp/parser.c:13534 +#: cp/parser.c:13558 #, gcc-internal-format msgid "ISO C++ forbids computed gotos" msgstr "" -#: cp/parser.c:13547 cp/parser.c:31692 +#: cp/parser.c:13571 cp/parser.c:31746 #, gcc-internal-format msgid "expected jump-statement" msgstr "" -#: cp/parser.c:13724 +#: cp/parser.c:13748 #, gcc-internal-format msgid "expected module-name" msgstr "" -#: cp/parser.c:13759 +#: cp/parser.c:13783 #, gcc-internal-format msgid "module-declaration not permitted in header-unit" msgstr "" -#: cp/parser.c:13784 +#: cp/parser.c:13808 #, gcc-internal-format msgid "private module fragment only permitted in purview of module interface or partition" msgstr "" -#: cp/parser.c:13789 +#: cp/parser.c:13813 #, gcc-internal-format msgid "private module fragment" msgstr "" #. Neither the first declaration, nor in a GMF. -#: cp/parser.c:13795 +#: cp/parser.c:13819 #, gcc-internal-format msgid "module-declaration only permitted as first declaration, or ending a global module fragment" msgstr "" -#: cp/parser.c:13832 +#: cp/parser.c:13856 #, gcc-internal-format msgid "post-module-declaration imports must be contiguous" msgstr "" -#: cp/parser.c:13835 +#: cp/parser.c:13859 #, gcc-internal-format msgid "perhaps insert a line break, or other disambiguation, to prevent this being considered a module control-line" msgstr "" -#: cp/parser.c:13843 +#: cp/parser.c:13867 #, gcc-internal-format msgid "import-declaration must be at global scope" msgstr "" -#: cp/parser.c:13856 +#: cp/parser.c:13880 #, gcc-internal-format msgid "import cannot appear directly in a linkage-specification" msgstr "" -#: cp/parser.c:13864 +#: cp/parser.c:13888 #, gcc-internal-format msgid "post-module-declaration imports must not be include-translated" msgstr "" -#: cp/parser.c:13869 +#: cp/parser.c:13893 #, gcc-internal-format msgid "post-module-declaration imports must not be from header inclusion" msgstr "" -#: cp/parser.c:13889 +#: cp/parser.c:13913 #, gcc-internal-format msgid "%qE may only occur after a module interface declaration" msgstr "" -#: cp/parser.c:13897 +#: cp/parser.c:13921 #, gcc-internal-format msgid "%qE may only occur once in an export declaration" msgstr "" -#: cp/parser.c:13918 +#: cp/parser.c:13942 #, gcc-internal-format msgid "% not part of following module-directive" msgstr "" -#: cp/parser.c:14020 +#: cp/parser.c:14044 #, fuzzy, gcc-internal-format msgid "attributes are not permitted in this position" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: cp/parser.c:14024 +#: cp/parser.c:14048 #, gcc-internal-format msgid "attributes may be inserted here" msgstr "" -#: cp/parser.c:14155 cp/parser.c:25964 +#: cp/parser.c:14179 cp/parser.c:25999 #, gcc-internal-format msgid "extra %<;%>" msgstr "" -#: cp/parser.c:14248 +#: cp/parser.c:14272 #, gcc-internal-format msgid "%<__label__%> not at the beginning of a block" msgstr "" -#: cp/parser.c:14463 +#: cp/parser.c:14487 #, gcc-internal-format msgid "non-variable %qD in declaration with more than one declarator with placeholder type" msgstr "" -#: cp/parser.c:14483 +#: cp/parser.c:14507 #, gcc-internal-format msgid "inconsistent deduction for %qT: %qT and then %qT" msgstr "" -#: cp/parser.c:14504 +#: cp/parser.c:14528 #, gcc-internal-format msgid "mixing declarations and function-definitions is forbidden" msgstr "" -#: cp/parser.c:14528 +#: cp/parser.c:14552 #, gcc-internal-format msgid "types may not be defined in a for-range-declaration" msgstr "" -#: cp/parser.c:14583 +#: cp/parser.c:14607 #, gcc-internal-format msgid "initializer in range-based % loop" msgstr "" -#: cp/parser.c:14586 +#: cp/parser.c:14610 #, fuzzy, gcc-internal-format #| msgid "multiple declarations `%T' and `%T'" msgid "multiple declarations in range-based % loop" msgstr "неаднолькавае абвяшчэньне `%T' і `%T'" -#: cp/parser.c:14637 +#: cp/parser.c:14661 #, gcc-internal-format msgid "structured bindings only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:14689 +#: cp/parser.c:14713 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "empty structured binding declaration" msgstr "пустое абвяшчэньне" -#: cp/parser.c:14707 +#: cp/parser.c:14731 #, fuzzy, gcc-internal-format msgid "invalid initializer for structured binding declaration" msgstr "нерэчаісны ініцыялізатар" -#: cp/parser.c:14876 +#: cp/parser.c:14900 #, gcc-internal-format msgid "% used outside of class" msgstr "" -#: cp/parser.c:14915 +#: cp/parser.c:14939 #, gcc-internal-format msgid "the % keyword is not allowed in a C++20 concept definition" msgstr "" -#: cp/parser.c:14918 +#: cp/parser.c:14942 #, gcc-internal-format msgid "C++20 concept definition syntax is % = %>" msgstr "" -#: cp/parser.c:14985 +#: cp/parser.c:15009 #, gcc-internal-format msgid "% changes meaning in C++11; please remove it" msgstr "" -#: cp/parser.c:15021 +#: cp/parser.c:15045 #, gcc-internal-format msgid "% invalid in condition" msgstr "" -#: cp/parser.c:15028 +#: cp/parser.c:15052 #, fuzzy, gcc-internal-format msgid "%qD invalid in lambda" msgstr "Нерэчаісны выбар \"%s\"" -#: cp/parser.c:15109 +#: cp/parser.c:15133 #, gcc-internal-format msgid "type-specifier invalid in lambda" msgstr "" -#: cp/parser.c:15128 +#: cp/parser.c:15152 #, fuzzy, gcc-internal-format msgid "class definition may not be declared a friend" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:15201 cp/parser.c:26479 +#: cp/parser.c:15225 cp/parser.c:26514 #, gcc-internal-format msgid "templates may not be %" msgstr "" -#: cp/parser.c:15220 +#: cp/parser.c:15244 #, gcc-internal-format msgid "types may not be defined in explicit-specifier" msgstr "" -#: cp/parser.c:15224 +#: cp/parser.c:15248 #, gcc-internal-format msgid "% only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:15288 +#: cp/parser.c:15312 #, fuzzy, gcc-internal-format msgid "invalid linkage-specification" msgstr "Нерэчаісная спецыфікацыя! Памылка ў cc." -#: cp/parser.c:15392 +#: cp/parser.c:15416 #, gcc-internal-format msgid "% without a message only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:15594 +#: cp/parser.c:15618 #, gcc-internal-format msgid "% type specifier only available with %<-std=c++14%> or %<-std=gnu++14%>" msgstr "" -#: cp/parser.c:15607 +#: cp/parser.c:15631 #, gcc-internal-format msgid "types may not be defined in % expressions" msgstr "" -#: cp/parser.c:15770 +#: cp/parser.c:15794 #, gcc-internal-format msgid "types may not be defined in a conversion-type-id" msgstr "" -#: cp/parser.c:15799 +#: cp/parser.c:15823 #, gcc-internal-format msgid "invalid use of % in conversion operator" msgstr "" -#: cp/parser.c:15803 +#: cp/parser.c:15827 #, gcc-internal-format msgid "use of % in member template conversion operator can never be deduced" msgstr "" -#: cp/parser.c:15887 +#: cp/parser.c:15911 #, gcc-internal-format msgid "only constructors take member initializers" msgstr "" -#: cp/parser.c:15914 +#: cp/parser.c:15938 #, fuzzy, gcc-internal-format msgid "cannot expand initializer for member %qD" msgstr "прапушчан ініцыялізатар" -#: cp/parser.c:15926 cp/pt.c:26408 +#: cp/parser.c:15950 cp/pt.c:26446 #, gcc-internal-format msgid "mem-initializer for %qD follows constructor delegation" msgstr "" -#: cp/parser.c:15938 cp/pt.c:26420 +#: cp/parser.c:15962 cp/pt.c:26458 #, gcc-internal-format msgid "constructor delegation follows mem-initializer for %qD" msgstr "" -#: cp/parser.c:15990 +#: cp/parser.c:16014 #, gcc-internal-format msgid "anachronistic old-style base class initializer" msgstr "" -#: cp/parser.c:16075 +#: cp/parser.c:16099 #, gcc-internal-format msgid "keyword % not allowed in this context (a qualified member initializer is implicitly a type)" msgstr "" -#: cp/parser.c:16476 +#: cp/parser.c:16500 #, gcc-internal-format msgid "unexpected keyword; remove space between quotes and suffix identifier" msgstr "" -#: cp/parser.c:16482 +#: cp/parser.c:16506 #, gcc-internal-format msgid "expected suffix identifier" msgstr "" -#: cp/parser.c:16491 +#: cp/parser.c:16515 #, gcc-internal-format msgid "expected empty string after % keyword" msgstr "" -#: cp/parser.c:16497 +#: cp/parser.c:16521 #, gcc-internal-format msgid "invalid encoding prefix in literal operator" msgstr "" -#: cp/parser.c:16531 +#: cp/parser.c:16555 #, fuzzy, gcc-internal-format #| msgid "unregistered operator %s" msgid "expected operator" msgstr "нераспазнаны аператар %s" -#: cp/parser.c:16578 +#: cp/parser.c:16602 #, gcc-internal-format msgid "keyword % not implemented, and will be ignored" msgstr "" -#: cp/parser.c:16580 +#: cp/parser.c:16604 #, gcc-internal-format msgid "keyword % is deprecated, and is ignored" msgstr "" -#: cp/parser.c:16582 +#: cp/parser.c:16606 #, gcc-internal-format msgid "keyword % is enabled with %<-fmodules-ts%>" msgstr "" -#: cp/parser.c:16761 +#: cp/parser.c:16785 #, fuzzy, gcc-internal-format msgid "invalid constrained type parameter" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:16769 +#: cp/parser.c:16793 #, fuzzy, gcc-internal-format msgid "cv-qualified type parameter" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:16912 +#: cp/parser.c:16940 #, fuzzy, gcc-internal-format msgid "invalid use of % in default template argument" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:17148 cp/parser.c:17234 cp/parser.c:23932 +#: cp/parser.c:17176 cp/parser.c:17262 cp/parser.c:23969 #, fuzzy, gcc-internal-format msgid "template parameter pack %qD cannot have a default argument" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:17152 cp/parser.c:17238 +#: cp/parser.c:17180 cp/parser.c:17266 #, fuzzy, gcc-internal-format msgid "template parameter packs cannot have default arguments" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:17305 +#: cp/parser.c:17333 #, gcc-internal-format msgid "expected template-id" msgstr "" -#: cp/parser.c:17367 +#: cp/parser.c:17395 #, gcc-internal-format msgid "%<<::%> cannot begin a template-argument list" msgstr "" -#: cp/parser.c:17371 +#: cp/parser.c:17399 #, gcc-internal-format msgid "%<<:%> is an alternate spelling for %<[%>. Insert whitespace between %<<%> and %<::%>" msgstr "" -#: cp/parser.c:17375 +#: cp/parser.c:17403 #, gcc-internal-format msgid "(if you use %<-fpermissive%> or %<-std=c++11%>, or %<-std=gnu++11%> G++ will accept your code)" msgstr "" -#: cp/parser.c:17405 +#: cp/parser.c:17433 #, fuzzy, gcc-internal-format msgid "invalid template-argument-list" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:17406 +#: cp/parser.c:17434 #, gcc-internal-format msgid "function name as the left hand operand of %<<%> is ill-formed in C++20; wrap the function name in %<()%>" msgstr "" -#: cp/parser.c:17413 +#: cp/parser.c:17441 #, gcc-internal-format msgid "expected %<(%> after template-argument-list" msgstr "" -#: cp/parser.c:17517 +#: cp/parser.c:17545 #, gcc-internal-format msgid "parse error in template argument list" msgstr "" #. The name does not name a template. -#: cp/parser.c:17602 cp/parser.c:17768 cp/parser.c:17973 +#: cp/parser.c:17630 cp/parser.c:17796 cp/parser.c:18001 #, gcc-internal-format msgid "expected template-name" msgstr "" #. Explain what went wrong. -#: cp/parser.c:17648 +#: cp/parser.c:17676 #, gcc-internal-format msgid "non-template %qD used as template" msgstr "" -#: cp/parser.c:17650 +#: cp/parser.c:17678 #, gcc-internal-format msgid "use %<%T::template %D%> to indicate that it is a template" msgstr "" -#: cp/parser.c:17829 +#: cp/parser.c:17857 #, gcc-internal-format msgid "expected parameter pack before %<...%>" msgstr "" -#: cp/parser.c:17938 cp/parser.c:17956 cp/parser.c:18127 +#: cp/parser.c:17966 cp/parser.c:17984 cp/parser.c:18155 #, gcc-internal-format msgid "expected template-argument" msgstr "" -#: cp/parser.c:18094 +#: cp/parser.c:18122 #, fuzzy, gcc-internal-format msgid "invalid non-type template argument" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:18229 +#: cp/parser.c:18257 #, gcc-internal-format msgid "explicit instantiation shall not use % specifier" msgstr "" -#: cp/parser.c:18233 +#: cp/parser.c:18261 #, gcc-internal-format msgid "explicit instantiation shall not use % specifier" msgstr "" -#: cp/parser.c:18237 +#: cp/parser.c:18265 #, gcc-internal-format msgid "explicit instantiation shall not use % specifier" msgstr "" -#: cp/parser.c:18297 +#: cp/parser.c:18325 #, gcc-internal-format msgid "template specialization with C linkage" msgstr "" -#: cp/parser.c:18517 +#: cp/parser.c:18554 #, gcc-internal-format msgid "expected type specifier" msgstr "" -#: cp/parser.c:18710 +#: cp/parser.c:18747 #, gcc-internal-format msgid "use of % in lambda parameter declaration only available with %<-std=c++14%> or %<-std=gnu++14%>" msgstr "" -#: cp/parser.c:18716 +#: cp/parser.c:18753 #, gcc-internal-format msgid "use of % in parameter declaration only available with %<-std=c++14%> or %<-std=gnu++14%>" msgstr "" -#: cp/parser.c:18721 +#: cp/parser.c:18758 #, gcc-internal-format msgid "use of % in parameter declaration only available with %<-fconcepts-ts%>" msgstr "" -#: cp/parser.c:18878 +#: cp/parser.c:18915 #, gcc-internal-format msgid "expected template-id for type" msgstr "" -#: cp/parser.c:19008 +#: cp/parser.c:19045 #, gcc-internal-format msgid "expected type-name" msgstr "" -#: cp/parser.c:19118 +#: cp/parser.c:19155 #, fuzzy, gcc-internal-format #| msgid "function does not return string type" msgid "%qE does not constrain a type" msgstr "функцыя не вяртае тып string" -#: cp/parser.c:19119 +#: cp/parser.c:19156 #, gcc-internal-format msgid "concept defined here" msgstr "" -#: cp/parser.c:19141 +#: cp/parser.c:19178 #, gcc-internal-format msgid "expected % or % after %qE" msgstr "" -#: cp/parser.c:19148 +#: cp/parser.c:19185 #, gcc-internal-format msgid "unexpected placeholder in constrained result type" msgstr "" -#: cp/parser.c:19391 +#: cp/parser.c:19428 #, gcc-internal-format msgid "elaborated-type-specifier for a scoped enum must not use the %qD keyword" msgstr "" -#: cp/parser.c:19467 +#: cp/parser.c:19504 #, gcc-internal-format msgid "% must follow a nested-name-specifier" msgstr "" -#: cp/parser.c:19629 +#: cp/parser.c:19666 #, gcc-internal-format msgid "declaration %qD does not declare anything" msgstr "" -#: cp/parser.c:19717 +#: cp/parser.c:19754 #, gcc-internal-format msgid "attributes ignored on uninstantiated type" msgstr "" -#: cp/parser.c:19723 +#: cp/parser.c:19760 #, gcc-internal-format msgid "attributes ignored on template instantiation" msgstr "" -#: cp/parser.c:19728 +#: cp/parser.c:19765 #, gcc-internal-format msgid "attributes ignored on elaborated-type-specifier that is not a forward declaration" msgstr "" -#: cp/parser.c:19868 +#: cp/parser.c:19905 #, fuzzy, gcc-internal-format msgid "%qD is an enumeration template" msgstr "\"%s\" звычайна функцыя" -#: cp/parser.c:19879 +#: cp/parser.c:19916 #, gcc-internal-format msgid "%qD does not name an enumeration in %qT" msgstr "" -#: cp/parser.c:19894 +#: cp/parser.c:19931 #, gcc-internal-format msgid "unnamed scoped enum is not allowed" msgstr "" -#: cp/parser.c:19951 +#: cp/parser.c:19988 #, gcc-internal-format msgid "expected %<;%> or %<{%>" msgstr "" -#: cp/parser.c:19995 +#: cp/parser.c:20032 #, gcc-internal-format msgid "cannot add an enumerator list to a template instantiation" msgstr "" -#: cp/parser.c:20009 +#: cp/parser.c:20046 #, gcc-internal-format msgid "nested name specifier %qT for enum declaration does not name a class or namespace" msgstr "" -#: cp/parser.c:20021 cp/parser.c:25439 +#: cp/parser.c:20058 cp/parser.c:25474 #, gcc-internal-format msgid "declaration of %qD in namespace %qD which does not enclose %qD" msgstr "" -#: cp/parser.c:20026 cp/parser.c:25444 +#: cp/parser.c:20063 cp/parser.c:25479 #, gcc-internal-format msgid "declaration of %qD in %qD which does not enclose %qD" msgstr "" -#: cp/parser.c:20038 cp/parser.c:25457 +#: cp/parser.c:20075 cp/parser.c:25492 #, gcc-internal-format msgid "extra qualification not allowed" msgstr "" -#: cp/parser.c:20075 +#: cp/parser.c:20112 #, fuzzy, gcc-internal-format #| msgid "ISO C forbids an empty source file" msgid "ISO C++ forbids empty unnamed enum" msgstr "ISO C не дазваляе пусты ізыходны файл" -#: cp/parser.c:20100 +#: cp/parser.c:20137 #, gcc-internal-format msgid "opaque-enum-specifier without name" msgstr "" -#: cp/parser.c:20103 +#: cp/parser.c:20140 #, gcc-internal-format msgid "opaque-enum-specifier must use a simple identifier" msgstr "" -#: cp/parser.c:20290 +#: cp/parser.c:20327 #, gcc-internal-format msgid "%qD is not a namespace-name; did you mean %qs?" msgstr "" -#: cp/parser.c:20294 +#: cp/parser.c:20331 #, fuzzy, gcc-internal-format #| msgid "`%D' is not a function," msgid "%qD is not a namespace-name" msgstr "`%D' - гэта ня функцыя," -#: cp/parser.c:20298 +#: cp/parser.c:20335 #, gcc-internal-format msgid "expected namespace-name" msgstr "" -#: cp/parser.c:20359 +#: cp/parser.c:20396 #, gcc-internal-format msgid "nested inline namespace definitions only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:20370 +#: cp/parser.c:20407 #, gcc-internal-format msgid "standard attributes on namespaces must precede the namespace name" msgstr "" -#: cp/parser.c:20389 +#: cp/parser.c:20426 #, gcc-internal-format msgid "nested namespace definitions only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:20399 +#: cp/parser.c:20436 #, gcc-internal-format msgid "nested namespace name required" msgstr "" -#: cp/parser.c:20404 +#: cp/parser.c:20441 #, gcc-internal-format msgid "namespace name required" msgstr "" -#: cp/parser.c:20408 +#: cp/parser.c:20445 #, gcc-internal-format msgid "a nested namespace definition cannot have attributes" msgstr "" -#: cp/parser.c:20411 +#: cp/parser.c:20448 #, gcc-internal-format msgid "a nested namespace definition cannot be inline" msgstr "" -#: cp/parser.c:20418 +#: cp/parser.c:20455 #, gcc-internal-format msgid "namespace %qD entered" msgstr "" -#: cp/parser.c:20473 +#: cp/parser.c:20510 #, gcc-internal-format msgid "% definition is not allowed here" msgstr "" -#: cp/parser.c:20648 +#: cp/parser.c:20685 #, gcc-internal-format msgid "pack expansion in using-declaration only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:20663 +#: cp/parser.c:20700 #, fuzzy, gcc-internal-format msgid "a template-id may not appear in a using-declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/parser.c:20681 +#: cp/parser.c:20718 #, gcc-internal-format msgid "comma-separated list in using-declaration only available with %<-std=c++17%> or %<-std=gnu++17%>" msgstr "" -#: cp/parser.c:20691 +#: cp/parser.c:20728 #, gcc-internal-format msgid "access declarations are deprecated in favour of using-declarations; suggestion: add the % keyword" msgstr "" -#: cp/parser.c:20756 +#: cp/parser.c:20793 #, fuzzy, gcc-internal-format msgid "opaque-enum-declaration here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/parser.c:20826 +#: cp/parser.c:20863 #, gcc-internal-format msgid "types may not be defined in alias template declarations" msgstr "" -#: cp/parser.c:20997 +#: cp/parser.c:21034 #, gcc-internal-format msgid "% in % function only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:21016 cp/parser.c:21033 cp/parser.c:21047 +#: cp/parser.c:21053 cp/parser.c:21070 cp/parser.c:21084 #, fuzzy, gcc-internal-format msgid "duplicate % qualifier %qT" msgstr "паўтарэнне \"volatile\"" -#: cp/parser.c:21023 +#: cp/parser.c:21060 #, gcc-internal-format msgid "% qualifier %qT ignored outside of function body" msgstr "" -#: cp/parser.c:21060 +#: cp/parser.c:21097 #, gcc-internal-format msgid "%qT is not an % qualifier" msgstr "" -#: cp/parser.c:21076 +#: cp/parser.c:21113 #, gcc-internal-format msgid "% qualifier outside of function body" msgstr "" -#: cp/parser.c:21304 +#: cp/parser.c:21341 #, gcc-internal-format msgid "empty parentheses were disambiguated as a function declaration" msgstr "" -#: cp/parser.c:21315 +#: cp/parser.c:21352 #, gcc-internal-format msgid "remove parentheses to default-initialize a variable" msgstr "" -#: cp/parser.c:21320 +#: cp/parser.c:21357 #, gcc-internal-format msgid "or replace parentheses with braces to aggregate-initialize a variable" msgstr "" -#: cp/parser.c:21323 +#: cp/parser.c:21360 #, gcc-internal-format msgid "or replace parentheses with braces to value-initialize a variable" msgstr "" -#: cp/parser.c:21340 cp/parser.c:21365 +#: cp/parser.c:21377 cp/parser.c:21402 #, gcc-internal-format msgid "parentheses were disambiguated as a function declaration" msgstr "" -#: cp/parser.c:21352 cp/parser.c:21373 +#: cp/parser.c:21389 cp/parser.c:21410 #, gcc-internal-format msgid "replace parentheses with braces to declare a variable" msgstr "" -#: cp/parser.c:21359 +#: cp/parser.c:21396 #, gcc-internal-format msgid "add parentheses to declare a variable" msgstr "" -#: cp/parser.c:21587 +#: cp/parser.c:21624 #, fuzzy, gcc-internal-format msgid "a function-definition is not allowed here" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: cp/parser.c:21598 +#: cp/parser.c:21635 #, gcc-internal-format msgid "an % specification is not allowed on a function-definition" msgstr "" -#: cp/parser.c:21602 +#: cp/parser.c:21639 #, fuzzy, gcc-internal-format msgid "attributes are not allowed on a function-definition" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/parser.c:21653 +#: cp/parser.c:21690 #, gcc-internal-format msgid "expected constructor, destructor, or type conversion" msgstr "" -#: cp/parser.c:21773 +#: cp/parser.c:21810 #, fuzzy, gcc-internal-format msgid "initializer provided for function" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/parser.c:21815 +#: cp/parser.c:21852 #, gcc-internal-format msgid "attributes after parenthesized initializer ignored" msgstr "" -#: cp/parser.c:21829 +#: cp/parser.c:21866 #, gcc-internal-format msgid "non-function %qD declared as implicit template" msgstr "" -#: cp/parser.c:22320 +#: cp/parser.c:22357 #, fuzzy, gcc-internal-format msgid "array bound is not an integer constant" msgstr "памер масіва \"%s\" адмоўны" -#: cp/parser.c:22446 +#: cp/parser.c:22483 #, gcc-internal-format msgid "cannot define member of dependent typedef %qT" msgstr "" -#: cp/parser.c:22450 +#: cp/parser.c:22487 #, fuzzy, gcc-internal-format msgid "%<%T::%E%> is not a type" msgstr "\"%s\" мае незавершаны тып" @@ -54826,437 +54875,437 @@ msgstr "\"%s\" мае незавершаны тып" #. here because we do not have enough #. information about its original syntactic #. form. -#: cp/parser.c:22479 +#: cp/parser.c:22516 #, gcc-internal-format msgid "invalid declarator" msgstr "нерэчаісны абвяшчальнік" -#: cp/parser.c:22487 +#: cp/parser.c:22524 #, fuzzy, gcc-internal-format msgid "invalid use of constructor as a template" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:22489 +#: cp/parser.c:22526 #, gcc-internal-format msgid "use %<%T::%D%> instead of %<%T::%D%> to name the constructor in a qualified name" msgstr "" #. But declarations with qualified-ids can't appear in a #. function. -#: cp/parser.c:22604 +#: cp/parser.c:22641 #, fuzzy, gcc-internal-format #| msgid "Invalid declaration" msgid "qualified-id in declaration" msgstr "Нерэчаіснае абвяшчэнне" -#: cp/parser.c:22629 +#: cp/parser.c:22666 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "expected declarator" msgstr "пустое абвяшчэньне" -#: cp/parser.c:22750 +#: cp/parser.c:22787 #, gcc-internal-format msgid "%qD is a namespace" msgstr "" -#: cp/parser.c:22752 +#: cp/parser.c:22789 #, gcc-internal-format msgid "cannot form pointer to member of non-class %q#T" msgstr "" -#: cp/parser.c:22773 +#: cp/parser.c:22810 #, gcc-internal-format msgid "expected ptr-operator" msgstr "" -#: cp/parser.c:22834 +#: cp/parser.c:22871 #, fuzzy, gcc-internal-format #| msgid "duplicate `volatile'" msgid "duplicate cv-qualifier" msgstr "паўтарэнне \"volatile\"" -#: cp/parser.c:22888 +#: cp/parser.c:22925 #, gcc-internal-format msgid "multiple ref-qualifiers" msgstr "" -#: cp/parser.c:22925 +#: cp/parser.c:22962 #, gcc-internal-format msgid "%qE requires %<-fgnu-tm%>" msgstr "" -#: cp/parser.c:22983 +#: cp/parser.c:23020 #, fuzzy, gcc-internal-format #| msgid "duplicate `volatile'" msgid "duplicate virt-specifier" msgstr "паўтарэнне \"volatile\"" -#: cp/parser.c:23232 +#: cp/parser.c:23269 #, fuzzy, gcc-internal-format msgid "missing template arguments after %qT" msgstr "невыкарыстаемы параметр \"%s\"" -#: cp/parser.c:23238 +#: cp/parser.c:23275 #, gcc-internal-format msgid "%qT not permitted in template argument" msgstr "" -#: cp/parser.c:23241 cp/typeck2.c:353 cp/typeck2.c:400 cp/typeck2.c:2200 +#: cp/parser.c:23278 cp/typeck2.c:353 cp/typeck2.c:400 cp/typeck2.c:2197 #, fuzzy, gcc-internal-format #| msgid "invalid use of `%T'" msgid "invalid use of %qT" msgstr "нерэчаіснае выкарыстаньне `%T'" -#: cp/parser.c:23267 +#: cp/parser.c:23304 #, gcc-internal-format msgid "types may not be defined in template arguments" msgstr "" -#: cp/parser.c:23272 +#: cp/parser.c:23309 #, fuzzy, gcc-internal-format msgid "invalid use of % in template argument" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:23378 +#: cp/parser.c:23415 #, gcc-internal-format msgid "expected type-specifier" msgstr "" -#: cp/parser.c:23659 +#: cp/parser.c:23696 #, gcc-internal-format msgid "expected %<,%> or %<...%>" msgstr "" -#: cp/parser.c:23737 +#: cp/parser.c:23774 #, gcc-internal-format msgid "types may not be defined in parameter types" msgstr "" -#: cp/parser.c:23916 +#: cp/parser.c:23953 #, gcc-internal-format msgid "default arguments are only permitted for function parameters" msgstr "" -#: cp/parser.c:23934 +#: cp/parser.c:23971 #, gcc-internal-format msgid "parameter pack %qD cannot have a default argument" msgstr "" -#: cp/parser.c:23940 +#: cp/parser.c:23977 #, fuzzy, gcc-internal-format msgid "template parameter pack cannot have a default argument" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:23942 +#: cp/parser.c:23979 #, gcc-internal-format msgid "parameter pack cannot have a default argument" msgstr "" -#: cp/parser.c:24068 +#: cp/parser.c:24105 #, gcc-internal-format msgid "function-try-block body of % constructor only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:24072 +#: cp/parser.c:24109 #, gcc-internal-format msgid "function-try-block body of % function only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:24396 +#: cp/parser.c:24433 #, gcc-internal-format msgid "C++ designated initializers only available with %<-std=c++20%> or %<-std=gnu++20%>" msgstr "" -#: cp/parser.c:24416 +#: cp/parser.c:24453 #, gcc-internal-format msgid "ISO C++ does not allow GNU designated initializers" msgstr "" -#: cp/parser.c:24454 +#: cp/parser.c:24491 #, gcc-internal-format msgid "ISO C++ does not allow C99 designated initializers" msgstr "" -#: cp/parser.c:24468 +#: cp/parser.c:24505 #, gcc-internal-format msgid "either all initializer clauses should be designated or none of them should be" msgstr "" -#: cp/parser.c:24493 +#: cp/parser.c:24530 #, gcc-internal-format msgid "%<...%> not allowed in designated initializer list" msgstr "" -#: cp/parser.c:24544 +#: cp/parser.c:24581 #, gcc-internal-format msgid "%<.%s%> designator used multiple times in the same initializer list" msgstr "" -#: cp/parser.c:24600 cp/parser.c:24739 +#: cp/parser.c:24637 cp/parser.c:24774 #, gcc-internal-format msgid "expected class-name" msgstr "" -#: cp/parser.c:24978 +#: cp/parser.c:25013 #, gcc-internal-format msgid "expected %<;%> after class definition" msgstr "" -#: cp/parser.c:24981 +#: cp/parser.c:25016 #, gcc-internal-format msgid "expected %<;%> after struct definition" msgstr "" -#: cp/parser.c:24984 +#: cp/parser.c:25019 #, gcc-internal-format msgid "expected %<;%> after union definition" msgstr "" -#: cp/parser.c:25381 +#: cp/parser.c:25416 #, gcc-internal-format msgid "expected %<{%> or %<:%>" msgstr "" -#: cp/parser.c:25392 +#: cp/parser.c:25427 #, fuzzy, gcc-internal-format #| msgid "cannot find file for class %s" msgid "cannot specify % for a class" msgstr "немагчыма знайсьці файл для кляса %s" -#: cp/parser.c:25400 +#: cp/parser.c:25435 #, gcc-internal-format msgid "global qualification of class name is invalid" msgstr "" -#: cp/parser.c:25407 +#: cp/parser.c:25442 #, gcc-internal-format msgid "qualified name does not name a class" msgstr "" -#: cp/parser.c:25419 +#: cp/parser.c:25454 #, gcc-internal-format msgid "keyword % not allowed in class-head-name" msgstr "" -#: cp/parser.c:25425 +#: cp/parser.c:25460 #, fuzzy, gcc-internal-format msgid "invalid class name in declaration of %qD" msgstr "Нерэчаіснае абвяшчэнне" -#: cp/parser.c:25479 +#: cp/parser.c:25514 #, fuzzy, gcc-internal-format msgid "an explicit specialization must be preceded by %