diff --git a/ChangeLog b/ChangeLog index e9696513700..6b960232ba3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/config/ChangeLog b/config/ChangeLog index e81232d4775..380e92a7582 100644 --- a/config/ChangeLog +++ b/config/ChangeLog @@ -1,3 +1,7 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/contrib/ChangeLog b/contrib/ChangeLog index 86bfbe1fe67..039dc251ebb 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -1,3 +1,11 @@ +2019-08-16 Uros Bizjak + + * test_summary: Do not escape "=". + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/contrib/header-tools/ChangeLog b/contrib/header-tools/ChangeLog index 512d617f376..94c667f070f 100644 --- a/contrib/header-tools/ChangeLog +++ b/contrib/header-tools/ChangeLog @@ -1,3 +1,7 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/contrib/reghunt/ChangeLog b/contrib/reghunt/ChangeLog index 405500aeaf8..502783ce0e8 100644 --- a/contrib/reghunt/ChangeLog +++ b/contrib/reghunt/ChangeLog @@ -1,3 +1,7 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/contrib/regression/ChangeLog b/contrib/regression/ChangeLog index 61d7c859d6e..4bfbaebdb08 100644 --- a/contrib/regression/ChangeLog +++ b/contrib/regression/ChangeLog @@ -1,3 +1,7 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/contrib/test_summary b/contrib/test_summary index 3560a64c4f1..5760b053ec2 100755 --- a/contrib/test_summary +++ b/contrib/test_summary @@ -127,7 +127,7 @@ NR == 1 { if (lang == "") lang = " "$2" "; else lang = " "; } $2 == "version" { save = $0; $1 = ""; $2 = ""; version = $0; gsub(/^ */, "", version); gsub(/\r$/, "", version); $0 = save; } -/\===.*Summary/ { print ""; print; blanks=1; } +/===.*Summary/ { print ""; print; blanks=1; } /tests ===/ || /^(Target|Host|Native)/ || $2 == "version" { print; blanks=1; } /^(XPASS|FAIL|UNRESOLVED|WARNING|ERROR|# of )/ { sub ("\r", ""); print; } /^using:/ { print ""; print; print ""; } diff --git a/fixincludes/ChangeLog b/fixincludes/ChangeLog index 29a68baedf5..65c928f817c 100644 --- a/fixincludes/ChangeLog +++ b/fixincludes/ChangeLog @@ -1,3 +1,64 @@ +2019-08-25 Iain Sandoe + + Backport from mainline. + 2019-08-18 C.G. Dogan + Iain Sandoe + + PR target/83531 + * inclhack.def (darwin_api_availability): New; strip leading + underscores from API_XXXX defines. + * fixincl.x: Regenerate. + * tests/base/os/availability.h: New file. + +2019-08-24 Iain Sandoe + + Backport from mainline. + 2019-06-21 Iain Sandoe + + * inclhack.def: Replace the complex test using __STRICT_ANSI__ and + __STDC_VERSION__ with a test using __DARWIN_NO_LONG_LONG. + Ensure that the top level math.h uses <> to wrap included headers + rather than "". + * fixincl.x: Regenerated. + * tests/base/architecture/ppc/math.h: Update test to include the + __DARWIN_NO_LONG_LONG case. + +2019-08-24 Iain Sandoe + + Backport from mainline. + 2019-06-21 Iain Sandoe + + * inclhack.def: Guard __has_attribute and __has_extension in + os/base.h. + Guard Apple blocks syntax in dispatch/object.h. + * fixincl.x: Regenerate. + * tests/base/dispatch/object.h: New file. + * tests/base/os/base.h: New file. + +2019-06-01 Iain Sandoe + + Backport from mainline. + 2019-05-11 Iain Sandoe + + PR bootstrap/89864 + * inclhack.def (darwin_ucred__Atomic): Do not supply test_text + for wrap fixes. + * fixincl.x: Regenerated. + + Backport from mainline. + 2019-04-18 Erik Schnetter + Jakub Jelinek + Iain Sandoe + + PR bootstrap/89864 + * inclhack.def (darwin_ucred__Atomic): New, work around _Atomic keyword + use in headers included by C++. + * fixincl.x: Regenerated. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/fixincludes/fixincl.x b/fixincludes/fixincl.x index 9a2dc8b417f..3fd470cb965 100644 --- a/fixincludes/fixincl.x +++ b/fixincludes/fixincl.x @@ -2,11 +2,11 @@ * * DO NOT EDIT THIS FILE (fixincl.x) * - * It has been AutoGen-ed February 22, 2018 at 03:46:51 PM by AutoGen 5.18 + * It has been AutoGen-ed August 24, 2019 at 04:04:26 PM by AutoGen 5.17.4 * From the definitions inclhack.def * and the template file fixincl */ -/* DO NOT SVN-MERGE THIS FILE, EITHER Thu Feb 22 15:46:51 UTC 2018 +/* DO NOT SVN-MERGE THIS FILE, EITHER Sat Aug 24 16:04:26 BST 2019 * * You must regenerate it. Use the ./genfixes script. * @@ -15,7 +15,7 @@ * certain ANSI-incompatible system header files which are fixed to work * correctly with ANSI C and placed in a directory that GNU C will search. * - * This file contains 249 fixup descriptions. + * This file contains 254 fixup descriptions. * * See README for more information. * @@ -267,6 +267,56 @@ static const char* apzAab_Darwin7_9_Long_Double_FuncsPatch[] = { #endif /* __MATH__ */", (char*)NULL }; +/* * * * * * * * * * * * * * * * * * * * * * * * * * + * + * Description of Darwin_Api_Availability fix + */ +tSCC zDarwin_Api_AvailabilityName[] = + "darwin_api_availability"; + +/* + * File name selection pattern + */ +tSCC zDarwin_Api_AvailabilityList[] = + "os/availability.h\0"; +/* + * Machine/OS name selection pattern + */ +tSCC* apzDarwin_Api_AvailabilityMachs[] = { + "*-*-darwin*", + (const char*)NULL }; + +/* + * content selection pattern - do fix if pattern found + */ +tSCC zDarwin_Api_AvailabilitySelect0[] = + " *#define __API_AVAILABLE.*\n\ + *#define __API_DEPRECATED.*\n\ + *#define __API_DEPRECATED_WITH_REPLACEMENT.*\n\ + *#define __API_UNAVAILABLE.*\n"; + +/* + * content bypass pattern - skip fix if pattern found + */ +tSCC zDarwin_Api_AvailabilityBypass0[] = + "__IPHONE_OS_VERSION_MIN_REQUIRED"; + +#define DARWIN_API_AVAILABILITY_TEST_CT 2 +static tTestDesc aDarwin_Api_AvailabilityTests[] = { + { TT_NEGREP, zDarwin_Api_AvailabilityBypass0, (regex_t*)NULL }, + { TT_EGREP, zDarwin_Api_AvailabilitySelect0, (regex_t*)NULL }, }; + +/* + * Fix Command Arguments for Darwin_Api_Availability + */ +static const char* apzDarwin_Api_AvailabilityPatch[] = { + "format", + " #define API_AVAILABLE(...)\n\ + #define API_DEPRECATED(...)\n\ + #define API_DEPRECATED_WITH_REPLACEMENT(...)\n\ + #define API_UNAVAILABLE(...)\n", + (char*)NULL }; + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * Description of Aab_Fd_Zero_Asm_Posix_Types_H fix @@ -2598,7 +2648,7 @@ tSCC zDarwin_9_Long_Double_Funcs_2List[] = * Machine/OS name selection pattern */ tSCC* apzDarwin_9_Long_Double_Funcs_2Machs[] = { - "*-*-darwin7.9*", + "*-*-darwin*", (const char*)NULL }; /* @@ -2702,6 +2752,42 @@ static const char* apzDarwin_Gcc4_BreakagePatch[] = { "((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))", (char*)NULL }; +/* * * * * * * * * * * * * * * * * * * * * * * * * * + * + * Description of Darwin_Ll_Funcs_Avail fix + */ +tSCC zDarwin_Ll_Funcs_AvailName[] = + "darwin_ll_funcs_avail"; + +/* + * File name selection pattern + */ +tSCC zDarwin_Ll_Funcs_AvailList[] = + "architecture/ppc/math.h\0architecture/i386/math.h\0"; +/* + * Machine/OS name selection pattern + */ +tSCC* apzDarwin_Ll_Funcs_AvailMachs[] = { + "*-*-darwin*", + (const char*)NULL }; + +/* + * content selection pattern - do fix if pattern found + */ +tSCC zDarwin_Ll_Funcs_AvailSelect0[] = + "#if[^_]*__STDC_VERSION__[^_]*__STDC_VERSION__[^1]*199901L[^_]*__STRICT_ANSI__[^_]*__GNUC__[^)]*"; + +#define DARWIN_LL_FUNCS_AVAIL_TEST_CT 1 +static tTestDesc aDarwin_Ll_Funcs_AvailTests[] = { + { TT_EGREP, zDarwin_Ll_Funcs_AvailSelect0, (regex_t*)NULL }, }; + +/* + * Fix Command Arguments for Darwin_Ll_Funcs_Avail + */ +static const char* apzDarwin_Ll_Funcs_AvailPatch[] = { sed_cmd_z, + "-e", "s/#if[^_]*__STDC_VERSION__[^_]*__STDC_VERSION__[^_]*199901L[^_]*__STRICT_ANSI__[^_]*__GNUC__[^\\)]*)/#if !(__DARWIN_NO_LONG_LONG)/", + (char*)NULL }; + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * Description of Darwin_Longjmp_Noreturn fix @@ -2864,6 +2950,86 @@ static const char* apzDarwin_Os_Trace_3Patch[] = { #endif", (char*)NULL }; +/* * * * * * * * * * * * * * * * * * * * * * * * * * + * + * Description of Darwin_Os_Base_1 fix + */ +tSCC zDarwin_Os_Base_1Name[] = + "darwin_os_base_1"; + +/* + * File name selection pattern + */ +tSCC zDarwin_Os_Base_1List[] = + "os/base.h\0"; +/* + * Machine/OS name selection pattern + */ +tSCC* apzDarwin_Os_Base_1Machs[] = { + "*-*-darwin*", + (const char*)NULL }; + +/* + * content selection pattern - do fix if pattern found + */ +tSCC zDarwin_Os_Base_1Select0[] = + "#define __has_attribute.*\n\ +#endif"; + +#define DARWIN_OS_BASE_1_TEST_CT 1 +static tTestDesc aDarwin_Os_Base_1Tests[] = { + { TT_EGREP, zDarwin_Os_Base_1Select0, (regex_t*)NULL }, }; + +/* + * Fix Command Arguments for Darwin_Os_Base_1 + */ +static const char* apzDarwin_Os_Base_1Patch[] = { + "format", + "%0\n\ +#ifndef __has_extension\n\ +#define __has_extension(x) 0\n\ +#endif", + (char*)NULL }; + +/* * * * * * * * * * * * * * * * * * * * * * * * * * + * + * Description of Darwin_Dispatch_Object_1 fix + */ +tSCC zDarwin_Dispatch_Object_1Name[] = + "darwin_dispatch_object_1"; + +/* + * File name selection pattern + */ +tSCC zDarwin_Dispatch_Object_1List[] = + "dispatch/object.h\0"; +/* + * Machine/OS name selection pattern + */ +tSCC* apzDarwin_Dispatch_Object_1Machs[] = { + "*-*-darwin*", + (const char*)NULL }; + +/* + * content selection pattern - do fix if pattern found + */ +tSCC zDarwin_Dispatch_Object_1Select0[] = + "typedef void.*\\^dispatch_block_t.*"; + +#define DARWIN_DISPATCH_OBJECT_1_TEST_CT 1 +static tTestDesc aDarwin_Dispatch_Object_1Tests[] = { + { TT_EGREP, zDarwin_Dispatch_Object_1Select0, (regex_t*)NULL }, }; + +/* + * Fix Command Arguments for Darwin_Dispatch_Object_1 + */ +static const char* apzDarwin_Dispatch_Object_1Patch[] = { + "format", + "#if __BLOCKS__\n\ +%0\n\ +#endif", + (char*)NULL }; + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * Description of Darwin_Private_Extern fix @@ -3220,6 +3386,48 @@ static const char* apzDarwin_Stdint_7Patch[] = { #endif", (char*)NULL }; +/* * * * * * * * * * * * * * * * * * * * * * * * * * + * + * Description of Darwin_Ucred__Atomic fix + */ +tSCC zDarwin_Ucred__AtomicName[] = + "darwin_ucred__Atomic"; + +/* + * File name selection pattern + */ +tSCC zDarwin_Ucred__AtomicList[] = + "sys/ucred.h\0"; +/* + * Machine/OS name selection pattern + */ +tSCC* apzDarwin_Ucred__AtomicMachs[] = { + "*-*-darwin*", + (const char*)NULL }; + +/* + * content selection pattern - do fix if pattern found + */ +tSCC zDarwin_Ucred__AtomicSelect0[] = + "_Atomic"; + +#define DARWIN_UCRED__ATOMIC_TEST_CT 1 +static tTestDesc aDarwin_Ucred__AtomicTests[] = { + { TT_EGREP, zDarwin_Ucred__AtomicSelect0, (regex_t*)NULL }, }; + +/* + * Fix Command Arguments for Darwin_Ucred__Atomic + */ +static const char* apzDarwin_Ucred__AtomicPatch[] = { + "wrap", + "#if (__STDC_VERSION__ < 201112L) || defined(__cplusplus)\n\ +# define _Atomic volatile\n\ +#endif\n", + "#if (__STDC_VERSION__ < 201112L) || defined(__cplusplus)\n\ +# undef _Atomic\n\ +#endif\n", + (char*)NULL }; + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * Description of Dec_Intern_Asm fix @@ -10099,9 +10307,9 @@ static const char* apzX11_SprintfPatch[] = { * * List of all fixes */ -#define REGEX_COUNT 287 +#define REGEX_COUNT 293 #define MACH_LIST_SIZE_LIMIT 187 -#define FIX_COUNT 249 +#define FIX_COUNT 254 /* * Enumerate the fixes @@ -10110,6 +10318,7 @@ typedef enum { AAB_AIX_STDIO_FIXIDX, AAB_AIX_FCNTL_FIXIDX, AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_FIXIDX, + DARWIN_API_AVAILABILITY_FIXIDX, AAB_FD_ZERO_ASM_POSIX_TYPES_H_FIXIDX, AAB_FD_ZERO_GNU_TYPES_H_FIXIDX, AAB_FD_ZERO_SELECTBITS_H_FIXIDX, @@ -10171,10 +10380,13 @@ typedef enum { DARWIN_9_LONG_DOUBLE_FUNCS_2_FIXIDX, DARWIN_EXTERNC_FIXIDX, DARWIN_GCC4_BREAKAGE_FIXIDX, + DARWIN_LL_FUNCS_AVAIL_FIXIDX, DARWIN_LONGJMP_NORETURN_FIXIDX, DARWIN_OS_TRACE_1_FIXIDX, DARWIN_OS_TRACE_2_FIXIDX, DARWIN_OS_TRACE_3_FIXIDX, + DARWIN_OS_BASE_1_FIXIDX, + DARWIN_DISPATCH_OBJECT_1_FIXIDX, DARWIN_PRIVATE_EXTERN_FIXIDX, DARWIN_STDINT_1_FIXIDX, DARWIN_STDINT_2_FIXIDX, @@ -10183,6 +10395,7 @@ typedef enum { DARWIN_STDINT_5_FIXIDX, DARWIN_STDINT_6_FIXIDX, DARWIN_STDINT_7_FIXIDX, + DARWIN_UCRED__ATOMIC_FIXIDX, DEC_INTERN_ASM_FIXIDX, DJGPP_WCHAR_H_FIXIDX, ECD_CURSOR_FIXIDX, @@ -10374,6 +10587,11 @@ tFixDesc fixDescList[ FIX_COUNT ] = { AAB_DARWIN7_9_LONG_DOUBLE_FUNCS_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT, aAab_Darwin7_9_Long_Double_FuncsTests, apzAab_Darwin7_9_Long_Double_FuncsPatch, 0 }, + { zDarwin_Api_AvailabilityName, zDarwin_Api_AvailabilityList, + apzDarwin_Api_AvailabilityMachs, + DARWIN_API_AVAILABILITY_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, + aDarwin_Api_AvailabilityTests, apzDarwin_Api_AvailabilityPatch, 0 }, + { zAab_Fd_Zero_Asm_Posix_Types_HName, zAab_Fd_Zero_Asm_Posix_Types_HList, apzAab_Fd_Zero_Asm_Posix_Types_HMachs, AAB_FD_ZERO_ASM_POSIX_TYPES_H_TEST_CT, FD_MACH_ONLY | FD_REPLACEMENT, @@ -10679,6 +10897,11 @@ tFixDesc fixDescList[ FIX_COUNT ] = { DARWIN_GCC4_BREAKAGE_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, aDarwin_Gcc4_BreakageTests, apzDarwin_Gcc4_BreakagePatch, 0 }, + { zDarwin_Ll_Funcs_AvailName, zDarwin_Ll_Funcs_AvailList, + apzDarwin_Ll_Funcs_AvailMachs, + DARWIN_LL_FUNCS_AVAIL_TEST_CT, FD_MACH_ONLY, + aDarwin_Ll_Funcs_AvailTests, apzDarwin_Ll_Funcs_AvailPatch, 0 }, + { zDarwin_Longjmp_NoreturnName, zDarwin_Longjmp_NoreturnList, apzDarwin_Longjmp_NoreturnMachs, DARWIN_LONGJMP_NORETURN_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, @@ -10699,6 +10922,16 @@ tFixDesc fixDescList[ FIX_COUNT ] = { DARWIN_OS_TRACE_3_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, aDarwin_Os_Trace_3Tests, apzDarwin_Os_Trace_3Patch, 0 }, + { zDarwin_Os_Base_1Name, zDarwin_Os_Base_1List, + apzDarwin_Os_Base_1Machs, + DARWIN_OS_BASE_1_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, + aDarwin_Os_Base_1Tests, apzDarwin_Os_Base_1Patch, 0 }, + + { zDarwin_Dispatch_Object_1Name, zDarwin_Dispatch_Object_1List, + apzDarwin_Dispatch_Object_1Machs, + DARWIN_DISPATCH_OBJECT_1_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, + aDarwin_Dispatch_Object_1Tests, apzDarwin_Dispatch_Object_1Patch, 0 }, + { zDarwin_Private_ExternName, zDarwin_Private_ExternList, apzDarwin_Private_ExternMachs, DARWIN_PRIVATE_EXTERN_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, @@ -10739,6 +10972,11 @@ tFixDesc fixDescList[ FIX_COUNT ] = { DARWIN_STDINT_7_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, aDarwin_Stdint_7Tests, apzDarwin_Stdint_7Patch, 0 }, + { zDarwin_Ucred__AtomicName, zDarwin_Ucred__AtomicList, + apzDarwin_Ucred__AtomicMachs, + DARWIN_UCRED__ATOMIC_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE, + aDarwin_Ucred__AtomicTests, apzDarwin_Ucred__AtomicPatch, 0 }, + { zDec_Intern_AsmName, zDec_Intern_AsmList, apzDec_Intern_AsmMachs, DEC_INTERN_ASM_TEST_CT, FD_MACH_ONLY, diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def index 77444db2333..f574029e98e 100644 --- a/fixincludes/inclhack.def +++ b/fixincludes/inclhack.def @@ -194,6 +194,33 @@ fix = { _EndOfHeader_; }; +/* + * SDKs for 10.13 and 10.14 omit the definitions for API_AVAILABLE where + * __attribute__((availability)) is not supported. + */ +fix = { + hackname = darwin_api_availability; + mach = "*-*-darwin*"; + files = os/availability.h; + bypass = "__IPHONE_OS_VERSION_MIN_REQUIRED"; + select = + " *#define __API_AVAILABLE.*\n" + " *#define __API_DEPRECATED.*\n" + " *#define __API_DEPRECATED_WITH_REPLACEMENT.*\n" + " *#define __API_UNAVAILABLE.*\n"; + c_fix = format; + c_fix_arg = + " #define API_AVAILABLE(...)\n" + " #define API_DEPRECATED(...)\n" + " #define API_DEPRECATED_WITH_REPLACEMENT(...)\n" + " #define API_UNAVAILABLE(...)\n"; + test_text = + "#define __API_AVAILABLE(...)\n" + "#define __API_DEPRECATED(...)\n" + "#define __API_DEPRECATED_WITH_REPLACEMENT(...)\n" + "#define __API_UNAVAILABLE(...)\n"; +}; + /* * This fixes __FD_ZERO bug for linux 2.x.y (x <= 2 && y <= some n) */ @@ -1268,12 +1295,12 @@ fix = { }; /* - * For the AAB_darwin7_9_long_double_funcs fix to be useful, - * you have to not use "" includes. + * For the AAB_darwin7_9_long_double_funcs fix (and later fixes for long long) + * to be useful, the main math.h must use <> and not "" includes. */ fix = { hackname = darwin_9_long_double_funcs_2; - mach = "*-*-darwin7.9*"; + mach = "*-*-darwin*"; files = math.h; select = '#include[ \t]+\"'; c_fix = format; @@ -1281,7 +1308,7 @@ fix = { c_fix_arg = '([ \t]*#[ \t]*include[ \t]+)"([a-z0-9/]+)\.h"'; - test_text = '#include "architecture/ppc/math.h"'; + test_text = '#include '; }; /* @@ -1324,6 +1351,22 @@ fix = { "(__GNUC_MINOR__ >= 1)\n"; }; +/* + * math.h hides the long long functions that are available on the system for + * 10.5 and 10.6 SDKs, we expect to use them in G++ without specifying a value + * for __STDC_VERSION__, or switching __STRICT_ANSI__ off. + */ +fix = { + hackname = darwin_ll_funcs_avail; + mach = "*-*-darwin*"; + files = architecture/ppc/math.h, architecture/i386/math.h; + select = "#if[^_]*__STDC_VERSION__[^_]*__STDC_VERSION__[^1]*199901L[^_]*" + "__STRICT_ANSI__[^_]*__GNUC__[^\)]*"; + sed = "s/#if[^_]*__STDC_VERSION__[^_]*__STDC_VERSION__[^_]*199901L[^_]*" + "__STRICT_ANSI__[^_]*__GNUC__[^\\)]*\)/#if\ !\(__DARWIN_NO_LONG_LONG\)/"; + test_text = "#if\ !(__DARWIN_NO_LONG_LONG)"; +}; + /* * Before Mac OS X 10.8 doesn't mark longjump noreturn. */ @@ -1395,6 +1438,49 @@ fix = { _EOText_; }; +/* + * In macOS 10.10 , doesn't have __has_extension guarded. + */ +fix = { + hackname = darwin_os_base_1; + mach = "*-*-darwin*"; + files = os/base.h; + select = <<- OS_BASE_1_SEL +#define __has_attribute.* +#endif +OS_BASE_1_SEL; + c_fix = format; + c_fix_arg = <<- OS_BASE_1_FIX +%0 +#ifndef __has_extension +#define __has_extension(x) 0 +#endif +OS_BASE_1_FIX; + test_text = <<- OS_BASE_1_TEST +#define __has_attribute(x) 0 +#endif + +#if __GNUC__ +OS_BASE_1_TEST; +}; + +/* + * In macOS 10.10 , has unguarded block syntax. + */ +fix = { + hackname = darwin_dispatch_object_1; + mach = "*-*-darwin*"; + files = dispatch/object.h; + select = "typedef void.*\\^dispatch_block_t.*"; + c_fix = format; + c_fix_arg = "#if __BLOCKS__\n%0\n#endif"; + test_text = <<- DISPATCH_OBJECT_1_TEST +typedef void (^dispatch_block_t)(void); + +__BEGIN_DECLS +DISPATCH_OBJECT_1_TEST; +}; + /* * __private_extern__ doesn't exist in FSF GCC. Even if it did, * why would you ever put it in a system header file? @@ -1592,6 +1678,25 @@ fix = { "#define UINTMAX_C(v) (v ## ULL)"; }; +/* The SDK included with XCode 10.2 has the file that uses the + C11 _Atomic keyword (exposing it to C++ code). The work-around here follows + the header in declaring the entity volatile when _Atomic is not available. +*/ +fix = { + hackname = darwin_ucred__Atomic; + mach = "*-*-darwin*"; + files = sys/ucred.h; + select = "_Atomic"; + c_fix = wrap; + c_fix_arg = "#if (__STDC_VERSION__ < 201112L) || defined(__cplusplus)\n" + "# define _Atomic volatile\n" + "#endif\n"; + c_fix_arg = "#if (__STDC_VERSION__ < 201112L) || defined(__cplusplus)\n" + "# undef _Atomic\n" + "#endif\n"; + test_text = ""; /* Don't provide this for wrap fixes. */ +}; + /* * Fix on Digital UNIX V4.0: * It contains a prototype for a DEC C internal asm() function, diff --git a/fixincludes/tests/base/architecture/ppc/math.h b/fixincludes/tests/base/architecture/ppc/math.h index 4af7808fcc2..e7db705f5f9 100644 --- a/fixincludes/tests/base/architecture/ppc/math.h +++ b/fixincludes/tests/base/architecture/ppc/math.h @@ -12,3 +12,8 @@ #if defined( BROKEN_NAN_CHECK ) #if 1 #endif /* BROKEN_NAN_CHECK */ + + +#if defined( DARWIN_LL_FUNCS_AVAIL_CHECK ) +#if !(__DARWIN_NO_LONG_LONG) +#endif /* DARWIN_LL_FUNCS_AVAIL_CHECK */ diff --git a/fixincludes/tests/base/dispatch/object.h b/fixincludes/tests/base/dispatch/object.h new file mode 100644 index 00000000000..36722f4b9dc --- /dev/null +++ b/fixincludes/tests/base/dispatch/object.h @@ -0,0 +1,18 @@ +/* DO NOT EDIT THIS FILE. + + It has been auto-edited by fixincludes from: + + "fixinc/tests/inc/dispatch/object.h" + + This had to be done to correct non-standard usages in the + original, manufacturer supplied header file. */ + + + +#if defined( DARWIN_DISPATCH_OBJECT_1_CHECK ) +#if __BLOCKS__ +typedef void (^dispatch_block_t)(void); +#endif + +__BEGIN_DECLS +#endif /* DARWIN_DISPATCH_OBJECT_1_CHECK */ diff --git a/fixincludes/tests/base/os/availability.h b/fixincludes/tests/base/os/availability.h new file mode 100644 index 00000000000..e8696b14acd --- /dev/null +++ b/fixincludes/tests/base/os/availability.h @@ -0,0 +1,18 @@ +/* DO NOT EDIT THIS FILE. + + It has been auto-edited by fixincludes from: + + "fixinc/tests/inc/os/availability.h" + + This had to be done to correct non-standard usages in the + original, manufacturer supplied header file. */ + + + +#if defined( DARWIN_API_AVAILABILITY_CHECK ) + #define API_AVAILABLE(...) + #define API_DEPRECATED(...) + #define API_DEPRECATED_WITH_REPLACEMENT(...) + #define API_UNAVAILABLE(...) + +#endif /* DARWIN_API_AVAILABILITY_CHECK */ diff --git a/fixincludes/tests/base/os/base.h b/fixincludes/tests/base/os/base.h new file mode 100644 index 00000000000..44aa3932cfa --- /dev/null +++ b/fixincludes/tests/base/os/base.h @@ -0,0 +1,20 @@ +/* DO NOT EDIT THIS FILE. + + It has been auto-edited by fixincludes from: + + "fixinc/tests/inc/os/base.h" + + This had to be done to correct non-standard usages in the + original, manufacturer supplied header file. */ + + + +#if defined( DARWIN_OS_BASE_1_CHECK ) +#define __has_attribute(x) 0 +#endif +#ifndef __has_extension +#define __has_extension(x) 0 +#endif + +#if __GNUC__ +#endif /* DARWIN_OS_BASE_1_CHECK */ diff --git a/gcc/BASE-VER b/gcc/BASE-VER index fbb9ea12de3..56b6be4ebb2 100644 --- a/gcc/BASE-VER +++ b/gcc/BASE-VER @@ -1 +1 @@ -8.2.0 +8.3.1 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b93dae5dfb0..b4943c7099e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,5022 @@ +2019-12-28 Iain Sandoe + + Backport from mainline. + 2019-12-14 Iain Sandoe + + * config/darwin.h (DARWIN_EXTRA_SPECS): Add new + bundle spec. (DARWIN_BUNDLE1_SPEC): New. + (STARTFILE_SPEC): Use darwin bundle spec. + * config/rs6000/darwin.h (DARWIN_BUNDLE1_SPEC): New. + (DARWIN_DYLIB1_SPEC): Delete duplicate. + +2019-12-20 Roman Zhuykov + + Backport from mainline + 2019-12-13 Roman Zhuykov + + PR rtl-optimization/92591 + * modulo-sched.c (ps_add_node_check_conflicts): Improve checking + for history > 0 case. + * params.def (sms-dfa-history): Limit to 16. + +2019-12-19 Georg-Johann Lay + + Backport support for some AVR devices from avrxmega3 family + from SVN trunk r279309, r278387, r278389, r278478. + + PR target/92545 + * config/avr/avr-arch.h (avr_mcu_t) : New field. + * config/avr/avr-devices.c (avr_mcu_types): Adjust initializers. + * config/avr/avr-mcus.def (AVR_MCU): Add respective field. + * config/avr/gen-avr-mmcu-specs.c (print_mcu) + <*cpp, *cpp_mcu, *cpp_avrlibc, *link_pm_base_address>: Emit code + for spec definitions. + * config/avr/gen-avr-mmcu-texi.c: Rewrite. + * doc/avr-mmcu.texi: Regenerate. + +2019-12-17 Andreas Krebbel + + Backport from mainline + 2019-12-16 Andreas Krebbel + + PR target/92950 + * config/s390/vector.md ("mov" for V_8): Replace lh, lhy, + and lhrl with llc. + +2019-12-02 Wilco Dijkstra + + * config/aarch64/aarch64-cores.def (ares): Define. + (cortex-a76): Likewise. + (neoverse-n1): Likewise. + * config/aarch64/aarch64-tune.md: Regenerate. + * doc/invoke.texi (AArch64 Options): Document ares, cortex-a75 and + neoverse-n1. + +2019-11-29 David Malcolm + + PR driver/89014 + * config/aarch64/driver-aarch64.c (host_detect_local_cpu): Fix + use-after-free of the result of + aarch64_get_extension_string_for_isa_flags. + +2019-11-21 Jakub Jelinek + + PR tree-optimization/91355 + * tree-ssa-sink.c (select_best_block): Use >= rather than > + for early_bb scaled count with best_bb count comparison. + + Backported from mainline + 2019-11-20 Jakub Jelinek + + PR middle-end/90840 + * expmed.c (store_bit_field_1): Handle the case where op0 is not a MEM + and has a mode that doesn't have corresponding integral type. + + PR target/90867 + * config/i386/i386.c (ix86_valid_target_attribute_tree): Don't + clear opts->x_ix86_isa_flags{,2} here... + (ix86_valid_target_attribute_inner_p): ... but here when seeing + arch=. Also clear opts->x_ix86_isa_flags{,2}_explicit. + + PR c/90898 + * tree-ssa-ccp.c (insert_clobber_before_stack_restore): Remove + assertion. + (insert_clobbers_for_var): Fix a typo in function comment. + + 2019-11-19 Jakub Jelinek + + PR middle-end/91450 + * internal-fn.c (expand_mul_overflow): For s1 * s2 -> ur, if one + operand is negative and one non-negative, compare the non-negative + one against 0 rather than comparing s1 & s2 against 0. Otherwise, + don't compare (s1 & s2) == 0, but compare separately both s1 == 0 + and s2 == 0, unless one of them is known to be negative. Remove + tem2 variable, use tem where tem2 has been used before. + + 2019-11-08 Jakub Jelinek + + PR c++/92384 + * function.c (assign_parm_setup_block, assign_parm_setup_stack): Don't + copy TYPE_EMPTY_P arguments from data->entry_parm to data->stack_parm + slot. + (assign_parms): For TREE_ADDRESSABLE parms with TYPE_EMPTY_P type + force creation of a unique data.stack_parm slot. + + 2019-10-17 Jakub Jelinek + + PR tree-optimization/92056 + * tree-object-size.c (cond_expr_object_size): Return early if then_ + processing resulted in unknown size. + + 2019-09-07 Jakub Jelinek + + PR tree-optimization/91665 + * tree-vect-loop.c (vectorizable_reduction): Punt if base has type + incompatible with the type of PHI result. + + 2019-09-06 Jakub Jelinek + + * function.c (assign_parm_find_data_types): Use RECORD_OR_UNION_TYPE_P + before testing TYPE_TRANSPARENT_AGGR. + * calls.c (initialize_argument_information, load_register_parameters): + Likewise. + + 2019-09-05 Jakub Jelinek + + PR middle-end/91001 + PR middle-end/91105 + PR middle-end/91106 + * calls.c (load_register_parameters): For TYPE_TRANSPARENT_AGGR + types, use type of their first field instead of type of + args[i].tree_value. + + 2019-09-01 Jakub Jelinek + + PR middle-end/91623 + * optabs.c (expand_vec_cond_expr): If op0 is a VECTOR_CST and only + EQ_EXPR/NE_EXPR is supported, verify that op0 only contains + zeros or negative elements and use NE_EXPR instead of LT_EXPR against + zero vector. + +2019-11-20 Peter Bergner + + Backport from mainline + 2019-11-07 Peter Bergner + + PR other/92090 + * config/rs6000/predicates.md (input_operand): Allow MODE_PARTIAL_INT + modes for integer constants. + +2019-11-19 Eric Botcazou + + * doc/invoke.texi (-gno-internal-reset-location-views): Fix typo. + +2019-11-14 Martin Liska + + Backport from mainline + 2019-11-14 Martin Liska + + PR target/92389 + * config/i386/i386.h: Add PTA_AVX512VPOPCNTDQ to + PTA_ICELAKE_CLIENT which is later interited by + PTA_ICELAKE_SERVER and PTA_TIGERLAKE. + +2019-11-13 Dragan Mladjenovic + + Backport from mainline + * config/mips/mips.md (rotr3): Sanitize the constant argument + instead of asserting its value. + +2019-11-11 H.J. Lu + + Backport from trunk: + PR target/87833 + * config/i386/intelmic-mkoffload.c (prepare_target_image): Put + -fPIC and -shared the last to create offload image. + +2019-11-11 Thomas Schwinge + + Backport from trunk: + * gimplify.c (gimplify_scan_omp_clauses): Assert 'offset2' instead + of 'offset'. + + Backport from trunk: + * Makefile.in (LANG_CONFIGUREFRAGS): Define. + (config.status): Use/depend on it. + * configure.ac (all_lang_configurefrags): Track, 'AC_SUBST'. + * configure: Regenerate. + +2019-11-09 John David Anglin + + Backport from mainline + 2019-11-07 John David Anglin + + * config/pa/pa.md (memory_barrier): Revise to use ldcw barriers. + Enhance comment. + (memory_barrier_coherent, memory_barrier_64, memory_barrier_32): New + insn patterns using ldcw instruction. + (memory_barrier): Remove insn pattern using sync instruction. + * config/pa/pa.opt (coherent-ldcw): New option. + (ordered): New option. + +2019-11-08 Eric Botcazou + + PR target/92095 + * config/sparc/sparc-protos.h (output_load_pcrel_sym): Declare. + * config/sparc/sparc.c (sparc_cannot_force_const_mem): Revert latest + change. + (got_helper_needed): New static variable. + (output_load_pcrel_sym): New function. + (get_pc_thunk_name): Remove after inlining... + (load_got_register): ...here. Rework the initialization of the GOT + register and of the GOT helper. + (save_local_or_in_reg_p): Test the REGNO of the GOT register. + (sparc_file_end): Test got_helper_needed to decide whether the GOT + helper must be emitted. Use output_asm_insn instead of fprintf. + (sparc_init_pic_reg): In PIC mode, always initialize the PIC register + if optimization is enabled. + * config/sparc/sparc.md (load_pcrel_sym): Emit the assembly + by calling output_load_pcrel_sym. + +2019-11-06 John David Anglin + + Backport from mainline + 2018-09-19 John David Anglin + + PR rtl-optimization/85458 + * config/pa/pa.c (pa_adjust_priority): Delete. + (TARGET_SCHED_ADJUST_PRIORITY): Delete define. + +2019-11-05 Segher Boessenkool + + Backport from trunk + 2019-10-24 Segher Boessenkool + + * config/rs6000/altivec.md (altivec_vavgu): Rename to... + (uavg3_ceil): ... This. + (altivec_vavgs): Rename to... + (avg3_ceil): ... This. + * config/rs6000/rs6000-builtin.def (VAVGUB, VAVGSB, VAVGUH, VAVGSH, + VAVGUW, VAVGSW): Adjust. + +2019-11-05 Segher Boessenkool + + Backport from trunk + 2019-10-26 Segher Boessenkool + + PR target/91289 + * config/rs6000/rs6000.c (rs6000_emit_allocate_stack): Don't add an + immediate to r0; use r11 instead. Save and restore r11 to r0 around + this. + +2019-11-04 John David Anglin + + Backport from mainline + 2019-10-03 John David Anglin + + * config/pa/pa.h (MAX_PCREL17F_OFFSET): Adjust. + +2019-11-04 John David Anglin + + Backport from mainline + 2019-10-03 John David Anglin + + * config/pa/pa.c (pa_output_call): Remove 64-bit sibcall sequence. + (pa_attr_length_call): Adjust length for 64-bit plabel sequence. + +2019-11-04 John David Anglin + + Backport from mainline + 2019-10-12 John David Anglin + + * config/pa/pa.c (pa_output_call): Load descriptor address to register + %r22. Load function address before global pointer. + (pa_attr_length_indirect_call): Adjust length of inline versions of + $$dyncall. + (pa_output_indirect_call): Remove fast inline version of $$dyncall + before normal cases. Update inline $$dyncall sequences to preserve + function descriptor address in register %r22. + (TRAMPOLINE_CODE_SIZE): Adjust. + (pa_asm_trampoline_template): Revise 32-bit trampoline. Don't assume + register %r22 contains trampoline address. + (pa_trampoline_init): Adjust offsets. + (pa_trampoline_adjust_address): Likewise. + * config/pa/pa.h (TRAMPOLINE_SIZE): Adjust 32-bit size. + + 2019-10-17 John David Anglin + + * config/pa/pa.c (pa_output_indirect_call): Fix typos in last change. + +2019-11-1 Delia Burduv + + Backport from trunk + 2019-02-20 Andre Vieira + + PR target/86487 + * lra-constraints.c(uses_hard_regs_p): Fix handling of + paradoxical SUBREGS. + +2019-10-31 Iain Sandoe + + Backport from mainline + 2019-10-13 Iain Sandoe + + * config/darwin.c (machopic_indirection_name): Rework the + function to emit linker-visible symbols only for indirections + in the data section. Clean up the code and update comments. + +2019-10-31 Iain Sandoe + + Backport from mainline + 2019-10-09 Iain Sandoe + + * config/darwin.c (darwin_override_options): Make the check for + Objective-C ABI version more specific for 64bit code. + + Backport from mainline + 2019-10-06 Iain Sandoe + + * config/darwin.c (darwin_override_options): Adjust objective-c + ABI version error messages to avoid punctuation and contracted + negations. + +2019-10-31 Iain Sandoe + + Backport from mainline + 2019-07-03 Iain Sandoe + + * config/darwin.h (REAL_LIBGCC_SPEC): Adjust for earlier Darwin. + (STARTFILE_SPEC): Split crt3 into a separate spec. + (DARWIN_EXTRA_SPECS): Add crt2 and crt3 spec. + (DARWIN_CRT2_SPEC): New. + (DARWIN_CRT3_SPEC): New. + (MIN_LD64_OMIT_STUBS): Revise to 62.1. + * config/rs6000/darwin.h (DARWIN_CRT2_SPEC): Revise conditions. + (DARWIN_CRT3_SPEC): New. + +2019-10-31 Iain Sandoe + + Backport from mainline + 2019-06-27 Iain Sandoe + + * config/rs6000/darwin.h (ENDFILE_SPEC): Correct whitespace in the + spec. + + Backport from mainline + 2019-06-25 Iain Sandoe + + * config/rs6000/darwin.h (ENDFILE_SPEC): New. + +2019-10-31 Iain Sandoe + + Backport from mainline + 2019-06-18 Iain Sandoe + + * config/darwin.c (darwin_emit_unwind_label): New default to false. + (darwin_override_options): Set darwin_emit_unwind_label as needed. + +2019-10-31 Iain Sandoe + + Backport from mainline + 2019-08-13 Iain Sandoe + + * config/darwin.c (machopic_indirect_call_target): Rename symbol stub + flag. + (darwin_override_options): Likewise. + * config/darwin.h: Likewise. + * config/darwin.opt: Likewise. + * config/i386/i386.c (output_pic_addr_const): Likewise. + * config/rs6000/darwin.h: Likewise. + * config/rs6000/rs6000.c (rs6000_call_darwin_1): Likewise. + * config/i386/darwin.h (TARGET_MACHO_PICSYM_STUBS): Rename to ... + ... this TARGET_MACHO_SYMBOL_STUBS. + (FUNCTION_PROFILER):Likewise. + * config/i386/i386.h: Likewise. + + Backport from mainline + 2019-06-16 Iain Sandoe + + * config/darwin.c (machopic_indirect_call_target): Use renamed + darwin_picsymbol_stubs to decide on output. + (darwin_override_options): Handle darwin_picsymbol_stubs. + * config/darwin.h (MIN_LD64_OMIT_STUBS): New. + (LD64_VERSION): Revise default. + * config/darwin.opt: (mpic-symbol-stubs): New option. + (darwin_picsymbol_stubs): New variable. + * config/i386/darwin.h (TARGET_MACHO_BRANCH_ISLANDS): + rename to TARGET_MACHO_PICSYM_STUBS. + * config/i386/i386.c (output_pic_addr_const): Likewise. + * config/i386/i386.h Likewise. + * config/rs6000/darwin.h: Likewise. + * config/rs6000/rs6000.c (rs6000_call_darwin_1): Use renamed + darwin_picsymbol_stubs. + +2019-10-31 Iain Sandoe + + Backport from mainline + 2019-06-27 Iain Sandoe + + * config/rs6000/rs6000.c (darwin_rs6000_override_options): Honour + user-specified float mode choice for kernel mode code. + +2019-10-31 Iain Sandoe + + Backport from mainline + 2019-06-23 Iain Sandoe + + * config/rs6000/darwin.h: Handle GCC target pragma. + +2019-10-30 Dragan Mladjenovic + + Backport from mainline + 2019-07-09 Dragan Mladjenovic + + * cfgcleanup.c (old_insns_match_p): Check if used hard regs set is equal + for both call instructions. + +2019-10-28 Iain Sandoe + + Backport from mainline + 2019-10-17 Iain Sandoe + + PR target/65342 + * config/rs6000/darwin.md (movdi_low, movsi_low_st): Delete. + (movdi_low_st): Delete. + * config/rs6000/rs6000.c + (darwin_rs6000_legitimate_lo_sum_const_p): New. + (mem_operand_gpr): Validate Mach-O LO_SUM cases separately. + * config/rs6000/rs6000.md (movsi_low): Delete. + +2019-10-28 Iain Sandoe + + Backport from mainline + 2019-10-12 Iain Sandoe + + PR target/67183 + * config/darwin.c (machopic_indirection): New field to flag + non-lazy-symbol-pointers in the data section. + (machopic_indirection_name): Compute if an indirection should + appear in the data section. + (machopic_output_data_section_indirection): New callback split + from machopic_output_indirection. + (machopic_output_stub_indirection): Likewise. + (machopic_output_indirection): Retain the code for non-lazy + symbol pointers in their regular section. + (machopic_finish): Use the new callbacks to order the indirection + output. + +2019-10-28 Iain Sandoe + + Backport from mainline + 2019-10-12 Iain Sandoe + + * config/darwin-protos.h (machopic_finish): Delete. + * config/darwin.c (machopic_finish): Make static. + + Backport from mainline + 2019-10-09 Iain Sandoe + + * config/darwin.c (machopic_indirect_data_reference): Set flag to + indicate that the new symbol is an indirection. + (machopic_indirect_call_target): Likewise. + * config/darwin.h (MACHO_SYMBOL_FLAG_INDIRECTION): New. + (MACHO_SYMBOL_INDIRECTION_P): New. + (MACHO_SYMBOL_FLAG_STATIC): Adjust bit number. + + Backport from mainline + 2019-10-08 Iain Sandoe + + * config/darwin.c (machopic_indirect_data_reference): Check for + required indirections before making direct access to defined + values. + (machopic_output_indirection): Place the indirected pointes for + required indirections into the non-lazy symbol pointers section. + (darwin_encode_section_info): + * config/darwin.h (MACHO_SYMBOL_FLAG_MUST_INDIRECT): New. + (MACHO_SYMBOL_MUST_INDIRECT_P): New. + + Backport from mainline + 2019-10-07 Iain Sandoe + + * config/darwin.c (machopic_output_indirection): Don't put + hidden symbol indirections into the .data section, use the + non-lazy symbol pointers section as normal. + (darwin_encode_section_info): Record if a symbol is hidden. + * config/darwin.h (MACHO_SYMBOL_FLAG_HIDDEN_VIS): New. + (MACHO_SYMBOL_HIDDEN_VIS_P): New. + + Backport from mainline + 2019-10-07 Iain Sandoe + + * config/darwin.c (machopic_symbol_defined_p): Use symbol flag + predicates instead of accessing bits directly. + (machopic_indirect_call_target): Likewise. + (machopic_output_indirection): Likewise. + (darwin_encode_section_info): Improve description. Use renamed + symbol flags. Use predicate macros for variables and functions. + * config/darwin.h: + Rename MACHO_SYMBOL_VARIABLE to MACHO_SYMBOL_FLAG_VARIABLE. + Rename MACHO_SYMBOL_DEFINED to MACHO_SYMBOL_FLAG_DEFINED. + Rename MACHO_SYMBOL_STATIC to MACHO_SYMBOL_FLAG_STATIC. + (MACHO_SYMBOL_VARIABLE_P): New. + (MACHO_SYMBOL_DEFINED_P):New. + (MACHO_SYMBOL_STATIC_P): New. + * config/i386/darwin.h (MACHO_SYMBOL_FLAG_VARIABLE): Delete. + (SYMBOL_FLAG_SUBT_DEP): New. + * config/rs6000/darwin.h (SYMBOL_FLAG_SUBT_DEP): New. + +2019-10-28 Iain Sandoe + + Backport from mainline + 2019-10-05 Iain Sandoe + + PR target/59888 + * config/darwin.c (darwin_rodata_section): Add relocation flag, + choose const_data section for constants with relocations. + (machopic_select_section): Pass relocation flag to + darwin_rodata_section (). + +2019-10-28 Iain Sandoe + + Backport from mainline + 2019-09-21 Iain Sandoe + + * config/darwin.c (machopic_legitimize_pic_address): Check + for lra, rather than reload. + +2019-10-28 Peter Bergner + Jiufu Guo + + PR target/70010 + * config/rs6000/rs6000.c (rs6000_can_inline_p): Prohibit inlining if + the callee explicitly disables some isa_flags the caller is using. + +2019-10-25 Iain Sandoe + + * config/rs6000/darwin.h (ASM_OUTPUT_MAX_SKIP_ALIGN):Guard + against out of range max skip or log values. + +2019-10-25 Richard Earnshaw + + Backport from mainline + 2019-05-08 Mihail Ionescu + Richard Earnshaw + PR target/88167 + * config/arm/arm.c (thumb1_prologue_unused_call_clobbered_lo_regs): New + function. + (thumb1_epilogue_unused_call_clobbered_lo_regs): New function. + (thumb1_compute_save_core_reg_mask): Don't force a spare work + register if both the epilogue and prologue can use call-clobbered + regs. + (thumb1_unexpanded_epilogue): Use + thumb1_epilogue_unused_call_clobbered_lo_regs. Reverse the logic for + picking temporaries for restoring high regs to match that of the + prologue where possible. + (thumb1_expand_prologue): Add any usable call-clobbered low registers to + the list of work registers. Detect if the return address is still live + at the end of the prologue and avoid using it for a work register if so. + If the return address is not live, add LR to the list of pushable regs + after the first pass. + +2019-10-23 Peter Bergner + + Backport from mainline + 2019-10-08 Tulio Magno Quites Machado Filho + + * config.gcc: Move -L usage from LINK_OS_EXTRA_SPEC32 and + LINK_OS_EXTRA_SPEC64 to MD_STARTFILE_PREFIX and + MD_STARTFILE_PREFIX_1 when using --with-advance-toolchain. + +2019-10-23 Richard Biener + + Backport from mainline + 2019-10-17 Richard Biener + + PR debug/91887 + * dwarf2out.c (gen_formal_parameter_die): Also try to match + context_die against a DW_TAG_GNU_formal_parameter_pack parent. + + 2019-09-19 Richard Biener + + PR tree-optimization/91812 + * tree-ssa-phiprop.c (propagate_with_phi): Do not replace + volatile loads. + + 2019-09-17 Richard Biener + + PR debug/91772 + * dwarf2out.c (dwarf2out_late_global_decl): If early dwarf + was missing generate locations only once. + +2019-10-23 Eric Botcazou + + PR tree-optimization/92131 + * tree-vrp.c (extract_range_from_plus_minus_expr): If the resulting + range would be symbolic, drop to varying for any explicit overflow + in the constant part or if neither range is a singleton. + +2019-10-20 Iain Sandoe + + Backport from mainline + 2019-10-03 Iain Sandoe + + PR target/87243 + * config/darwin-driver.c (maybe_get_sysroot_from_sdkroot): New. + (darwin_driver_init): Use the sysroot provided by SDKROOT when that + is available and the user has not set one on the command line. + +2019-10-20 Iain Sandoe + + Backport from mainline + 2019-07-03 Iain Sandoe + + * config/darwin.h (DRIVER_SELF_SPECS): Remove the linker cases. + (RDYNAMIC): Rename to, DARWIN_RDYNAMIC. + (DARWIN_PIE_SPEC, DARWIN_NOPIE_SPEC): Adjust to remove the Xlinker + clauses. + (LINK_COMMAND_SPEC_A): Add DARWIN_RDYNAMIC, DARWIN_PIE_SPEC and + DARWIN_NOPIE_SPEC. + + Backport from mainline + 2019-06-19 Iain Sandoe + + * config/darwin.h (DRIVER_SELF_SPECS): Add RDYNAMIC, DARWIN_PIE_SPEC + and DARWIN_NOPIE_SPEC. + (RDYNAMIC): New, modified from DARWIN_EXPORT_DYNAMIC. + (DARWIN_PIE_SPEC): Collate from darwin.h and darwin9.h. + (DARWIN_NOPIE_SPEC): Collate from darwin10.h. + (DARWIN_NOCOMPACT_UNWIND): New from darwin10.h + (DARWIN_EXPORT_DYNAMIC): Delete. + * config/darwin10.h (LINK_GCC_C_SEQUENCE_SPEC): Move no_compact_unwind + and pie options processing to darwin.h. + * config/darwin9.h (DARWIN_PIE_SPEC): Move pie processing to darwin.h + +2019-10-18 Georg-Johann Lay + + Backport from 2019-10-18 trunk r277143. + + PR target/86040 + * config/avr/avr.c (avr_out_lpm): Do not shortcut-return. + +2019-10-17 Segher Boessenkool + + Backport from trunk + 2019-03-15 Segher Boessenkool + + PR rtl-optimization/89721 + * lra-constraints (invariant_p): Return false if side_effects_p holds. + +2019-10-17 Richard Earnshaw + + Backport from mainline + 2019-05-03 Richard Earnshaw + + PR target/89400 + * config/arm/arm.md (unaligned_loadsi): Add variant for thumb1. + Restrict 'all' variant to 32-bit configurations. + (unaligned_loadhiu): Likewise. + (unaligned_storehi): Likewise. + (unaligned_storesi): Likewise. + (unaligned_loadhis): Disable when compiling for thumb1. + +2019-10-14 Will Schmidt + + Backport from trunk + 2019-09-26 Will Schmidt + + * config/rs6000/rs6000-builtin.def: (LVSL, LVSR, LVEBX, LVEHX, + LVEWX, LVXL, LVXL_V2DF, LVXL_V2DI, LVXL_V4SF, LVXL_V4SI, LVXL_V8HI, + LVXL_V16QI, LVX, LVX_V1TI, LVX_V2DF, LVX_V2DI, LVX_V4SF, LVX_V4SI, + LVX_V8HI, LVX_V16QI, LVLX, LVLXL, LVRX, LVRXL, LXSDX, LXVD2X_V1TI, + LXVD2X_V2DF, LXVD2X_V2DI, LXVDSX, LXVW4X_V4SF, LXVW4X_V4SI, + LXVW4X_V8HI, LXVW4X_V16QI, LD_ELEMREV_V1TI, LD_ELEMREV_V2DF, + LD_ELEMREV_V2DI, LD_ELEMREV_V4SF, LD_ELEMREV_V4SI, LD_ELEMREV_V8HI, + LD_ELEMREV_V16QI): Use the PURE attribute. + +2019-10-10 Uroš Bizjak + + PR target/92022 + * config/alpha/alpha.c (alpha_handle_trap_shadows): Skip DEBUG_INSN. + +2019-10-10 Oleg Endo + + Backport from mainline + 2019-10-10 Oleg Endo + + PR target/88630 + * config/sh/sh.h (TARGET_FPU_SH4_300): New macro. + * config/sh/sh.c (sh_option_override): Enable fsca and fsrra insns + also for TARGET_FPU_SH4_300. + (sh_emit_mode_set): Check for TARGET_FPU_SH4_300 instead of + TARGET_SH4_300. + * config/sh/sh.md (toggle_pr): Add TARGET_FPU_SH4_300 condition. + (negsf2): Expand to either negsf2_fpscr or negsf2_no_fpscr. + (*negsf2_i): Split into ... + (negsf2_fpscr, negsf2_no_fpscr): ... these new patterns. + (abssf2): Expand to either abssf2_fpsc or abssf2_no_fpsc. + (**abssf2_i): Split into ... + (abssf2_fpscr, abssf2_no_fpscr): ... these new patterns. + (negdf2): Expand to either negdf2_fpscr or negdf2_no_fpscr. + (*negdf2_i): Split into ... + (negdf2_fpscr, negdf2_no_fpscr): ... these new patterns. + (absdf2): Expand to either absdf2_fpscr or absdf2_no_fpsc. + (**abssf2_i): Split into ... + (absdf2_fpscr, absdf2_no_fpscr): ... these new patterns. + +2019-10-07 Bill Schmidt + + Backport from mainline + 2019-10-01 Bill Schmidt + + PR target/91275 + * config/rs6000/rs6000-p8swap.c (rtx_is_swappable_p): Don't swap + vpmsumd. + +2019-10-01 Oleg Endo + + Backport from mainline + + 2019-10-01 Oleg Endo + + PR target/88562 + * config/sh/sh.c (sh_extending_set_of_reg::use_as_extended_reg): Use + sh_check_add_incdec_notes to preserve REG_INC notes when replacing + a memory access insn. + +2019-10-01 Kyrylo Tkachov + + Backport from mainline + 2019-09-24 Kyrylo Tkachov + + * config/aarch64/aarch64.md (mov): Don't call + aarch64_split_dimode_const_store on volatile MEM. + +2019-10-01 Eric Botcazou + + PR target/91854 + Backport from mainline + 2019-09-20 Eric Botcazou + + PR target/91269 + * config/sparc/sparc.h (HARD_REGNO_CALLER_SAVE_MODE): Define. + +2019-09-28 Oleg Endo + + Backport from mainline + 2019-09-28 Oleg Endo + + PR target/80672 + * config/sh/sh.c (parse_validate_atomic_model_option): Use + std::string::compare instead of std::string::find. + +2019-09-28 Oleg Endo + + Backport from mainline + 2018-07-15 Jeff Law + + PR target/85993 + * config/sh/sh.c (output_mi_thunk): Remove dead conditional + block. + +2019-09-26 Iain Sandoe + + Backport from mainline + 2019-06-16 Iain Sandoe + + * config/darwin.opt (prebind, noprebind, seglinkedit, + noseglinkedit): Add RejectNegative. + + Backport from mainline + 2019-06-14 Iain Sandoe + + * config/darwin.opt: Add RejectNegative where needed, reorder + and add minimal functional descriptions. + +2019-09-25 Kyrylo Tkachov + + Backport from mainline + 2019-08-22 Kyrylo Tkachov + + * config/arm/arm_acle.h: Use arch=armv8-a+crc+simd pragma for CRC32 + intrinsics if __ARM_FP. + Use __ARM_FEATURE_CRC32 ifdef guard. + +2019-09-23 Max Filippov + + Backport from mainline + 2019-06-18 Max Filippov + + * config/xtensa/xtensa.c (xtensa_expand_prologue): Add stack + pointer adjustment for the case of no callee-saved registers and + stack frame bigger than 128 bytes. + +2019-09-20 John David Anglin + + * config/pa/pa.c (pa_trampoline_init): Remove spurious extended + character. + +2019-09-20 Andreas Krebbel + + Backport from mainline + 2019-06-06 Andreas Krebbel + + PR rtl-optimization/88751 + * ira.c (ira): Use the number of the actually referenced registers + when calculating the threshold. + +2019-09-11 Eric Botcazou + + PR rtl-optimization/89795 + * rtlanal.c (nonzero_bits1) : Do not propagate results from + inner REGs to paradoxical SUBREGs if WORD_REGISTER_OPERATIONS is set. + +2019-09-09 Jakub Jelinek + + PR target/87853 + * config/i386/emmintrin.h (_mm_cmpeq_epi8): Use casts to __v16qi + instead of __v16qs. + + PR target/91704 + * config/i386/avxintrin.h (__v32qs): New typedef. + * config/i386/avx2intrin.h (_mm256_cmpgt_epi8): Use casts to __v32qs + instead of __v32qi. + +2019-09-04 Wilco Dijkstra + + Backport from mainline + 2019-08-13 Wilco Dijkstra + + PR target/81800 + * gcc/config/aarch64/aarch64.md (lrint): Disable lrint pattern if GPF + operand is larger than a long int. + +2019-09-03 Iain Sandoe + + Backport from mainline + 2019-08-23 Iain Sandoe + + PR pch/61250 + * ggc-page.c (ggc_pch_read): Read the ggc_pch_ondisk structure + and issue any diagnostics needed before collecting the pre-PCH + state. + +2019-09-01 Eric Botcazou + + PR target/91472 + * config/sparc/sparc.c (sparc_cannot_force_const_mem): Return true + during LRA/reload in PIC mode if the PIC register hasn't been used yet. + (sparc_pic_register_p): Test reload_in_progress for consistency's sake. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-06-21 Richard Biener + + PR tree-optimization/90930 + * tree-ssa-reassoc.c (rewrite_expr_tree_parallel): Set visited + flag on new stmts to avoid re-processing them. + + 2019-05-27 Richard Biener + + PR tree-optimization/90637 + * tree-ssa-sink.c (statement_sink_location): Honor the + computed sink location for single-uses. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-07-08 Richard Biener + + PR tree-optimization/91108 + * tree-ssa-sccvn.c: Include builtins.h. + (vn_reference_lookup_3): Use only alignment constraints to + verify same-valued store disambiguation. + +2019-08-30 Segher Boessenkool + + Backport from trunk + 2019-08-22 Segher Boessenkool + + PR target/91481 + * config/rs6000/rs6000.md (unspec): Delete UNSPEC_DARN, UNSPEC_DARN_32, + and UNSPEC_DARN_RAW. + (unspecv): New enumerator values UNSPECV_DARN, UNSPECV_DARN_32, and + UNSPECV_DARN_RAW. + (darn_32): Use an unspec_volatile, and UNSPECV_DARN_32. + (darn_raw): Use an unspec_volatile, and UNSPECV_DARN_RAW. + (darn): Use an unspec_volatile, and UNSPECV_DARN. + +2019-08-30 Segher Boessenkool + + Backport from trunk + 2019-08-22 Segher Boessenkool + + * config/rs6000/altivec.md (unspec): Delete UNSPEC_DARN, UNSPEC_DARN_32, + UNSPEC_DARN_RAW, UNSPEC_CMPRB, UNSPEC_CMPRB2, UNSPEC_CMPEQB; move to... + * config/rs6000/rs6000.md (unspec): ... here. + * config/rs6000/altivec.md (darn_32, darn_raw, darn, cmprb, + *cmprb_internal, setb_signed, setb_unsigned, cmprb2, *cmprb2_internal, + cmpeqb, *cmpeqb_internal): Delete, move to... + * config/rs6000/rs6000.md (darn_32, darn_raw, darn, cmprb, + *cmprb_internal, setb_signed, setb_unsigned, cmprb2, *cmprb2_internal, + cmpeqb, *cmpeqb_internal): ... here. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-01-07 Richard Sandiford + + PR middle-end/88567 + * tree-vect-loop.c (get_initial_defs_for_reduction): Pass the + output vector directly to duplicate_and_interleave instead of + going through a temporary. Postpone insertion of ctor_seq to + the end of the loop. + + 2018-12-04 Richard Biener + + PR tree-optimization/88315 + * tree-vect-loop.c (get_initial_defs_for_reduction): Simplify + and fix initialization vector for SAD and DOT_PROD SLP reductions. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-06-18 Richard Biener + + PR debug/90900 + * cfgexpand.c (expand_debug_expr): Treat NOTE_P DECL_RTL + as if optimized away. + + 2019-04-29 Richard Biener + + PR tree-optimization/90278 + * tree-ssa-forwprop.c (pass_forwprop::execute): Transfer/clean + EH on comparison simplification. + + 2019-04-25 Richard Biener + + PR middle-end/90194 + * match.pd: Add pattern to simplify view-conversion of an + empty constructor. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-08-12 Richard Biener + + PR lto/91375 + * tree.c (free_lang_data_in_type): Do not free TYPE_BINFO dependent on + flag_devirtualize. + + 2019-07-31 Richard Biener + + PR tree-optimization/91293 + * tree-vect-slp.c (vect_build_slp_tree_2): Do not swap operands + of reduction stmts. + + 2019-07-31 Richard Biener + + PR tree-optimization/91280 + * tree-ssa-structalias.c (get_constraint_for_component_ref): + Decompose MEM_REF manually for offset handling. + + 2019-07-19 Richard Biener + + PR tree-optimization/91200 + * tree-ssa-phiopt.c (cond_store_replacement): Check we have + no PHI nodes in middle-bb. + + 2019-07-15 Richard Biener + + PR middle-end/91162 + * tree-cfg.c (move_block_to_fn): When releasing a virtual PHI + node make sure to replace all uses with something valid. + + 2019-07-11 Richard Biener + + PR middle-end/91131 + * gimplify.c (gimplify_compound_literal_expr): Force a temporary + when the object is volatile and we have not cleared it even though + there are no nonzero elements. + + 2019-07-10 Richard Biener + + PR tree-optimization/91126 + * tree-ssa-sccvn.c (vn_reference_lookup_3): Adjust + native encoding offset for BYTES_BIG_ENDIAN. + +2019-08-30 Richard Biener + + * lto-streamer.h (LTO_minor_version): Bump. + + Backport from mainline + 2019-05-06 Richard Biener + + PR tree-optimization/90328 + * tree-data-ref.h (dr_may_alias_p): Pass in the actual loop nest. + * tree-data-ref.c (dr_may_alias_p): Check whether the clique + is valid in the loop nest before using it. + (initialize_data_dependence_relation): Adjust. + * graphite-scop-detection.c (build_alias_set): Pass the SCOP enclosing + loop as loop-nest to dr_may_alias_p. + + 2019-03-08 Richard Biener + + PR middle-end/89578 + * cfgloop.h (struct loop): Add owned_clique field. + * cfgloopmanip.c (copy_loop_info): Copy it. + * tree-cfg.c (gimple_duplicate_bb): Do not remap owned_clique + cliques. + * tree-inline.c (copy_loops): Remap owned_clique. + * lto-streamer-in.c (input_cfg): Stream owned_clique. + * lto-streamer-out.c (output_cfg): Likewise. + + 2019-02-22 Richard Biener + + PR tree-optimization/87609 + * tree-cfg.c (gimple_duplicate_bb): Only remap inlined cliques. + + 2019-02-22 Richard Biener + + PR middle-end/87609 + * cfghooks.h (dependence_hash): New typedef. + (struct copy_bb_data): New type. + (cfg_hooks::duplicate_block): Adjust to take a copy_bb_data argument. + (duplicate_block): Likewise. + * cfghooks.c (duplicate_block): Pass down copy_bb_data. + (copy_bbs): Create and pass down copy_bb_data. + * cfgrtl.c (cfg_layout_duplicate_bb): Adjust. + (rtl_duplicate_bb): Likewise. + * tree-cfg.c (gimple_duplicate_bb): If the copy_bb_data arg is not NULL + remap dependence info. + + 2019-02-22 Richard Biener + + PR tree-optimization/87609 + * tree-core.h (tree_base): Document special clique values. + * tree-inline.c (remap_dependence_clique): Do not use the + special clique value of one. + (maybe_set_dependence_info): Use clique one. + (clear_dependence_clique): New callback. + (compute_dependence_clique): Clear clique one from all refs + before assigning it (again). + +2019-08-30 Bin Cheng + + Backport from mainline + 2019-07-18 Bin Cheng + + PR tree-optimization/91137 + * tree-ssa-loop-ivopts.c (struct ivopts_data): New field. + (tree_ssa_iv_optimize_init, alloc_iv, tree_ssa_iv_optimize_finalize): + Init, use and fini the above new field. + (determine_base_object_1): New function. + (determine_base_object): Reimplement using walk_tree. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-04-09 Richard Sandiford + + * tree-vect-data-refs.c (vect_get_smallest_scalar_type): Always + use gimple_expr_type for load and store calls. Skip over the + condition argument in a conditional internal function. + Protect use of TREE_INT_CST_LOW. + + 2019-04-08 Richard Biener + + PR tree-optimization/90006 + * tree-vect-data-refs.c (vect_get_smallest_scalar_type): Handle + calls like lrint. + + 2019-04-01 Bin Cheng + + PR tree-optimization/89725 + * tree-chrec.c (chrec_contains_symbols): New parameter. Handle outer + loop's chrec as invariant symbol. + * tree-chrec.h (chrec_contains_symbols): New parameter. + * tree-data-ref.c (analyze_miv_subscript): Pass new argument. + (build_classic_dist_vector_1, add_other_self_distances): Bypass access + function of loops not in DDR's loop_nest. + + 2019-03-26 Bin Cheng + + PR tree-optimization/81740 + * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): + In case of outer loop vectorization, check for backward dependence + at the inner loop if outer loop dependence is reversed. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-04-24 Richard Biener + + PR middle-end/90213 + * gimple-fold.c (fold_const_aggregate_ref_1): Do multiplication + by size and BITS_PER_UNIT on poly-wide-ints. + + 2019-04-11 Richard Biener + + PR tree-optimization/90020 + * tree-ssa-sccvn.c (vn_reference_may_trap): New function. + * tree-ssa-sccvn.h (vn_reference_may_trap): Declare. + * tree-ssa-pre.c (compute_avail): Use it to not put + possibly trapping references after a call that might not + return into EXP_GEN. + * gcse.c (compute_hash_table_work): Do not elide + marking a block containing a call if the call might not + return. + +2019-08-29 Iain Sandoe + + Backport from mainline + 2019-07-24 Iain Sandoe + + PR bootstrap/87030 + * config/i386/darwin.h (REAL_LIBGCC_SPEC): Revert change from r273749. + + PR bootstrap/87030 + * config/i386/darwin.h (REAL_LIBGCC_SPEC): Move from here... + * config/i386/darwin32-biarch.h .. to here. + * config/i386/darwin64-biarch.h: Adjust comments. + * config/rs6000/darwin32-biarch.h: Likewise. + * config/rs6000/darwin64-biarch.h: Likewise. + * config.gcc: Missed commit from r273746 + (*-*-darwin*): Don't include CPU t-darwin here. + (i[34567]86-*-darwin*): Adjust to use biarch files. Produce + an error message if i686-darwin configuration is attempted for + Darwin >= 18. + + Backport from mainline + 2019-07-23 Iain Sandoe + + PR bootstrap/87030 + * config.gcc (*-*-darwin*): Don't include CPU t-darwin here. + (i[34567]86-*-darwin*): Adjust to use biarch files. Produce + an error message if i686-darwin configuration is attempted for + Darwin >= 18. + (x86_64-*-darwin*): Switch to single multilib for Darwin >= 18. + (powerpc-*-darwin*): Use biarch files where needed. + (powerpc64-*-darwin*): Likewise. + * config/i386/darwin.h (REAL_LIBGCC_SPEC): Move to new biarch file. + (DARWIN_ARCH_SPEC, DARWIN_SUBARCH_SPEC): Revise for default single + arch case. + * config/i386/darwin32-biarch.h: New. + * config/i386/darwin64.h: Rename. + * gcc/config/i386/darwin64-biarch.h: To this. + * config/i386/t-darwin: Rename. + * gcc/config/i386/t-darwin32-biarch: To this. + * config/i386/t-darwin64: Rename. + * gcc/config/i386/t-darwin64-biarch: To this. + * config/rs6000/darwin32-biarch.h: New. + * config/rs6000/darwin64.h: Rename. + * config/rs6000/darwin64-biarch.h: To this. + (DARWIN_ARCH_SPEC, DARWIN_SUBARCH_SPEC): Revise for default single + arch case. + * config/rs6000/t-darwin8: Rename. + * config/rs6000/t-darwin32-biarch: To this. + * config/rs6000/t-darwin64 Rename. + * config/rs6000/t-darwin64-biarch: To this. + +2019-08-29 Jakub Jelinek + + Backported from mainline + 2019-07-30 Jakub Jelinek + + PR target/91150 + * config/i386/i386.c (expand_vec_perm_blend): Change mask type + from unsigned to unsigned HOST_WIDE_INT. For E_V64QImode cast + comparison to unsigned HOST_WIDE_INT before shifting it left. + + 2019-07-04 Jakub Jelinek + + PR middle-end/78884 + * gimplify.c (struct gimplify_omp_ctx): Add add_safelen1 member. + (gimplify_bind_expr): If seeing TREE_ADDRESSABLE VLA inside of simd + loop body, set ctx->add_safelen1 instead of making it GOVD_PRIVATE. + (gimplify_adjust_omp_clauses): Add safelen (1) clause if + ctx->add_safelen1 is set. + + PR rtl-optimization/90756 + * explow.c (promote_ssa_mode): Always use TYPE_MODE, don't bypass it + for VECTOR_TYPE_P. + + 2019-06-12 Jakub Jelinek + + PR c/90760 + * symtab.c (symtab_node::set_section): Allow being called on aliases + as long as they aren't analyzed yet. + + 2019-06-05 Jakub Jelinek + + PR debug/90733 + * var-tracking.c (vt_expand_loc_callback): Don't create raw subregs + with VOIDmode inner operands. + + 2019-04-19 Jakub Jelinek + + PR middle-end/90139 + * tree-outof-ssa.c (get_temp_reg): If reg_mode is BLKmode, return + assign_temp instead of gen_reg_rtx. + +2019-08-27 Iain Sandoe + + Backport from mainline + 2019-07-07 Iain Sandoe + + * config/darwin.c (darwin_override_options): Make a final check on PIC + options. + +2019-08-27 Iain Sandoe + + Backport from mainline + 2019-07-07 Iain Sandoe + * config/darwin.c (darwin_override_options): Don't jam symbol stubs + on for kernel code. + +2019-08-27 Iain Sandoe + + Backport from mainline + 2019-06-27 Iain Sandoe + + * config/rs6000/rs6000.c (darwin_rs6000_override_options): Do not + use longcall for 64b code. + +2019-08-27 Iain Sandoe + + Backport from mainline + 2019-08-18 Iain Sandoe + + * config/rs6000/darwin.h (TARGET_OS_CPP_BUILTINS): Add asserts + for cpu and machine. Factor 64/32b builtins. + + Backport from mainline + 2019-06-23 Iain Sandoe + + * config/rs6000/darwin.h: (__PPC__, __PPC64__): New. + +2019-08-25 Iain Sandoe + + Backport from mainline + 2019-06-19 Iain Sandoe + + * config/darwin-driver.c (darwin_driver_init): Fix off-by-one errors + in computing the number of options to be moved. + + Backport from mainline + 2019-06-13 Iain Sandoe + + * config/darwin-driver.c (validate_macosx_version_min): New. + (darwin_default_min_version): Cleanup and validate supplied version. + (darwin_driver_init): Likewise and push cleaned version into opts. + +2019-08-25 Uroš Bizjak + + PR target/91533 + Backport from mainline + 2019-06-30 Uroš Bizjak + + * config/i386/sse.md (ssse3_abs2): Rename from abs2. + * config/i386/i386-builtin.def (__builtin_ia32_pabsb): + Use CODE_FOR_ssse3_absv8qi2. + (__builtin_ia32_pabsw): Use CODE_FOR_ssse3_absv4hi2. + (__builtin_ia32_pabsd): Use CODE_FOR_ssse3_absv2si2. + +2019-08-23 Mihailo Stojanovic + + Backport from mainline + 2019-08-23 Mihailo Stojanovic + + * config/mips/mips.md (mips_get_fcsr, *mips_get_fcsr): Use SI + machine mode for unspec_volatile operand. + +2019-08-22 Iain Sandoe + + Backport from mainline + 2018-12-23 Iain Sandoe + + * config/i386/darwin.h (TARGET_ASM_OUTPUT_IDENT): New. + +2019-08-22 Iain Sandoe + + Backport from mainline + 2019-05-31 Iain Sandoe + + * config/i386/darwin.h (ASM_OUTPUT_MAX_SKIP_ALIGN): New. + +2019-08-22 Iain Sandoe + + Backport from mainline + 2019-05-18 Iain Sandoe + + * config/darwin-c.c (darwin_register_objc_includes): Do not + prepend the sysroot when building gnu-runtime header search + paths. + +2019-08-22 Iain Sandoe + + Backport from mainline + 2019-05-18 Iain Sandoe + + * config/darwin.c (darwin_file_end): Use switch_to_section () + instead of direct output of the asm. + +2019-08-20 Eric Botcazou + + PR rtl-optimization/91347 + * dse.c (scan_insn): Call add_wild_read for non-const/memset tail calls + before reload if HARD_FRAME_POINTER_IS_ARG_POINTER. + +2019-08-16 Iain Sandoe + + Backport from mainline + 2019-04-21 Iain Sandoe + + * config/rs6000/rs6000.md (group_end_nop): Emit insn register + names using operand format, rather than hard-wired. + (speculation_barrier): Likewise. + +2019-08-14 Iain Sandoe + + Backport from mainline + 2018-08-22 Iain Sandoe + + * config/darwin.h (LINK_COMMAND_SPEC_A): Update lto options + to match gcc/gcc.c. + +2019-08-05 Kito Cheng + + Backport from mainline + 2019-08-05 Kito Cheng + + * config/riscv/riscv.c (riscv_promote_function_mode): New. + (TARGET_PROMOTE_FUNCTION_MODE): Use riscv_promote_function_mode. + +2019-08-04 Segher Boessenkool + + Backport from trunk + 2019-05-02 Segher Boessenkool + + * config/rs6000/rs6000.c (rs6000_dbx_register_number): Return the + correct numbers for TFHAR, TFIAR, TEXASR. + +2019-07-23 Matthew Beliveau + + Backported from mainline + 2019-07-16 Jeff Law + + PR rtl-optimization/91173 + * tree-ssa-address.c (addr_for_mem_ref): If the base is an + SSA_NAME with a constant value, fold its value into the offset + and clear the base before calling gen_addr_rtx. + * g++.dg/pr91173.C: New test. + +2019-07-23 Richard Biener + + PR debug/91231 + * lto-streamer-in.c (input_function): Drop inline-entry markers + that ended up with an unknown location block. + +2019-07-22 Martin Liska + + Backport from mainline + 2019-07-22 Martin Liska + + PR driver/91172 + * opts-common.c (decode_cmdline_option): Decode + argument of -Werror and check it for a wrong language. + * opts-global.c (complain_wrong_lang): Remove such case. + +2019-07-21 Richard Sandiford + + Backport from mainline + 2019-07-10 Richard Sandiford + + * fold-const.c (fold_relational_const): Fix folding of + vector-to-scalar NE_EXPRs. + (test_vector_folding): Add more tests. + +2019-07-19 Jason Merrill + + PR c++/82081 - tail call optimization breaks noexcept + * tree-tailcall.c (find_tail_calls): Don't turn a call from a + nothrow function to a might-throw function into a tail call. + +2019-07-16 Wilco Dijkstra + + Backport from mainline + PR target/89222 + * config/arm/arm.md (movsi): Use targetm.cannot_force_const_mem + to decide when to split off a non-zero offset from a symbol. + * config/arm/arm.c (arm_cannot_force_const_mem): Disallow offsets + in function symbols. + +2019-07-16 Wilco Dijkstra + + Backport from mainline + 2019-02-13 Wilco Dijkstra + PR target/89190 + * config/arm/arm.c (ldm_stm_operation_p) Set + addr_reg_in_reglist correctly for first register. + (load_multiple_sequence): Remove dead base check. + (gen_ldm_seq): Correctly set write_back for Thumb-1. + +2019-07-15 Andreas Krebbel + + Backport from mainline + 2019-07-01 Andreas Krebbel + + * config/s390/vector.md: Fix shift count operand printing. + +2019-07-15 Wilco Dijkstra + + Backport from mainline + 2019-01-23 Bin Cheng + Steve Ellcey + + PR target/85711 + * recog.c (address_operand): Return false on wrong mode for address. + (constrain_operands): Check for mode with 'p' constraint. + +2019-07-12 Eric Botcazou + + PR rtl-optimization/91136 + * df-core.c (ACCESSING REFS): Fix typos in comment. + * resource.c (mark_target_live_reg): Add artificial defs that occur at + the beginning of the block to the initial set of live registers. + +2019-07-04 Martin Liska + + Backport from mainline + 2019-07-03 Martin Liska + + PR middle-end/90899 + * multiple_target.c (create_dispatcher_calls): Add to comdat + group only if set for ifunc. + +2019-06-28 Jeff Law + + Backport from mainline + 2019-06-21 Jeff Law + + PR tree-optimization/90949 + * tree-ssa-copy.c (fini_copy_prop): Use reset_flow_sensitive_info. + * tree-ssanames.c (reset_flow_sensitive_info): Reset non-null state. + +2019-06-26 Martin Jambor + + Backport from mainline + 2019-06-25 Martin Jambor + + PR ipa/90939 + * ipa-cp.c (ipcp_bits_lattice::meet_with): Remove assert. + +2019-06-26 Rainer Orth + + Backport from mainline + 2019-06-17 Rainer Orth + + * configure.ac (ld_vers) <*-*-solaris2*>: Remove support for + alternative Solaris 11.4 format. + * configure: Regenerate. + +2019-06-16 Jeff Law + + Backport from mainline + 2019-06-16 Prachi Godbole + Robert Suchanek + * config/mips/mips.c (mips_expand_builtin_insn): Swap the 1st + and 3rd operands of the fmadd/fmsub/maddv builtin. + +2019-06-16 John David Anglin + + PR middle-end/64242 + * config/pa/pa.md (nonlocal_goto): Restore frame pointer last. Add + frame clobbers and schedule block. + (builtin_longjmp): Likewise. + +2019-06-11 Jakub Jelinek + + PR target/90811 + * config/nvptx/nvptx.c (nvptx_output_softstack_switch): Use and.b%d + instead of and.u%d. + +2019-06-07 John David Anglin + + PR target/90751 + * config/pa/pa-linux.h (ASM_DECLARE_FUNCTION_NAME): Update comment. + Call pa_output_function_label. + (TARGET_ASM_FUNCTION_PROLOGUE): define. + * config/pa/pa-protos.h (pa_output_function_label): Declare. + * config/pa/pa.c (pa_output_function_prologue): Add ATTRIBUTE_UNUSED + to declaration. + (pa_linux_output_function_prologue): Declare. + (TARGET_ASM_FUNCTION_PROLOGUE): Delete define. + (pa_output_function_label): New. + (pa_output_function_prologue): Revise to use pa_output_function_label. + (pa_linux_output_function_prologue): New. + * config/pa/pa.h (TARGET_ASM_FUNCTION_PROLOGUE): Define. + +2019-06-07 Iain Sandoe + + Backport from mainline. + 2019-05-12 Iain Sandoe + + PR target/82920 + * config/i386/darwin.h (CC1_SPEC): Report -mx32 as an error for + Darwin. + +2019-06-07 Iain Sandoe + + Backport from mainline. + 2019-05-12 Iain Sandoe + + PR target/82920 + * config/i386/i386.c (ix86_output_jmp_thunk_or_indirect): New. + (ix86_output_indirect_branch_via_reg): Use output mechanism + accounting for __USER_LABEL_PREFIX__. + (ix86_output_indirect_branch_via_push): Likewise. + (ix86_output_function_return): Likewise. + (ix86_output_indirect_function_return): Likewise. + +2019-05-30 Jakub Jelinek + + * tree-predcom.c (is_inv_store_elimination_chain): Fix a typo - lenght + to length. + +2019-05-29 Jakub Jelinek + + PR fortran/90329 + * lto-streamer.h (LTO_minor_version): Bump to 2. + + Backported from mainline + 2019-05-16 Jakub Jelinek + + PR fortran/90329 + * tree-core.h (struct tree_decl_common): Document + decl_nonshareable_flag for PARM_DECLs. + * tree.h (DECL_HIDDEN_STRING_LENGTH): Define. + * calls.c (expand_call): Don't try tail call if caller + has any DECL_HIDDEN_STRING_LENGTH PARM_DECLs that are or might be + passed on the stack and callee needs to pass any arguments on the + stack. + * tree-streamer-in.c (unpack_ts_decl_common_value_fields): Use + else if instead of series of mutually exclusive ifs. Handle + DECL_HIDDEN_STRING_LENGTH for PARM_DECLs. + * tree-streamer-out.c (pack_ts_decl_common_value_fields): Likewise. + +2019-05-28 John David Anglin + + * config/pa/pa.c (hppa_profile_hook): Remove offset adjustment. + +2019-05-27 Eric Botcazou + + * dwarf2out.c (resolve_args_picking_1): Deal with DW_OP_GNU_addr_index + and DW_OP_GNU_const_index opcodes. + +2019-05-24 John David Anglin + + PR target/90530 + * config/pa/pa.c (pa_can_change_mode_class): Accept mode changes from + DImode to SImode in floating-point registers on 64-bit target. + * config/pa/pa.md (umulsidi3): Change nonimmediate_operand to + register_operand in xmpyu patterns. + +2019-05-24 Martin Liska + + Backport from mainline + 2019-05-23 Martin Liska + + PR sanitizer/90570 + * gimplify.c (gimplify_target_expr): Skip TREE_STATIC target + expression similarly to gimplify_decl_expr. + +2019-05-23 Uroš Bizjak + + Backport from mainline + 2019-05-21 Uroš Bizjak + + * config/i386/cpuid.h (__cpuid): For 32bit targets, zero + %ebx and %ecx bafore calling cpuid with leaf 1 or + non-constant leaf argument. + + 2019-05-21 Uroš Bizjak + + PR target/90547 + * config/i386/i386.md (anddi_1 to andsi_1_zext splitter): + Avoid calling gen_lowpart with CONST operand. + +2019-05-21 Sebastian Huber + + Backported from mainline + 2019-05-16 Sebastian Huber + + * config/arm/t-rtems: Replace ARMv7-M multilibs with Cortex-M + multilibs. + +2019-05-20 Jeff Law + + Backport from mainline + 2019-05-17 Dragan Mladjenovic + + * config/mips/mips.c (mips_dwarf_frame_reg_mode): Replace + TARGET_FLOAT64 with !TARGET_FLOAT32, thus handling both fp64 + and fpxx modes. + +2019-05-16 Kelvin Nilsen + + Backport from mainline. + 2019-05-07 Kelvin Nilsen + + PR target/89765 + * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin): + In handling of ALTIVEC_BUILTIN_VEC_INSERT, use modular arithmetic + to compute vector element selector for both constant and variable + operands. + +2019-05-15 David Edelsohn + + Backport from mainline + 2019-04-11 David Edelsohn + * xcoffout.h (xcoff_private_rodata_section_name): Declare. + * xcoffout.c (xcoff_private_rodata_section_name): Define. + * config/rs6000/rs6000.c (rs6000_xcoff_asm_init_sections): Create + read_only_private_data_section using coff_private_rodata_section_name. + (rs6000_xcoff_file_start): Generate coff_private_rodata_section_name. + + 2018-12-04 David Edelsohn + 2018-12-13 David Edelsohn + PR target/61976 + * config/rs6000/rs6000.c (rs6000_function_arg): Don't pass aggregates + in FPRs on AIX. Ensure type is non-NULL. + (rs6000_arg_partial_bytes): Same. + +2019-05-14 Martin Liska + + Backport from mainline + 2019-05-13 Martin Liska + + PR gcov-profile/90380 + * gcov.c (handle_cycle): Do not support zero cycle count, + it should not be possible. + (path_contains_zero_cycle_arc): New function. + (circuit): Ignore zero cycle arc counts. + +2019-05-14 Martin Liska + + Backport from mainline + 2019-05-13 Martin Liska + + PR gcov-profile/90380 + * gcov.c (enum loop_type): Remove the enum and + the operator. + (handle_cycle): Assert that we should not reach + a negative count. + (circuit): Use loop_found instead of a tri-state loop_type. + (get_cycles_count): Do not handle NEGATIVE_LOOP as it can't + happen. + +2019-05-11 Andreas Tobler + + Backport from mainline. + 2019-04-25 Andreas Tobler + + * config/i386/freebsd64.h: Add bits for 32-bit multilib support. + * config/i386/t-freebsd64: New file. + * config.gcc: Add the t-freebsd64 for multilib support. + +2019-05-08 Kelvin Nilsen + + Backport from mainline. + 2019-05-06 Kelvin Nilsen + + PR target/89424 + * config/rs6000/rs6000.c (rs6000_expand_vector_extract): Add + handling of V1TImode. + +2019-05-06 Richard Biener + + PR bootstrap/90359 + Backport from mainline + 2019-03-11 Jakub Jelinek + + PR middle-end/89655 + PR bootstrap/89656 + * vr-values.c (vr_values::update_value_range): If + old_vr->varying_p (), don't update it, make new_vr also VARYING + and return false. + +2019-05-03 Richard Biener + + Backport from mainline + 2019-03-14 Richard Biener + + PR middle-end/89698 + * fold-const.c (operand_equal_p): For INDIRECT_REF check + that the access types are similar. + + 2019-03-07 Richard Biener + + PR tree-optimization/89595 + * tree-ssa-dom.c (dom_opt_dom_walker::optimize_stmt): Take + stmt iterator as reference, take boolean output parameter to + indicate whether the stmt was removed and thus the iterator + already advanced. + (dom_opt_dom_walker::before_dom_children): Re-iterate over + stmts created by folding. + + 2019-03-14 Richard Biener + + PR tree-optimization/89710 + * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): Use + safe_dyn_cast. + + 2019-04-15 Richard Biener + + PR tree-optimization/90071 + * tree-ssa-reassoc.c (init_range_entry): Do not pick up + abnormal operands from def stmts. + + 2018-08-20 Bernd Edlinger + + PR target/86984 + * expr.c (expand_assignment): Assert that bitpos is positive. + (store_field): Likewise + (expand_expr_real_1): Make sure that bitpos is positive. + * config/alpha/alpha.h (CONSTANT_ADDRESS_P): Avoid signed + integer overflow. + + 2019-03-14 Richard Biener + + PR target/89711 + * config/i386/i386.c (make_resolver_func): Properly set + DECL_CONTEXT on the RESULT_DECL. + * config/rs6000/rs6000.c (make_resolver_func): Likewise. + +2019-04-30 Jakub Jelinek + + Backported from mainline + 2019-04-24 Jakub Jelinek + + PR target/90193 + * rtl.c (classify_insn): Return JUMP_INSN for asm goto. + * emit-rtl.c (try_split): Copy over REG_LABEL_TARGET. + + PR target/90187 + * config/i386/i386.c (ix86_expand_sse_fp_minmax): Force if_true into + a register if both if_true and if_false are MEMs. + + PR tree-optimization/90208 + * tree-cfg.c (remove_bb): Move forced labels from removed bbs + after labels of new_bb, not before them. + + 2019-04-16 Jakub Jelinek + + PR rtl-optimization/90082 + * dce.c (can_delete_call): New function. + (deletable_insn_p, mark_insn): Use it. + + PR tree-optimization/90090 + * tree-ssa-math-opts.c (is_division_by): Ignore divisions that can + throw internally. + (is_division_by_square): Likewise. Formatting fix. + + 2019-04-12 Jakub Jelinek + + PR rtl-optimization/89965 + * dce.c: Include rtl-iter.h. + (struct check_argument_load_data): New type. + (check_argument_load): New function. + (find_call_stack_args): Check for loads from stack slots still tracked + in sp_bytes and punt if any is found. + + PR c/89946 + * varasm.c (assemble_start_function): Don't use tree_fits_uhwi_p + and gcc_unreachable if it fails, just call tree_to_uhwi which + verifies that too. Test TREE_CHAIN instead of list_length > 1. + Start warning message with a lower-case letter. Formatting fixes. + + PR rtl-optimization/90026 + * cfgcleanup.c (try_optimize_cfg): When removing empty bb with no + successors, look for BARRIERs inside of the whole BB_FOOTER chain + rather than just at the start of it. If e->src BB_FOOTER is not NULL + in cfglayout mode, use emit_barrier_after_bb. + + 2019-04-11 Jakub Jelinek + + PR rtl-optimization/89965 + * dce.c (sp_based_mem_offset): New function. + (find_call_stack_args): Use sp_based_mem_offset. + + 2019-04-10 Jakub Jelinek + + PR c++/90010 + * gimple-ssa-sprintf.c (target_to_host): Fix handling of targstr + with strlen in between hostsz-3 and hostsz-1 inclusive when no + translation is needed, and when translation is needed, only append + ... if the string length is hostsz or more bytes long. Avoid using + strncpy or strcat. + + 2019-04-09 Jakub Jelinek + + PR tree-optimization/89998 + * gimple-ssa-sprintf.c (try_substitute_return_value): Use lhs type + instead of integer_type_node if possible, don't add ranges if return + type is not compatible with int. + * gimple-fold.c (gimple_fold_builtin_sprintf, + gimple_fold_builtin_snprintf): Use lhs type instead of hardcoded + integer_type_node. + + 2019-03-29 Jakub Jelinek + + PR c/89872 + * gimplify.c (gimplify_compound_literal_expr): Don't optimize a + non-addressable complit into its initializer if it is volatile. + + 2019-03-28 Jakub Jelinek + + PR middle-end/89621 + * tree-inline.h (struct copy_body_data): Add + dont_remap_vla_if_no_change flag. + * tree-inline.c (remap_type_3, remap_type_2): New functions. + (remap_type): Don't remap vla types if id->dont_remap_vla_if_no_change + and remap_type_2 returns false. + * omp-low.c (new_omp_context): Set ctx->cb.dont_remap_vla_if_no_change. + + 2019-03-20 Jakub Jelinek + + PR target/89752 + * lra-constraints.c (process_alt_operands) : For BLKmode, don't + update this_alternative nor this_alternative_set. + + 2019-03-19 Jakub Jelinek + + PR rtl-optimization/89768 + * loop-unroll.c (unroll_loop_constant_iterations): Use gen_int_mode + instead of GEN_INT. + (unroll_loop_runtime_iterations): Likewise. + + PR target/89752 + * gimplify.c (gimplify_asm_expr): For output argument with + TREE_ADDRESSABLE type, clear allows_reg if it allows memory, otherwise + diagnose error. + + PR target/89726 + * config/i386/i386.c (ix86_expand_floorceildf_32): In ceil + compensation use x2 += 1 instead of x2 -= -1 and when honoring + signed zeros, do another copysign after the compensation. + + 2019-03-15 Jakub Jelinek + + PR debug/89704 + * dwarf2out.c (add_const_value_attribute): Return false for MINUS, + SIGN_EXTEND and ZERO_EXTEND. + + 2019-03-14 Jakub Jelinek + + PR ipa/89684 + * multiple_target.c (create_dispatcher_calls): Change + references_to_redirect from vector of ipa_ref * to vector of ipa_ref. + In the node->iterate_referring loop, push *ref rather than ref, call + ref->remove_reference () and always pass 0 to iterate_referring. + + PR rtl-optimization/89679 + * expmed.c (expand_mult_const): Don't add a REG_EQUAL note if it + would contain a paradoxical SUBREG. + + PR tree-optimization/89703 + * tree-ssa-strlen.c (valid_builtin_call): Punt if stmt call types + aren't compatible also with builtin_decl_explicit. Check pure + or non-pure status of BUILT_IN_STR{{,N}CMP,N{LEN,{CAT,CPY}{,_CHK}}} + and BUILT_IN_STPNCPY{,_CHK}. + + 2019-03-13 Jakub Jelinek + + PR debug/89498 + * dwarf2out.c (size_of_die): For dw_val_class_view_list always use + DWARF_OFFSET_SIZE. + (value_format): For dw_val_class_view_list never use DW_FORM_loclistx. + + PR middle-end/88588 + * omp-simd-clone.c (ipa_simd_modify_stmt_ops): Handle PHI args. + (ipa_simd_modify_function_body): Handle PHIs. + + 2019-03-12 Jakub Jelinek + + PR middle-end/89663 + * builtins.c (expand_builtin_int_roundingfn, + expand_builtin_int_roundingfn_2): Return NULL_RTX instead of + gcc_unreachable if validate_arglist fails. + + 2019-03-09 Jakub Jelinek + + PR c/88568 + * attribs.c (handle_dll_attribute): Don't clear TREE_STATIC for + dllimport on VAR_DECLs with RECORD_TYPE or UNION_TYPE DECL_CONTEXT. + + 2019-03-05 Jakub Jelinek + + PR target/89587 + * config/rs6000/t-linux (MULTIARCH_DIRNAME): Set to non-empty only + if_multiarch. + + PR middle-end/89590 + * builtins.c (maybe_emit_free_warning): Punt if free doesn't have + exactly one argument. + + 2019-02-28 Jakub Jelinek + + PR c/89520 + * convert.c (convert_to_real_1, convert_to_integer_1): Punt for + builtins if they don't have a single scalar floating point argument. + Formatting fixes. + + 2019-02-20 Jakub Jelinek + + PR middle-end/89412 + * expr.c (expand_assignment): If result is a MEM, use change_address + instead of simplify_gen_subreg. + + 2019-02-20 Jakub Jelinek + David Malcolm + + PR middle-end/89091 + * fold-const.c (decode_field_reference): Return NULL_TREE if + lang_hooks.types.type_for_size returns NULL. Check it before + overwriting *exp_. Use return NULL_TREE instead of return 0. + + 2019-02-20 Jakub Jelinek + + PR middle-end/88074 + PR middle-end/89415 + * toplev.c (do_compile): Double the emin/emax exponents to workaround + buggy mpc_norm. + + 2019-02-19 Richard Biener + + PR middle-end/88074 + * toplev.c (do_compile): Initialize mpfr's exponent range + based on available float modes. + +2019-04-30 Ramana Radhakrishnan + + Backport from mainline. + 2019-04-30 Ramana Radhakrishnan + PR target/86538 + * config/aarch64/aarch64-c.c (aarch64_update_cpp_builtins): + Define __ARM_FEATURE_ATOMICS. + +2019-04-30 Srinath Parvathaneni + + Backport from mainline + 2018-12-11 Richard Earnshaw + + PR target/37369 + * config/aarch64/iterators.md (sizem1): Add sizes for + SFmode and DFmode. + (Vbtype): Add SFmode mapping. + * config/aarch64/aarch64.md (copysigndf3, copysignsf3): Delete. + (copysign3): New expand pattern. + (copysign3_insn): New insn pattern. + +2019-04-29 Richard Sandiford + + Backport from mainline: + 2019-01-25 Richard Sandiford + + PR middle-end/89037 + * varasm.c (output_constructor_bitfield): Use wi::extract_uhwi + instead of accessing TREE_INT_CST_ELT directly. + +2019-04-29 Richard Sandiford + + Backport from mainline: + 2018-08-23 Richard Sandiford + + PR target/85910 + * config/aarch64/aarch64.c (aarch64_expand_vec_perm_const_1): Fix + aarch64_evpc_tbl guard. + +2019-04-29 Richard Sandiford + + Backport from mainline: + 2019-03-08 Richard Sandiford + + PR debug/89631 + * dwarf2cfi.c (dwarf2out_frame_debug_expr): Use CONST_POLY_INT + instead of POLY_INT_CST. + +2019-04-26 Roman Zhuykov + + Backport from mainline + 2019-04-23 Roman Zhuykov + + PR rtl-optimization/87979 + * modulo-sched.c (sms_schedule): Start ii value "mii" should + not equal zero. + + PR rtl-optimization/84032 + * modulo-sched.c (ps_insn_find_column): Change condition so that + branch will always be the last insn in a row inside partial + schedule. + +2019-04-19 Pat Haugen + + Backport from mainline: + 2019-04-16 Pat Haugen + + PR target/84369 + * config/rs6000/power9.md: Add store forwarding bypass. + +2019-04-17 Martin Jambor + + Backport from mainline + 2019-03-10 Martin Jambor + + PR tree-optimization/85762 + PR tree-optimization/87008 + PR tree-optimization/85459 + * tree-sra.c (contains_vce_or_bfcref_p): New parameter, set the bool + it points to if there is a type changing MEM_REF. Adjust all callers. + (build_accesses_from_assign): Disable total scalarization if + contains_vce_or_bfcref_p returns true through the new parameter, for + both rhs and lhs. + +2019-04-17 Kelvin Nilsen + + Backport from mainline + 2019-03-15 Kelvin Nilsen + + PR target/87532 + * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin): + When handling vec_extract, use modular arithmetic to allow + constant selectors greater than vector length. + * config/rs6000/rs6000.c (rs6000_expand_vector_extract): Allow + V1TImode vectors to have constant selector values greater than 0. + Use modular arithmetic to compute vector index. + (rs6000_split_vec_extract_var): Use modular arithmetic to compute + index for in-memory vectors. Correct code generation for + in-register vectors. Use inner mode of vector rather than mode of + destination for move instruction. + (altivec_expand_vec_ext_builtin): Use modular arithmetic to + compute index. + + 2019-04-12 Kelvin Nilsen + + PR target/87532 + * config/rs6000/vsx.md (*vsx_extract__mode_var): + Use QI inner mode with V16QI vector mode. + +2019-04-15 Martin Jambor + + Backport from mainline + 2019-04-15 Martin Jambor + + PR ipa/89693 + * cgraph.c (clone_of_p): Loop over clone chain for each step in + the thunk chain. + +2019-04-15 Martin Liska + + Backport from mainline + 2019-01-18 Martin Liska + Richard Biener + + PR middle-end/88587 + * cgraph.h (create_version_clone_with_body): Add new argument + with attributes. + * cgraphclones.c (cgraph_node::create_version_clone): Add + DECL_ATTRIBUTES to a newly created decl. And call + valid_attribute_p so that proper cl_target_optimization_node + is set for the newly created declaration. + * multiple_target.c (create_target_clone): Set DECL_ATTRIBUTES + for declaration. + (expand_target_clones): Do not call valid_attribute_p, it must + be already done. + * tree-inline.c (copy_decl_for_dup_finish): Reset mode for + vector types. + +2019-04-11 Richard Biener + + PR tree-optimization/90018 + * tree-vect-data-refs.c (vect_preserves_scalar_order_p): + Test both SLP and interleaving variants. + +2019-04-10 Matthew Malcomson + + PR target/90024 + * config/arm/arm.c (neon_valid_immediate): Disallow VOIDmode parameter. + * config/arm/constraints.md (Dm, DN, Dn): Split previous Dn constraint + into three. + * config/arm/neon.md (*neon_mov): Account for TImode and DImode + differences directly. + (*smax3_neon, vashl3, vashr3_imm): Use Dm constraint. + +2019-04-07 Uroš Bizjak + + PR target/89945 + * config/i386/i386.md (anddi_1 to andsi_1_zext splitter): + Avoid calling gen_lowpart with SYMBOL_REF and LABEL_REF operand. + +2019-04-04 Martin Sebor + + PR middle-end/89934 + * gimple-ssa-warn-restrict.c (builtin_access::builtin_access): Bail + out if the number of arguments is less than expected. + +2019-04-03 Richard Biener + + PR lto/89896 + * lto-wrapper.c (run_gcc): Avoid implicit rules making + the all target phony. + +2019-04-02 Uroš Bizjak + + PR target/89902 + PR target/89903 + * config/i386/i386.c (dimode_scalar_to_vector_candidate_p): + Return false for variable DImode shifts. + (dimode_scalar_chain::compute_convert_gain): Do not handle + register count operand in variable DImode shifts. + (dimode_scalar_chain::make_vector_copies): Remove support to copy + count argument of a variable shift instruction to a vector register. + (dimode_scalar_chain::convert_reg): Remove support to convert + count argument of a variable shift instruction. + +2019-03-29 Kugan Vivekanandarajah + + Backport from mainline + 2019-03-29 Kugan Vivekanandarajah + Eric Botcazou + + PR rtl-optimization/89862 + * rtl.h (word_register_operation_p): Exclude CONST_INT from operations + that operates on the full registers for WORD_REGISTER_OPERATIONS + architectures. + +2019-03-28 Uroš Bizjak + + PR target/89848 + * config/i386/i386.c (dimode_scalar_chain::make_vector_copies): + Also process XEXP (src, 0) of a shift insn. + +2019-03-28 Martin Liska + + Backport from mainline + 2018-11-05 Martin Liska + + PR web/87829 + * doc/invoke.texi: Remove options that are + not disabled with -Os. + +2019-03-26 Uroš Bizjak + + PR target/89827 + * config/i386/i386.c (dimode_scalar_chain::convert_reg): + Also process XEXP (src, 0) of a shift insn. + +2019-03-25 Andreas Krebbel + + Backport from mainline + 2019-03-20 Andreas Krebbel + + PR target/89775 + * config/s390/s390.c (global_not_special_regno_p): Move to make it + available to ... + (s390_optimize_register_info): Use global_not_special_regno_p to + check for global regs. + +2019-03-22 Bill Schmidt + + Backport from mainline + 2019-03-22 Bill Schmidt + + * config/rs6000/mmintrin.h (_mm_sub_pi32): Fix typo. + +2019-03-21 Bill Schmidt + + Backport from mainline + 2019-03-08 Bill Schmidt + + * config/rs6000/rs6000-p8swap.c (rs6000_analyze_swaps): Rebuild + ud- and du-chains between phases. + +2019-03-19 Richard Biener + + PR debug/88389 + * opts.c (finish_options): Disable -gsplit-dwarf when doing LTO. + +2019-03-19 Eric Botcazou + + PR rtl-optimization/89753 + * loop-unroll.c (decide_unroll_constant_iterations): Make guard for + explicit unrolling factor even more robust. + +2019-03-18 Martin Sebor + + PR middle-end/88273 + * gimple-ssa-warn-restrict.c (builtin_memref::extend_offset_range): + Handle anti-ranges the same as no range at all. + +2019-03-18 Martin Jambor + + Backport from mainline + 2019-03-18 Martin Jambor + + PR tree-optimization/89546 + * tree-sra.c (propagate_subaccesses_across_link): Requeue new_acc if + any propagation to its children took place. + +2019-03-17 H.J. Lu + + Backport from mainline + 2019-03-14 H.J. Lu + + PR target/89523 + * config/i386/i386.c (ix86_print_operand): Handle 'M' to add + addr32 prefix to VSIB address for X32. + * config/i386/sse.md (*avx512pf_gatherpfsf_mask): Prepend + "%M2" to opcode. + (*avx512pf_gatherpfdf_mask): Likewise. + (*avx512pf_scatterpfsf_mask): Likewise. + (*avx512pf_scatterpfdf_mask): Likewise. + (*avx2_gathersi): Prepend "%M3" to opcode. + (*avx2_gathersi_2): Prepend "%M2" to opcode. + (*avx2_gatherdi): Prepend "%M3" to opcode. + (*avx2_gatherdi_2): Prepend "%M2" to opcode. + (*avx2_gatherdi_3): Prepend "%M3" to opcode. + (*avx2_gatherdi_4): Prepend "%M2" to opcode.` + (*avx512f_gathersi): Prepend "%M4" to opcode. + (*avx512f_gathersi_2): Prepend "%M3" to opcode. + (*avx512f_gatherdi): Prepend "%M4" to opcode. + (*avx512f_gatherdi_2): Prepend "%M3" to opcode. + (*avx512f_scattersi): Prepend "%M0" to opcode. + (*avx512f_scatterdi): Likewise. + +2019-03-15 Richard Biener + + Backport from mainline + 2018-11-30 Jakub Jelinek + + PR testsuite/85368 + * params.def (PARAM_LOGICAL_OP_NON_SHORT_CIRCUIT): New param. + * tree-ssa-ifcombine.c (ifcombine_ifandif): If + --param logical-op-non-short-circuit is present, override + LOGICAL_OP_NON_SHORT_CIRCUIT value from the param. + * fold-const.c (fold_range_test, fold_truth_andor): Likewise. + +2019-03-15 Martin Liska + + PR other/89712 + * doc/invoke.texi: Remove -fdump-class-hierarchy option. + +2019-03-14 Martin Jambor + + Backport from mainline + 2019-03-07 Martin Jambor + + PR lto/87525 + * ipa-cp.c (perform_estimation_of_a_value): Account zero time benefit + for extern inline functions. + +2019-03-14 Richard Biener + + PR middle-end/89572 + * tree-scalar-evolution.c (get_loop_exit_condition): Use + safe_dyn_cast. + * tree-ssa-loop-ivcanon.c (canonicalize_loop_induction_variables): + Use gimple_location_safe. + +2019-03-13 Vladimir Makarov + + PR target/85860 + * lra-constraints.c (inherit_in_ebb): Update + potential_reload_hard_regs along with live_hard_regs. + +2019-03-14 Richard Biener + + Backport from mainline + 2019-03-13 Richard Biener + + PR middle-end/89677 + * tree-scalar-evolution.c (simplify_peeled_chrec): Do not + throw FP expressions at tree-affine. + + 2019-03-01 Richard Biener + + PR middle-end/89497 + * tree-cfgcleanup.h (cleanup_tree_cfg): Add SSA update flags + argument, defaulted to zero. + * passes.c (execute_function_todo): Pass down SSA update flags + to cleanup_tree_cfg. + * tree-cfgcleanup.c: Include tree-into-ssa.h and tree-cfgcleanup.h. + (cleanup_tree_cfg_1): After cleanup_control_flow_pre update SSA + form if requested. + (cleanup_tree_cfg_noloop): Pass down SSA update flags. + (cleanup_tree_cfg): Get and pass down SSA update flags. + + 2019-02-18 Richard Biener + + PR tree-optimization/89296 + * tree-ssa-loop-ch.c (ch_base::copy_headers): Restrict setting + of no-warning flag to cases that might emit the bogus warning. + +2019-03-13 Andreas Krebbel + + Backport from mainline + 2019-03-11 Andreas Krebbel + + * config/s390/s390.c (s390_expand_builtin): Do the copy_to_reg not + only on the else branch. + +2019-03-13 Andreas Krebbel + + Backport from mainline + 2019-02-07 Andreas Krebbel + + * config/s390/s390-builtin-types.def: Add new types. + * config/s390/s390-builtins.def: (s390_vec_xl, s390_vec_xld2) + (s390_vec_xlw4): Make the memory operand into a const pointer. + (s390_vec_xld2, s390_vec_xlw4): Add a variant for single precision + float. + * config/s390/s390-c.c (s390_expand_overloaded_builtin): Generate + a new vector type with the alignment of the scalar memory operand. + +2019-03-12 Richard Biener + + PR tree-optimization/89664 + * tree-ssa-math-opts.c (execute_cse_reciprocals_1): Properly + free the occurance tree after the early out. + +2019-03-12 Andre Vieira + + Backport from mainline + 2019-03-08 Andre Vieira + + * config/arm/arm.h (TARGET_FP16_TO_DOUBLE): Add TARGET_VFP_DOUBLE + requirement. + +2019-03-11 Eric Botcazou + + PR rtl-optimization/89588 + * loop-unroll.c (decide_unroll_constant_iterations): Make guard for + explicit unrolling factor more robust. + +2019-03-11 Martin Liska + + Backport from mainline + 2019-03-08 Martin Liska + + PR target/86952 + * config/i386/i386.c (ix86_option_override_internal): Disable + jump tables when retpolines are used. + +2019-03-11 Martin Liska + + Backport from mainline + 2019-02-11 David Malcolm + + PR lto/88147 + * input.c (selftest::test_line_offset_overflow): New selftest. + (selftest::input_c_tests): Call it. + +2019-03-08 Martin Jambor + + Backport from mainline + 2019-03-07 Martin Jambor + + PR ipa/88235 + * cgraph.h (cgraph_node): New inline method former_thunk_p. + * cgraph.c (cgraph_node::dump): Dump a note if node is a former thunk. + (clone_of_p): Treat expanded thunks like thunks, be optimistic if they + have multiple callees. At the end check if declarations match as + opposed to cgraph_nodes. + +2019-03-06 Tamar Christina + + Backport from trunk. + 2019-02-25 Tamar Christina + + PR target/88530 + * common/config/aarch64/aarch64-common.c + (struct aarch64_option_extension): Add is_synthetic. + (all_extensions): Use it. + (TARGET_OPTION_INIT_STRUCT): Define hook. + (struct gcc_targetm_common): Moved to end. + (all_extensions_by_on): New. + (opt_ext_cmp, typedef opt_ext): New. + (aarch64_option_init_struct): New. + (aarch64_contains_opt): New. + (aarch64_get_extension_string_for_isa_flags): Output smallest set. + * config/aarch64/aarch64-option-extensions.def + (AARCH64_OPT_EXTENSION): Explicitly include AES and SHA2 in crypto. + (fp, simd, crc, lse, fp16, rcpc, rdma, dotprod, aes, sha2, sha3, + sm4, fp16fml, sve): + Set is_synthetic to false. + (crypto): Set is_synthetic to true. + * config/aarch64/driver-aarch64.c (AARCH64_OPT_EXTENSION): Add + SYNTHETIC. + +2019-03-06 Tamar Christina + + Backport from trunk. + 2019-02-28 Tamar Christina + + PR target/88530 + * config/aarch64/aarch64-option-extensions.def: Document it. + * config/aarch64/driver-aarch64.c (host_detect_local_cpu): Skip feature + if empty hwcaps. + +2019-03-06 Xiong Hu Luo + + Backport of r268834 from mainline to gcc-8-branch. + 2019-02-13 Xiong Hu Luo + + * config/rs6000/altivec.h (vec_sbox_be, vec_cipher_be, + vec_cipherlast_be, vec_ncipher_be, vec_ncipherlast_be): New #defines. + * config/rs6000/crypto.md (CR_vqdi): New define_mode_iterator. + (crypto_vsbox_, crypto__): New define_insns. + * config/rs6000/rs6000-builtin.def (VSBOX_BE): New BU_CRYPTO_1. + (VCIPHER_BE, VCIPHERLAST_BE, VNCIPHER_BE, VNCIPHERLAST_BE): + New BU_CRYPTO_2. + * config/rs6000/rs6000.c (builtin_function_type) + : New switch options. + * doc/extend.texi (vec_sbox_be, vec_cipher_be, vec_cipherlast_be, + vec_ncipher_be, vec_ncipherlast_be): New builtin functions. + +2019-03-05 Richard Biener + + Backport from mainline + 2019-02-26 Richard Biener + + PR tree-optimization/89505 + * tree-ssa-structalias.c (compute_dependence_clique): Make sure + to handle restrict pointed-to vars with multiple subvars + correctly. + +2019-03-01 Tamar Christina + + PR target/89517 + * config/aarch64/aarch64-option-extensions.def (fp, simd, crypto, + fp16): Collapse line. + +2019-03-01 Richard Biener + + Backport from mainline + 2019-03-01 Jakub Jelinek + + PR bootstrap/89539 + * dwarf2out.c (output_comdat_type_unit): Add ATTRIBUTE_UNUSED to + early_lto_debug argument. + + 2019-02-27 Richard Biener + + PR debug/88878 + * dwarf2out.c (use_debug_types): Disable when in_lto_p. + + 2019-02-27 Richard Biener + + PR debug/88878 + * dwarf2out.c (output_comdat_type_unit): Add early_lto_debug + parameter, prefix section name with .gnu.debuglto_ if true. + (dwarf2out_finish): Pass false to output_comdat_type_unit. + (dwarf2out_early_finish): Pass true to output_comdat_type_unit. + + 2019-02-27 Richard Biener + + PR debug/89514 + * dwarf2out.c (size_of_die): Key on AT_ref (a)->comdat_type_p + rather than on use_debug_types, doing what output_die does. + (value_format): Likewise. + +2019-02-28 Eric Botcazou + + PR tree-optimization/89536 + * tree-ssa-dom.c (edge_info::derive_equivalences) : Test + only whether bit #0 of the value is 0 instead of the entire value. + +2019-02-28 Li Jia He + + Backport from trunk + 2019-02-20 Li Jia He + + PR target/88100 + * gcc/config/rs6000/rs6000.c (rs6000_gimple_fold_builtin) + : Don't convert the operand before + range checking it. + +2019-02-27 Uroš Bizjak + + PR target/89397 + * config/i386/i386.c (ix86_atomic_assign_expand_fenv): Check + TARGET_SSE in addition to TARGET_SSE_MATH. + + (ix86_excess_precision): Ditto. + (ix86_float_exceptions_rounding_supported_p): Ditto. + (use_rsqrt_p): Ditto. + * config/i386/sse.md (rsqrt2): Ditto. + +2019-02-27 Jakub Jelinek + + Backported from mainline + 2019-02-18 Jakub Jelinek + + PR target/89361 + * config/s390/s390.c (s390_indirect_branch_attrvalue, + s390_indirect_branch_settings): Define unconditionally. + (s390_set_current_function): Likewise, but guard the whole body except + the s390_indirect_branch_settings call with + #if S390_USE_TARGET_ATTRIBUTE. + (TARGET_SET_CURRENT_FUNCTION): Redefine unconditionally. + +2019-02-26 Eric Botcazou + + Backport from mainline + 2019-02-19 Eric Botcazou + + * rtlanal.c (get_initial_register_offset): Fall back to the estimate + as long as the epilogue isn't completed. + +2019-02-26 Eric Botcazou + + * tree-ssa-dom.c (edge_info::derive_equivalences) : Fix + and move around comment. + : Likewise. + : Add specific handling for boolean types. + +2019-02-24 Alan Modra + + PR target/89271 + * config/rs6000/rs6000.md (_ split): Check for an int + output reg on add insn. + (tf_ split): Likewise. Match predicates with insn. + +2019-02-22 Jakub Jelinek + + * BASE-VER: Set to 8.3.1. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + +2019-02-15 Richard Biener + Jakub Jelinek + + PR tree-optimization/89278 + * tree-loop-distribution.c: Include tree-eh.h. + (generate_memset_builtin, generate_memcpy_builtin): Call + rewrite_to_non_trapping_overflow on builtin->size before passing it + to force_gimple_operand_gsi. + +2019-02-15 Jakub Jelinek + + PR other/89342 + * optc-save-gen.awk: Handle optimize_fast like optimize_size or + optimize_debug. + * opth-gen.awk: Likewise. + +2019-02-14 David Malcolm + + Backport of r267957 from trunk. + 2019-01-15 David Malcolm + + PR c++/88795 + * tree.c (build_function_type): Assert that arg_types is not + error_mark_node. + +2019-02-14 Jakub Jelinek + + PR rtl-optimization/89354 + * combine.c (make_extraction): Punt if extraction_mode is narrower + than len bits. + +2019-02-14 David Malcolm + + Backport of r263339 from trunk. + 2018-08-06 David Malcolm + + * function-tests.c (selftest::test_expansion_to_rtl): Call + free_after_compilation. + +2019-02-14 David Malcolm + + Backport of r263295 from trunk. + 2018-08-03 David Malcolm + + * doc/gcov.texi (-x): Remove duplicate "to". + * doc/invoke.texi (-Wnoexcept-type): Remove duplicate "calls". + (-Wif-not-aligned): Remove duplicate "is". + (-flto): Remove duplicate "the". + (MicroBlaze Options): In examples of "-mcpu=cpu-type", remove + duplicate "v5.00.b". + (MSP430 Options): Remove duplicate "and" from the description + of "-mgprel-sec=regexp". + (x86 Options): Remove duplicate copies of "vmldLog102" and + vmlsLog104 from description of "-mveclibabi=type". + +2019-02-14 David Malcolm + + Backport of r263275 from trunk. + 2018-08-02 David Malcolm + + * diagnostic-show-locus.c (diagnostic_show_locus): Use + pp_take_prefix when saving the existing prefix. + * diagnostic.c (diagnostic_append_note): Likewise. + * langhooks.c (lhd_print_error_function): Likewise. + * pretty-print.c (pp_set_prefix): Drop the "const" from "prefix" + param's type. Free the existing prefix. + (pp_take_prefix): New function. + (pretty_printer::pretty_printer): Drop the prefix parameter. + Rename the length parameter to match the comment. + (pretty_printer::~pretty_printer): Free the prefix. + * pretty-print.h (pretty_printer::pretty_printer): Drop the prefix + parameter. + (struct pretty_printer): Drop the "const" from "prefix" field's + type and clarify memory management. + (pp_set_prefix): Drop the "const" from the 2nd param. + (pp_take_prefix): New decl. + +2019-02-14 Segher Boessenkool + + Backport from trunk + 2018-08-31 Segher Boessenkool + + PR target/86684 + PR target/87149 + * config/rs6000/rs6000.md (lrounddi2): Gate on TARGET_FPRND. + +2019-02-14 Segher Boessenkool + + Backport from trunk + 2019-01-18 Segher Boessenkool + + PR target/88892 + * config/rs6000/rs6000.md (*movsi_from_df): Allow only register + operands. + +2019-02-14 Segher Boessenkool + + Backport from trunk + 2018-07-26 Segher Boessenkool + + PR rtl-optimization/85805 + * combine.c (reg_nonzero_bits_for_combine): Only use the last set + value for hard registers if that was written in the same mode. + +2019-02-14 Martin Liska + + Backport from mainline + 2019-02-14 Martin Liska + + PR rtl-optimization/89242 + * dce.c (delete_unmarked_insns): Call free_dominance_info we + process a transformation. + +2019-02-14 Martin Liska + + Backport from mainline + 2019-02-13 Martin Liska + + PR lto/88858 + * cfgrtl.c (remove_barriers_from_footer): New function. + (try_redirect_by_replacing_jump): Use it. + (cfg_layout_redirect_edge_and_branch): Likewise. + +2019-02-14 Martin Liska + + Backport from mainline + 2019-02-11 Martin Liska + + PR ipa/89009 + * ipa-cp.c (build_toporder_info): Remove usage of a param. + * ipa-inline.c (inline_small_functions): Likewise. + * ipa-pure-const.c (propagate_pure_const): Likewise. + (propagate_nothrow): Likewise. + * ipa-reference.c (propagate): Likewise. + * ipa-utils.c (struct searchc_env): Remove unused field. + (searchc): Always search across AVAIL_INTERPOSABLE. + (ipa_reduced_postorder): Always allow AVAIL_INTERPOSABLE as + the only called IPA pure const can properly not propagate + across interposable boundary. + * ipa-utils.h (ipa_reduced_postorder): Remove param. + +2019-02-14 Jakub Jelinek + + PR tree-optimization/89314 + * fold-const.c (fold_binary_loc): Cast strlen argument to + const char * before dereferencing it. Formatting fixes. + + Backported from mainline + 2019-02-13 Jakub Jelinek + + PR middle-end/89303 + * tree-ssa-structalias.c (set_uids_in_ptset): Or in vi->is_heap_var + into pt->vars_contains_escaped_heap instead of setting + pt->vars_contains_escaped_heap to it. + + PR middle-end/89281 + * optabs.c (prepare_cmp_insn): Use UINTVAL (size) instead of + INTVAL (size), compare it to GET_MODE_MASK instead of + 1 << GET_MODE_BITSIZE. + + PR target/89290 + * config/i386/predicates.md (x86_64_immediate_operand): Allow + TLS UNSPECs offsetted by signed 32-bit CONST_INT even with + -mcmodel=large. + + 2019-02-09 Jakub Jelinek + + PR middle-end/89246 + * config/i386/i386.c (ix86_simd_clone_compute_vecsize_and_simdlen): + If !node->definition and TYPE_ARG_TYPES is non-NULL, use + TYPE_ARG_TYPES instead of DECL_ARGUMENTS. + +2019-02-13 Bill Schmidt + + Backport from mainline + 2019-02-11 Bill Schmidt + + * config/rs6000/rs6000.c (rs6000_gimple_fold_builtin): Shift-right + and shift-left vector built-ins need to include a TRUNC_MOD_EXPR + for correct semantics. + +2019-02-13 Richard Biener + + Backport from mainline + 2019-01-08 Richard Biener + + PR tree-optimization/86554 + * tree-ssa-sccvn.c (visit_nary_op): When value-numbering to + expressions with different overflow behavior make sure there's an + available expression on the path. + +2019-02-13 Martin Liska + + PR lto/89260 + * lto-streamer.h (LTO_minor_version): Bump version due + to r268698. + +2019-02-13 Richard Biener + + Backport from mainline + 2019-02-12 Richard Biener + + PR tree-optimization/89253 + * tree-ssa-loop-split.c (tree_ssa_split_loops): Check we can + duplicate the loop. + + 2019-02-08 Richard Biener + + PR middle-end/89223 + * tree-data-ref.c (initialize_matrix_A): Fail if constant + doesn't fit in HWI. + (analyze_subscript_affine_affine): Handle failure from + initialize_matrix_A. + + 2019-01-28 Richard Biener + + PR tree-optimization/88739 + * tree-ssa-sccvn.c (vn_reference_lookup_3): Avoid generating + BIT_FIELD_REFs of non-mode-precision integral operands. + +2019-02-12 Jan Hubicka + + Backport from mainline: + 2019-02-09 Jan Hubicka + + * ipa-visibility.c (localize_node): Also do not localize + LDPR_PREVAILING_DEF_IRONLY_EXP. + +2019-02-11 Stefan Agner + + Backport from mainline. + 2019-01-10 Stefan Agner + + PR target/88648 + * config/arm/arm.c (arm_option_override_internal): Force + opts->x_inline_asm_unified to true only if TARGET_THUMB2_P. + +2019-02-09 Jan Hubicka + + Backport from mainline: + 2019-01-05 Jan Hubicka + + PR tree-opt/86020 + Revert: + 2017-05-22 Jan Hubicka + + * ipa-inline.c (edge_badness): Use inlined_time instead of + inline_summaries->get. + +2019-02-09 Aaron Sawdey + + Backported from mainline + 2019-02-05 Aaron Sawdey + + PR target/89112 + * config/rs6000/rs6000.md (tf_): Generate a local label + for the long branch case. + + 2019-02-05 Aaron Sawdey + + PR target/89112 + * config/rs6000/rs6000-string.c (do_ifelse, expand_cmp_vec_sequence, + expand_compare_loop, expand_block_compare_gpr, + expand_strncmp_align_check, expand_strncmp_gpr_sequence): Insert + REG_BR_PROB notes in inline expansion of memcmp/strncmp. Add + #include "profile-count.h" and "predict.h" for types and functions + needed to work with REG_BR_PROB notes. + + 2019-02-09 Aaron Sawdey + + * config/rs6000/rs6000-string.c (expand_compare_loop, + expand_block_compare): Insert REG_BR_PROB notes in inline expansion of + memcmp/strncmp. + +2019-02-09 Jakub Jelinek + + Backported from mainline + 2019-01-16 David Malcolm + + PR target/88861 + * combine.c (delete_noop_moves): Convert to "bool" return, + returning true if any edges are eliminated. + (combine_instructions): Also return true if delete_noop_moves + returns true. + + 2019-02-08 Jakub Jelinek + + PR rtl-optimization/89234 + * except.c (copy_reg_eh_region_note_forward): Return if note_or_insn + is a NOTE, CODE_LABEL etc. - rtx_insn * other than INSN_P. + (copy_reg_eh_region_note_backward): Likewise. + +2019-02-09 Alan Modra + + PR target/88343 + * config/rs6000/rs6000.c (save_reg_p): Match logic in + rs6000_emit_prologue emitting pic_offset_table setup. + +2019-02-08 Richard Biener + + Backport from mainline + 2018-11-13 Richard Biener + + PR tree-optimization/86991 + * tree-vect-loop.c (vect_is_slp_reduction): Delay reduction + group building until we have successfully detected the SLP + reduction. + (vect_is_simple_reduction): Remove fixup code here. + +2019-02-08 Richard Biener + + Backport from mainline + 2019-02-03 Richard Biener + + PR debug/87295 + * dwarf2out.c (copy_ancestor_tree): Register non-stubs as + orig. + + 2019-01-29 Richard Biener + + PR debug/87295 + * dwarf2out.c (collect_skeleton_dies): New helper. + (copy_decls_for_unworthy_types): Call it. + (build_abbrev_table): Do not try to replace + DW_AT_signature refs with local refs. + + 2019-01-17 Richard Biener + + PR lto/86736 + * dwarf2out.c (want_pubnames): Never generate pubnames sections + and friends for the LTO part of debug info. + + 2019-01-24 Richard Biener + + PR lto/87187 + * tree-streamer-out.c (write_ts_decl_common_tree_pointers): + When in "legacy" debug mode make sure to reset self-origins. + + 2019-01-15 Richard Biener + + PR debug/88046 + * dwarf2out.c (gen_member_die): Do not generate inheritance + DIEs late. + + 2018-11-22 Richard Biener + + PR lto/87229 + PR lto/88112 + * lto-streamer-out.c (lto_is_streamable): Allow CALL_EXPRs + which can appear in size expressions. + * tree-streamer-in.c (unpack_ts_base_value_fields): Stream + CALL_EXPR_BY_DESCRIPTOR. + (streamer_read_tree_bitfields): Stream CALL_EXPR_IFN. + * tree-streamer-out.c (pack_ts_base_value_fields): Stream + CALL_EXPR_BY_DESCRIPTOR. + (streamer_write_tree_bitfields): Stream CALL_EXPR_IFN. + +2019-02-08 Christophe Lyon + + Backport from mainline + 2019-01-07 Christophe Lyon + + PR target/85596 + * doc/install.texi (with-multilib-list): Document for aarch64. + +2019-02-08 Richard Biener + + Backport from mainline + 2018-12-10 Richard Biener + + PR tree-optimization/88427 + * vr-values.c (vr_values::extract_range_from_phi_node): + Handle symbolic ranges conservatively when trying to drop + to Inf +- 1. + + 2018-11-28 Richard Biener + + PR tree-optimization/88217 + * vr-values.c (vr_values::extract_range_from_phi_node): Make + sure to handle results > +INF and < -INF correctly when + trying to drop down to +INF - 1 or -INF + 1. + + 2018-11-23 Richard Biener + + PR tree-optimization/88149 + * tree-vect-slp.c (vect_slp_analyze_node_operations): Detect + the case where there are two different def types for the + same operand at different operand position in the same stmt. + +2019-02-07 Jakub Jelinek + + Backported from mainline + 2019-02-05 Jakub Jelinek + + PR target/89188 + * dce.c (delete_unmarked_insns): Don't remove no-op moves if they + can throw, non-call exceptions are enabled and we can't delete + dead exceptions or alter cfg. Set must_clean if + delete_insn_and_edges returns true, don't set it blindly for calls. + + PR rtl-optimization/89195 + * combine.c (make_extraction): For MEMs, don't extract bytes outside + of the original MEM. + + PR target/89186 + * optabs.c (prepare_cmp_insn): Pass x and y to + emit_block_comp_via_libcall rather than XEXP (x, 0) and XEXP (y, 0). + + 2019-02-02 Jakub Jelinek + + PR middle-end/87887 + * config/i386/i386.c (ix86_simd_clone_compute_vecsize_and_simdlen): + Punt with warning on aggregate return or argument types. Ignore + type/mode checking for uniform arguments. + + 2019-02-01 Jakub Jelinek + + PR tree-optimization/88107 + * tree-cfg.c (find_outermost_region_in_block): Add ALL argument, + instead of assertion that eh_region_outermost is non-NULL, if it + is NULL, set *ALL to true and return NULL. + (move_sese_region_to_fn): Adjust caller, if all is set, call + duplicate_eh_regions with NULL region. + + 2019-01-31 Jakub Jelinek + + PR sanitizer/89124 + * ipa-inline.c (sanitize_attrs_match_for_inline_p): Allow inlining + always_inline callees into no_sanitize_address callers. + + 2019-01-30 Jakub Jelinek + + PR c++/89105 + * config/i386/i386.c (ix86_warn_parameter_passing_abi): Don't warn + for arguments to functions that are TU-local and shouldn't be + referenced by assembly. + + 2019-01-29 Jakub Jelinek + + PR c++/66676 + PR ipa/89104 + * omp-simd-clone.c (simd_clone_clauses_extract) + : Ignore clauses with NULL + OMP_CLAUSE_ALIGNED_ALIGNMENT. + + 2019-01-28 Jakub Jelinek + + PR middle-end/89002 + * gimplify.c (gimplify_omp_for): When adding OMP_CLAUSE_*_GIMPLE_SEQ + for lastprivate/linear IV, push gimplify context around gimplify_assign + and, if it needed any temporaries, pop it into a gimple bind around the + sequence. + + PR target/89073 + * doc/invoke.texi (-mclwb, -mprfchw, -mrdpid, -mrdseed, -msgx, + -madx, -mhle, -mavx5124fmaps, -mavx512vnni, -mavx5124vnniw): Document + x86 ISA options. + (bmi2): Add missing @opindex. + * doc/extend.texi (x86 target attribute): Move fma4, lwp, ssse3 + options alphabetically. Add missing 3dnow, 3dnowa, adx, avx, avx2, + avx5124fmaps, avx5124vnniw, avx512bitalg, avx512bw, avx512cd, + avx512dq, avx512er, avx512f, avx512ifma, avx512pf, avx512vbmi, + avx512vbmi2, avx512vl, avx512vnni, avx512vpopcntdq, bmi, bmi2, + clflushopt, clwb, clzero, crc32, cx16, f16c, fma, fsgsbase, + fxsr, gfni, hle, lzcnt, movbe, movdir64b, movdiri, mwaitx, pconfig, + pku, prefetchwt1, prfchw, rdpid, rdrnd, rdseed, rtm, sahf, + sgx, sha, shstk, tbm, vaes, vpclmulqdq, wbnoinvd, xsave, + xsavec, xsaveopt and xsaves options. + + 2019-01-27 Jakub Jelinek + + PR target/87214 + * config/i386/sse.md + (avx512dq_shuf_64x2_1, + avx512f_shuf_64x2_1): Ensure the + first constants in pairs are multiples of 2. Formatting fixes. + (avx512vl_shuf_32x4_1, + avx512vl_shuf_32x4_1): Ensure the + first constants in each quadruple are multiples of 4. Formatting fixes. + + 2019-01-24 Jakub Jelinek + + PR tree-optimization/88964 + * gimple-loop-interchange.cc (loop_cand::analyze_induction_var): Also + punt if HONOR_SNANS (chrec). + + 2019-01-23 Jakub Jelinek + + PR tree-optimization/88964 + * gimple-loop-interchange.cc (loop_cand::analyze_induction_var): Use + build_zero_cst instead of build_int_cst. Return false for loop + invariants which honor signed zeros. + + 2019-01-22 Jakub Jelinek + + PR target/88965 + * config/rs6000/rs6000.c: Include tree-vrp.h and tree-ssanames.h. + (rs6000_gimple_fold_builtin): If MEM_REF address doesn't satisfy + is_gimple_mem_ref_addr predicate, force it into a SSA_NAME first. + + PR middle-end/88968 + * gimplify.c (gimplify_omp_atomic): Handle bitfield atomics with + non-integral DECL_BIT_FIELD_REPRESENTATIVEs. + + PR target/88905 + * optabs.c (add_equal_note): Add op0_mode argument, use it instead of + GET_MODE (op0). + (expand_binop_directly, expand_doubleword_clz, + expand_doubleword_popcount, expand_ctz, expand_ffs, + expand_unop_direct, maybe_emit_unop_insn): Adjust callers. + + PR rtl-optimization/49429 + PR target/49454 + PR rtl-optimization/86334 + PR target/88906 + * expr.c (emit_block_move_hints): Move marking of MEM_EXPRs + addressable from here... + (emit_block_op_via_libcall): ... to here. + + 2019-01-17 Jakub Jelinek + + PR target/88734 + * config/aarch64/arm_neon.h: Fix #pragma GCC target syntax - replace + (("..."))) with ("..."). Use arch=armv8.2-a+sha3 instead of + arch=armv8.2-a+crypto for vsha512hq_u64 etc. intrinsics. + + PR rtl-optimization/88870 + * dce.c (deletable_insn_p): Never delete const/pure calls that can + throw if we can't alter the cfg or delete dead exceptions. + (mark_insn): Don't call find_call_stack_args for such calls. + + 2019-01-11 Jakub Jelinek + + PR bootstrap/88714 + * passes.c (finish_optimization_passes): Call print_combine_total_stats + inside of pass_combine_1 dump rather than pass_profile_1. + + 2019-01-10 Jakub Jelinek + + PR c/88568 + * attribs.c (handle_dll_attribute): Clear TREE_STATIC after setting + DECL_EXTERNAL. + + 2019-01-07 Jakub Jelinek + + PR debug/88723 + * dwarf2out.c (const_ok_for_output_1): Remove redundant call to + const_not_ok_for_debug_p target hook. + (mem_loc_descriptor) : Only call const_ok_for_output_1 + on UNSPEC and subexpressions thereof if all subexpressions of the + UNSPEC are CONSTANT_P. + + 2019-01-05 Jakub Jelinek + + PR debug/88635 + * dwarf2out.c (const_ok_for_output_1): Reject MINUS that contains + SYMBOL_REF, CODE_LABEL or UNSPEC in subexpressions of second argument. + Reject PLUS that contains SYMBOL_REF, CODE_LABEL or UNSPEC in + subexpressions of both operands. + (mem_loc_descriptor): Handle UNSPEC if target hook acks it and all the + subrtxes are CONSTANT_P. + +2019-02-07 Richard Biener + + Backport from mainline + 2018-11-20 Richard Biener + + PR tree-optimization/88105 + * tree-ssa-dom.c (pass_dominator::execute): Do not walk + backedges. + + 2018-11-28 Richard Biener + + PR tree-optimization/88223 + * tree-ssa-sccvn.c (vn_reference_lookup_3): When skipping + over a stored-same value may-alias store make sure to consider + partial overlaps which are valid when TBAA reasonings do not + apply and byte-granular overlaps are possible at all. + +2019-02-07 Richard Biener + + Backport from mainline + 2018-12-11 Richard Biener + + PR middle-end/88448 + PR middle-end/88415 + * tree-complex.c (update_complex_assignment): Properly transfer + or clean EH info around gimple_assign_set_rhs_with_ops. + + 2018-11-15 Richard Biener + + PR tree-optimization/88030 + * tree-complex.c (need_eh_cleanup): New global. + (update_complex_assignment): Mark blocks that need EH update. + (expand_complex_comparison): Likewise. + (tree_lower_complex): Allocate and deallocate need_eh_cleanup, + perform EH cleanup and schedule CFG cleanup if that did anything. + + 2018-11-08 Richard Biener + + PR tree-optimization/87929 + * tree-complex.c (expand_complex_comparison): Clean EH. + +2019-02-06 Eric Botcazou + + * config/i386/i386.c (ix86_expand_prologue): Emit a memory blockage + after restoring registers saved to allocate the frame on Windows. + +2019-02-06 Richard Biener + + Backport from mainline + 2019-01-31 Richard Biener + + PR tree-optimization/89135 + * tree-ssa-phiprop.c (pass_phiprop::execute): Skip blocks + with abnormal preds. + + 2019-01-18 Richard Biener + + PR tree-optimization/88903 + * tree-vect-stmts.c (vectorizable_shift): Verify we see all + scalar stmts a SLP shift amount is composed of when detecting + shifts by scalars. + +2019-02-05 Kelvin Nilsen + + Backport from mainline. + 2019-01-30 Kelvin Nilsen + * config/rs6000/rs6000-c.c (altivec-resolve_overloaded_builtin): + Change handling of ALTIVEC_BUILTIN_VEC_EXTRACT. Coerce result to + type of vector element when vec_extract is implemented by direct + move. + +2019-02-05 Andreas Krebbel + + Backport from mainline + 2019-02-05 Andreas Krebbel + + PR target/88856 + * config/s390/s390.md: Remove load and test FP splitter. + +2019-02-04 Bill Schmidt + + PR target/87064 + Backport from mainline + + 2019-01-30 Bill Schmidt + + PR target/87064 + * config/rs6000/vsx.md (*vsx_reduc__v4sf_scalar): + Disable for little-endian. + + 2019-01-22 Jakub Jelinek + + PR target/87064 + * config/rs6000/vsx.md (*vsx_reduc__v2df_scalar): + Disable for little endian. + +2019-02-04 Eric Botcazou + + * config/sparc/sparc.h: Remove superfluous blank lines. + * config/sparc/sparc.c (global_offset_table_rtx): Rename into... + (got_register_rtx): ...this. + (sparc_got): Adjust to above renaming. + (sparc_tls_got): Likewise. + (sparc_output_mi_thunk): Likewise. + (sparc_init_pic_reg): Likewise. + (save_local_or_in_reg_p): Fix test on the GOT register. + (USE_HIDDEN_LINKONCE): Move around. + (get_pc_thunk_name): Likewise. + (gen_load_pcrel_sym): Likewise. + (load_got_register): Likewise. + +2019-02-01 Bin Cheng + + Backport from mainline + 2018-10-15 Bin Cheng + + PR tree-optimization/87022 + * tree-loop-distribution.c (pg_add_dependence_edges): Check all + bits in dist vector rather than the first one. + +2019-02-01 Bin Cheng + + Backport from mainline + 2019-02-01 Bin Cheng + + PR tree-optimization/88932 + * tree-predcom.c (try_combine_chains): Get loop bbs in dom order. + +2018-01-31 Bill Schmidt + + Backport from mainline + 2018-01-31 Bill Schmidt + + PR tree-optimization/89008 + * gimple-ssa-strength-reduction.c (slsr_process_mul): Don't + process anything of the form X * 0. + +2019-01-31 Richard Biener + + Backport from mainline + 2019-01-31 Richard Biener + + PR rtl-optimization/89115 + * lra.c (lra_rtx_hash): Properly hash CONST_INT values. + + 2019-01-30 Richard Biener + + PR rtl-optimization/89115 + * opts.c (default_options_optimization): Reduce + PARAM_MAX_DSE_ACTIVE_LOCAL_STORES by a factor of 10 at -O1. + Make PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP reduction relative + to the default. + +2019-01-30 Kewen Lin + + Backport from mainline. + 2019-01-17 Kewen Lin + + * doc/extend.texi: Add four new prototypes for vec_ld and seven new + prototypes for vec_st. + * config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add entries + for scalar address type variants of altivec_vec_ld/altivec_vec_st, + mainly on signed/unsigned long long and double. + +2019-01-29 Vineet Gupta + + Backport from mainline. + * gcc/config.gcc: Force .init_array for ARC. + +2019-01-29 Vineet Gupta + + Backport from mainline. + * config/arc/atomic.md: Add operand to DMB instruction. + +2019-01-27 Uroš Bizjak + + PR target/88948 + * rtl.h (prepare_copy_insn): New prototype. + * gcse.c (prepare_copy_insn): New function, split out from + process_insert_insn. + (process_insert_insn): Use prepare_copy_insn. + * store-motion.c (replace_store_insn): Use prepare_copy_insn + instead of gen_move_insn. + +2019-01-25 Richard Biener + + PR tree-optimization/86865 + * graphite-scop-detection.c (scop_detection::can_represent_loop): + Reject non-do-while loops. + +2019-01-24 Uroš Bizjak + + PR target/88998 + * config/i386/sse.md (sse2_cvtpi2pd): Add SSE alternatives. + Disparage MMX alternative. + (sse2_cvtpd2pi): Ditto. + (sse2_cvttpd2pi): Ditto. + +2019-01-24 Richard Earnshaw + + PR target/88469 + * profile-count.h (profile_count): On ARM systems using GCC 6/7/8 + force the alignment of m_val. + +2019-01-24 Richard Biener + + Backport from mainline + 2019-01-23 Richard Biener + + PR tree-optimization/89008 + * tree-ssa-reassoc.c (eliminate_using_constants): For * 0 do + not leave another stray operand. + +2019-01-22 Uroš Bizjak + + PR target/88938 + * config/i386/i386.c (ix86_expand_builtin) [case IX86_BUILTIN_BEXTRI32, + case IX86_BUILTIN_BEXTRI64]: Sanitize operands. + +2019-01-18 Richard Earnshaw + + PR target/88799 + * config/arm/arm-cpus.in (mp): New feature. + (sec): New feature. + (fgroup ARMv7ve): Add mp and sec features. + (arch armv7-a): Add options to allow mp and sec extensions. + (cpu generic-armv7-a): Add options to allow mp and sec extensions. + (cpu cortex-a5, cpu cortex-7, cpu cortex-a9): Add mp and sec + extenstions to the base architecture. + (cpu cortex-a8): Add sec extension to the base architecture. + (cpu marvell-pj4): Add mp and sec extensions to the base architecture. + * config/arm/t-aprofile (MULTILIB_MATCHES): Map all armv7-a arch + variants down to the base v7-a varaint. + * config/arm/t-multilib (v7_a_arch_variants): New variable. + * doc/invoke.texi (ARM Options): Add +mp and +sec to the list + of permitted extensions for -march=armv7-a and for + -mcpu=generic-armv7-a. + +2019-01-17 Uroš Bizjak + + * config/alpha/alpha.c (alpha_gimplify_va_arg): + Handle split indirect COMPLEX_TYPE arguments. + +2019-01-17 Eric Botcazou + + * gimple-ssa-isolate-paths.c (stmt_uses_name_in_undefined_way): Replace + flag_non_call_exceptions with cfun->can_throw_non_call_exceptions. + (stmt_uses_0_or_null_in_undefined_way): Likewise. + * tree-ssa-alias.c (same_addr_size_stores_p): Likewise. + +2019-01-16 Aaron Sawdey + + Backported from mainline + 2019-01-03 Aaron Sawdey + * config/rs6000/rs6000-string.c (expand_block_move): Don't use + unaligned vsx and avoid lxvd2x/stxvd2x. + (gen_lvx_v4si_move): New function. + +2019-01-16 Martin Jambor + + Backported from mainline + 2018-12-10 Martin Jambor + + PR ipa/88214 + * ipa-prop.c (determine_locally_known_aggregate_parts): Make sure + we check pointers against pointers. + +2019-01-10 Jan Hubicka + + Backported from mainline + 2018-12-27 Jan Hubicka + + * ipa-devirt.c (polymorphic_call_target_d): Add n_odr_types. + (polymorphic_call_target_hasher::hash): Hash it. + (polymorphic_call_target_hasher::equal): Compare it. + (possible_polymorphic_call_targets): Set it. + * tree.c (free_lang_data): Rebuild type inheritance graph even on + non-LTO path. + +2019-01-03 Jan Hubicka + + Backported from mainline + 2019-01-02 Richard Biener + + PR ipa/85574 + * ipa-icf.h (sem_item_optimizer::sort_congruence_split): Declare. + * ipa-icf.c (sem_item_optimizer::sort_congruence_split): New + function. + (sem_item_optimizer::do_congruence_step_f): Sort the congruence + set after UIDs before splitting them. + +2019-01-03 Jan Hubicka + + Backported from mainline + 2019-01-03 Jan Hubicka + + PR tree-optimization/85574 + * tree-ssa-uncprop.c (struct equiv_hash_elt): Remove unused + structure. + (struct ssa_equip_hash_traits): Declare. + (val_ssa_equiv): Use custom hash traits using operand_equal_p. + +2019-01-09 Eric Botcazou + + * config/sparc/sparc.md (*tablejump_sp32): Merge into... + (*tablejump_sp64): Likewise. + (*tablejump): ...this. + (*call_address_sp32): Merge into... + (*call_address_sp64): Likewise. + (*call_address): ...this. + (*call_symbolic_sp32): Merge into... + (*call_symbolic_sp64): Likewise. + (*call_symbolic): ...this. + (call_value): Remove constraint and add predicate. + (*call_value_address_sp32): Merge into... + (*call_value_address_sp64): Likewise. + (*call_value_address): ...this. + (*call_value_symbolic_sp32): Merge into... + (*call_value_symbolic_sp64): Likewise. + (*call_value_symbolic): ...this. + (*sibcall_symbolic_sp32): Merge into... + (*sibcall_symbolic_sp64): Likewise. + (*sibcall_symbolic): ...this. + (sibcall_value): Remove constraint and add predicate. + (*sibcall_value_symbolic_sp32): Merge into... + (*sibcall_value_symbolic_sp64): Likewise. + (*sibcall_value_symbolic): ...this. + (window_save): Minor tweak. + (*branch_sp32): Merge into... + (*branch_sp64): Likewise. + (*branch): ...this. + +2019-01-09 Eric Botcazou + James Clarke + + PR target/84010 + * config/sparc/sparc.c (sparc_legitimize_tls_address): Only use Pmode + consistently in TLS address generation and adjust code to the renaming + of patterns. Mark calls to __tls_get_addr as const. + * config/sparc/sparc.md (tgd_hi22): Turn into... + (tgd_hi22): ...this and use Pmode throughout. + (tgd_lo10): Turn into... + (tgd_lo10): ...this and use Pmode throughout. + (tgd_add32): Merge into... + (tgd_add64): Likewise. + (tgd_add): ...this and use Pmode throughout. + (tldm_hi22): Turn into... + (tldm_hi22): ...this and use Pmode throughout. + (tldm_lo10): Turn into... + (tldm_lo10): ...this and use Pmode throughout. + (tldm_add32): Merge into... + (tldm_add64): Likewise. + (tldm_add): ...this and use Pmode throughout. + (tldm_call32): Merge into... + (tldm_call64): Likewise. + (tldm_call): ...this and use Pmode throughout. + (tldo_hix22): Turn into... + (tldo_hix22): ...this and use Pmode throughout. + (tldo_lox10): Turn into... + (tldo_lox10): ...this and use Pmode throughout. + (tldo_add32): Merge into... + (tldo_add64): Likewise. + (tldo_add): ...this and use Pmode throughout. + (tie_hi22): Turn into... + (tie_hi22): ...this and use Pmode throughout. + (tie_lo10): Turn into... + (tie_lo10): ...this and use Pmode throughout. + (tie_ld64): Use DImode throughout. + (tie_add32): Merge into... + (tie_add64): Likewise. + (tie_add): ...this and use Pmode throughout. + (tle_hix22_sp32): Merge into... + (tle_hix22_sp64): Likewise. + (tle_hix22): ...this and use Pmode throughout. + (tle_lox22_sp32): Merge into... + (tle_lox22_sp64): Likewise. + (tle_lox22): ...this and use Pmode throughout. + (*tldo_ldub_sp32): Merge into... + (*tldo_ldub_sp64): Likewise. + (*tldo_ldub): ...this and use Pmode throughout. + (*tldo_ldub1_sp32): Merge into... + (*tldo_ldub1_sp64): Likewise. + (*tldo_ldub1): ...this and use Pmode throughout. + (*tldo_ldub2_sp32): Merge into... + (*tldo_ldub2_sp64): Likewise. + (*tldo_ldub2): ...this and use Pmode throughout. + (*tldo_ldsb1_sp32): Merge into... + (*tldo_ldsb1_sp64): Likewise. + (*tldo_ldsb1): ...this and use Pmode throughout. + (*tldo_ldsb2_sp32): Merge into... + (*tldo_ldsb2_sp64): Likewise. + (*tldo_ldsb2): ...this and use Pmode throughout. + (*tldo_ldub3_sp64): Use DImode throughout. + (*tldo_ldsb3_sp64): Likewise. + (*tldo_lduh_sp32): Merge into... + (*tldo_lduh_sp64): Likewise. + (*tldo_lduh): ...this and use Pmode throughout. + (*tldo_lduh1_sp32): Merge into... + (*tldo_lduh1_sp64): Likewise. + (*tldo_lduh1): ...this and use Pmode throughout. + (*tldo_ldsh1_sp32): Merge into... + (*tldo_ldsh1_sp64): Likewise. + (*tldo_ldsh1): ...this and use Pmode throughout. + (*tldo_lduh2_sp64): Use DImode throughout. + (*tldo_ldsh2_sp64): Likewise. + (*tldo_lduw_sp32): Merge into... + (*tldo_lduw_sp64): Likewise. + (*tldo_lduw): ...this and use Pmode throughout. + (*tldo_lduw1_sp64): Use DImode throughout. + (*tldo_ldsw1_sp64): Likewise. + (*tldo_ldx_sp64): Likewise. + (*tldo_stb_sp32): Merge into... + (*tldo_stb_sp64): Likewise. + (*tldo_stb): ...this and use Pmode throughout. + (*tldo_sth_sp32): Merge into... + (*tldo_sth_sp64): Likewise. + (*tldo_sth): ...this and use Pmode throughout. + (*tldo_stw_sp32): Merge into... + (*tldo_stw_sp64): Likewise. + (*tldo_stw): ...this and use Pmode throughout. + (*tldo_stx_sp64): Use DImode throughout. + +2019-01-09 Eric Botcazou + + * doc/invoke.texi (-Os): Add reference to -finline-functions. + (-finline-functions): Remove reference to -O2, add references + to -fprofile-use and -fauto-profile. + +2019-01-08 Jakub Jelinek + + Backported from mainline + 2019-01-05 Jakub Jelinek + + PR middle-end/82564 + PR target/88620 + * expr.c (expand_assignment): For calls returning VLA structures + if to_rtx is not a MEM, force it into a stack temporary. + + 2019-01-04 Jakub Jelinek + + PR target/88594 + * config/i386/i386.c (ix86_expand_divmod_libfunc): Use mode instead + of GET_MODE (opN) as modes of the libcall arguments. + + 2019-01-03 Jakub Jelinek + + PR debug/88644 + * dwarf2out.c (modified_type_die): If type is equal to sizetype, + change it to qualified_type. + + 2018-12-21 Jakub Jelinek + + PR middle-end/85594 + PR middle-end/88553 + * omp-expand.c (extract_omp_for_update_vars): Regimplify the condition + if needed. + (expand_omp_for_generic): Don't clobber t temporary for ordered loops. + + PR target/88522 + * config/i386/sse.md (*avx512pf_gatherpfsf_mask, + *avx512pf_gatherpfdf_mask, *avx512pf_scatterpfsf_mask, + *avx512pf_scatterpfdf_mask): Use %X5 instead of %5 for + -masm=intel. + (gatherq_mode): Remove mode iterator. + (*avx512f_gathersi, *avx512f_gathersi_2): Use X instead + of . + (*avx512f_gatherdi): Use X instead of . + (*avx512f_gatherdi_2, *avx512f_scattersi, + *avx512f_scatterdi): Use %X5 for -masm=intel. + + PR rtl-optimization/88563 + * expr.c (expand_expr_real_2) : Swap innermode + and mode arguments to convert_modes. Likewise swap mode and word_mode + arguments. Handle both arguments with VOIDmode before convert_modes + of one of them. Formatting fixes. + + 2018-12-19 Jakub Jelinek + + PR target/88541 + * config/i386/vpclmulqdqintrin.h (_mm256_clmulepi64_epi128): Enable + for -mavx -mvpclmulqdq rather than just for -mavx512vl -mvpclmulqdq. + + 2018-12-14 Jakub Jelinek + + PR c++/82294 + PR c++/87436 + * expr.h (categorize_ctor_elements): Add p_unique_nz_elts argument. + * expr.c (categorize_ctor_elements_1): Likewise. Compute it like + p_nz_elts, except don't multiply it by mult. Adjust recursive call. + Fix up COMPLEX_CST handling. + (categorize_ctor_elements): Add p_unique_nz_elts argument, initialize + it and pass it through to categorize_ctor_elements_1. + (mostly_zeros_p, all_zeros_p): Adjust categorize_ctor_elements callers. + * gimplify.c (gimplify_init_constructor): Likewise. Don't force + ctor into readonly data section if num_unique_nonzero_elements is + smaller or equal to 1/8 of num_nonzero_elements and size is >= 64 + bytes. + + 2018-12-13 Jakub Jelinek + + PR rtl-optimization/88470 + * cfgcleanup.c (outgoing_edges_match): If the function is + shrink-wrapped and bb1 ends with a JUMP_INSN with a single fake + edge to EXIT, return false. + + PR rtl-optimization/88416 + * valtrack.c (cleanup_auto_inc_dec): Handle pre/post-inc/dec/modify + even if !AUTO_INC_DEC. + + 2018-12-07 Jakub Jelinek + + PR target/85593 + * final.c (rest_of_handle_final): Don't call collect_fn_hard_reg_usage + for functions with naked attribute. + + 2018-12-06 Jakub Jelinek + + PR target/87598 + * config/aarch64/aarch64.c (aarch64_print_address_internal): Don't + call output_operand_lossage on VOIDmode CONST_INTs. After + output_operand_lossage do return false. + + 2018-12-05 Jakub Jelinek + + PR tree-optimization/87360 + * gimple-loop-jam.c (tree_loop_unroll_and_jam): On failure to analyze + data dependencies, don't return false, just continue. + + 2018-11-29 Jakub Jelinek + + PR target/88234 + * config/rs6000/rs6000.c (rs6000_gimple_fold_builtin): For + vec_add and vec_sub builtins, perform PLUS_EXPR or MINUS_EXPR + in unsigned_type_for instead of vector integral type where overflow + doesn't wrap. + + 2018-11-26 Jakub Jelinek + + PR c++/86900 + * dwarf2out.c (secname_for_decl): For functions with + DECL_SECTION_NAME if in_cold_section_p, try to return + current_function_section's name if it is a named section. + + 2018-11-22 Jakub Jelinek + + PR target/85644 + PR target/86832 + * config/i386/i386.c (ix86_option_override_internal): Default + ix86_stack_protector_guard to SSP_TLS only if TARGET_THREAD_SSP_OFFSET + is defined. + * config/i386/i386.md (stack_protect_set, stack_protect_set_, + stack_protect_test, stack_protect_test_): Use empty condition + instead of TARGET_SSP_TLS_GUARD. + + 2018-11-20 Jakub Jelinek + + PR tree-optimization/87895 + * omp-simd-clone.c (ipa_simd_modify_function_body): When removing + or replacing GIMPLE_RETURN, set EDGE_FALLTHRU on the edge to EXIT. + (simd_clone_adjust): Don't set EDGE_FALLTHRU here. In a loop that + redirects edges to EXIT to edges to incr_bb, iterate while EXIT + has any preds and always use EDGE_PRED (, 0). + + 2018-11-19 Jakub Jelinek + + PR tree-optimization/88071 + * tree-vect-loop.c (vectorize_fold_left_reduction): Pass true instead + of false as last argument to gsi_remove. + * tree-vect-stmts.c (vect_finish_replace_stmt): Pass true instead of + false as last argument to gsi_replace. + + PR debug/87039 + * omp-expand.c: Don't include debug.h. + (adjust_context_and_scope): Add REGION argument. Find DECL_CONTEXT + from innermost outer parallel, task, or target that has a + child_fn set, or, if there is no such outer region, use + current_function_decl. Do the DECL_CONTEXT adjustment regardless of + whether a suitable BLOCK is found or not. + (expand_parallel_call): Don't call adjust_context_and_scope here. + (grid_expand_target_grid_body): Revert 2017-01-25 changes. + (expand_omp_taskreg, expand_omp_target): Likewise. Call + adjust_context_and_scope. + * dwarf2out.c (dwarf2out_early_global_decl): For + decl_function_context recurse instead of calling dwarf2out_decl. + + 2018-11-16 Jakub Jelinek + + PR rtl-optimization/87475 + * cfgrtl.c (patch_jump_insn): Allow redirection failure for + CROSSING_JUMP_P insns. + (cfg_layout_redirect_edge_and_branch): Don't ICE if ret is NULL. + + 2018-11-15 Jakub Jelinek + + PR rtl-optimization/88018 + * cfgrtl.c (fixup_abnormal_edges): Guard moving insns to fallthru edge + on the presence of fallthru edge, rather than if it is a USE or not. + + 2018-11-13 Jakub Jelinek + + PR tree-optimization/87898 + * omp-simd-clone.c (ipa_simd_modify_function_body): Remove debug stmts + where the first argument was changed into a non-decl. + +2019-01-03 Jan Hubicka + + Backport from mainline + 2019-01-02 Jan Hubicka + + PR lto/88130 + * varpool.c (varpool_node::ctor_useable_for_folding_p): Also return + false at WPA time when body was removed. + +2019-01-03 Jan Hubicka + + Backport from mainline + 2018-08-29 Jan Hubicka + + PR lto/86517 + PR lto/88185 + * lto-opts.c (lto_write_options): Always stream PIC/PIE mode. + * lto-wrapper.c (merge_and_complain): Fix merging of PIC/PIE. + +2019-01-04 Aaron Sawdey + + Backport from mainline + 2018-11-28 Aaron Sawdey + + * config/rs6000/rs6000-string.c (expand_block_clear): Change how + we determine if unaligned vsx is ok. + +2019-01-03 Jan Hubicka + + Backport from mainline + 2019-01-03 Jan Hubicka + + * ipa-utils.c (scale_ipa_profile_for_fn): Break out from ... + (ipa_merge_profiles): ... here; do not ICE on thunks and aliases. + +2019-01-03 Martin Liska + + Backport from mainline + 2019-01-01 Jan Hubicka + + * coverage.c (get_coverage_counts): Use current_function_decl. + * profile.c (read_thunk_profile): New function. + (branch_prob): Add THUNK parameter. + * tree-profile.c (tree_profiling): Handle thunks. + * value-prof.c (init_node_map): Handle thunks. + * value-prof.h (branch_prob): Upate prototype. + (read_thunk_profile): Declare. + +2019-01-03 Iain Sandoe + + revert: + 2018-12-23 Iain Sandoe + + backport from mainline. + 2018-12-12 Segher Boessenkool + Iain Sandoe + + PR target/88343 + * config/rs6000/rs6000.c (save_reg_p): Do not save the picbase reg + unless it has been used. + (first_reg_to_save): Remove dead code. + +2019-01-02 Segher Boessenkool + + Backport from trunk + 2018-12-06 Segher Boessenkool + + PR inline-asm/55681 + * doc/extend.texi (Basic Asm): Update grammar. + (Extended Asm): Update grammar. + + Backport from trunk + 2018-12-06 Segher Boessenkool + + * doc/extend.texi (Using Assembly Language with C): Document asm inline. + (Size of an asm): Fix typo. Document asm inline. + * gimple-pretty-print.c (dump_gimple_asm): Handle asm inline. + * gimple.h (enum gf_mask): Add GF_ASM_INLINE. + (gimple_asm_set_volatile): Fix typo. + (gimple_asm_inline_p): New. + (gimple_asm_set_inline): New. + * gimplify.c (gimplify_asm_expr): Propagate the asm inline flag from + tree to gimple. + * ipa-icf-gimple.c (func_checker::compare_gimple_asm): Compare the + gimple_asm_inline_p flag, too. + * tree-core.h (tree_base): Document that protected_flag is ASM_INLINE_P + in an ASM_EXPR. + * tree-inline.c (estimate_num_insns): If gimple_asm_inline_p return + a minimum size for an asm. + * tree.h (ASM_INLINE_P): New. + +2018-12-28 Thomas Schwinge + Julian Brown + + * gimplify.c (gimplify_scan_omp_clauses): Fix known_eq typo/bug. + +2018-12-27 Martin Liska + + Backport from mainline + 2018-12-15 Jan Hubicka + + PR ipa/88561 + * ipa-polymorphic-call.c + (ipa_polymorphic_call_context::ipa_polymorphic_call_context): Handle + arguments of thunks correctly. + (ipa_polymorphic_call_context::get_dynamic_context): Be ready for + NULL instance pinter. + * lto-cgraph.c (lto_output_node): Always stream thunk info. + +2018-12-23 Iain Sandoe + + backport from mainline. + 2018-12-12 Segher Boessenkool + Iain Sandoe + + PR target/88343 + * config/rs6000/rs6000.c (save_reg_p): Do not save the picbase reg + unless it has been used. + (first_reg_to_save): Remove dead code. + +2018-12-23 Iain Sandoe + + Backport from mainline + 2018-12-06 Iain Sandoe + + PR c++/87380 + * config/darwin.h (TARGET_WEAK_NOT_IN_ARCHIVE_TOC) Remove, use the + default. + * config/rs6000/darwin7.h (TARGET_WEAK_NOT_IN_ARCHIVE_TOC): New. + +2018-12-23 Iain Sandoe + + Backport from mainline + 2018-12-06 Iain Sandoe + + PR target/78444 + * config/i386/darwin.h (STACK_BOUNDARY): Remove macro. + * config/i386/i386.c (ix86_compute_frame_layout): Ensure at least 128b + stack alignment in non-leaf functions. + +2018-12-21 Uros Bizjak + + Backport from mainline + 2018-12-10 Uros Bizjak + + PR target/88418 + * config/i386/i386.c (ix86_expand_sse_cmp): For vector modes, + check operand 1 with vector_operand predicate. + (ix86_expand_sse_movcc): For vector modes, check op_true with + vector_operand, not nonimmediate_operand. + +2018-12-19 Bill Schmidt + + Backport from mainline + 2018-12-18 Bill Schmidt + + * doc/extend.texi (PowerPC Altivec/VSX Built-in Functions): + Describe when a typedef name can be used as the type specifier for + a vector type, and when it cannot. + +2018-12-19 Segher Boessenkool + + Backport from trunk + 2018-12-19 Segher Boessenkool + + PR target/88213 + * config/rs6000/vsx.md (*vsx_extract___load): + Require TARGET_POWERPC64. + +2018-12-17 Senthil Kumar Selvaraj + + Backport from trunk + 2018-12-17 Senthil Kumar Selvaraj + + PR rtl-optimization/88253 + * combine.c (combine_simplify_rtx): Test for side-effects before + substituting by zero. + +2018-12-15 Segher Boessenkool + + Backport from trunk + 2018-12-14 Segher Boessenkool + + PR rtl-optimization/88001 + * function.c (match_asm_constraints_1): Don't invalidly share RTL. + +2018-12-15 Jan Hubicka + + * ipa.c (cgraph_build_static_cdtor_1): Add OPTIMIZATION and TARGET + parameters. + (cgraph_build_static_cdtor): Update. + (build_cdtor): Use OPTIMIZATION and TARGET of the first real cdtor + callsed. + +2018-12-15 Jan Hubicka + + Backport from mainline + 2018-11-02 Richard Biener + + * dwarf2out.c (build_abbrev_table): Guard lookup_external_ref call + with is_type_die. + +2018-12-14 Kyrylo Tkachov + + Backport from mainline + 2018-12-13 Kyrylo Tkachov + + * doc/invoke.texi (-msve-vector-bits): Clarify -msve-vector-bits=128 + behavior. + +2018-12-14 Andre Vieira + + Backport from mainline + PR target/88224 + * config/arm/arm-cpus.in (armv7-r): Add FP16conv configurations. + (cortex-r7, cortex-r8): Update fpu and add new configuration. + * doc/invoke.texi (armv7-r): Add two new vfp options. + (nofp.dp): Add cortex-r7 and cortex-r8 to the list of targets that + support this option. + +2018-12-13 H.J. Lu + + Backport from mainline + 2018-11-05 Xuepeng Guo + + PR target/87853 + * config/i386/emmintrin.h (__v16qs): New to cope with option + -funsigned-char. + (_mm_cmpeq_epi8): Replace __v16qi with __v16qs. + (_mm_cmplt_epi8): Likewise. + (_mm_cmpgt_epi8): Likewise. + +2018-12-13 Andreas Krebbel + + Backport from mainline + 2018-12-13 Andreas Krebbel + + * config/s390/s390-builtins.def (s390_vec_double_s64): Map to + s390_vec_double_s64 instead of s390_vcdgb. + (s390_vec_double_u64): Map to s390_vec_double_u64 instead of + s390_vcdlgb. + +2018-12-13 Andreas Krebbel + + Backport from mainline + 2018-12-13 Andreas Krebbel + + * config/s390/vx-builtins.md ("vec_ctd_s64", "vec_ctd_u64") + ("vec_ctsl", "vec_ctul"): Replace 0 with VEC_NOINEXACT. + ("vec_double_s64", "vec_double_u64"): Replace 4 with VEC_INEXACT. + +2018-12-13 Eric Botcazou + + Backport from mainline + 2018-12-11 Eric Botcazou + + * config/rs6000/vxworks.h (RS6000_STARTING_FRAME_OFFSET): Define, + accounting for STACK_BOUNDARY 128. + (STACK_DYNAMIC_OFFSET): Likewise. + +2018-12-12 Peter Bergner + + Backport from mainline + 2018-12-07 Peter Bergner + + PR target/87496 + * config/rs6000/rs6000.c (rs6000_option_override_internal): Disallow + -mabi=ieeelongdouble and -mabi=ibmlongdouble without -mlong-double-128. + Do not error for -mabi=ibmlongdouble and no ISA 2.06 support. + * doc/invoke.texi: Document -mabi=ibmlongdouble and -mabi=ieeelongdouble + require -mlong-double-128. + +2018-12-05 Richard Biener + + Backport from mainline + 2018-09-20 Richard Sandiford + + PR tree-optimization/87288 + * tree-vect-loop.c (vect_analyze_loop_2): Take PEELING_FOR_GAPS + into account when determining PEELING_FOR_NITERS. + +2018-12-05 Iain Sandoe + + Backport from mainline + 2018-08-18 Iain Sandoe + + * config/darwin.c (darwin_override_options): If -gsplit-dwarf is set, + emit a diagnostic that it is not supported and reset the option. + * config/darwin.h (DRIVER_SELF_SPECS): Note that gsplit-dwarf is not + supported and consume the option. (ASM_FINAL_SPEC): New. + +2018-12-04 Iain Sandoe + + Backport from mainline + 2018-08-15 Iain Sandoe + + PR target/81685 + * config/darwin.h: (DEBUG_STR_OFFSETS_SECTION, DEBUG_LOCLISTS_SECTION, + DEBUG_RNGLISTS_SECTION) new macros. (DEBUG_PUBNAMES_SECTION, + DEBUG_PUBTYPES_SECTION) update to include GNU variant. + +2018-11-29 Peter Bergner + + Backport from mainline + 2018-11-29 Peter Bergner + + PR target/87496 + * config/rs6000/rs6000.c (rs6000_option_override_internal): Disallow + -mabi=ieeelongdouble without both -mpopcntd and -mvsx. + +2018-11-28 Aaron Sawdey + + Backport from mainline + 2018-10-25 Aaron Sawdey + + * config/rs6000/rs6000-string.c (expand_strncmp_gpr_sequence): Change to + a shorter sequence with fewer branches. + (emit_final_str_compare_gpr): Ditto. + + Backport from mainline to allow the above code to go in: + 2018-06-14 Aaron Sawdey + + * config/rs6000/rs6000-string.c (do_and3, do_and3_mask, + do_cmpb3, do_rotl3): New functions. + +2018-11-28 Richard Biener + + PR tree-optimization/79351 + * tree-ssa-sccvn.c (vn_reference_lookup_3): For assignments from + empty CONSTRUCTORs ensure the store is at a constant position. + +2018-11-28 Richard Biener + + PR tree-optimization/88229 + * tree-ssa.c (non_rewritable_mem_ref_base): Check DECL_SIZE_UNIT + is an INTEGER_CST before accessing it so. + +2018-11-26 Andreas Krebbel + + Backport from mainline + 2018-11-20 Andreas Krebbel + + * config/s390/s390.md ("clztidi2"): Swap the RTX's written to the + DImode parts of the target operand. + +2018-11-26 Andreas Krebbel + + Backport from mainline + 2018-11-26 Andreas Krebbel + + * doc/invoke.texi: Document z14/arch12 -march option. + +2018-11-23 Tamar Christina + + Backported from mainline. + 2018-08-16 Tamar Christina + + PR target/84711 + * config/arm/neon.md (movv4hf, movv8hf): Refactored to.. + (mov): ..this and enable unconditionally. + +2018-11-22 Uros Bizjak + + Backport from mainline + 2018-11-16 Uros Bizjak + + PR target/88051 + * config/i386/sse.md (UNSPEC_MOVDI_TO_SSE): New UNSPEC. + (movdi_to_sse): Rewrite using UNSPEC_MOVDI_TO_SSE unspec. + +2018-11-20 Eric Botcazou + + PR rtl-optimization/85925 + * rtl.h (word_register_operation_p): New predicate. + * combine.c (record_dead_and_set_regs_1): Only apply specific handling + for WORD_REGISTER_OPERATIONS targets to word_register_operation_p RTX. + * rtlanal.c (nonzero_bits1): Likewise. Adjust couple of comments. + (num_sign_bit_copies1): Likewise. + +2018-11-19 Martin Liska + + PR gcov-profile/88045 + * coverage.c (coverage_begin_function): One can't relly on the + fact that function ends on the same line it starts or later. + +2018-11-18 Uros Bizjak + + Backport from mainline + 2018-11-11 Uros Bizjak + + PR target/87928 + * config/i386/i386.h (STACK_BOUNDARY): Use TARGET_64BIT_MS_ABI + instead of (TARGET_64BIT && ix86_abi == MS_ABI). + * config/i386/darwin.h (STACK_BOUNDARY): Ditto. + * config/i386/cygming.h (STACK_BOUNDARY): Remove. + +2018-11-16 Eric Botcazou + + * tree-switch-conversion.c (emit_case_decision_tree): Pass location + of switch statement to emit_case_nodes. + (do_jump_if_equal): Add LOC parameter and set it on the newly built + GIMPLE comparison statement. + (emit_cmp_and_jump_insns): Likewise. + (emit_case_nodes): Add LOC parameter and pass it to do_jump_if_equal + as well as recursive calls. + +2018-11-15 Nathan Sidwell + + PR debug/88006 + PR debug/87462 + * dwarf2out.c (dwarf2out_finish): Apply resolve_addr to comdat + type list. + +2018-11-14 Paul A. Clarke + + Backport from mainline + * config/rs6000/xmmintrin.h (_mm_extract_pi16): Fix for big-endian. + +2018-11-14 Claudiu Zissulescu + + Backport from mainline + PR target/85968 + * config/arc/arc.c (arc_return_address_register): Fix + if-condition. + +2018-11-14 Claudiu Zissulescu + + Backport from mainline + * config/arc/arc.h (FUNCTION_PROFILER): Redefine to empty. + * config/arc/elf.h (PROFILE_HOOK): Define. + * config/arc/linux.h (PROFILE_HOOK): Likewise. + +2018-11-14 Claudiu Zissulescu + + Backport from mainline + * config/arc/arc.c (hwloop_optimize): Bailout when detecting a + jump table data in the text section. + +2018-11-14 Claudiu Zissulescu + + Backport from mainline + * config/arc/arc.c (arc_eh_return_address_location): Repurpose it + to fit the eh_return pattern. + * config/arc/arc.md (eh_return): Define. + (VUNSPEC_ARC_EH_RETURN): Likewise. + * config/arc/arc-protos.h (arc_eh_return_address_location): Match + new implementation. + * config/arc/arc.h (EH_RETURN_HANDLER_RTX): Remove it. + +2018-11-14 Claudiu Zissulescu + + Backport from mainline + 2018-09-17 Alexey Brodkin + + * config/arc/linux.h (LINK_EH_SPEC): Add missing space. + +2018-11-14 Claudiu Zissulescu + + Backport from mainline + * config/arc/linux.h (CLEAR_INSN_CACHE): Define. + +2018-11-11 Uros Bizjak + + Backport from mainline + 2018-11-04 Uros Bizjak + + PR middle-end/58372 + * cfgexpand.c (pass_expand::execute): Move the call to + finish_eh_generation in front of the call to expand_stack_alignment. + +2018-11-07 Max Filippov + + Backport from mainline + 2018-11-05 Max Filippov + + * config/xtensa/uclinux.h (XTENSA_ALWAYS_PIC): Change to 0. + +2018-11-05 Jakub Jelinek + + PR tree-optimization/87859 + * gimple-ssa-store-merging.c (struct merged_store_group): Add + first_nonmergeable_order member. + (merged_store_group::merged_store_group): Initialize them. + (imm_store_chain_info::coalesce_immediate_stores): Don't merge + stores with order >= first_nonmergeable_order. + Set merged_store->first_nonmergeable_order if we've skipped any + stores. Attempt to merge overlapping INTEGER_CST stores that + we would otherwise skip. + + PR sanitizer/87837 + * match.pd (X + Y < X): Don't optimize if TYPE_OVERFLOW_SANITIZED. + + Backported from mainline + 2018-10-20 Jakub Jelinek + + PR middle-end/87647 + * varasm.c (decode_addr_const): Handle COMPOUND_LITERAL_EXPR. + + 2018-10-19 Jakub Jelinek + + PR middle-end/85488 + PR middle-end/87649 + * omp-low.c (check_omp_nesting_restrictions): Diagnose ordered without + depend closely nested inside of loop with ordered clause with + a parameter. + +2018-10-29 Richard Biener + + Backport from mainline + 2018-09-26 Richard Biener + + PR debug/87428 + PR debug/87362 + * tree-inline.c (expand_call_inline): When the location + of the call is UNKNOWN_LOCATION use DECL_SOURCE_LOCATION + or BUILTINS_LOCATION for the BLOCK_SOURCE_LOCATION of + the inserted BLOCK to make inlined_function_outer_scope_p + recognize it. + * dwarf2out.c (add_call_src_coords_attributes): Do not add + coords for reserved locations. + +2018-10-28 Iain Sandoe + + Backport from mainline + 2018-08-22 Iain Sandoe + + PR bootstrap/81033 + PR target/81733 + PR target/52795 + * gcc/dwarf2out.c (FUNC_SECOND_SECT_LABEL): New. + (dwarf2out_switch_text_section): Generate a local label for the second + function sub-section and apply it as the second FDE start label. + * gcc/final.c (final_scan_insn_1): Emit second FDE label after the + second sub-section start. + +2018-10-28 Iain Sandoe + + Backport from mainline + 2018-08-15 Iain Sandoe + + * config/darwin.c + (darwin_function_switched_text_sections): Delete. + * gcc/config/darwin.h + (TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS): Likewise. + +2018-10-28 Iain Sandoe + + backport from mainline. + 2018-10-28 Iain Sandoe + + PR target/85669 + * config/rs6000/darwin.h (STACK_BOUNDARY): New. + (RS6000_STARTING_FRAME_OFFSET): Adjust to preserve 16byte alignment. + (STACK_DYNAMIC_OFFSET): Likewise. + +2018-10-26 Bill Schmidt + + Backport from mainline + 2018-10-19 Bill Schmidt + + PR tree-optimization/87473 + * gimple-ssa-strength-reduction.c (record_phi_increments_1): For + phi arguments identical to the base expression of the phi + candidate, record a phi-adjust increment of zero minus the index + expression of the hidden basis. + (phi_incr_cost_1): For phi arguments identical to the base + expression of the phi candidate, the difference to compare against + the increment is zero minus the index expression of the hidden + basis, and there is no potential savings from replacing the (phi) + statement. + (ncd_with_phi): For phi arguments identical to the base expression + of the phi candidate, the difference to compare against the + increment is zero minus the index expression of the hidden basis. + (all_phi_incrs_profitable_1): For phi arguments identical to the + base expression of the phi candidate, the increment to be checked + for profitability is zero minus the index expression of the hidden + basis. + +2018-10-25 Richard Biener + + PR tree-optimization/87665 + PR tree-optimization/87745 + * tree-vectorizer.h (get_earlier_stmt): Remove. + (get_later_stmt): Pick up UID from the original non-pattern stmt. + +2018-10-24 Richard Biener + + PR tree-optimization/87665 + * tree-vect-data-refs.c (vect_preserves_scalar_order_p): Adjust + to reflect reality. + +2018-10-23 Richard Biener + + PR tree-optimization/87700 + * tree-ssa-copy.c (set_copy_of_val): Fix change detection logic. + +2018-10-19 Richard Biener + + PR middle-end/87645 + Backport from mainline + 2018-07-12 Richard Biener + + * tree-ssa-sccvn.c (mprts_hook_cnt): Remove. + (vn_lookup_simplify_result): Remove recursion limit applied + here. + (vn_nary_build_or_lookup_1): Adjust. + (try_to_simplify): Likewise. + * gimple-match-head.c (gimple_resimplify1): Instead apply one + here. + (gimple_resimplify2): Likewise. + (gimple_resimplify3): Likewise. + (gimple_resimplify4): Likewise. + +2018-10-19 Andreas Krebbel + + Backport from mainline + 2018-10-15 Andreas Krebbel + + * config/s390/s390.c (s390_expand_vec_init): Force vector element + into reg if it isn't a general operand. + +2018-10-18 Richard Biener + + PR middle-end/87087 + Revert + 2018-02-07 Richard Biener + + PR tree-optimization/84204 + * tree-chrec.c (chrec_fold_plus_1): Remove size limiting in + this place. + +2018-10-17 Eric Botcazou + + PR middle-end/87623 + * fold-const.c (fold_truth_andor_1): If the right side is not constant, + bail out if both sides do not have the same storage order. + +2018-10-17 Richard Biener + + Backport from mainline + 2018-10-08 Richard Sandiford + + PR middle-end/63155 + * gimple-ssa-backprop.c (backprop::intersect_uses): Use + FOR_EACH_IMM_USE_FAST instead of FOR_EACH_IMM_USE_STMT. + +2018-10-16 Richard Biener + + Backport from mainline + 2018-10-08 Richard Biener + + PR tree-optimization/63155 + * tree-ssa-propagate.c (add_ssa_edge): Do cheap check first. + (ssa_propagation_engine::ssa_propagate): Remove redundant + bitmap bit clearing. + + 2018-10-05 Richard Biener + + PR tree-optimization/63155 + * tree-ssa-ccp.c (ccp_propagate::visit_phi): Avoid excess + vertical space in dumpfiles. + * tree-ssa-propagate.h + (ssa_propagation_engine::process_ssa_edge_worklist): Remove. + * tree-ssa-propagate.c (cfg_blocks_back): New global. + (ssa_edge_worklist_back): Likewise. + (curr_order): Likewise. + (cfg_blocks_get): Remove abstraction. + (cfg_blocks_add): Likewise. + (cfg_blocks_empty_p): Likewise. + (add_ssa_edge): Add to current or next worklist based on + RPO index. + (add_control_edge): Likewise. + (ssa_propagation_engine::process_ssa_edge_worklist): Fold + into ... + (ssa_propagation_engine::ssa_propagate): ... here. Unify + iteration from CFG and SSA edge worklist so we process + everything in RPO order, prioritizing forward progress + over iteration. + (ssa_prop_init): Allocate new worklists, do not dump + immediate uses. + (ssa_prop_fini): Free new worklists. + + 2018-09-24 Richard Biener + + PR tree-optimization/63155 + * tree-ssa-propagate.c (add_ssa_edge): Avoid adding PHIs to + the worklist when the edge of the respective argument isn't + executable. + +2018-10-16 Wilco Dijkstra + + Backported from mainline + PR target/87511 + * config/aarch64/aarch64.c (aarch64_mask_and_shift_for_ubfiz_p): + Use HOST_WIDE_INT_1U for shift. + +2018-10-16 Richard Biener + + Backport from mainline + 2018-09-18 Richard Biener + + PR middle-end/63155 + * tree-ssa-coalesce.c (tree_int_map_hasher): Remove. + (compute_samebase_partition_bases): Likewise. + (coalesce_ssa_name): Always use compute_optimized_partition_bases. + (gimple_can_coalesce_p): Simplify. + +2018-10-16 Richard Biener + + Backport from mainline + 2018-10-15 Richard Biener + + PR middle-end/87610 + * tree-ssa-structalias.c (struct vls_data): Add escaped_p member. + (visit_loadstore): When a used restrict tag escaped verify that + the points-to solution of "other" pointers do not include + escaped. + (compute_dependence_clique): If a used restrict tag escaped + communicated that down to visit_loadstore. + + 2018-10-01 Richard Biener + + PR tree-optimization/87465 + * tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Fix typo + causing branch miscounts. + +2018-10-11 Jakub Jelinek + + Backported from mainline + 2018-10-10 Jakub Jelinek + + PR target/87550 + * config/i386/i386-builtin.def (IX86_BUILTIN_RDPMC): Move from args set + to special_args set. + + 2018-09-26 Jakub Jelinek + + PR target/87414 + * config/i386/i386.c: Include debug.h and dwarf2out.h. + (output_indirect_thunk): Emit DW_CFA_def_cfa_offset after the + call. + + 2018-09-12 Jakub Jelinek + Andreas Krebbel + + PR tree-optimization/86844 + * gimple-ssa-store-merging.c + (imm_store_chain_info::coalesce_immediate): For overlapping stores, if + there are any overlapping stores in between them, make sure they are + also coalesced or we give up completely. + +2018-10-09 Will Schmidt + + Backport from trunk. + 2018-09-06 Will Schmidt + + PR target/86731 + * config/rs6000/rs6000.c (rs6000_gimple_fold_builtin): Update logic + around folding of vec_sl to handle out of range shift values. + +2018-10-09 H.J. Lu + + Backport from mainline + 2018-09-29 H.J. Lu + + PR target/87370 + * config/i386/i386.c (construct_container): Use TImode for + BLKmode values in 2 integer registers. + +2018-10-08 H.J. Lu + + Backport from mainline + 2018-10-08 H.J. Lu + + PR target/87517 + * config/i386/avx512fintrin.h (_mm512_mask_fmaddsub_round_pd): + Defined with __builtin_ia32_vfmaddsubpd512_mask. + +2018-10-05 H.J. Lu + + Backport from mainline + 2018-10-05 H.J. Lu + + PR target/87522 + * config/i386/gnu-user.h (ASM_SPEC): Don't pass -msse2avx to + assembler for -mavx. + * config/i386/gnu-user64.h (ASM_SPEC): Likewise. + +2018-10-03 Uros Bizjak + + Backport from mainline + 2018-09-28 Uros Bizjak + + * config/i386/i386.h (SSE_REGNO): Fix check for FIRST_REX_SSE_REG. + (GET_SSE_REGNO): Rename from SSE_REGNO. Update all uses for rename. + +2018-10-03 Jonathan Wakely + + PR other/87353 + * doc/invoke.texi (Link Options): Fix formatting and grammar. + +2018-10-03 Martin Liska + + Backport from mainline + 2018-10-03 Martin Liska + + PR gcov-profile/86109 + * coverage.c (coverage_begin_function): Do not + mark lambdas as artificial. + * tree-core.h (struct GTY): Remove tm_clone_flag + and introduce new lambda_function. + * tree.h (DECL_LAMBDA_FUNCTION): New macro. + +2018-10-02 H.J. Lu + + Backport from mainline + 2018-09-24 H.J. Lu + + PR target/82699 + * config/i386/i386.c (rest_of_insert_endbranch): Set + endbr_queued_at_entrance to true and don't insert ENDBR if + x86_function_profiler will be called. + (x86_function_profiler): Insert ENDBR if endbr_queued_at_entrance + is true. + * config/i386/i386.h (machine_function): Add + endbr_queued_at_entrance. + +2018-10-01 Kyrylo Tkachov + + Backport from mainline + 2018-06-29 Kyrylo Tkachov + + * config/arm/arm.c (output_move_double): Don't allow STRD instructions + if starting source register is not even. + +2018-09-29 Jakub Jelinek + + PR target/87467 + * config/i386/avx512fintrin.h (_mm512_abs_pd, _mm512_mask_abs_pd): Use + __m512d type for __A argument rather than __m512. + +2018-09-27 Michael Meissner + + Backport from mainline + 2018-08-20 Michael Meissner + + PR target/87033 + * config/rs6000/rs6000.md (extendsi2): Change constraints + from 'Y' to 'YZ' to enable the LWAX instruction to be generated + for indexed loads. + +2018-09-25 Martin Liska + + Backport from mainline + 2018-09-24 Martin Liska + + PR sanitizer/85774 + * asan.c: Make asan_handled_variables extern. + * asan.h: Likewise. + * cfgexpand.c (expand_stack_vars): Make sure + a representative is unpoison if another + variable in the partition is handled by + use-after-scope sanitization. + +2018-09-24 Andrew Pinski + + * config/aarch64/aarch64.c (aarch_macro_fusion_pair_p): Don't + access prev before checking it for NULLness in the + AARCH64_FUSE_CMP_BRANCH case. + +2018-09-21 Eric Botcazou + + * config/rs6000/rs6000.c (rs6000_function_ok_for_sibcall): Return false + if the call takes a static chain. + +2018-09-19 John David Anglin + + * config/pa/pa.md (atomic_storeqi): Restore deleted expander. + (atomic_storehi): Likewise. + (atomic_storesi): Likewise. + (atomic_loaddi): Restore compare and swap exchange loop code. + +2018-09-18 Segher Boessenkool + + Backport from trunk + 2018-09-18 Segher Boessenkool + + PR rtl-optimization/86882 + * rtlanal.c (reg_overlap_mentioned_p): Handle CLOBBER. + +2018-09-18 Martin Liska + + Backport from mainline + 2018-09-17 Martin Liska + + PR gcov-profile/85871 + * gcov.c (output_intermediate_file): Fix out of bounds + access. + +2018-09-16 Hans-Peter Nilsson + + PR target/85666 + * config/mmix/mmix.c (mmix_assemble_integer): Handle byte-size + non-CONST_INT rtx:es using assemble_integer_with_op ".byte". + (MMIX_CFUN_NEEDS_SAVED_EH_RETURN_ADDRESS): Don't call + leaf_function_p, instead use has_hard_reg_initial_val. + +2018-09-14 John David Anglin + + PR middle-end/87188 + * dojump.c (do_compare_and_jump): Canonicalize function pointers + when one operand is a function pointer. Use POINTER_TYPE_P and + FUNC_OR_METHOD_TYPE_P. + * expr.c (do_store_flag): Use POINTER_TYPE_P and FUNC_OR_METHOD_TYPE_P. + * fold-const.c (build_range_check): Likewise. + * match.pd (simple_comparison): Likewise. + +2018-09-14 Segher Boessenkool + + Backport from trunk + 2018-09-14 Segher Boessenkool + + PR target/87224 + * config/rs6000/rs6000.md (*mov_hardfloat64): Add Z to the Y + alternatives. + +2018-09-14 Carl Love + + Backport from trunk + 2018-09-14 Carl Love + + * config/rs6000/emmintrin.h: Add _MM_SHUFFLE2. + * config/rs6000/xmmintrin.h: Add _MM_SHUFFLE. + +2018-09-12 Segher Boessenkool + + Backport from trunk + 2018-08-24 Segher Boessenkool + + PR target/86989 + * config/rs6000/rs6000.c (toc_relative_expr_p): Check that the base is + the TOC register. + +2018-09-12 Segher Boessenkool + + Backport from trunk + 2018-08-22 Segher Boessenkool + + PR rtl-optimization/86771 + * combine.c (try_combine): Do not allow splitting a resulting PARALLEL + of two SETs into those two SETs, one to be placed at i2, if that SETs + destination is modified between i2 and i3. + +2018-09-12 Andreas Krebbel + + Backport from mainline + 2018-09-12 Andreas Krebbel + + * config/s390/s390.md (PFPO_RND_MODE_DFP, PFPO_RND_MODE_BFP): New + constants. + ("trunc2") + ("trunc2") + ("extend2") + ("extend2"): Set proper rounding mode + according to the target operand type. + +2018-09-12 Jakub Jelinek + + PR middle-end/87248 + * fold-const.c (fold_ternary_loc) : Verify also that + BIT_AND_EXPR's second operand is a power of two. Formatting fix. + +2018-09-05 Nathan Sidwell + + PR c++/87137 + * stor-layout.c (place_field): Scan forwards to check last + bitfield when ms_bitfield_placement is in effect. + +2018-09-05 Richard Biener + + PR bootstrap/87225 + * tree-vect-stmts.c (vectorizable_simd_clone_call): Fix bogus + return. + +2018-09-05 Jakub Jelinek + + Backported from mainline + 2018-09-04 Jakub Jelinek + + PR target/87198 + * common/config/i386/i386-common.c (OPTION_MASK_ISA_XSAVEOPT_SET, + OPTION_MASK_ISA_XSAVES_SET, OPTION_MASK_ISA_XSAVEC_SET): Use + OPTION_MASK_ISA_XSAVE_SET instead of OPTION_MASK_ISA_XSAVE. + (OPTION_MASK_ISA_XSAVE_UNSET): Add OPTION_MASK_ISA_XSAVES_UNSET + and OPTION_MASK_ISA_XSAVEC_UNSET. + + 2018-08-31 Jakub Jelinek + + PR middle-end/87138 + * expmed.c (expand_mult_const): Use immed_wide_int_const instead of + gen_int_mode. Formatting fixes. + + 2018-08-11 Jakub Jelinek + + PR tree-optimization/86835 + * tree-ssa-math-opts.c (insert_reciprocals): Even when inserting + new_stmt after def_gsi, make sure to insert new_square_stmt after + that stmt, not 2 stmts before it. + +2018-09-04 Max Filippov + + Backport from mainline + 2018-09-04 Max Filippov + + * config/xtensa/xtensa.c (xtensa_expand_atomic): Reorder AND and + XOR operations in NAND case. + +2018-09-04 Jonathan Wakely + + * doc/invoke.texi (Option Summary): Add -Waligned-new. + +2018-09-03 Tom de Vries + + backport from trunk: + 2018-06-21 Tom de Vries + + PR tree-optimization/85859 + * tree-ssa-tail-merge.c (stmt_local_def): Copy gimple_is_call + test with comment from bb_no_side_effects_p. + +2018-09-01 Michael Matz + + Backport from mainline + PR tree-optimization/87074 + * gimple-loop-jam.c (unroll_jam_possible_p): Check loop exit + PHIs for outer-loop uses. + +2018-08-31 Richard Biener + + Backport from mainline + 2018-08-27 Richard Biener + + PR tree-optimization/86927 + * tree-vect-loop.c (vect_create_epilog_for_reduction): Properly + use const cond reduction code. + + 2018-08-23 Richard Biener + + PR middle-end/87024 + * tree-inline.c (copy_bb): Drop unused __builtin_va_arg_pack_len + calls. + + 2018-08-22 Richard Biener + + PR tree-optimization/86945 + * tree-cfg.c (generate_range_test): Use unsigned arithmetic. + + 2018-08-17 Richard Biener + + PR middle-end/86505 + * tree-inline.c (copy_bb): When inlining __builtin_va_arg_pack_len () + across a va-arg-pack using call adjust its return value accordingly. + + 2018-08-02 Richard Biener + + PR tree-optimization/86816 + * tree-ssa-tail-merge.c (tail_merge_valueize): New function + which checks for value availability before querying it. + (gvn_uses_equal): Use it. + (same_succ_hash): Likewise. + (gimple_equal_p): Likewise. + + 2018-07-17 Richard Biener + + PR lto/86456 + * dwarf2out.c (init_sections_and_labels): Always generate + a debug_line_str_section for early LTO debug. + (dwarf2out_finish): Reset debug_line_str_hash output early. + Bump counter for extra dwarf5 .debug_loc labels to not conflict + with fat LTO part. + (dwarf2out_early_finish): Output debug_line_str. + +2018-08-29 Luis Machado + + * config/aarch64/aarch64.c (qdf24xx_vector_cost): New static global. + (qdf24xx_tunings): Set vector cost structure to qdf24xx_vector_cost. + +2018-08-29 Luis Machado + + * config/aarch64/aarch64.c (qdf24xx_addrcost_table) + : Set to 3. + +2018-08-27 Martin Sebor + + PR tree-optimization/86914 + * tree-ssa-strlen.c (maybe_set_strlen_range): Avoid MEM_REF. + +2018-08-28 Jakub Jelinek + + PR middle-end/87099 + * calls.c (maybe_warn_nonstring_arg): Punt early if + warn_stringop_overflow is zero. Don't call get_range_strlen + on 3rd argument, keep iterating until lenrng[1] is INTEGER_CST. + Only use lenrng[1] if non-NULL and INTEGER_CST. Don't uselessly + increment lenrng[0]. + +2018-08-27 Jakub Jelinek + + PR rtl-optimization/87065 + * combine.c (simplify_if_then_else): Formatting fix. + (if_then_else_cond): Guard MULT optimization with SCALAR_INT_MODE_P + check. + (known_cond): Don't return const_true_rtx for vector modes. Use + CONST0_RTX instead of const0_rtx. Formatting fixes. + +2018-08-25 Jozef Lawrynowicz + + Backport from mainline + PR target/86662 + * gcc/tree.c (build_common_tree_nodes): Initialize integer_types array + with all enabled __intN types. + + * gcc/testsuite/gcc.target/msp430/pr86662.c: New test. + +2018-08-21 H.J. Lu + + Backport from mainline + 2018-08-20 H.J. Lu + + PR target/87014 + * config/i386/i386.md (eh_return): Always update EH return + address in word_mode. + +2018-08-17 John David Anglin + + Backport from mainline + 2018-08-11 John David Anglin + + * config/pa/pa.md (UNSPEC_MEMORY_BARRIER): New unspec enum. + Update comment for atomic instructions. + (atomic_storeqi, atomic_storehi, atomic_storesi, atomic_storesf, + atomic_loaddf, atomic_loaddf_1, atomic_storedf, atomic_storedf_1): + Remove. + (atomic_loaddi): Revise fence expansion to only emit fence prior to + load for __ATOMIC_SEQ_CST model. + (atomic_loaddi_1): Remove float register target. + (atomic_storedi): Handle CONST_INT values. + (atomic_storedi_1): Remove float register source. Add special case + for zero value. + (memory_barrier): New expander and insn. + +2018-08-16 Tamar Christina + + Backport from mainline + 2018-07-30 Segher Boessenkool + + PR target/86640 + * config/arm/arm.c (arm_block_set_aligned_vect): Use gen_int_mode + instead of GEN_INT. + +2018-08-16 Martin Liska + + Backport from mainline + 2018-08-02 Martin Liska + + PR gcov-profile/86817 + * gcov.c (process_all_functions): New function. + (main): Call it. + (process_file): Move functions processing to + process_all_functions. + +2018-08-14 Siddhesh Poyarekar + + Backport from mainline + 2018-08-03 Siddhesh Poyarekar + + * config/aarch64/falkor.md (falkor_am_1_vxvy_vxvy): Move + neon_dup_q to... + (falkor_am_1_gtov_gtov): ... a new insn reservation. + +2018-08-13 Liu Hao + + Backport from mainline + 2018-08-13 Liu Hao + + * pretty-print.c (eat_esc_sequence): Swap the foreground and + background colors if the COMMON_LVB_REVERSE_VIDEO flag is set, + and clear it thereafter, as it only works for DBCS. + +2018-08-13 Liu Hao + + Backport from mainline + 2018-08-13 Liu Hao + + * pretty-print.c (mingw_ansi_fputs): Do not call _close() on the + handle returned by _get_osf_handle(). + +2018-08-14 Richard Sandiford + + Backport from mainline + 2018-08-09 Richard Sandiford + + PR tree-optimization/86871 + * tree-vect-stmts.c (vect_transform_stmt): Use gimple_get_lhs + instead of gimple_assign_lhs. + +2018-08-07 H.J. Lu + + Backport from mainline + 2018-08-05 H.J. Lu + + PR target/86386 + * config/i386/i386.c (ix86_finalize_stack_frame_flags): Set + cfun->machine->max_used_stack_alignment if needed. + +2018-08-02 Jozef Lawrynowicz + + Backport from mainline + 2018-07-31 Jozef Lawrynowicz + + PR middle-end/86705 + * gcc/cfgexpand.c (set_parm_rtl): Use the alignment of Pmode when + MAX_SUPPORTED_STACK_ALIGNMENT would otherwise be exceeded by the + requested variable alignment. + (expand_one_ssa_partition): Likewise. + (expand_one_var): Likewise. + +2018-08-02 Andreas Schwab + + Backport from mainline + 2018-07-17 Andreas Schwab + + PR target/86820 + * config/m68k/m68k.md (umulsi3_highpart+1, const_umulsi3_highpart) + (smulsi3_highpart+1, const_smulsi3_highpart): Add CC_STATUS_INIT. + +2018-08-01 Richard Biener + + PR bootstrap/86724 + * graphite.h: Include isl/id.h and isl/space.h to allow build + with ISL 0.20. + +2018-08-01 Jan Willem Jagersma + + PR target/86651 + * dwarf2out.c (dwarf2out_early_finish): Do not generate assembly in LTO + mode for COFF targets. + * defaults.h (TARGET_COFF): Define. + * config/i386/djgpp.h (TARGET_ASM_LTO_START, TARGET_ASM_LTO_END, + TARGET_COFF): Define. + (i386_djgpp_asm_lto_start, i386_djgpp_asm_lto_end): Declare. + * config/i386/djgpp.c (saved_debug_info_level): New static variable. + (i386_djgpp_asm_lto_start, i386_djgpp_asm_lto_end): New functions. + +2018-07-29 Bernd Edlinger + + Backport from mainline + 2018-07-23 Bernd Edlinger + + PR c/86617 + * genmatch.c (dt_operand::gen_match_op): Avoid folding volatile values. + +2018-07-29 John David Anglin + + * config/pa/pa.c (pa_output_addr_vec): Align address table. + * config/pa/pa.h (JUMP_TABLES_IN_TEXT_SECTION): Revise comment. + * config/pa/pa32-linux.h (JUMP_TABLES_IN_TEXT_SECTION): Define. + +2018-07-26 Uros Bizjak + + Backport from mainline + 2018-07-16 Uros Bizjak + + PR target/86511 + * expmed.c (emit_store_flag): Do not emit setcc followed by a + conditional move when trapping comparison was split to a + non-trapping one (and vice versa). + +2018-07-26 Jakub Jelinek + + Backported from mainline + 2018-07-24 Jakub Jelinek + + PR middle-end/86627 + * expmed.c (expand_divmod): Punt if d == HOST_WIDE_INT_MIN + and size > HOST_BITS_PER_WIDE_INT. For size > HOST_BITS_PER_WIDE_INT + and abs_d == d, do the power of two handling if profitable. + + 2018-07-17 Jakub Jelinek + + PR middle-end/86542 + * omp-low.c (create_task_copyfn): Copy over also fields corresponding + to _looptemp_ clauses, other than the first two. + + PR middle-end/86539 + * gimplify.c (gimplify_omp_for): Ensure taskloop firstprivatized init + and cond temporaries don't have reference type if iterator has + pointer type. For init use &for_pre_body instead of pre_p if + for_pre_body is non-empty. + +2018-07-26 Jakub Jelinek + + PR middle-end/86660 + * omp-low.c (scan_sharing_clauses): Don't ignore map clauses for + declare target to variables if they have always,{to,from,tofrom} map + kinds. + + * BASE-VER: Set to 8.2.1. + 2018-07-26 Release Manager * GCC 8.2.0 released. @@ -647,8 +5666,8 @@ gcc/testsuite/ChangeLog: 2018-06-11 Jason Merrill - PR c++/80485 - inline function non-zero address. - * symtab.c (nonzero_address): Check DECL_COMDAT. + PR c++/80485 - inline function non-zero address. + * symtab.c (nonzero_address): Check DECL_COMDAT. 2018-06-11 Peter Bergner @@ -941,7 +5960,7 @@ gcc/testsuite/ChangeLog: Backport from mainline 2018-05-11 Martin Liska - PR sanitizer/85556 + PR sanitizer/85556 * doc/extend.texi: Document LLVM style format for no_sanitize attribute. @@ -1369,9 +6388,9 @@ gcc/testsuite/ChangeLog: 2018-04-20 Carl Love - PR target/83402 - * config/rs6000/rs6000-c.c (rs6000_gimple_fold_builtin): Add - size check for arg0. + PR target/83402 + * config/rs6000/rs6000-c.c (rs6000_gimple_fold_builtin): Add + size check for arg0. 2018-04-20 Nathan Sidwell Tom de Vries @@ -1733,7 +6752,7 @@ gcc/testsuite/ChangeLog: PR ipa/85329 * multiple_target.c (create_dispatcher_calls): Set apostrophes for target_clone error message. Make default implementation - clone to be a local declaration. + clone to be a local declaration. (separate_attrs): Add new argument and check for an empty string. (expand_target_clones): Handle it. @@ -1835,7 +6854,7 @@ gcc/testsuite/ChangeLog: * cfgloopanal.c (expected_loop_iterations_unbounded): Add by_profile_only parameter. * cfgloopmanip.c (scale_loop_profile): Further scale loop's profile - information if the loop was predicted to iterate too many times. + information if the loop was predicted to iterate too many times. * cfgloop.h (expected_loop_iterations_unbounded): Update prototype 2018-04-13 Jan Hubicka @@ -4949,7 +9968,7 @@ gcc/testsuite/ChangeLog: 2018-02-26 Ramana Radhakrishnan - PR target/84521 + PR target/84521 * common/config/aarch64/aarch64-common.c (aarch_option_optimization_table[]): Switch off fomit-frame-pointer @@ -5614,7 +10633,7 @@ gcc/testsuite/ChangeLog: 2018-02-13 Jeff Law - * config/rl/rl78.c (rl78_attribute_table): Fix terminator and + * config/rl/rl78.c (rl78_attribute_table): Fix terminator and entry for "vector". * config/rl78/rl78.c (rl78_handle_func_attribute): Mark diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP index 583b559ae9b..cb668771379 100644 --- a/gcc/DATESTAMP +++ b/gcc/DATESTAMP @@ -1 +1 @@ -20180726 +20191229 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 20bee0494b1..ad07f056137 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1114,6 +1114,7 @@ endif # Support for additional languages (other than C). # C can be supported this way too (leave for later). +LANG_CONFIGUREFRAGS = @all_lang_configurefrags@ LANG_MAKEFRAGS = @all_lang_makefrags@ # Used by gcc/jit/Make-lang.in @@ -1877,7 +1878,7 @@ cstamp-h: config.in config.status # Really, really stupid make features, such as SUN's KEEP_STATE, may force # a target to build even if it is up-to-date. So we must verify that # config.status does not exist before failing. -config.status: $(srcdir)/configure $(srcdir)/config.gcc +config.status: $(srcdir)/configure $(srcdir)/config.gcc $(LANG_CONFIGUREFRAGS) @if [ ! -f config.status ] ; then \ echo You must configure gcc. Look at http://gcc.gnu.org/install/ for details.; \ false; \ diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index fef296b2343..7e209f93ecb 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,204 @@ +2019-11-25 Eric Botcazou + + PR ada/92575 + * expect.c (__gnat_expect_poll [VMS, HPUX]): Fix typo. + +2019-10-12 Eric Botcazou + + PR ada/91995 + * sem_ch8.adb (Chain_Use_Clause): Remove second argument in calls + to Defining_Entity. + * sem_elab.adb (Find_Unit_Entity): Likewise. Deal with N_Subunit + here in lieu of in Defining_Entity. + * sem_spark.adb (Check_Callable_Body): Likewise. + (Check_Package_Body): Likewise. + * sem_util.ads (Defining_Entity): Remove 2nd and 3th parameters. + * sem_util.adb (Defining_Entity): Remove 2nd and 3th parameters, + and adjust accordingly. Deal with N_Compilation_Unit. + +2019-10-11 Eric Botcazou + + * gcc-interface/decl.c (annotate_value) : Really test the + sign of the value when deciding to build a NEGATE_EXPR. + : Remove redundant line. + : Do the negation here. + +2019-09-23 Eric Botcazou + + * gcc-interface/trans.c (Attribute_to_gnu): Test Can_Use_Internal_Rep + on the underlying type of the node. + (Call_to_gnu): Likewise with the type of the prefix. + +2019-09-01 Iain Sandoe + + Backport from mainline. + 2019-07-02 Iain Sandoe + + * libgnat/system-darwin-ppc.ads: Set Stack_Check_Probes True for + PPC Darwin. + +2019-08-05 Iain Sandoe + + Backport from mainline. + 2019-06-30 Iain Sandoe + + * gnatlink.adb (Link_Step): Push -shared-libgcc explicitly, when it + is the target default (unless overidden by the static flag). + When the user has put an instance of shared/static-libgcc do not push + a duplicate of this. + +2019-06-29 Eric Botcazou + + * gcc-interface/decl.c (gnat_to_gnu_entity): Beep up comment on SAVED, + and tweak comment on the assertion about the scopes of Itypes. Do not + skip the regular processing for Itypes that are E_Record_Subtype with + a Cloned_Subtype. Get the Cloned_Subtype for every E_Record_Subtype + if the type is dummy and hasn't got its own freeze node. + : Save again the DECL of the Cloned_Subtype, if any. + : Save again the DECL of the equivalent type. + (Gigi_Equivalent_Type) : New case. + +2019-06-29 Eric Botcazou + + * gcc-interface/trans.c (mark_visited_r): Set TYPE_SIZES_GIMPLIFIED on + the main variant of a type, if any. + +2019-06-29 Eric Botcazou + + * gcc-interface/decl.c (set_nonaliased_component_on_array_type): Add + missing guard for the presence of TYPE_CANONICAL. + (set_reverse_storage_order_on_array_type): Likewise. + +2019-06-17 Arnaud Charlet + + PR ada/80590 + * exp_ch9.adb (Expand_N_Delay_Relative_Statement): Swap the two + conditions to avoid a unnecessary exception propagation in the default + case. + +2019-05-28 Eric Botcazou + + * gcc-interface/trans.c (walk_nesting_tree): New static function. + (finalize_nrv): Use it to walk the entire nesting tree. + +2019-05-27 Eric Botcazou + + * gcc-interface/utils.c (maybe_pad_type): Issue the warning for the + specific case of component types preferably. + +2019-05-27 Eric Botcazou + + * gcc-interface/trans.c (Call_to_gnu): Use the unpadded type when + putting back an intermediate conversion the type of the actuals. + +2019-05-07 Rainer Orth + + * gcc-interface/Makefile.in (install-gcc-specs): Use foreach. + Honor DESTDIR. + +2019-02-23 Eric Botcazou + + PR ada/89349 + Backport from mainline + 2018-05-25 Arnaud Charlet + + * osint.ads (Unknown_Attributes): No longer pretend this is a constant. + (No_File_Info_Cache): Initialize separately. + * osint.adb (No_File_Info_Cache): Update initializer. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + +2019-02-08 Eric Botcazou + + * gcc-interface/utils.c (max_size) : Be prepared for an + operand with VOID_TYPE. + +2019-02-08 Eric Botcazou + + * gcc-interface/trans.c (Loop_Statement_to_gnu): Replace tests on + individual flag_unswitch_loops and flag_tree_loop_vectorize switches + with test on global optimize switch. + (Raise_Error_to_gnu): Likewise. + +2019-02-07 Eric Botcazou + + * libgnarl/s-linux__sparc.ads (ETIMEDOUT): Set to correct value. + +2019-01-27 Eric Botcazou + + * gcc-interface/decl.c (array_type_has_nonaliased_component): Return + the same value for every dimension of a multidimensional array type. + +2019-01-26 Eric Botcazou + + * gcc-interface/trans.c (gnat_to_gnu) : Use + DECL_SIZE_UNIT instead of TYPE_SIZE_UNIT for the size to be assigned + by a call to memset if the LHS is a DECL. + +2019-01-26 Eric Botcazou + + * gcc-interface/trans.c (struct loop_info_d): Remove artificial field. + (Loop_Statement_to_gnu): Do not set it. + +2019-01-26 Eric Botcazou + + * gcc-interface/decl.c (annotate_value) : Use test on + the sign bit instead of on the sign of the value. + : Turn addition of negative constant into subtraction. + : Add test for degenerate case. + : Simplify. + +2018-12-23 Iain Sandoe + + * adaint.c [__APPLE__] (__gnat_lwp_self): Ensure that the system + interface used is available on the target. + +2018-11-15 Eric Botcazou + + * gcc-interface/misc.c (gnat_init_gcc_eh): Do not override the switch + -fnon-call-exceptions passed on the command line in -gnatp mode. + +2018-11-13 Eric Botcazou + + * gcc-interface/misc.c (gnat_init_gcc_eh): Set -fnon-call-exceptions + for the runtime on platforms where System.Machine_Overflow is true. + +2018-11-08 Eric Botcazou + + * fe.h (Suppress_Checks): Declare. + * gcc-interface/misc.c (gnat_init_gcc_eh): Set -fnon-call-exceptions + only if checks are not suppressed and -faggressive-loop-optimizations + only if they are. + * gcc-interface/trans.c (struct loop_info_d): Remove has_checks and + warned_aggressive_loop_optimizations fields. + (gigi): Do not clear warn_aggressive_loop_optimizations here. + (Raise_Error_to_gnu): Do not set has_checks. + (gnat_to_gnu) : Remove support for aggressive + loop optimizations. + +2018-10-22 Eric Botcazou + + * gcc-interface/utils.c (unchecked_convert): Use local variables for + the biased and reverse SSO attributes of both types. + Further extend the processing of integral types in the presence of + reverse SSO to all scalar types. + +2018-10-22 Eric Botcazou + + * gcc-interface/trans.c (Pragma_to_gnu) : Use + a simple memory constraint in all cases. + +2018-09-13 Eric Botcazou + + Backport from mainline + 2018-07-31 Eric Botcazou + + * libgnarl/s-osinte__solaris.ads (upad64_t): New private type. + (mutex_t): Use it for 'lock' and 'data' components. + (cond_t): Likewise for 'data' and use single 'flags' component. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 3b0aea92c05..41434655865 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -3231,9 +3231,13 @@ __gnat_lwp_self (void) #endif #if defined (__APPLE__) -#include -#include -#include +# if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 +# include +# include +# include +# else +# include +# endif /* System-wide thread identifier. Note it could be truncated on 32 bit hosts. @@ -3241,6 +3245,7 @@ __gnat_lwp_self (void) void * __gnat_lwp_self (void) { +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 thread_identifier_info_data_t data; mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; kern_return_t kret; @@ -3251,6 +3256,9 @@ __gnat_lwp_self (void) return (void *)(uintptr_t)data.thread_id; else return 0; +#else + return (void *)pthread_mach_thread_np (pthread_self ()); +#endif } #endif diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb index a3234fbb94a..627a9d5e86a 100644 --- a/gcc/ada/exp_ch9.adb +++ b/gcc/ada/exp_ch9.adb @@ -8144,18 +8144,17 @@ package body Exp_Ch9 is Proc : Entity_Id; begin - -- Try to use System.Relative_Delays.Delay_For only if available. This - -- is the implementation used on restricted platforms when Ada.Calendar - -- is not available. + -- Try to use Ada.Calendar.Delays.Delay_For if available. - if RTE_Available (RO_RD_Delay_For) then - Proc := RTE (RO_RD_Delay_For); + if RTE_Available (RO_CA_Delay_For) then + Proc := RTE (RO_CA_Delay_For); - -- Otherwise, use Ada.Calendar.Delays.Delay_For and emit an error - -- message if not available. + -- Otherwise, use System.Relative_Delays.Delay_For and emit an error + -- message if not available. This is the implementation used on + -- restricted platforms when Ada.Calendar is not available. else - Proc := RTE (RO_CA_Delay_For); + Proc := RTE (RO_RD_Delay_For); end if; Rewrite (N, diff --git a/gcc/ada/expect.c b/gcc/ada/expect.c index aa34411b391..f196b7d36eb 100644 --- a/gcc/ada/expect.c +++ b/gcc/ada/expect.c @@ -265,7 +265,7 @@ __gnat_expect_poll (int *fd, if ((status & 1) != 1) { ready = -1; - dead_process = i + 1; + *dead_process = i + 1; return ready; } } @@ -450,7 +450,7 @@ __gnat_expect_poll (int *fd, if (ei.request == TIOCCLOSE) { ioctl (fd[i], TIOCREQSET, &ei); - dead_process = i + 1; + *dead_process = i + 1; return -1; } diff --git a/gcc/ada/fe.h b/gcc/ada/fe.h index 77faac9777a..9a0461c3268 100644 --- a/gcc/ada/fe.h +++ b/gcc/ada/fe.h @@ -181,6 +181,7 @@ extern Boolean In_Same_Source_Unit (Node_Id, Node_Id); #define GNAT_Mode opt__gnat_mode #define List_Representation_Info opt__list_representation_info #define No_Strict_Aliasing_CP opt__no_strict_aliasing +#define Suppress_Checks opt__suppress_checks typedef enum { Front_End_SJLJ, Back_End_ZCX, Back_End_SJLJ @@ -195,6 +196,7 @@ extern Boolean Generate_SCO_Instance_Table; extern Boolean GNAT_Mode; extern Int List_Representation_Info; extern Boolean No_Strict_Aliasing_CP; +extern Boolean Suppress_Checks; #define ZCX_Exceptions opt__zcx_exceptions #define SJLJ_Exceptions opt__sjlj_exceptions diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in index ebb955ebce5..0258f106d40 100644 --- a/gcc/ada/gcc-interface/Makefile.in +++ b/gcc/ada/gcc-interface/Makefile.in @@ -2285,9 +2285,8 @@ gnatlink-re: ../stamp-tools gnatmake-re install-gcc-specs: # Install all the requested GCC spec files. - for f in $(GCC_SPEC_FILES); do \ - $(INSTALL_DATA_DATE) $(srcdir)/ada/$$f $(libsubdir)/; \ - done + $(foreach f,$(GCC_SPEC_FILES), \ + $(INSTALL_DATA_DATE) $(srcdir)/ada/$(f) $(DESTDIR)$(libsubdir)/;) install-gnatlib: ../stamp-gnatlib-$(RTSDIR) install-gcc-specs $(RMDIR) $(DESTDIR)$(ADA_RTL_OBJ_DIR) diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 51d08a327dc..3e8552a2d5c 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -295,7 +295,10 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) tree gnu_size = NULL_TREE; /* Contains the GCC name to be used for the GCC node. */ tree gnu_entity_name; - /* True if we have already saved gnu_decl as a GNAT association. */ + /* True if we have already saved gnu_decl as a GNAT association. This can + also be used to purposely avoid making such an association but this use + case ought not to be applied to types because it can break the deferral + mechanism implemented for access types. */ bool saved = false; /* True if we incremented defer_incomplete_level. */ bool this_deferred = false; @@ -312,14 +315,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) /* Since a use of an Itype is a definition, process it as such if it is in the main unit, except for E_Access_Subtype because it's actually a use - of its base type, and for E_Record_Subtype with cloned subtype because - it's actually a use of the cloned subtype, see below. */ + of its base type, see below. */ if (!definition && is_type && Is_Itype (gnat_entity) - && !(kind == E_Access_Subtype - || (kind == E_Record_Subtype - && Present (Cloned_Subtype (gnat_entity)))) + && Ekind (gnat_entity) != E_Access_Subtype && !present_gnu_tree (gnat_entity) && In_Extended_Main_Code_Unit (gnat_entity)) { @@ -362,7 +362,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) } /* This abort means the Itype has an incorrect scope, i.e. that its - scope does not correspond to the subprogram it is declared in. */ + scope does not correspond to the subprogram it is first used in. */ gcc_unreachable (); } @@ -371,7 +371,9 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) In that case, we will abort below when we try to save a new GCC tree for this object. We also need to handle the case of getting a dummy type when a Full_View exists but be careful so as not to trigger its - premature elaboration. */ + premature elaboration. Likewise for a cloned subtype without its own + freeze node, which typically happens when a generic gets instantiated + on an incomplete or private type. */ if ((!definition || (is_type && imported_p)) && present_gnu_tree (gnat_entity)) { @@ -385,7 +387,23 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) || No (Freeze_Node (Full_View (gnat_entity))))) { gnu_decl - = gnat_to_gnu_entity (Full_View (gnat_entity), NULL_TREE, false); + = gnat_to_gnu_entity (Full_View (gnat_entity), NULL_TREE, + false); + save_gnu_tree (gnat_entity, NULL_TREE, false); + save_gnu_tree (gnat_entity, gnu_decl, false); + } + + if (TREE_CODE (gnu_decl) == TYPE_DECL + && TYPE_IS_DUMMY_P (TREE_TYPE (gnu_decl)) + && Ekind (gnat_entity) == E_Record_Subtype + && No (Freeze_Node (gnat_entity)) + && Present (Cloned_Subtype (gnat_entity)) + && (present_gnu_tree (Cloned_Subtype (gnat_entity)) + || No (Freeze_Node (Cloned_Subtype (gnat_entity))))) + { + gnu_decl + = gnat_to_gnu_entity (Cloned_Subtype (gnat_entity), NULL_TREE, + false); save_gnu_tree (gnat_entity, NULL_TREE, false); save_gnu_tree (gnat_entity, gnu_decl, false); } @@ -3367,13 +3385,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) case E_Record_Subtype: /* If Cloned_Subtype is Present it means this record subtype has identical layout to that type or subtype and we should use - that GCC type for this one. The front end guarantees that + that GCC type for this one. The front-end guarantees that the component list is shared. */ if (Present (Cloned_Subtype (gnat_entity))) { gnu_decl = gnat_to_gnu_entity (Cloned_Subtype (gnat_entity), NULL_TREE, false); - saved = true; + maybe_present = true; break; } @@ -3787,8 +3805,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) case E_Access_Subtype: /* We treat this as identical to its base type; any constraint is meaningful only to the front-end. */ - gnu_decl = gnat_to_gnu_entity (Etype (gnat_entity), NULL_TREE, false); - saved = true; + gnu_decl = gnat_to_gnu_entity (gnat_equiv_type, NULL_TREE, false); + maybe_present = true; /* The designated subtype must be elaborated as well, if it does not have its own freeze node. But designated subtypes created @@ -4974,6 +4992,10 @@ Gigi_Equivalent_Type (Entity_Id gnat_entity) gnat_equiv = Equivalent_Type (gnat_entity); break; + case E_Access_Subtype: + gnat_equiv = Etype (gnat_entity); + break; + case E_Class_Wide_Type: gnat_equiv = Root_Type (gnat_entity); break; @@ -6065,7 +6087,8 @@ static void set_nonaliased_component_on_array_type (tree type) { TYPE_NONALIASED_COMPONENT (type) = 1; - TYPE_NONALIASED_COMPONENT (TYPE_CANONICAL (type)) = 1; + if (TYPE_CANONICAL (type)) + TYPE_NONALIASED_COMPONENT (TYPE_CANONICAL (type)) = 1; } /* Set TYPE_REVERSE_STORAGE_ORDER on an array type built by means of @@ -6075,7 +6098,8 @@ static void set_reverse_storage_order_on_array_type (tree type) { TYPE_REVERSE_STORAGE_ORDER (type) = 1; - TYPE_REVERSE_STORAGE_ORDER (TYPE_CANONICAL (type)) = 1; + if (TYPE_CANONICAL (type)) + TYPE_REVERSE_STORAGE_ORDER (TYPE_CANONICAL (type)) = 1; } /* Return true if DISCR1 and DISCR2 represent the same discriminant. */ @@ -6099,12 +6123,6 @@ same_discriminant_p (Entity_Id discr1, Entity_Id discr2) static bool array_type_has_nonaliased_component (tree gnu_type, Entity_Id gnat_type) { - /* If the array type is not the innermost dimension of the GNAT type, - then it has a non-aliased component. */ - if (TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE - && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type))) - return true; - /* If the array type has an aliased component in the front-end sense, then it also has an aliased component in the back-end sense. */ if (Has_Aliased_Components (gnat_type)) @@ -6115,15 +6133,17 @@ array_type_has_nonaliased_component (tree gnu_type, Entity_Id gnat_type) if (Is_Derived_Type (gnat_type)) { tree gnu_parent_type = gnat_to_gnu_type (Etype (gnat_type)); - int index; if (TREE_CODE (gnu_parent_type) == UNCONSTRAINED_ARRAY_TYPE) gnu_parent_type = TREE_TYPE (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (gnu_parent_type)))); - for (index = Number_Dimensions (gnat_type) - 1; index > 0; index--) - gnu_parent_type = TREE_TYPE (gnu_parent_type); return TYPE_NONALIASED_COMPONENT (gnu_parent_type); } + /* For a multi-dimensional array type, find the component type. */ + while (TREE_CODE (TREE_TYPE (gnu_type)) == ARRAY_TYPE + && TYPE_MULTI_ARRAY_P (TREE_TYPE (gnu_type))) + gnu_type = TREE_TYPE (gnu_type); + /* Consider that an array of pointers has an aliased component, which is sort of logical and helps with Taft Amendment types in LTO mode. */ if (POINTER_TYPE_P (TREE_TYPE (gnu_type))) @@ -8160,8 +8180,20 @@ annotate_value (tree gnu_size) case EQ_EXPR: tcode = Eq_Expr; break; case NE_EXPR: tcode = Ne_Expr; break; - case MULT_EXPR: case PLUS_EXPR: + /* Turn addition of negative constant into subtraction. */ + if (TREE_CODE (TREE_OPERAND (gnu_size, 1)) == INTEGER_CST + && tree_int_cst_sign_bit (TREE_OPERAND (gnu_size, 1))) + { + tcode = Minus_Expr; + wide_int wop1 = -wi::to_wide (TREE_OPERAND (gnu_size, 1)); + ops[1] = annotate_value (wide_int_to_tree (sizetype, wop1)); + break; + } + + /* ... fall through ... */ + + case MULT_EXPR: tcode = (TREE_CODE (gnu_size) == MULT_EXPR ? Mult_Expr : Plus_Expr); /* Fold conversions from bytes to bits into inner operations. */ if (TREE_CODE (TREE_OPERAND (gnu_size, 1)) == INTEGER_CST @@ -8171,6 +8203,7 @@ annotate_value (tree gnu_size) if (TREE_CODE (inner_op) == TREE_CODE (gnu_size) && TREE_CODE (TREE_OPERAND (inner_op, 1)) == INTEGER_CST) { + ops[0] = annotate_value (TREE_OPERAND (inner_op, 0)); tree inner_op_op1 = TREE_OPERAND (inner_op, 1); tree gnu_size_op1 = TREE_OPERAND (gnu_size, 1); widest_int op1; @@ -8178,10 +8211,13 @@ annotate_value (tree gnu_size) op1 = (wi::to_widest (inner_op_op1) * wi::to_widest (gnu_size_op1)); else - op1 = (wi::to_widest (inner_op_op1) - + wi::to_widest (gnu_size_op1)); - ops[1] = UI_From_gnu (wide_int_to_tree (sizetype, op1)); - ops[0] = annotate_value (TREE_OPERAND (inner_op, 0)); + { + op1 = (wi::to_widest (inner_op_op1) + + wi::to_widest (gnu_size_op1)); + if (wi::zext (op1, TYPE_PRECISION (sizetype)) == 0) + return ops[0]; + } + ops[1] = annotate_value (wide_int_to_tree (sizetype, op1)); } } break; @@ -8189,18 +8225,12 @@ annotate_value (tree gnu_size) case BIT_AND_EXPR: tcode = Bit_And_Expr; /* For negative values in sizetype, build NEGATE_EXPR of the opposite. - Such values appear in expressions with aligning patterns. Note that, - since sizetype is unsigned, we have to jump through some hoops. */ + Such values can appear in expressions with aligning patterns. */ if (TREE_CODE (TREE_OPERAND (gnu_size, 1)) == INTEGER_CST) { - tree op1 = TREE_OPERAND (gnu_size, 1); - wide_int signed_op1 = wi::sext (wi::to_wide (op1), - TYPE_PRECISION (sizetype)); - if (wi::neg_p (signed_op1)) - { - op1 = wide_int_to_tree (sizetype, wi::neg (signed_op1)); - ops[1] = annotate_value (build1 (NEGATE_EXPR, sizetype, op1)); - } + wide_int wop1 = -wi::to_wide (TREE_OPERAND (gnu_size, 1)); + tree op1 = wide_int_to_tree (sizetype, wop1); + ops[1] = annotate_value (build1 (NEGATE_EXPR, sizetype, op1)); } break; diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index e4efa21d740..f826d9a993c 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -395,7 +395,7 @@ gnat_init_gcc_eh (void) using_eh_for_cleanups (); /* Turn on -fexceptions, -fnon-call-exceptions and -fdelete-dead-exceptions. - The first one triggers the generation of the necessary exception tables. + The first one activates the support for exceptions in the compiler. The second one is useful for two reasons: 1/ we map some asynchronous signals like SEGV to exceptions, so we need to ensure that the insns which can lead to such signals are correctly attached to the exception @@ -405,10 +405,26 @@ gnat_init_gcc_eh (void) for such calls to actually raise in Ada. The third one is an optimization that makes it possible to delete dead instructions that may throw exceptions, most notably loads and stores, - as permitted in Ada. */ + as permitted in Ada. + Turn off -faggressive-loop-optimizations because it may optimize away + out-of-bound array accesses that we want to be able to catch. + If checks are disabled, we use the same settings as the C++ compiler, + except for the runtime on platforms where S'Machine_Overflow is true + because the runtime depends on FP (hardware) checks being properly + handled despite being compiled in -gnatp mode. */ flag_exceptions = 1; - flag_non_call_exceptions = 1; flag_delete_dead_exceptions = 1; + if (Suppress_Checks) + { + if (!global_options_set.x_flag_non_call_exceptions) + flag_non_call_exceptions = Machine_Overflows_On_Target && GNAT_Mode; + } + else + { + flag_non_call_exceptions = 1; + flag_aggressive_loop_optimizations = 0; + warn_aggressive_loop_optimizations = 0; + } init_eh (); } diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 6054008bd1e..5925a4860da 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -199,9 +199,6 @@ struct GTY(()) loop_info_d { tree low_bound; tree high_bound; vec *checks; - bool artificial; - bool has_checks; - bool warned_aggressive_loop_optimizations; }; typedef struct loop_info_d *loop_info; @@ -668,10 +665,6 @@ gigi (Node_Id gnat_root, /* Now translate the compilation unit proper. */ Compilation_Unit_to_gnu (gnat_root); - /* Disable -Waggressive-loop-optimizations since we implement our own - version of the warning. */ - warn_aggressive_loop_optimizations = 0; - /* Then process the N_Validate_Unchecked_Conversion nodes. We do this at the very end to avoid having to second-guess the front-end when we run into dummy nodes during the regular processing. */ @@ -1276,32 +1269,18 @@ Pragma_to_gnu (Node_Id gnat_node) { Node_Id gnat_expr = Expression (gnat_temp); tree gnu_expr = gnat_to_gnu (gnat_expr); - int use_address; - machine_mode mode; - scalar_int_mode int_mode; tree asm_constraint = NULL_TREE; #ifdef ASM_COMMENT_START char *comment; #endif - - if (TREE_CODE (gnu_expr) == UNCONSTRAINED_ARRAY_REF) - gnu_expr = TREE_OPERAND (gnu_expr, 0); - - /* Use the value only if it fits into a normal register, - otherwise use the address. */ - mode = TYPE_MODE (TREE_TYPE (gnu_expr)); - use_address = (!is_a (mode, &int_mode) - || GET_MODE_SIZE (int_mode) > UNITS_PER_WORD); - - if (use_address) - gnu_expr = build_unary_op (ADDR_EXPR, NULL_TREE, gnu_expr); + gnu_expr = maybe_unconstrained_array (gnu_expr); + gnat_mark_addressable (gnu_expr); #ifdef ASM_COMMENT_START comment = concat (ASM_COMMENT_START, " inspection point: ", Get_Name_String (Chars (gnat_expr)), - use_address ? " address" : "", - " is in %0", + " is at %0", NULL); asm_constraint = build_string (strlen (comment), comment); free (comment); @@ -1311,8 +1290,8 @@ Pragma_to_gnu (Node_Id gnat_node) NULL_TREE, tree_cons (build_tree_list (NULL_TREE, - build_string (1, "g")), - gnu_expr, NULL_TREE), + build_string (1, "m")), + gnu_expr, NULL_TREE), NULL_TREE, NULL_TREE); ASM_VOLATILE_P (gnu_expr) = 1; set_expr_location_from_node (gnu_expr, gnat_node); @@ -1741,32 +1720,29 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) /* For other address attributes applied to a nested function, find an inner ADDR_EXPR and annotate it so that we can issue a useful warning with -Wtrampolines. */ - else if (TREE_CODE (TREE_TYPE (gnu_prefix)) == FUNCTION_TYPE) + else if (TREE_CODE (TREE_TYPE (gnu_prefix)) == FUNCTION_TYPE + && (gnu_expr = remove_conversions (gnu_result, false)) + && TREE_CODE (gnu_expr) == ADDR_EXPR + && decl_function_context (TREE_OPERAND (gnu_expr, 0))) { - gnu_expr = remove_conversions (gnu_result, false); + set_expr_location_from_node (gnu_expr, gnat_node); - if (TREE_CODE (gnu_expr) == ADDR_EXPR - && decl_function_context (TREE_OPERAND (gnu_expr, 0))) - { - set_expr_location_from_node (gnu_expr, gnat_node); - - /* Also check the inlining status. */ - check_inlining_for_nested_subprog (TREE_OPERAND (gnu_expr, 0)); - - /* Moreover, for 'Access or 'Unrestricted_Access with non- - foreign-compatible representation, mark the ADDR_EXPR so - that we can build a descriptor instead of a trampoline. */ - if ((attribute == Attr_Access - || attribute == Attr_Unrestricted_Access) - && targetm.calls.custom_function_descriptors > 0 - && Can_Use_Internal_Rep (Etype (gnat_node))) - FUNC_ADDR_BY_DESCRIPTOR (gnu_expr) = 1; - - /* Otherwise, we need to check that we are not violating the - No_Implicit_Dynamic_Code restriction. */ - else if (targetm.calls.custom_function_descriptors != 0) - Check_Implicit_Dynamic_Code_Allowed (gnat_node); - } + /* Also check the inlining status. */ + check_inlining_for_nested_subprog (TREE_OPERAND (gnu_expr, 0)); + + /* Moreover, for 'Access or 'Unrestricted_Access with non- + foreign-compatible representation, mark the ADDR_EXPR so + that we can build a descriptor instead of a trampoline. */ + if ((attribute == Attr_Access + || attribute == Attr_Unrestricted_Access) + && targetm.calls.custom_function_descriptors > 0 + && Can_Use_Internal_Rep (Underlying_Type (Etype (gnat_node)))) + FUNC_ADDR_BY_DESCRIPTOR (gnu_expr) = 1; + + /* Otherwise, we need to check that we are not violating the + No_Implicit_Dynamic_Code restriction. */ + else if (targetm.calls.custom_function_descriptors != 0) + Check_Implicit_Dynamic_Code_Allowed (gnat_node); } break; @@ -2875,7 +2851,6 @@ Loop_Statement_to_gnu (Node_Id gnat_node) /* Save the statement for later reuse. */ gnu_loop_info->stmt = gnu_loop_stmt; - gnu_loop_info->artificial = !Comes_From_Source (gnat_node); /* Set the condition under which the loop must keep going. For the case "LOOP .... END LOOP;" the condition is always true. */ @@ -3138,7 +3113,7 @@ Loop_Statement_to_gnu (Node_Id gnat_node) unswitching is enabled, do not require the loop bounds to be also invariant, as their evaluation will still be ahead of the loop. */ if (vec_safe_length (gnu_loop_info->checks) > 0 - && (make_invariant (&gnu_low, &gnu_high) || flag_unswitch_loops)) + && (make_invariant (&gnu_low, &gnu_high) || optimize >= 3)) { struct range_check_info_d *rci; unsigned int i, n_remaining_checks = 0; @@ -3191,22 +3166,21 @@ Loop_Statement_to_gnu (Node_Id gnat_node) /* Note that loop unswitching can only be applied a small number of times to a given loop (PARAM_MAX_UNSWITCH_LEVEL default to 3). */ if (IN_RANGE (n_remaining_checks, 1, 3) - && optimize > 1 + && optimize >= 2 && !optimize_size) FOR_EACH_VEC_ELT (*gnu_loop_info->checks, i, rci) if (rci->invariant_cond != boolean_false_node) { TREE_OPERAND (rci->inserted_cond, 0) = rci->invariant_cond; - if (flag_unswitch_loops) + if (optimize >= 3) add_stmt_with_node_force (rci->inserted_cond, gnat_node); } } /* Second, if loop vectorization is enabled and the iterations of the loop can easily be proved as independent, mark the loop. */ - if (optimize - && flag_tree_loop_vectorize + if (optimize >= 3 && independent_iterations_p (LOOP_STMT_BODY (gnu_loop_stmt))) LOOP_STMT_IVDEP (gnu_loop_stmt) = 1; @@ -3557,6 +3531,20 @@ finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data) return NULL_TREE; } +/* Apply FUNC to all the sub-trees of nested functions in NODE. FUNC is called + with the DATA and the address of each sub-tree. If FUNC returns a non-NULL + value, the traversal is stopped. */ + +static void +walk_nesting_tree (struct cgraph_node *node, walk_tree_fn func, void *data) +{ + for (node = node->nested; node; node = node->next_nested) + { + walk_tree_without_duplicates (&DECL_SAVED_TREE (node->decl), func, data); + walk_nesting_tree (node, func, data); + } +} + /* Finalize the Named Return Value optimization for FNDECL. The NRV bitmap contains the candidates for Named Return Value and OTHER is a list of the other return values. GNAT_RET is a representative return node. */ @@ -3564,7 +3552,6 @@ finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data) static void finalize_nrv (tree fndecl, bitmap nrv, vec *other, Node_Id gnat_ret) { - struct cgraph_node *node; struct nrv_data data; walk_tree_fn func; unsigned int i; @@ -3585,10 +3572,7 @@ finalize_nrv (tree fndecl, bitmap nrv, vec *other, Node_Id gnat_ret return; /* Prune also the candidates that are referenced by nested functions. */ - node = cgraph_node::get_create (fndecl); - for (node = node->nested; node; node = node->next_nested) - walk_tree_without_duplicates (&DECL_SAVED_TREE (node->decl), prune_nrv_r, - &data); + walk_nesting_tree (cgraph_node::get_create (fndecl), prune_nrv_r, &data); if (bitmap_empty_p (nrv)) return; @@ -4331,7 +4315,8 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, /* If the access type doesn't require foreign-compatible representation, be prepared for descriptors. */ if (targetm.calls.custom_function_descriptors > 0 - && Can_Use_Internal_Rep (Etype (Prefix (Name (gnat_node))))) + && Can_Use_Internal_Rep + (Underlying_Type (Etype (Prefix (Name (gnat_node)))))) by_descriptor = true; } else if (Nkind (Name (gnat_node)) == N_Attribute_Reference) @@ -4598,7 +4583,7 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target, 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. */ - tree gnu_actual_type = gnat_to_gnu_type (Etype (gnat_actual)); + 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)); else if (suppress_type_conversion @@ -5726,9 +5711,8 @@ Raise_Error_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) rci->inserted_cond = build1 (SAVE_EXPR, boolean_type_node, boolean_true_node); vec_safe_push (loop->checks, rci); - loop->has_checks = true; gnu_cond = build_noreturn_cond (gnat_to_gnu (gnat_cond)); - if (flag_unswitch_loops) + if (optimize >= 3) gnu_cond = build_binary_op (TRUTH_ANDIF_EXPR, boolean_type_node, rci->inserted_cond, @@ -5739,14 +5723,6 @@ Raise_Error_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) gnu_cond, rci->inserted_cond); } - - /* Or else, if aggressive loop optimizations are enabled, we just - record that there are checks applied to iteration variables. */ - else if (optimize - && flag_aggressive_loop_optimizations - && inside_loop_p () - && (loop = find_loop_for (gnu_index))) - loop->has_checks = true; } break; @@ -6364,45 +6340,9 @@ gnat_to_gnu (Node_Id gnat_node) gcc_assert (TREE_CODE (gnu_type) == ARRAY_TYPE); gnat_temp = gnat_expr_array[i]; gnu_expr = maybe_character_value (gnat_to_gnu (gnat_temp)); - struct loop_info_d *loop; gnu_result = build_binary_op (ARRAY_REF, NULL_TREE, gnu_result, gnu_expr); - - /* Array accesses are bound-checked so they cannot trap, but this - is valid only if they are not hoisted ahead of the check. We - need to mark them as no-trap to get decent loop optimizations - in the presence of -fnon-call-exceptions, so we do it when we - know that the original expression had no side-effects. */ - if (TREE_CODE (gnu_result) == ARRAY_REF - && !(Nkind (gnat_temp) == N_Identifier - && Ekind (Entity (gnat_temp)) == E_Constant)) - TREE_THIS_NOTRAP (gnu_result) = 1; - - /* If aggressive loop optimizations are enabled, we warn for loops - overrunning a simple array of size 1 not at the end of a record. - This is aimed to catch misuses of the trailing array idiom. */ - if (optimize - && flag_aggressive_loop_optimizations - && inside_loop_p () - && TREE_CODE (TREE_TYPE (gnu_type)) != ARRAY_TYPE - && TREE_CODE (gnu_array_object) != ARRAY_REF - && tree_int_cst_equal (TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_type)), - TYPE_MAX_VALUE (TYPE_DOMAIN (gnu_type))) - && !array_at_struct_end_p (gnu_result) - && (loop = find_loop_for (gnu_expr)) - && !loop->artificial - && !loop->has_checks - && tree_int_cst_equal (TYPE_MIN_VALUE (TYPE_DOMAIN (gnu_type)), - loop->low_bound) - && can_be_lower_p (loop->low_bound, loop->high_bound) - && !loop->warned_aggressive_loop_optimizations - && warning (OPT_Waggressive_loop_optimizations, - "out-of-bounds access may be optimized away")) - { - inform (EXPR_LOCATION (loop->stmt), "containing loop"); - loop->warned_aggressive_loop_optimizations = true; - } } gnu_result_type = get_unpadded_type (Etype (gnat_node)); @@ -7051,12 +6991,17 @@ gnat_to_gnu (Node_Id gnat_node) = real_zerop (gnu_rhs) ? integer_zero_node : fold_convert (integer_type_node, gnu_rhs); - tree to = gnu_lhs; - tree type = TREE_TYPE (to); - tree size - = SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (type), to); - tree to_ptr = build_fold_addr_expr (to); + tree dest = build_fold_addr_expr (gnu_lhs); tree t = builtin_decl_explicit (BUILT_IN_MEMSET); + /* Be extra careful not to write too much data. */ + tree size; + if (TREE_CODE (gnu_lhs) == COMPONENT_REF) + size = DECL_SIZE_UNIT (TREE_OPERAND (gnu_lhs, 1)); + else if (DECL_P (gnu_lhs)) + size = DECL_SIZE_UNIT (gnu_lhs); + else + size = TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs)); + size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, gnu_lhs); if (TREE_CODE (value) == INTEGER_CST && !integer_zerop (value)) { tree mask @@ -7064,7 +7009,7 @@ gnat_to_gnu (Node_Id gnat_node) ((HOST_WIDE_INT) 1 << BITS_PER_UNIT) - 1); value = int_const_binop (BIT_AND_EXPR, value, mask); } - gnu_result = build_call_expr (t, 3, to_ptr, value, size); + gnu_result = build_call_expr (t, 3, dest, value, size); } /* Otherwise build a regular assignment. */ @@ -8230,8 +8175,9 @@ mark_visited_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) else if (!TYPE_IS_DUMMY_P (t)) TREE_VISITED (t) = 1; + /* The test in gimplify_type_sizes is on the main variant. */ if (TYPE_P (t)) - TYPE_SIZES_GIMPLIFIED (t) = 1; + TYPE_SIZES_GIMPLIFIED (TYPE_MAIN_VARIANT (t)) = 1; return NULL_TREE; } diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 486f27b63f8..da751b18340 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -1519,14 +1519,14 @@ maybe_pad_type (tree type, tree size, unsigned int align, generated for some other corresponding source entity. */ if (Comes_From_Source (gnat_entity)) { - if (Present (gnat_error_node)) - post_error_ne_tree ("{^ }bits of & unused?", - gnat_error_node, gnat_entity, - size_diffop (size, orig_size)); - else if (is_component_type) + if (is_component_type) post_error_ne_tree ("component of& padded{ by ^ bits}?", gnat_entity, gnat_entity, size_diffop (size, orig_size)); + else if (Present (gnat_error_node)) + post_error_ne_tree ("{^ }bits of & unused?", + gnat_error_node, gnat_entity, + size_diffop (size, orig_size)); } } @@ -3616,7 +3616,10 @@ fntype_same_flags_p (const_tree t, tree cico_list, bool return_unconstrained_p, /* EXP is an expression for the size of an object. If this size contains discriminant references, replace them with the maximum (if MAX_P) or - minimum (if !MAX_P) possible value of the discriminant. */ + minimum (if !MAX_P) possible value of the discriminant. + + Note that the expression may have already been gimplified,in which case + COND_EXPRs have VOID_TYPE and no operands, and this must be handled. */ tree max_size (tree exp, bool max_p) @@ -3672,11 +3675,15 @@ max_size (tree exp, bool max_p) return build_int_cst (type, max_p ? 1 : 0); case tcc_unary: + op0 = TREE_OPERAND (exp, 0); + if (code == NON_LVALUE_EXPR) - return max_size (TREE_OPERAND (exp, 0), max_p); + return max_size (op0, max_p); + + if (VOID_TYPE_P (TREE_TYPE (op0))) + return max_p ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type); - op0 = max_size (TREE_OPERAND (exp, 0), - code == NEGATE_EXPR ? !max_p : max_p); + op0 = max_size (op0, code == NEGATE_EXPR ? !max_p : max_p); if (op0 == TREE_OPERAND (exp, 0)) return exp; @@ -5106,8 +5113,16 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) tree etype = TREE_TYPE (expr); enum tree_code ecode = TREE_CODE (etype); enum tree_code code = TREE_CODE (type); + const bool ebiased + = (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype)); + const bool biased + = (code == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (type)); + const bool ereverse + = (AGGREGATE_TYPE_P (etype) && TYPE_REVERSE_STORAGE_ORDER (etype)); + const bool reverse + = (AGGREGATE_TYPE_P (type) && TYPE_REVERSE_STORAGE_ORDER (type)); tree tem; - int c; + int c = 0; /* If the expression is already of the right type, we are done. */ if (etype == type) @@ -5123,7 +5138,7 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) || (ecode == RECORD_TYPE && TYPE_JUSTIFIED_MODULAR_P (etype)))) || code == UNCONSTRAINED_ARRAY_TYPE) { - if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype)) + if (ebiased) { tree ntype = copy_type (etype); TYPE_BIASED_REPRESENTATION_P (ntype) = 0; @@ -5131,7 +5146,7 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) expr = build1 (NOP_EXPR, ntype, expr); } - if (code == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (type)) + if (biased) { tree rtype = copy_type (type); TYPE_BIASED_REPRESENTATION_P (rtype) = 0; @@ -5160,30 +5175,35 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) Finally, for the sake of consistency, we do the unchecked conversion to an integral type with reverse storage order as soon as the source type is an aggregate type with reverse storage order, even if there - are no considerations of precision or size involved. */ - else if (INTEGRAL_TYPE_P (type) - && TYPE_RM_SIZE (type) - && (tree_int_cst_compare (TYPE_RM_SIZE (type), - TYPE_SIZE (type)) < 0 - || (AGGREGATE_TYPE_P (etype) - && TYPE_REVERSE_STORAGE_ORDER (etype)))) + are no considerations of precision or size involved. Ultimately, we + further extend this processing to any scalar type. */ + else if ((INTEGRAL_TYPE_P (type) + && TYPE_RM_SIZE (type) + && ((c = tree_int_cst_compare (TYPE_RM_SIZE (type), + TYPE_SIZE (type))) < 0 + || ereverse)) + || (SCALAR_FLOAT_TYPE_P (type) && ereverse)) { tree rec_type = make_node (RECORD_TYPE); - unsigned HOST_WIDE_INT prec = TREE_INT_CST_LOW (TYPE_RM_SIZE (type)); tree field_type, field; - if (AGGREGATE_TYPE_P (etype)) - TYPE_REVERSE_STORAGE_ORDER (rec_type) - = TYPE_REVERSE_STORAGE_ORDER (etype); + TYPE_REVERSE_STORAGE_ORDER (rec_type) = ereverse; - if (type_unsigned_for_rm (type)) - field_type = make_unsigned_type (prec); + if (c < 0) + { + const unsigned HOST_WIDE_INT prec + = TREE_INT_CST_LOW (TYPE_RM_SIZE (type)); + if (type_unsigned_for_rm (type)) + field_type = make_unsigned_type (prec); + else + field_type = make_signed_type (prec); + SET_TYPE_RM_SIZE (field_type, TYPE_RM_SIZE (type)); + } else - field_type = make_signed_type (prec); - SET_TYPE_RM_SIZE (field_type, TYPE_RM_SIZE (type)); + field_type = type; field = create_field_decl (get_identifier ("OBJ"), field_type, rec_type, - NULL_TREE, bitsize_zero_node, 1, 0); + NULL_TREE, bitsize_zero_node, c < 0, 0); finish_record_type (rec_type, field, 1, false); @@ -5198,31 +5218,35 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) The same considerations as above apply if the target type is an aggregate type with reverse storage order and we also proceed similarly. */ - else if (INTEGRAL_TYPE_P (etype) - && TYPE_RM_SIZE (etype) - && (tree_int_cst_compare (TYPE_RM_SIZE (etype), - TYPE_SIZE (etype)) < 0 - || (AGGREGATE_TYPE_P (type) - && TYPE_REVERSE_STORAGE_ORDER (type)))) + else if ((INTEGRAL_TYPE_P (etype) + && TYPE_RM_SIZE (etype) + && ((c = tree_int_cst_compare (TYPE_RM_SIZE (etype), + TYPE_SIZE (etype))) < 0 + || reverse)) + || (SCALAR_FLOAT_TYPE_P (etype) && reverse)) { tree rec_type = make_node (RECORD_TYPE); - unsigned HOST_WIDE_INT prec = TREE_INT_CST_LOW (TYPE_RM_SIZE (etype)); vec *v; vec_alloc (v, 1); tree field_type, field; - if (AGGREGATE_TYPE_P (type)) - TYPE_REVERSE_STORAGE_ORDER (rec_type) - = TYPE_REVERSE_STORAGE_ORDER (type); + TYPE_REVERSE_STORAGE_ORDER (rec_type) = reverse; - if (type_unsigned_for_rm (etype)) - field_type = make_unsigned_type (prec); + if (c < 0) + { + const unsigned HOST_WIDE_INT prec + = TREE_INT_CST_LOW (TYPE_RM_SIZE (etype)); + if (type_unsigned_for_rm (etype)) + field_type = make_unsigned_type (prec); + else + field_type = make_signed_type (prec); + SET_TYPE_RM_SIZE (field_type, TYPE_RM_SIZE (etype)); + } else - field_type = make_signed_type (prec); - SET_TYPE_RM_SIZE (field_type, TYPE_RM_SIZE (etype)); + field_type = etype; field = create_field_decl (get_identifier ("OBJ"), field_type, rec_type, - NULL_TREE, bitsize_zero_node, 1, 0); + NULL_TREE, bitsize_zero_node, c < 0, 0); finish_record_type (rec_type, field, 1, false); @@ -5321,8 +5345,8 @@ unchecked_convert (tree type, tree expr, bool notrunc_p) if the input is also an integral type and both are unsigned or both are signed and have the same precision. */ if (!notrunc_p + && !biased && INTEGRAL_TYPE_P (type) - && !(code == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (type)) && TYPE_RM_SIZE (type) && tree_int_cst_compare (TYPE_RM_SIZE (type), TYPE_SIZE (type)) < 0 && !(INTEGRAL_TYPE_P (etype) diff --git a/gcc/ada/gnatlink.adb b/gcc/ada/gnatlink.adb index 855d6d38a5b..45104a2ac4d 100644 --- a/gcc/ada/gnatlink.adb +++ b/gcc/ada/gnatlink.adb @@ -1882,6 +1882,7 @@ begin Clean_Link_Option_Set : declare J : Natural; Shared_Libgcc_Seen : Boolean := False; + Static_Libgcc_Seen : Boolean := False; begin J := Linker_Options.First; @@ -1903,7 +1904,7 @@ begin end if; end if; - -- Remove duplicate -shared-libgcc switch + -- Remove duplicate -shared-libgcc switches if Linker_Options.Table (J).all = Shared_Libgcc_String then if Shared_Libgcc_Seen then @@ -1917,6 +1918,20 @@ begin end if; end if; + -- Remove duplicate -static-libgcc switches + + if Linker_Options.Table (J).all = Static_Libgcc_String then + if Static_Libgcc_Seen then + Linker_Options.Table (J .. Linker_Options.Last - 1) := + Linker_Options.Table (J + 1 .. Linker_Options.Last); + Linker_Options.Decrement_Last; + Num_Args := Num_Args - 1; + + else + Static_Libgcc_Seen := True; + end if; + end if; + -- Here we just check for a canonical form that matches the -- pragma Linker_Options set in the NT runtime. @@ -1948,14 +1963,27 @@ begin -- libgcc, if gcc is not called with -shared-libgcc, call it -- with -static-libgcc, as there are some platforms where one -- of these two switches is compulsory to link. + -- Don't push extra switches if we already saw one. if Shared_Libgcc_Default = 'T' and then not Shared_Libgcc_Seen + and then not Static_Libgcc_Seen then Linker_Options.Increment_Last; Linker_Options.Table (Linker_Options.Last) := Static_Libgcc; Num_Args := Num_Args + 1; end if; + + -- Likewise, the reverse. + + if Shared_Libgcc_Default = 'H' + and then not Static_Libgcc_Seen + and then not Shared_Libgcc_Seen + then + Linker_Options.Increment_Last; + Linker_Options.Table (Linker_Options.Last) := Shared_Libgcc; + Num_Args := Num_Args + 1; + end if; end if; end Clean_Link_Option_Set; diff --git a/gcc/ada/libgnarl/s-linux__sparc.ads b/gcc/ada/libgnarl/s-linux__sparc.ads index 79a88d832bc..d1c08afaed5 100644 --- a/gcc/ada/libgnarl/s-linux__sparc.ads +++ b/gcc/ada/libgnarl/s-linux__sparc.ads @@ -70,7 +70,7 @@ package System.Linux is EINVAL : constant := 22; ENOMEM : constant := 12; EPERM : constant := 1; - ETIMEDOUT : constant := 110; + ETIMEDOUT : constant := 60; ------------- -- Signals -- diff --git a/gcc/ada/libgnarl/s-osinte__solaris.ads b/gcc/ada/libgnarl/s-osinte__solaris.ads index 57d1d5c3ece..8d53d634d35 100644 --- a/gcc/ada/libgnarl/s-osinte__solaris.ads +++ b/gcc/ada/libgnarl/s-osinte__solaris.ads @@ -536,17 +536,18 @@ private end record; pragma Convention (C, record_type_3); + type upad64_t is new Interfaces.Unsigned_64; + type mutex_t is record flags : record_type_3; - lock : String (1 .. 8); - data : String (1 .. 8); + lock : upad64_t; + data : upad64_t; end record; pragma Convention (C, mutex_t); type cond_t is record - flag : array_type_9; - Xtype : unsigned_long; - data : String (1 .. 8); + flags : record_type_3; + data : upad64_t; end record; pragma Convention (C, cond_t); diff --git a/gcc/ada/libgnat/system-darwin-ppc.ads b/gcc/ada/libgnat/system-darwin-ppc.ads index 9648767f742..8b7fc5687d8 100644 --- a/gcc/ada/libgnat/system-darwin-ppc.ads +++ b/gcc/ada/libgnat/system-darwin-ppc.ads @@ -158,7 +158,7 @@ private Preallocated_Stacks : constant Boolean := False; Signed_Zeros : constant Boolean := True; Stack_Check_Default : constant Boolean := False; - Stack_Check_Probes : constant Boolean := False; + Stack_Check_Probes : constant Boolean := True; Stack_Check_Limits : constant Boolean := False; Support_Aggregates : constant Boolean := True; Support_Atomic_Primitives : constant Boolean := Word_Size = 64; diff --git a/gcc/ada/osint.adb b/gcc/ada/osint.adb index 0c23761b6dc..896fbc7ee37 100644 --- a/gcc/ada/osint.adb +++ b/gcc/ada/osint.adb @@ -250,8 +250,7 @@ package body Osint is Attr : aliased File_Attributes; end record; - No_File_Info_Cache : constant File_Info_Cache := - (No_File, Unknown_Attributes); + No_File_Info_Cache : constant File_Info_Cache := (No_File, (others => 0)); package File_Name_Hash_Table is new GNAT.HTable.Simple_HTable ( Header_Num => File_Hash_Num, diff --git a/gcc/ada/osint.ads b/gcc/ada/osint.ads index 65a87fe4ce3..6c75b521456 100644 --- a/gcc/ada/osint.ads +++ b/gcc/ada/osint.ads @@ -255,10 +255,26 @@ package Osint is -- from the disk and then cached in the File_Attributes parameter (possibly -- along with other values). - type File_Attributes is private; - Unknown_Attributes : constant File_Attributes; + File_Attributes_Size : constant Natural := 32; + -- This should be big enough to fit a "struct file_attributes" on any + -- system. It doesn't cause any malfunction if it is too big (which avoids + -- the need for either mapping the struct exactly or importing the sizeof + -- from C, which would result in dynamic code). However, it does waste + -- space (e.g. when a component of this type appears in a record, if it is + -- unnecessarily large). Note: for runtime units, use System.OS_Constants. + -- SIZEOF_struct_file_attributes instead, which has the exact value. + + type File_Attributes is + array (1 .. File_Attributes_Size) + of System.Storage_Elements.Storage_Element; + for File_Attributes'Alignment use Standard'Maximum_Alignment; + + Unknown_Attributes : File_Attributes; -- A cache for various attributes for a file (length, accessibility,...) - -- This must be initialized to Unknown_Attributes prior to the first call. + -- Will be initialized properly at elaboration (for efficiency later on, + -- avoid function calls every time we want to reset the attributes) prior + -- to the first usage. We cannot make it constant since the compiler may + -- put it in a read-only section. function Is_Directory (Name : C_File_Name; @@ -754,22 +770,4 @@ private -- detected, the file being written is deleted, and a fatal error is -- signalled. - File_Attributes_Size : constant Natural := 32; - -- This should be big enough to fit a "struct file_attributes" on any - -- system. It doesn't cause any malfunction if it is too big (which avoids - -- the need for either mapping the struct exactly or importing the sizeof - -- from C, which would result in dynamic code). However, it does waste - -- space (e.g. when a component of this type appears in a record, if it is - -- unnecessarily large). Note: for runtime units, use System.OS_Constants. - -- SIZEOF_struct_file_attributes instead, which has the exact value. - - type File_Attributes is - array (1 .. File_Attributes_Size) - of System.Storage_Elements.Storage_Element; - for File_Attributes'Alignment use Standard'Maximum_Alignment; - - Unknown_Attributes : constant File_Attributes := (others => 0); - -- Will be initialized properly at elaboration (for efficiency later on, - -- avoid function calls every time we want to reset the attributes). - end Osint; diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index 49b11835afc..753c3f0deaf 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -4259,16 +4259,14 @@ package body Sem_Ch8 is -- Common case for compilation unit - elsif Defining_Entity (N => Parent (N), - Empty_On_Errors => True) = Current_Scope - then + elsif Defining_Entity (Parent (N)) = Current_Scope then null; else -- If declaration appears in some other scope, it must be in some -- parent unit when compiling a child. - Pack := Defining_Entity (Parent (N), Empty_On_Errors => True); + Pack := Defining_Entity (Parent (N)); if not In_Open_Scopes (Pack) then null; diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb index cc5d0456cdc..d2a21e00b6b 100644 --- a/gcc/ada/sem_elab.adb +++ b/gcc/ada/sem_elab.adb @@ -5544,13 +5544,23 @@ package body Sem_Elab is N_Procedure_Instantiation) and then Nkind (Context) = N_Compilation_Unit then - return - Related_Instance (Defining_Entity (N, Concurrent_Subunit => True)); + return Related_Instance (Defining_Entity (N)); + + -- The unit denotes a concurrent body acting as a subunit. Such bodies + -- are generally rewritten into null statements. The proper entity is + -- that of the "original node". + + elsif Nkind (N) = N_Subunit + and then Nkind (Proper_Body (N)) = N_Null_Statement + and then Nkind_In (Original_Node (Proper_Body (N)), N_Protected_Body, + N_Task_Body) + then + return Defining_Entity (Original_Node (Proper_Body (N))); -- Otherwise the proper entity is the defining entity else - return Defining_Entity (N, Concurrent_Subunit => True); + return Defining_Entity (N); end if; end Find_Unit_Entity; diff --git a/gcc/ada/sem_spark.adb b/gcc/ada/sem_spark.adb index e8aede44af9..4b7ea0f232c 100644 --- a/gcc/ada/sem_spark.adb +++ b/gcc/ada/sem_spark.adb @@ -971,7 +971,7 @@ package body Sem_SPARK is if Present (SPARK_Pragma (Defining_Entity (Body_N))) then if Get_SPARK_Mode_From_Annotation - (SPARK_Pragma (Defining_Entity (Body_N, False))) /= Opt.On + (SPARK_Pragma (Defining_Entity (Body_N))) /= Opt.On then return; end if; @@ -2379,7 +2379,7 @@ package body Sem_SPARK is CorSp : Node_Id; begin - if Present (SPARK_Pragma (Defining_Entity (Pack, False))) then + if Present (SPARK_Pragma (Defining_Entity (Pack))) then if Get_SPARK_Mode_From_Annotation (SPARK_Pragma (Defining_Entity (Pack))) /= Opt.On then diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 5fa02ddde1c..1f1523d1dad 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -5714,11 +5714,7 @@ package body Sem_Util is -- Defining_Entity -- --------------------- - function Defining_Entity - (N : Node_Id; - Empty_On_Errors : Boolean := False; - Concurrent_Subunit : Boolean := False) return Entity_Id - is + function Defining_Entity (N : Node_Id) return Entity_Id is begin case Nkind (N) is when N_Abstract_Subprogram_Declaration @@ -5769,24 +5765,11 @@ package body Sem_Util is => return Defining_Identifier (N); - when N_Subunit => - declare - Bod : constant Node_Id := Proper_Body (N); - Orig_Bod : constant Node_Id := Original_Node (Bod); - - begin - -- Retrieve the entity of the original protected or task body - -- if requested by the caller. + when N_Compilation_Unit => + return Defining_Entity (Unit (N)); - if Concurrent_Subunit - and then Nkind (Bod) = N_Null_Statement - and then Nkind_In (Orig_Bod, N_Protected_Body, N_Task_Body) - then - return Defining_Entity (Orig_Bod); - else - return Defining_Entity (Bod); - end if; - end; + when N_Subunit => + return Defining_Entity (Proper_Body (N)); when N_Function_Instantiation | N_Function_Specification @@ -5812,14 +5795,10 @@ package body Sem_Util is -- can continue semantic analysis. elsif Nam = Error then - if Empty_On_Errors then - return Empty; - else - Err := Make_Temporary (Sloc (N), 'T'); - Set_Defining_Unit_Name (N, Err); + Err := Make_Temporary (Sloc (N), 'T'); + Set_Defining_Unit_Name (N, Err); - return Err; - end if; + return Err; -- If not an entity, get defining identifier @@ -5834,11 +5813,7 @@ package body Sem_Util is return Entity (Identifier (N)); when others => - if Empty_On_Errors then - return Empty; - else - raise Program_Error; - end if; + raise Program_Error; end case; end Defining_Entity; diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads index 3de394456b0..60171ff4b21 100644 --- a/gcc/ada/sem_util.ads +++ b/gcc/ada/sem_util.ads @@ -543,10 +543,7 @@ package Sem_Util is -- in the case of a descendant of a generic formal type (returns Int'Last -- instead of 0). - function Defining_Entity - (N : Node_Id; - Empty_On_Errors : Boolean := False; - Concurrent_Subunit : Boolean := False) return Entity_Id; + function Defining_Entity (N : Node_Id) return Entity_Id; -- Given a declaration N, returns the associated defining entity. If the -- declaration has a specification, the entity is obtained from the -- specification. If the declaration has a defining unit name, then the @@ -557,22 +554,6 @@ package Sem_Util is -- local entities declared during loop expansion. These entities need -- debugging information, generated through Qualify_Entity_Names, and -- the loop declaration must be placed in the table Name_Qualify_Units. - -- - -- Set flag Empty_On_Error to change the behavior of this routine as - -- follows: - -- - -- * True - A declaration that lacks a defining entity returns Empty. - -- A node that does not allow for a defining entity returns Empty. - -- - -- * False - A declaration that lacks a defining entity is given a new - -- internally generated entity which is subsequently returned. A node - -- that does not allow for a defining entity raises Program_Error. - -- - -- The former semantics is appropriate for the back end; the latter - -- semantics is appropriate for the front end. - -- - -- Set flag Concurrent_Subunit to handle rewritings of concurrent bodies - -- which act as subunits. Such bodies are generally rewritten as null. function Denotes_Discriminant (N : Node_Id; diff --git a/gcc/asan.c b/gcc/asan.c index e71ab2cc710..235e219479d 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -253,7 +253,7 @@ static tree last_alloca_addr; /* Set of variable declarations that are going to be guarded by use-after-scope sanitizer. */ -static hash_set *asan_handled_variables = NULL; +hash_set *asan_handled_variables = NULL; hash_set *asan_used_labels = NULL; diff --git a/gcc/asan.h b/gcc/asan.h index 412af220597..2f431b4f938 100644 --- a/gcc/asan.h +++ b/gcc/asan.h @@ -110,6 +110,8 @@ extern bool asan_sanitize_stack_p (void); extern bool asan_sanitize_allocas_p (void); +extern hash_set *asan_handled_variables; + /* Return TRUE if builtin with given FCODE will be intercepted by libasan. */ diff --git a/gcc/attribs.c b/gcc/attribs.c index bfadf124dcb..fc21f799d92 100644 --- a/gcc/attribs.c +++ b/gcc/attribs.c @@ -1685,6 +1685,11 @@ handle_dll_attribute (tree * pnode, tree name, tree args, int flags, a function global scope, unless declared static. */ if (current_function_decl != NULL_TREE && !TREE_STATIC (node)) TREE_PUBLIC (node) = 1; + /* Clear TREE_STATIC because DECL_EXTERNAL is set, unless + it is a C++ static data member. */ + if (DECL_CONTEXT (node) == NULL_TREE + || !RECORD_OR_UNION_TYPE_P (DECL_CONTEXT (node))) + TREE_STATIC (node) = 0; } if (*no_add_attrs == false) diff --git a/gcc/brig/ChangeLog b/gcc/brig/ChangeLog index 815c3362119..e56f5850fdf 100644 --- a/gcc/brig/ChangeLog +++ b/gcc/brig/ChangeLog @@ -1,3 +1,7 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/builtins.c b/gcc/builtins.c index a71555e8198..14624a641cd 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -2560,7 +2560,7 @@ expand_builtin_int_roundingfn (tree exp, rtx target) tree arg; if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE)) - gcc_unreachable (); + return NULL_RTX; arg = CALL_EXPR_ARG (exp, 0); @@ -2696,7 +2696,7 @@ expand_builtin_int_roundingfn_2 (tree exp, rtx target) enum built_in_function fallback_fn = BUILT_IN_NONE; if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE)) - gcc_unreachable (); + return NULL_RTX; arg = CALL_EXPR_ARG (exp, 0); @@ -10088,6 +10088,9 @@ maybe_emit_sprintf_chk_warning (tree exp, enum built_in_function fcode) static void maybe_emit_free_warning (tree exp) { + if (call_expr_nargs (exp) != 1) + return; + tree arg = CALL_EXPR_ARG (exp, 0); STRIP_NOPS (arg); diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 280dfe1d8d0..7db9a94f23d 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,89 @@ +2019-09-03 Iain Sandoe + + Backport from mainline + 2019-08-23 Iain Sandoe + + PR pch/61250 + * c-lex.c (c_lex_with_flags): Don't call + c_common_no_more_pch () from here. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-05-15 Richard Biener + + PR c/90474 + * c-common.c (c_common_mark_addressable_vec): Also mark + a COMPOUND_LITERAL_EXPR_DECL addressable similar to + c_mark_addressable. + +2019-08-29 Jakub Jelinek + + Backported from mainline + 2019-06-25 Jakub Jelinek + + PR sanitizer/90954 + * c-omp.c (c_finish_omp_atomic): Allow tree_invariant_p in addition + to SAVE_EXPR in first operand of a COMPOUND_EXPR. + +2019-05-22 Eric Botcazou + + Backport from mainline + 2018-05-10 Eric Botcazou + + PR c++/85400 + * c-attribs.c (handle_visibility_attribute): Do not set no_add_attrs. + +2019-04-30 Jakub Jelinek + + Backported from mainline + 2019-04-12 Jakub Jelinek + + PR c/89946 + * c-attribs.c (handle_patchable_function_entry_attribute): Add + function comment. Warn if arguments of the attribute are not positive + integer constants. + +2019-04-09 Eric Botcazou + + * c-ada-spec.c (print_destructor): Deal with deleting destructors. + (dump_ada_declaration) : Likewise. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + +2019-02-07 Jakub Jelinek + + Backported from mainline + 2019-01-22 Jakub Jelinek + + PR middle-end/88968 + * c-omp.c (c_finish_omp_atomic): For bitfield atomics, update type + variable after using BIT_FIELD_REF. + + 2019-01-14 Jakub Jelinek + + * c-cppbuiltin.c (c_cpp_builtin): Define __cpp_guaranteed_copy_elision + and __cpp_nontype_template_parameter_auto. Add a comment that + __cpp_template_auto is deprecated. + +2019-01-08 Jakub Jelinek + + Backported from mainline + 2018-11-28 Jakub Jelinek + + PR c++/88215 + * c-ubsan.c: Include langhooks.h. + (ubsan_instrument_division): Change gcc_assert that main variants + of op0 and op1 types are equal to gcc_checking_assert that the + main variants are compatible types. + +2018-08-17 Martin Liska + + PR other/86992 + * c.opt: Fix declaration of cilkplus. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/c-family/c-ada-spec.c b/gcc/c-family/c-ada-spec.c index 30fdb59d55c..f5f558c5a5c 100644 --- a/gcc/c-family/c-ada-spec.c +++ b/gcc/c-family/c-ada-spec.c @@ -2686,6 +2686,8 @@ print_destructor (pretty_printer *buffer, tree t, tree type) tree decl_name = DECL_NAME (TYPE_NAME (type)); pp_string (buffer, "Delete_"); + if (strncmp (IDENTIFIER_POINTER (DECL_NAME (t)), "__dt_del", 8) == 0) + pp_string (buffer, "And_Free_"); pp_ada_tree_identifier (buffer, decl_name, t, 0, false); } @@ -2937,9 +2939,10 @@ dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) if (DECL_ARTIFICIAL (t)) return 0; - /* Only consider constructors/destructors for complete objects. */ + /* Only consider complete constructors and deleting destructors. */ if (strncmp (IDENTIFIER_POINTER (decl_name), "__ct_comp", 9) != 0 - && strncmp (IDENTIFIER_POINTER (decl_name), "__dt_comp", 9) != 0) + && strncmp (IDENTIFIER_POINTER (decl_name), "__dt_comp", 9) != 0 + && strncmp (IDENTIFIER_POINTER (decl_name), "__dt_del", 8) != 0) return 0; } diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index c9e799e0fcd..8f9f4702378 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -2310,14 +2310,13 @@ handle_visibility_attribute (tree *node, tree name, tree args, static tree handle_tls_model_attribute (tree *node, tree name, tree args, - int ARG_UNUSED (flags), bool *no_add_attrs) + int ARG_UNUSED (flags), + bool *ARG_UNUSED (no_add_attrs)) { tree id; tree decl = *node; enum tls_model kind; - *no_add_attrs = true; - if (!VAR_P (decl) || !DECL_THREAD_LOCAL_P (decl)) { warning (OPT_Wattributes, "%qE attribute ignored", name); @@ -3562,9 +3561,28 @@ handle_fallthrough_attribute (tree *, tree name, tree, int, return NULL_TREE; } +/* Handle a "patchable_function_entry" attributes; arguments as in + struct attribute_spec.handler. */ + static tree -handle_patchable_function_entry_attribute (tree *, tree, tree, int, bool *) +handle_patchable_function_entry_attribute (tree *, tree name, tree args, + int, bool *no_add_attrs) { - /* Nothing to be done here. */ + for (; args; args = TREE_CHAIN (args)) + { + tree val = TREE_VALUE (args); + if (val && TREE_CODE (val) != IDENTIFIER_NODE + && TREE_CODE (val) != FUNCTION_DECL) + val = default_conversion (val); + + if (!tree_fits_uhwi_p (val)) + { + warning (OPT_Wattributes, + "%qE attribute argument %qE is not an integer constant", + name, val); + *no_add_attrs = true; + return NULL_TREE; + } + } return NULL_TREE; } diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index dbbaa81956b..655c3bf10a7 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -6440,6 +6440,8 @@ c_common_mark_addressable_vec (tree t) return; if (!VAR_P (t) || !DECL_HARD_REGISTER (t)) TREE_ADDRESSABLE (t) = 1; + if (TREE_CODE (t) == COMPOUND_LITERAL_EXPR) + TREE_ADDRESSABLE (COMPOUND_LITERAL_EXPR_DECL (t)) = 1; } diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c index 3fc4fa9cd68..18821eca88a 100644 --- a/gcc/c-family/c-cppbuiltin.c +++ b/gcc/c-family/c-cppbuiltin.c @@ -972,9 +972,13 @@ c_cpp_builtins (cpp_reader *pfile) cpp_define (pfile, "__cpp_aggregate_bases=201603"); cpp_define (pfile, "__cpp_deduction_guides=201611"); cpp_define (pfile, "__cpp_noexcept_function_type=201510"); + /* Old macro, superseded by + __cpp_nontype_template_parameter_auto. */ cpp_define (pfile, "__cpp_template_auto=201606"); cpp_define (pfile, "__cpp_structured_bindings=201606"); cpp_define (pfile, "__cpp_variadic_using=201611"); + cpp_define (pfile, "__cpp_guaranteed_copy_elision=201606"); + cpp_define (pfile, "__cpp_nontype_template_parameter_auto=201606"); } if (flag_concepts) cpp_define (pfile, "__cpp_concepts=201507"); diff --git a/gcc/c-family/c-lex.c b/gcc/c-family/c-lex.c index a4ad0a30f38..a8dc0dd9130 100644 --- a/gcc/c-family/c-lex.c +++ b/gcc/c-family/c-lex.c @@ -392,7 +392,6 @@ enum cpp_ttype c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags, int lex_flags) { - static bool no_more_pch; const cpp_token *tok; enum cpp_ttype type; unsigned char add_flags = 0; @@ -626,12 +625,6 @@ c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags, if (cpp_flags) *cpp_flags = tok->flags | add_flags; - if (!no_more_pch) - { - no_more_pch = true; - c_common_no_more_pch (); - } - timevar_pop (TV_CPP); return type; diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c index d8695f517af..f26d31b0147 100644 --- a/gcc/c-family/c-omp.c +++ b/gcc/c-family/c-omp.c @@ -300,7 +300,7 @@ c_finish_omp_atomic (location_t loc, enum tree_code code, if (TREE_CODE (x) == COMPOUND_EXPR) { pre = TREE_OPERAND (x, 0); - gcc_assert (TREE_CODE (pre) == SAVE_EXPR); + gcc_assert (TREE_CODE (pre) == SAVE_EXPR || tree_invariant_p (pre)); x = TREE_OPERAND (x, 1); } gcc_assert (TREE_CODE (x) == MODIFY_EXPR); @@ -373,8 +373,11 @@ c_finish_omp_atomic (location_t loc, enum tree_code code, } } if (blhs) - x = build3_loc (loc, BIT_FIELD_REF, TREE_TYPE (blhs), x, - bitsize_int (bitsize), bitsize_int (bitpos)); + { + x = build3_loc (loc, BIT_FIELD_REF, TREE_TYPE (blhs), x, + bitsize_int (bitsize), bitsize_int (bitpos)); + type = TREE_TYPE (blhs); + } x = build_modify_expr (loc, v, NULL_TREE, NOP_EXPR, loc, x, NULL_TREE); if (rhs1 && rhs1 != orig_lhs) diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c index ae6e25043bf..b8036805e39 100644 --- a/gcc/c-family/c-ubsan.c +++ b/gcc/c-family/c-ubsan.c @@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see #include "stringpool.h" #include "attribs.h" #include "asan.h" +#include "langhooks.h" /* Instrument division by zero and INT_MIN / -1. If not instrumenting, return NULL_TREE. */ @@ -44,8 +45,9 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1) /* At this point both operands should have the same type, because they are already converted to RESULT_TYPE. Use TYPE_MAIN_VARIANT since typedefs can confuse us. */ - gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (op0)) - == TYPE_MAIN_VARIANT (TREE_TYPE (op1))); + tree top0 = TYPE_MAIN_VARIANT (type); + tree top1 = TYPE_MAIN_VARIANT (TREE_TYPE (op1)); + gcc_checking_assert (lang_hooks.types_compatible_p (top0, top1)); op0 = unshare_expr (op0); op1 = unshare_expr (op1); diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index a4c8c8ffcb3..f591b39be5a 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -1339,8 +1339,8 @@ Driver static-libmpxwrappers Driver -fcilkplus Undocumented -C ObjC C++ ObjC++ LTO Report Var(flag_cilkplus) Init(0) +fcilkplus +C ObjC C++ ObjC++ LTO Report Var(flag_cilkplus) Init(0) Undocumented Deprecated in GCC 8. This switch has no effect. fconcepts diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index d2a125f401f..25a5213c8b7 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,162 @@ +2019-11-21 Jakub Jelinek + + Backported from mainline + 2019-08-09 Jakub Jelinek + + PR c/91401 + * c-parser.c (c_parser_omp_clause_dist_schedule): Fix up typos in the + check_no_duplicate_clause call. Comment it out, instead emit a + warning for duplicate dist_schedule clauses. + +2019-09-03 Iain Sandoe + + Backport from mainline. + 2019-08-23 Iain Sandoe + + PR pch/61250 + * c-parser.c (c_parse_file): Call c_common_no_more_pch () + after determining that the first token is not + PRAGMA_GCC_PCH_PREPROCESS. + +2019-08-29 Jakub Jelinek + + Backported from mainline + 2019-04-26 Jakub Jelinek + + PR debug/90197 + * c-tree.h (c_finish_loop): Add 2 further location_t arguments. + * c-parser.c (c_parser_while_statement): Adjust c_finish_loop caller. + (c_parser_do_statement): Likewise. + (c_parser_for_statement): Likewise. Formatting fixes. + * c-typeck.c (c_finish_loop): Add COND_LOCUS and INCR_LOCUS arguments, + emit DEBUG_BEGIN_STMTs if needed. + +2019-07-21 Richard Sandiford + + Backport from mainline + 2019-07-18 Richard Sandiford + + PR c/53633 + * c-decl.c (finish_function): Check targetm.warn_func_return + before issuing a -Wreturn-type warning. + +2019-04-30 Jakub Jelinek + + Backported from mainline + 2019-04-19 Jakub Jelinek + + PR c++/90108 + * c-decl.c (merge_decls): If remove is main variant and + DECL_ORIGINAL_TYPE is some other type, remove a DECL_ORIGINAL_TYPE + variant that has newdecl as TYPE_NAME if any. + + 2019-04-12 Jakub Jelinek + + PR c/89933 + * c-decl.c (merge_decls): When newdecl's type is its main variant, + don't try to remove it from the variant list, but instead assert + it has no variants. + + 2019-03-19 Jakub Jelinek + + PR c/89734 + * c-decl.c (grokdeclarator): Call c_build_qualified_type on function + return type even if quals_used is 0. Formatting fixes. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + +2019-02-07 Jakub Jelinek + + Backported from mainline + 2019-02-06 Jakub Jelinek + + PR c/89211 + * c-parser.c (c_parser_declaration_or_fndef): Don't update + DECL_ARGUMENTS of d if it has been defined already. Use a single if + instead of 3 nested ifs. + +2019-01-15 Joseph Myers + + Backport from mainline + 2019-01-07 Joseph Myers + + PR c/88720 + PR c/88726 + * c-decl.c (pop_scope): Use TREE_PUBLIC and b->nested to determine + whether a function is nested, not DECL_EXTERNAL. Diagnose inline + functions declared but never defined only for external scope, not + for other scopes. + +2019-01-08 Jakub Jelinek + + Backported from mainline + 2018-12-11 Jakub Jelinek + + PR sanitizer/88426 + * c-convert.c (convert): Call c_fully_fold before calling + ubsan_instrument_float_cast. + +2018-01-02 Segher Boessenkool + + Backport from trunk + 2018-12-06 Segher Boessenkool + + PR inline-asm/55681 + * c-parser.c (c_parser_asm_statement): Update grammar. Allow any + combination of volatile and goto, in any order, without repetitions. + + Backport from trunk + 2018-12-06 Segher Boessenkool + + * c-parser.c (c_parser_asm_statement): Detect the inline keyword + after asm. Pass a flag for it to build_asm_expr. + * c-tree.h (build_asm_expr): Update declaration. + * c-typeck.c (build_asm_stmt): Add is_inline parameter. Use it to + set ASM_INLINE_P. + + Backport from trunk + 2018-12-08 Segher Boessenkool + + * c-parser (c_parser_asm_statement) [RID_INLINE]: Delete stray line + setting "quals". + + Backport from trunk + 2018-12-19 Segher Boessenkool + + * c-parser.c (c_parser_asm_statement): Rewrite the loop to work without + "done" boolean variable. + + Backport from trunk + 2018-12-19 Segher Boessenkool + + * c-parser.c (c_parser_asm_statement): Keep track of the location each + asm qualifier is first seen; use that to give nicer "duplicate asm + qualifier" messages. Delete 'quals" variable, instead pass the + "is_volatile_ flag to build_asm_stmt directly. + * c-tree.h (build_asm_stmt): Make the first arg bool instead of tree. + * c-typeck.c (build_asm_stmt): Ditto; adjust. + + Backport from trunk + 2018-12-19 Segher Boessenkool + + * c-parser.c (c_parser_asm_statement) : Give + a more specific error message (instead of just falling through). + + And extra for the backport + 2019-01-02 Segher Boessenkool + + * c-parser.c (c_parser_asm_statement): Output a warning instead of an + error for const and restrict. + +2018-08-01 Jakub Jelinek + + PR c/85704 + * c-typeck.c (init_field_decl_cmp): New function. + (output_pending_init_elements): Use it for field comparisons + instead of pure bit_position comparisons. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/c/c-convert.c b/gcc/c/c-convert.c index b57bb8ea936..6165e145c0b 100644 --- a/gcc/c/c-convert.c +++ b/gcc/c/c-convert.c @@ -115,6 +115,7 @@ convert (tree type, tree expr) && COMPLETE_TYPE_P (type)) { expr = save_expr (expr); + expr = c_fully_fold (expr, false, NULL); tree check = ubsan_instrument_float_cast (loc, type, expr); expr = fold_build1 (FIX_TRUNC_EXPR, type, expr); if (check == NULL_TREE) diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 68b7c978010..ab3a5ed6e9e 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -1239,8 +1239,9 @@ pop_scope (void) && DECL_ABSTRACT_ORIGIN (p) != NULL_TREE && DECL_ABSTRACT_ORIGIN (p) != p) TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (p)) = 1; - if (!DECL_EXTERNAL (p) + if (!TREE_PUBLIC (p) && !DECL_INITIAL (p) + && !b->nested && scope != file_scope && scope != external_scope) { @@ -1256,7 +1257,7 @@ pop_scope (void) in the same translation unit." */ if (!flag_gnu89_inline && !lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (p)) - && scope != external_scope) + && scope == external_scope) pedwarn (input_location, 0, "inline function %q+D declared but never defined", p); DECL_EXTERNAL (p) = 1; @@ -2351,13 +2352,33 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) if (TYPE_NAME (TREE_TYPE (newdecl)) == newdecl) { tree remove = TREE_TYPE (newdecl); - for (tree t = TYPE_MAIN_VARIANT (remove); ; - t = TYPE_NEXT_VARIANT (t)) - if (TYPE_NEXT_VARIANT (t) == remove) - { - TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (remove); - break; - } + if (TYPE_MAIN_VARIANT (remove) == remove) + { + gcc_assert (TYPE_NEXT_VARIANT (remove) == NULL_TREE); + /* If remove is the main variant, no need to remove that + from the list. One of the DECL_ORIGINAL_TYPE + variants, e.g. created for aligned attribute, might still + refer to the newdecl TYPE_DECL though, so remove that one + in that case. */ + if (DECL_ORIGINAL_TYPE (newdecl) + && DECL_ORIGINAL_TYPE (newdecl) != remove) + for (tree t = TYPE_MAIN_VARIANT (DECL_ORIGINAL_TYPE (newdecl)); + t; t = TYPE_MAIN_VARIANT (t)) + if (TYPE_NAME (TYPE_NEXT_VARIANT (t)) == newdecl) + { + TYPE_NEXT_VARIANT (t) + = TYPE_NEXT_VARIANT (TYPE_NEXT_VARIANT (t)); + break; + } + } + else + for (tree t = TYPE_MAIN_VARIANT (remove); ; + t = TYPE_NEXT_VARIANT (t)) + if (TYPE_NEXT_VARIANT (t) == remove) + { + TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (remove); + break; + } } } @@ -6435,10 +6456,12 @@ grokdeclarator (const struct c_declarator *declarator, quals_used &= TYPE_QUAL_ATOMIC; if (quals_used && VOID_TYPE_P (type) && really_funcdef) pedwarn (specs_loc, 0, - "function definition has qualified void return type"); + "function definition has qualified void " + "return type"); else warning_at (specs_loc, OPT_Wignored_qualifiers, - "type qualifiers ignored on function return type"); + "type qualifiers ignored on function " + "return type"); /* Ensure an error for restrict on invalid types; the DR#423 resolution is not entirely clear about @@ -6448,8 +6471,7 @@ grokdeclarator (const struct c_declarator *declarator, && (!POINTER_TYPE_P (type) || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type)))) error_at (loc, "invalid use of %"); - if (quals_used) - type = c_build_qualified_type (type, quals_used); + type = c_build_qualified_type (type, quals_used); } type_quals = TYPE_UNQUALIFIED; @@ -9484,7 +9506,8 @@ finish_function (void) && !C_FUNCTION_IMPLICIT_INT (fndecl) /* Normally, with -Wreturn-type, flow will complain, but we might optimize out static functions. */ - && !TREE_PUBLIC (fndecl)) + && !TREE_PUBLIC (fndecl) + && targetm.warn_func_return (fndecl)) { warning (OPT_Wreturn_type, "no return statement in function returning non-void"); diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 47720861d3f..75ef0a437a7 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -2143,10 +2143,12 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, tree d = start_decl (declarator, specs, false, chainon (postfix_attrs, all_prefix_attrs)); - if (d && TREE_CODE (d) == FUNCTION_DECL) - if (declarator->kind == cdk_function) - if (DECL_ARGUMENTS (d) == NULL_TREE) - DECL_ARGUMENTS (d) = declarator->u.arg_info->parms; + if (d + && TREE_CODE (d) == FUNCTION_DECL + && declarator->kind == cdk_function + && DECL_ARGUMENTS (d) == NULL_TREE + && DECL_INITIAL (d) == NULL_TREE) + DECL_ARGUMENTS (d) = declarator->u.arg_info->parms; if (omp_declare_simd_clauses.exists ()) { tree parms = NULL_TREE; @@ -5931,7 +5933,8 @@ c_parser_while_statement (c_parser *parser, bool ivdep, unsigned short unroll, location_t loc_after_labels; bool open_brace = c_parser_next_token_is (parser, CPP_OPEN_BRACE); body = c_parser_c99_block_statement (parser, if_p, &loc_after_labels); - c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true); + c_finish_loop (loc, loc, cond, UNKNOWN_LOCATION, NULL, body, + c_break_label, c_cont_label, true); add_stmt (c_end_compound_stmt (loc, block, flag_isoc99)); c_parser_maybe_reclassify_token (parser); @@ -5976,6 +5979,7 @@ c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll) c_break_label = save_break; new_cont = c_cont_label; c_cont_label = save_cont; + location_t cond_loc = c_parser_peek_token (parser)->location; cond = c_parser_paren_condition (parser); if (ivdep && cond != error_mark_node) cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, @@ -5989,7 +5993,8 @@ c_parser_do_statement (c_parser *parser, bool ivdep, unsigned short unroll) build_int_cst (integer_type_node, unroll)); if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) c_parser_skip_to_end_of_block_or_statement (parser); - c_finish_loop (loc, cond, NULL, body, new_break, new_cont, false); + c_finish_loop (loc, cond_loc, cond, UNKNOWN_LOCATION, NULL, body, + new_break, new_cont, false); add_stmt (c_end_compound_stmt (loc, block, flag_isoc99)); } @@ -6062,7 +6067,9 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, /* Silence the bogus uninitialized warning. */ tree collection_expression = NULL; location_t loc = c_parser_peek_token (parser)->location; - location_t for_loc = c_parser_peek_token (parser)->location; + location_t for_loc = loc; + location_t cond_loc = UNKNOWN_LOCATION; + location_t incr_loc = UNKNOWN_LOCATION; bool is_foreach_statement = false; gcc_assert (c_parser_next_token_is_keyword (parser, RID_FOR)); token_indent_info for_tinfo @@ -6096,7 +6103,8 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, c_parser_consume_token (parser); is_foreach_statement = true; if (check_for_loop_decls (for_loc, true) == NULL_TREE) - c_parser_error (parser, "multiple iterating variables in fast enumeration"); + c_parser_error (parser, "multiple iterating variables in " + "fast enumeration"); } else check_for_loop_decls (for_loc, flag_isoc99); @@ -6126,7 +6134,8 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, c_parser_consume_token (parser); is_foreach_statement = true; if (check_for_loop_decls (for_loc, true) == NULL_TREE) - c_parser_error (parser, "multiple iterating variables in fast enumeration"); + c_parser_error (parser, "multiple iterating variables in " + "fast enumeration"); } else check_for_loop_decls (for_loc, flag_isoc99); @@ -6148,15 +6157,18 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, c_parser_consume_token (parser); is_foreach_statement = true; if (! lvalue_p (init_expression)) - c_parser_error (parser, "invalid iterating variable in fast enumeration"); - object_expression = c_fully_fold (init_expression, false, NULL); + c_parser_error (parser, "invalid iterating variable in " + "fast enumeration"); + object_expression + = c_fully_fold (init_expression, false, NULL); } else { ce = convert_lvalue_to_rvalue (loc, ce, true, false); init_expression = ce.value; c_finish_expr_stmt (loc, init_expression); - c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>"); + c_parser_skip_until_found (parser, CPP_SEMICOLON, + "expected %<;%>"); } } } @@ -6165,18 +6177,19 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, gcc_assert (!parser->objc_could_be_foreach_context); if (!is_foreach_statement) { + cond_loc = c_parser_peek_token (parser)->location; if (c_parser_next_token_is (parser, CPP_SEMICOLON)) { if (ivdep) { - c_parser_error (parser, "missing loop condition in loop with " - "% pragma"); + c_parser_error (parser, "missing loop condition in loop " + "with % pragma"); cond = error_mark_node; } else if (unroll) { - c_parser_error (parser, "missing loop condition in loop with " - "% pragma"); + c_parser_error (parser, "missing loop condition in loop " + "with % pragma"); cond = error_mark_node; } else @@ -6205,11 +6218,13 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, /* Parse the increment expression (the third expression in a for-statement). In the case of a foreach-statement, this is the expression that follows the 'in'. */ + loc = incr_loc = c_parser_peek_token (parser)->location; if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) { if (is_foreach_statement) { - c_parser_error (parser, "missing collection in fast enumeration"); + c_parser_error (parser, + "missing collection in fast enumeration"); collection_expression = error_mark_node; } else @@ -6218,8 +6233,8 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, else { if (is_foreach_statement) - collection_expression = c_fully_fold (c_parser_expression (parser).value, - false, NULL); + collection_expression + = c_fully_fold (c_parser_expression (parser).value, false, NULL); else { struct c_expr ce = c_parser_expression (parser); @@ -6242,10 +6257,14 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, body = c_parser_c99_block_statement (parser, if_p, &loc_after_labels); if (is_foreach_statement) - objc_finish_foreach_loop (loc, object_expression, collection_expression, body, c_break_label, c_cont_label); + objc_finish_foreach_loop (for_loc, object_expression, + collection_expression, body, c_break_label, + c_cont_label); else - c_finish_loop (loc, cond, incr, body, c_break_label, c_cont_label, true); - add_stmt (c_end_compound_stmt (loc, block, flag_isoc99 || c_dialect_objc ())); + c_finish_loop (for_loc, cond_loc, cond, incr_loc, incr, body, + c_break_label, c_cont_label, true); + add_stmt (c_end_compound_stmt (for_loc, block, + flag_isoc99 || c_dialect_objc ())); c_parser_maybe_reclassify_token (parser); token_indent_info next_tinfo @@ -6261,61 +6280,104 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, } /* Parse an asm statement, a GNU extension. This is a full-blown asm - statement with inputs, outputs, clobbers, and volatile tag - allowed. + statement with inputs, outputs, clobbers, and volatile, inline, and goto + tags allowed. + + asm-qualifier: + volatile + inline + goto + + asm-qualifier-list: + asm-qualifier-list asm-qualifier + asm-qualifier asm-statement: - asm type-qualifier[opt] ( asm-argument ) ; - asm type-qualifier[opt] goto ( asm-goto-argument ) ; + asm asm-qualifier-list[opt] ( asm-argument ) ; asm-argument: asm-string-literal asm-string-literal : asm-operands[opt] asm-string-literal : asm-operands[opt] : asm-operands[opt] - asm-string-literal : asm-operands[opt] : asm-operands[opt] : asm-clobbers[opt] - - asm-goto-argument: + asm-string-literal : asm-operands[opt] : asm-operands[opt] \ + : asm-clobbers[opt] asm-string-literal : : asm-operands[opt] : asm-clobbers[opt] \ : asm-goto-operands - Qualifiers other than volatile are accepted in the syntax but - warned for. */ + The form with asm-goto-operands is valid if and only if the + asm-qualifier-list contains goto, and is the only allowed form in that case. + Duplicate asm-qualifiers are not allowed. */ static tree c_parser_asm_statement (c_parser *parser) { - tree quals, str, outputs, inputs, clobbers, labels, ret; - bool simple, is_goto; + tree str, outputs, inputs, clobbers, labels, ret; + bool simple; location_t asm_loc = c_parser_peek_token (parser)->location; int section, nsections; gcc_assert (c_parser_next_token_is_keyword (parser, RID_ASM)); c_parser_consume_token (parser); - if (c_parser_next_token_is_keyword (parser, RID_VOLATILE)) - { - quals = c_parser_peek_token (parser)->value; - c_parser_consume_token (parser); - } - else if (c_parser_next_token_is_keyword (parser, RID_CONST) - || c_parser_next_token_is_keyword (parser, RID_RESTRICT)) - { - warning_at (c_parser_peek_token (parser)->location, - 0, - "%E qualifier ignored on asm", - c_parser_peek_token (parser)->value); - quals = NULL_TREE; - c_parser_consume_token (parser); - } - else - quals = NULL_TREE; - is_goto = false; - if (c_parser_next_token_is_keyword (parser, RID_GOTO)) + /* Handle the asm-qualifier-list. */ + location_t volatile_loc = UNKNOWN_LOCATION; + location_t inline_loc = UNKNOWN_LOCATION; + location_t goto_loc = UNKNOWN_LOCATION; + for (;;) { - c_parser_consume_token (parser); - is_goto = true; + c_token *token = c_parser_peek_token (parser); + location_t loc = token->location; + switch (token->keyword) + { + case RID_VOLATILE: + if (volatile_loc) + { + error_at (loc, "duplicate asm qualifier %qE", token->value); + inform (volatile_loc, "first seen here"); + } + else + volatile_loc = loc; + c_parser_consume_token (parser); + continue; + + case RID_INLINE: + if (inline_loc) + { + error_at (loc, "duplicate asm qualifier %qE", token->value); + inform (inline_loc, "first seen here"); + } + else + inline_loc = loc; + c_parser_consume_token (parser); + continue; + + case RID_GOTO: + if (goto_loc) + { + error_at (loc, "duplicate asm qualifier %qE", token->value); + inform (goto_loc, "first seen here"); + } + else + goto_loc = loc; + c_parser_consume_token (parser); + continue; + + case RID_CONST: + case RID_RESTRICT: + warning_at (loc, 0, "%qE is not an asm qualifier", token->value); + c_parser_consume_token (parser); + continue; + + default: + break; + } + break; } + bool is_volatile = (volatile_loc != UNKNOWN_LOCATION); + bool is_inline = (inline_loc != UNKNOWN_LOCATION); + bool is_goto = (goto_loc != UNKNOWN_LOCATION); + /* ??? Follow the C++ parser rather than using the lex_untranslated_string kludge. */ parser->lex_untranslated_string = true; @@ -6390,8 +6452,9 @@ c_parser_asm_statement (c_parser *parser) if (!c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>")) c_parser_skip_to_end_of_block_or_statement (parser); - ret = build_asm_stmt (quals, build_asm_expr (asm_loc, str, outputs, inputs, - clobbers, labels, simple)); + ret = build_asm_stmt (is_volatile, + build_asm_expr (asm_loc, str, outputs, inputs, + clobbers, labels, simple, is_inline)); error: parser->lex_untranslated_string = false; @@ -13786,7 +13849,10 @@ c_parser_omp_clause_dist_schedule (c_parser *parser, tree list) c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<,%> or %<)%>"); - check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule"); + /* check_no_duplicate_clause (list, OMP_CLAUSE_DIST_SCHEDULE, + "dist_schedule"); */ + if (omp_find_clause (list, OMP_CLAUSE_DIST_SCHEDULE)) + warning_at (loc, 0, "too many %qs clauses", "dist_schedule"); if (t == error_mark_node) return list; @@ -18415,6 +18481,8 @@ c_parse_file (void) if (c_parser_peek_token (&tparser)->pragma_kind == PRAGMA_GCC_PCH_PREPROCESS) c_parser_pragma_pch_preprocess (&tparser); + else + c_common_no_more_pch (); the_parser = ggc_alloc (); *the_parser = tparser; diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h index ae1a1e60d4b..bd7d396c67d 100644 --- a/gcc/c/c-tree.h +++ b/gcc/c/c-tree.h @@ -677,13 +677,15 @@ extern tree build_compound_literal (location_t, tree, tree, bool, extern void check_compound_literal_type (location_t, struct c_type_name *); extern tree c_start_case (location_t, location_t, tree, bool); extern void c_finish_case (tree, tree); -extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool); -extern tree build_asm_stmt (tree, tree); +extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool, + bool); +extern tree build_asm_stmt (bool, tree); extern int c_types_compatible_p (tree, tree); extern tree c_begin_compound_stmt (bool); extern tree c_end_compound_stmt (location_t, tree, bool); extern void c_finish_if_stmt (location_t, tree, tree, tree); -extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool); +extern void c_finish_loop (location_t, location_t, tree, location_t, tree, + tree, tree, tree, bool); extern tree c_begin_stmt_expr (void); extern tree c_finish_stmt_expr (location_t, tree); extern tree c_process_expr_stmt (location_t, tree); diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 3439f6e5ff7..19fb73f840b 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -9316,6 +9316,65 @@ output_init_element (location_t loc, tree value, tree origtype, output_pending_init_elements (0, braced_init_obstack); } +/* For two FIELD_DECLs in the same chain, return -1 if field1 + comes before field2, 1 if field1 comes after field2 and + 0 if field1 == field2. */ + +static int +init_field_decl_cmp (tree field1, tree field2) +{ + if (field1 == field2) + return 0; + + tree bitpos1 = bit_position (field1); + tree bitpos2 = bit_position (field2); + if (tree_int_cst_equal (bitpos1, bitpos2)) + { + /* If one of the fields has non-zero bitsize, then that + field must be the last one in a sequence of zero + sized fields, fields after it will have bigger + bit_position. */ + if (TREE_TYPE (field1) != error_mark_node + && COMPLETE_TYPE_P (TREE_TYPE (field1)) + && integer_nonzerop (TREE_TYPE (field1))) + return 1; + if (TREE_TYPE (field2) != error_mark_node + && COMPLETE_TYPE_P (TREE_TYPE (field2)) + && integer_nonzerop (TREE_TYPE (field2))) + return -1; + /* Otherwise, fallback to DECL_CHAIN walk to find out + which field comes earlier. Walk chains of both + fields, so that if field1 and field2 are close to each + other in either order, it is found soon even for large + sequences of zero sized fields. */ + tree f1 = field1, f2 = field2; + while (1) + { + f1 = DECL_CHAIN (f1); + f2 = DECL_CHAIN (f2); + if (f1 == NULL_TREE) + { + gcc_assert (f2); + return 1; + } + if (f2 == NULL_TREE) + return -1; + if (f1 == field2) + return -1; + if (f2 == field1) + return 1; + if (!tree_int_cst_equal (bit_position (f1), bitpos1)) + return 1; + if (!tree_int_cst_equal (bit_position (f2), bitpos1)) + return -1; + } + } + else if (tree_int_cst_lt (bitpos1, bitpos2)) + return -1; + else + return 1; +} + /* Output any pending elements which have become next. As we output elements, constructor_unfilled_{fields,index} advances, which may cause other elements to become next; @@ -9387,25 +9446,18 @@ output_pending_init_elements (int all, struct obstack * braced_init_obstack) } else if (RECORD_OR_UNION_TYPE_P (constructor_type)) { - tree ctor_unfilled_bitpos, elt_bitpos; - /* If the current record is complete we are done. */ if (constructor_unfilled_fields == NULL_TREE) break; - ctor_unfilled_bitpos = bit_position (constructor_unfilled_fields); - elt_bitpos = bit_position (elt->purpose); - /* We can't compare fields here because there might be empty - fields in between. */ - if (tree_int_cst_equal (elt_bitpos, ctor_unfilled_bitpos)) - { - constructor_unfilled_fields = elt->purpose; - output_init_element (input_location, elt->value, elt->origtype, - true, TREE_TYPE (elt->purpose), - elt->purpose, false, false, - braced_init_obstack); - } - else if (tree_int_cst_lt (ctor_unfilled_bitpos, elt_bitpos)) + int cmp = init_field_decl_cmp (constructor_unfilled_fields, + elt->purpose); + if (cmp == 0) + output_init_element (input_location, elt->value, elt->origtype, + true, TREE_TYPE (elt->purpose), + elt->purpose, false, false, + braced_init_obstack); + else if (cmp < 0) { /* Advance to the next smaller node. */ if (elt->left) @@ -9431,8 +9483,8 @@ output_pending_init_elements (int all, struct obstack * braced_init_obstack) elt = elt->parent; elt = elt->parent; if (elt - && (tree_int_cst_lt (ctor_unfilled_bitpos, - bit_position (elt->purpose)))) + && init_field_decl_cmp (constructor_unfilled_fields, + elt->purpose) < 0) { next = elt->purpose; break; @@ -9927,9 +9979,9 @@ process_init_element (location_t loc, struct c_expr value, bool implicit, (guaranteed to be 'volatile' or null) and ARGS (represented using an ASM_EXPR node). */ tree -build_asm_stmt (tree cv_qualifier, tree args) +build_asm_stmt (bool is_volatile, tree args) { - if (!ASM_VOLATILE_P (args) && cv_qualifier) + if (is_volatile) ASM_VOLATILE_P (args) = 1; return add_stmt (args); } @@ -9938,10 +9990,12 @@ build_asm_stmt (tree cv_qualifier, tree args) some INPUTS, and some CLOBBERS. The latter three may be NULL. SIMPLE indicates whether there was anything at all after the string in the asm expression -- asm("blah") and asm("blah" : ) - are subtly different. We use a ASM_EXPR node to represent this. */ + are subtly different. We use a ASM_EXPR node to represent this. + LOC is the location of the asm, and IS_INLINE says whether this + is asm inline. */ tree build_asm_expr (location_t loc, tree string, tree outputs, tree inputs, - tree clobbers, tree labels, bool simple) + tree clobbers, tree labels, bool simple, bool is_inline) { tree tail; tree args; @@ -10059,6 +10113,7 @@ build_asm_expr (location_t loc, tree string, tree outputs, tree inputs, as volatile. */ ASM_INPUT_P (args) = simple; ASM_VOLATILE_P (args) = (noutputs == 0); + ASM_INLINE_P (args) = is_inline; return args; } @@ -10473,11 +10528,14 @@ c_finish_if_stmt (location_t if_locus, tree cond, tree then_block, the beginning of the loop. COND is the loop condition. COND_IS_FIRST is false for DO loops. INCR is the FOR increment expression. BODY is the statement controlled by the loop. BLAB is the break label. CLAB is - the continue label. Everything is allowed to be NULL. */ + the continue label. Everything is allowed to be NULL. + COND_LOCUS is the location of the loop condition, INCR_LOCUS is the + location of the FOR increment expression. */ void -c_finish_loop (location_t start_locus, tree cond, tree incr, tree body, - tree blab, tree clab, bool cond_is_first) +c_finish_loop (location_t start_locus, location_t cond_locus, tree cond, + location_t incr_locus, tree incr, tree body, tree blab, + tree clab, bool cond_is_first) { tree entry = NULL, exit = NULL, t; @@ -10519,12 +10577,8 @@ c_finish_loop (location_t start_locus, tree cond, tree incr, tree body, } t = build_and_jump (&blab); - if (cond_is_first) - exit = fold_build3_loc (start_locus, - COND_EXPR, void_type_node, cond, exit, t); - else - exit = fold_build3_loc (input_location, - COND_EXPR, void_type_node, cond, exit, t); + exit = fold_build3_loc (cond_is_first ? start_locus : input_location, + COND_EXPR, void_type_node, cond, exit, t); } else { @@ -10545,9 +10599,23 @@ c_finish_loop (location_t start_locus, tree cond, tree incr, tree body, if (clab) add_stmt (build1 (LABEL_EXPR, void_type_node, clab)); if (incr) - add_stmt (incr); + { + if (MAY_HAVE_DEBUG_MARKER_STMTS && incr_locus != UNKNOWN_LOCATION) + { + t = build0 (DEBUG_BEGIN_STMT, void_type_node); + SET_EXPR_LOCATION (t, incr_locus); + add_stmt (t); + } + add_stmt (incr); + } if (entry) add_stmt (entry); + if (MAY_HAVE_DEBUG_MARKER_STMTS && cond_locus != UNKNOWN_LOCATION) + { + t = build0 (DEBUG_BEGIN_STMT, void_type_node); + SET_EXPR_LOCATION (t, cond_locus); + add_stmt (t); + } if (exit) add_stmt (exit); if (blab) diff --git a/gcc/calls.c b/gcc/calls.c index 9cbf2fe73ed..7eac750f34b 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1627,6 +1627,9 @@ maybe_warn_nonstring_arg (tree fndecl, tree exp) if (!fndecl || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL) return; + if (!warn_stringop_overflow) + return; + bool with_bounds = CALL_WITH_BOUNDS_P (exp); unsigned nargs = call_expr_nargs (exp); @@ -1655,7 +1658,10 @@ maybe_warn_nonstring_arg (tree fndecl, tree exp) conservatively as the bound for the unbounded function, and to adjust the range of the bound of the bounded ones. */ unsigned stride = with_bounds ? 2 : 1; - for (unsigned argno = 0; argno < nargs && !*lenrng; argno += stride) + for (unsigned argno = 0; + argno < MIN (nargs, 2 * stride) + && !(lenrng[1] && TREE_CODE (lenrng[1]) == INTEGER_CST); + argno += stride) { tree arg = CALL_EXPR_ARG (exp, argno); if (!get_attr_nonstring_decl (arg)) @@ -1693,11 +1699,9 @@ maybe_warn_nonstring_arg (tree fndecl, tree exp) if (bound) get_size_range (bound, bndrng); - if (*lenrng) + if (lenrng[1] && TREE_CODE (lenrng[1]) == INTEGER_CST) { /* Add one for the nul. */ - lenrng[0] = const_binop (PLUS_EXPR, TREE_TYPE (lenrng[0]), - lenrng[0], size_one_node); lenrng[1] = const_binop (PLUS_EXPR, TREE_TYPE (lenrng[1]), lenrng[1], size_one_node); @@ -2074,8 +2078,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED, /* If TYPE is a transparent union or record, pass things the way we would pass the first field of the union or record. We have already verified that the modes are the same. */ - if ((TREE_CODE (type) == UNION_TYPE || TREE_CODE (type) == RECORD_TYPE) - && TYPE_TRANSPARENT_AGGR (type)) + if (RECORD_OR_UNION_TYPE_P (type) && TYPE_TRANSPARENT_AGGR (type)) type = TREE_TYPE (first_field (type)); /* Decide where to pass this arg. @@ -2869,6 +2872,9 @@ load_register_parameters (struct arg_data *args, int num_actuals, poly_int64 size = 0; HOST_WIDE_INT const_size = 0; rtx_insn *before_arg = get_last_insn (); + tree type = TREE_TYPE (args[i].tree_value); + if (RECORD_OR_UNION_TYPE_P (type) && TYPE_TRANSPARENT_AGGR (type)) + type = TREE_TYPE (first_field (type)); /* Set non-negative if we must move a word at a time, even if just one word (e.g, partial == 4 && mode == DFmode). Set to -1 if we just use a normal move insn. This value can be @@ -2881,11 +2887,11 @@ load_register_parameters (struct arg_data *args, int num_actuals, gcc_assert (partial % UNITS_PER_WORD == 0); nregs = partial / UNITS_PER_WORD; } - else if (TYPE_MODE (TREE_TYPE (args[i].tree_value)) == BLKmode) + else if (TYPE_MODE (type) == BLKmode) { /* Variable-sized parameters should be described by a PARALLEL instead. */ - const_size = int_size_in_bytes (TREE_TYPE (args[i].tree_value)); + const_size = int_size_in_bytes (type); gcc_assert (const_size >= 0); nregs = (const_size + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD; size = const_size; @@ -3012,8 +3018,7 @@ load_register_parameters (struct arg_data *args, int num_actuals, if (GET_CODE (reg) == PARALLEL) use_group_regs (call_fusage, reg); else if (nregs == -1) - use_reg_mode (call_fusage, reg, - TYPE_MODE (TREE_TYPE (args[i].tree_value))); + use_reg_mode (call_fusage, reg, TYPE_MODE (type)); else if (nregs > 0) use_regs (call_fusage, REGNO (reg), nregs); } @@ -3750,6 +3755,28 @@ expand_call (tree exp, rtx target, int ignore) || dbg_cnt (tail_call) == false) try_tail_call = 0; + /* Workaround buggy C/C++ wrappers around Fortran routines with + character(len=constant) arguments if the hidden string length arguments + are passed on the stack; if the callers forget to pass those arguments, + attempting to tail call in such routines leads to stack corruption. + Avoid tail calls in functions where at least one such hidden string + length argument is passed (partially or fully) on the stack in the + caller and the callee needs to pass any arguments on the stack. + See PR90329. */ + if (try_tail_call && maybe_ne (args_size.constant, 0)) + for (tree arg = DECL_ARGUMENTS (current_function_decl); + arg; arg = DECL_CHAIN (arg)) + if (DECL_HIDDEN_STRING_LENGTH (arg) && DECL_INCOMING_RTL (arg)) + { + subrtx_iterator::array_type array; + FOR_EACH_SUBRTX (iter, array, DECL_INCOMING_RTL (arg), NONCONST) + if (MEM_P (*iter)) + { + try_tail_call = 0; + break; + } + } + /* If the user has marked the function as requiring tail-call optimization, attempt it. */ if (must_tail_call) diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 4a5dc29d14f..ac1263b7d1a 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see #include "dce.h" #include "dbgcnt.h" #include "rtl-iter.h" +#include "regs.h" #define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK) @@ -1217,6 +1218,14 @@ old_insns_match_p (int mode ATTRIBUTE_UNUSED, rtx_insn *i1, rtx_insn *i2) } } } + + HARD_REG_SET i1_used, i2_used; + + get_call_reg_set_usage (i1, &i1_used, call_used_reg_set); + get_call_reg_set_usage (i2, &i2_used, call_used_reg_set); + + if (!hard_reg_set_equal_p (i1_used, i2_used)) + return dir_none; } /* If both i1 and i2 are frame related, verify all the CFA notes @@ -1592,10 +1601,13 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2) if (crtl->shrink_wrapped && single_succ_p (bb1) && single_succ (bb1) == EXIT_BLOCK_PTR_FOR_FN (cfun) - && !JUMP_P (BB_END (bb1)) + && (!JUMP_P (BB_END (bb1)) + /* Punt if the only successor is a fake edge to exit, the jump + must be some weird one. */ + || (single_succ_edge (bb1)->flags & EDGE_FAKE) != 0) && !(CALL_P (BB_END (bb1)) && SIBLING_CALL_P (BB_END (bb1)))) return false; - + /* If BB1 has only one successor, we may be looking at either an unconditional jump, or a fake edge to exit. */ if (single_succ_p (bb1) @@ -2702,23 +2714,23 @@ try_optimize_cfg (int mode) if (current_ir_type () == IR_RTL_CFGLAYOUT) { - if (BB_FOOTER (b) - && BARRIER_P (BB_FOOTER (b))) + rtx_insn *insn; + for (insn = BB_FOOTER (b); + insn; insn = NEXT_INSN (insn)) + if (BARRIER_P (insn)) + break; + if (insn) FOR_EACH_EDGE (e, ei, b->preds) - if ((e->flags & EDGE_FALLTHRU) - && BB_FOOTER (e->src) == NULL) + if ((e->flags & EDGE_FALLTHRU)) { - if (BB_FOOTER (b)) + if (BB_FOOTER (b) + && BB_FOOTER (e->src) == NULL) { BB_FOOTER (e->src) = BB_FOOTER (b); BB_FOOTER (b) = NULL; } else - { - start_sequence (); - BB_FOOTER (e->src) = emit_barrier (); - end_sequence (); - } + emit_barrier_after_bb (e->src); } } else diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index ff2f4074df2..18565bf1dab 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1157,6 +1157,20 @@ expand_stack_vars (bool (*pred) (size_t), struct stack_vars_data *data) if (repr_decl == NULL_TREE) repr_decl = stack_vars[i].decl; data->asan_decl_vec.safe_push (repr_decl); + + /* Make sure a representative is unpoison if another + variable in the partition is handled by + use-after-scope sanitization. */ + if (asan_handled_variables != NULL + && !asan_handled_variables->contains (repr_decl)) + { + for (j = i; j != EOC; j = stack_vars[j].next) + if (asan_handled_variables->contains (stack_vars[j].decl)) + break; + if (j != EOC) + asan_handled_variables->add (repr_decl); + } + data->asan_alignb = MAX (data->asan_alignb, alignb); if (data->asan_base == NULL) data->asan_base = gen_reg_rtx (Pmode); @@ -1259,10 +1273,10 @@ set_parm_rtl (tree parm, rtx x) allocate it, which means that in-frame portion is just a pointer. ??? We've got a pseudo for sure here, do we actually dynamically allocate its spilling area if needed? - ??? Isn't it a problem when POINTER_SIZE also exceeds - MAX_SUPPORTED_STACK_ALIGNMENT, as on cris and lm32? */ + ??? Isn't it a problem when Pmode alignment also exceeds + MAX_SUPPORTED_STACK_ALIGNMENT, as can happen on cris and lm32? */ if (align > MAX_SUPPORTED_STACK_ALIGNMENT) - align = POINTER_SIZE; + align = GET_MODE_ALIGNMENT (Pmode); record_alignment_for_reg_var (align); } @@ -1383,7 +1397,7 @@ expand_one_ssa_partition (tree var) /* If the variable alignment is very large we'll dynamicaly allocate it, which means that in-frame portion is just a pointer. */ if (align > MAX_SUPPORTED_STACK_ALIGNMENT) - align = POINTER_SIZE; + align = GET_MODE_ALIGNMENT (Pmode); record_alignment_for_reg_var (align); @@ -1610,7 +1624,7 @@ expand_one_var (tree var, bool toplevel, bool really_expand) /* If the variable alignment is very large we'll dynamicaly allocate it, which means that in-frame portion is just a pointer. */ if (align > MAX_SUPPORTED_STACK_ALIGNMENT) - align = POINTER_SIZE; + align = GET_MODE_ALIGNMENT (Pmode); } record_alignment_for_reg_var (align); @@ -4309,7 +4323,11 @@ expand_debug_expr (tree exp) op0 = DECL_RTL_IF_SET (exp); /* This decl was probably optimized away. */ - if (!op0) + if (!op0 + /* At least label RTXen are sometimes replaced by + NOTE_INSN_DELETED_LABEL. Any notes here are not + handled by copy_rtx. */ + || NOTE_P (op0)) { if (!VAR_P (exp) || DECL_EXTERNAL (exp) @@ -6534,6 +6552,14 @@ pass_expand::execute (function *fun) find_many_sub_basic_blocks (blocks); purge_all_dead_edges (); + /* After initial rtl generation, call back to finish generating + exception support code. We need to do this before cleaning up + the CFG as the code does not expect dead landing pads. */ + if (fun->eh->region_tree != NULL) + finish_eh_generation (); + + /* Call expand_stack_alignment after finishing all + updates to crtl->preferred_stack_boundary. */ expand_stack_alignment (); /* Fixup REG_EQUIV notes in the prologue if there are tailcalls in this @@ -6541,12 +6567,6 @@ pass_expand::execute (function *fun) if (crtl->tail_call_emit) fixup_tail_calls (); - /* After initial rtl generation, call back to finish generating - exception support code. We need to do this before cleaning up - the CFG as the code does not expect dead landing pads. */ - if (fun->eh->region_tree != NULL) - finish_eh_generation (); - /* BB subdivision may have created basic blocks that are are only reachable from unlikely bbs but not marked as such in the profile. */ if (optimize) diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index 87d864c6022..5e5b5aa7a74 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -1066,7 +1066,7 @@ can_duplicate_block_p (const_basic_block bb) AFTER. */ basic_block -duplicate_block (basic_block bb, edge e, basic_block after) +duplicate_block (basic_block bb, edge e, basic_block after, copy_bb_data *id) { edge s, n; basic_block new_bb; @@ -1082,7 +1082,7 @@ duplicate_block (basic_block bb, edge e, basic_block after) gcc_checking_assert (can_duplicate_block_p (bb)); - new_bb = cfg_hooks->duplicate_block (bb); + new_bb = cfg_hooks->duplicate_block (bb, id); if (after) move_block_after (new_bb, after); @@ -1337,6 +1337,7 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs, unsigned i, j; basic_block bb, new_bb, dom_bb; edge e; + copy_bb_data id; /* Mark the blocks to be copied. This is used by edge creation hooks to decide whether to reallocate PHI nodes capacity to avoid reallocating @@ -1349,7 +1350,7 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs, { /* Duplicate. */ bb = bbs[i]; - new_bb = new_bbs[i] = duplicate_block (bb, NULL, after); + new_bb = new_bbs[i] = duplicate_block (bb, NULL, after, &id); after = new_bb; if (bb->loop_father) { diff --git a/gcc/cfghooks.h b/gcc/cfghooks.h index b5981da4a05..fa2092a51c5 100644 --- a/gcc/cfghooks.h +++ b/gcc/cfghooks.h @@ -54,6 +54,19 @@ struct profile_record bool run; }; +typedef int_hash dependence_hash; + +/* Optional data for duplicate_block. */ + +struct copy_bb_data +{ + copy_bb_data() : dependence_map (NULL) {} + ~copy_bb_data () { delete dependence_map; } + + /* A map from the copied BBs dependence info cliques to + equivalents in the BBs duplicated to. */ + hash_map *dependence_map; +}; struct cfg_hooks { @@ -112,7 +125,7 @@ struct cfg_hooks bool (*can_duplicate_block_p) (const_basic_block a); /* Duplicate block A. */ - basic_block (*duplicate_block) (basic_block a); + basic_block (*duplicate_block) (basic_block a, copy_bb_data *); /* Higher level functions representable by primitive operations above if we didn't have some oddities in RTL and Tree representations. */ @@ -227,7 +240,8 @@ extern void tidy_fallthru_edges (void); extern void predict_edge (edge e, enum br_predictor predictor, int probability); extern bool predicted_by_p (const_basic_block bb, enum br_predictor predictor); extern bool can_duplicate_block_p (const_basic_block); -extern basic_block duplicate_block (basic_block, edge, basic_block); +extern basic_block duplicate_block (basic_block, edge, basic_block, + copy_bb_data * = NULL); extern bool block_ends_with_call_p (basic_block bb); extern bool empty_block_p (basic_block); extern basic_block split_block_before_cond_jump (basic_block); diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h index af9bfabe094..cb39a3fa5f0 100644 --- a/gcc/cfgloop.h +++ b/gcc/cfgloop.h @@ -227,6 +227,10 @@ struct GTY ((chain_next ("%h.next"))) loop { Other values means unroll with the given unrolling factor. */ unsigned short unroll; + /* If this loop was inlined the main clique of the callee which does + not need remapping when copying the loop body. */ + unsigned short owned_clique; + /* For SIMD loops, this is a unique identifier of the loop, referenced by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE builtins. */ diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 74c39dbe8fa..4b300f20428 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -1019,6 +1019,7 @@ copy_loop_info (struct loop *loop, struct loop *target) target->warned_aggressive_loop_optimizations |= loop->warned_aggressive_loop_optimizations; target->in_oacc_kernels_region = loop->in_oacc_kernels_region; + target->owned_clique = loop->owned_clique; } /* Copies copy of LOOP as subloop of TARGET loop, placing newly diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index de704ce16d0..bf1504d082f 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -984,6 +984,31 @@ block_label (basic_block block) return as_a (BB_HEAD (block)); } +/* Remove all barriers from BB_FOOTER of a BB. */ + +static void +remove_barriers_from_footer (basic_block bb) +{ + rtx_insn *insn = BB_FOOTER (bb); + + /* Remove barriers but keep jumptables. */ + while (insn) + { + if (BARRIER_P (insn)) + { + if (PREV_INSN (insn)) + SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn); + else + BB_FOOTER (bb) = NEXT_INSN (insn); + if (NEXT_INSN (insn)) + SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn); + } + if (LABEL_P (insn)) + return; + insn = NEXT_INSN (insn); + } +} + /* Attempt to perform edge redirection by replacing possibly complex jump instruction by unconditional jump or removing jump completely. This can apply only if all edges now point to the same block. The parameters and @@ -1047,26 +1072,8 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout) /* Selectively unlink whole insn chain. */ if (in_cfglayout) { - rtx_insn *insn = BB_FOOTER (src); - delete_insn_chain (kill_from, BB_END (src), false); - - /* Remove barriers but keep jumptables. */ - while (insn) - { - if (BARRIER_P (insn)) - { - if (PREV_INSN (insn)) - SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn); - else - BB_FOOTER (src) = NEXT_INSN (insn); - if (NEXT_INSN (insn)) - SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn); - } - if (LABEL_P (insn)) - break; - insn = NEXT_INSN (insn); - } + remove_barriers_from_footer (src); } else delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)), @@ -1264,11 +1271,13 @@ patch_jump_insn (rtx_insn *insn, rtx_insn *old_label, basic_block new_bb) /* If the substitution doesn't succeed, die. This can happen if the back end emitted unrecognizable instructions or if - target is exit block on some arches. */ + target is exit block on some arches. Or for crossing + jumps. */ if (!redirect_jump (as_a (insn), block_label (new_bb), 0)) { - gcc_assert (new_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)); + gcc_assert (new_bb == EXIT_BLOCK_PTR_FOR_FN (cfun) + || CROSSING_JUMP_P (insn)); return false; } } @@ -3315,8 +3324,15 @@ fixup_abnormal_edges (void) If it's placed after a trapping call (i.e. that call is the last insn anyway), we have no fallthru edge. Simply delete this use and don't try to insert - on the non-existent edge. */ - if (GET_CODE (PATTERN (insn)) != USE) + on the non-existent edge. + Similarly, sometimes a call that can throw is + followed in the source with __builtin_unreachable (), + meaning that there is UB if the call returns rather + than throws. If there weren't any instructions + following such calls before, supposedly even the ones + we've deleted aren't significant and can be + removed. */ + if (e) { /* We're not deleting it, we're moving it. */ insn->set_undeleted (); @@ -4217,7 +4233,7 @@ duplicate_insn_chain (rtx_insn *from, rtx_insn *to) /* Create a duplicate of the basic block BB. */ static basic_block -cfg_layout_duplicate_bb (basic_block bb) +cfg_layout_duplicate_bb (basic_block bb, copy_bb_data *) { rtx_insn *insn; basic_block new_bb; @@ -4370,6 +4386,7 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest) "Removing crossing jump while redirecting edge form %i to %i\n", e->src->index, dest->index); delete_insn (BB_END (src)); + remove_barriers_from_footer (src); e->flags |= EDGE_FALLTHRU; } @@ -4436,6 +4453,9 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest) else ret = redirect_branch_edge (e, dest); + if (!ret) + return NULL; + fixup_partition_crossing (ret); /* We don't want simplejumps in the insn stream during cfglayout. */ gcc_assert (!simplejump_p (BB_END (src)) || CROSSING_JUMP_P (BB_END (src))); @@ -5039,9 +5059,9 @@ rtl_can_remove_branch_p (const_edge e) } static basic_block -rtl_duplicate_bb (basic_block bb) +rtl_duplicate_bb (basic_block bb, copy_bb_data *id) { - bb = cfg_layout_duplicate_bb (bb); + bb = cfg_layout_duplicate_bb (bb, id); bb->aux = NULL; return bb; } diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 9f3a2929f6b..74a82129f62 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -3007,42 +3007,55 @@ cgraph_node::collect_callers (void) return redirect_callers; } -/* Return TRUE if NODE2 a clone of NODE or is equivalent to it. */ + +/* Return TRUE if NODE2 a clone of NODE or is equivalent to it. Return + optimistically true if this cannot be determined. */ static bool clone_of_p (cgraph_node *node, cgraph_node *node2) { - bool skipped_thunk = false; node = node->ultimate_alias_target (); node2 = node2->ultimate_alias_target (); + if (node2->clone_of == node + || node2->former_clone_of == node->decl) + return true; + + if (!node->thunk.thunk_p && !node->former_thunk_p ()) + { + while (node2 && node->decl != node2->decl) + node2 = node2->clone_of; + return node2 != NULL; + } + /* There are no virtual clones of thunks so check former_clone_of or if we might have skipped thunks because this adjustments are no longer necessary. */ - while (node->thunk.thunk_p) + while (node->thunk.thunk_p || node->former_thunk_p ()) { - if (node2->former_clone_of == node->decl) - return true; if (!node->thunk.this_adjusting) return false; + /* In case of instrumented expanded thunks, which can have multiple calls + in them, we do not know how to continue and just have to be + optimistic. */ + if (node->callees->next_callee) + return true; node = node->callees->callee->ultimate_alias_target (); - skipped_thunk = true; - } - if (skipped_thunk) - { if (!node2->clone.args_to_skip || !bitmap_bit_p (node2->clone.args_to_skip, 0)) return false; if (node2->former_clone_of == node->decl) return true; - else if (!node2->clone_of) - return false; + + cgraph_node *n2 = node2; + while (n2 && node->decl != n2->decl) + n2 = n2->clone_of; + if (n2) + return true; } - while (node != node2 && node2) - node2 = node2->clone_of; - return node2 != NULL; + return false; } /* Verify edge count and frequency. */ diff --git a/gcc/cgraph.h b/gcc/cgraph.h index afb2745a841..9495863d8ce 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -997,12 +997,17 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node { If non-NULL BLOCK_TO_COPY determine what basic blocks to copy. If non_NULL NEW_ENTRY determine new entry BB of the clone. + If TARGET_ATTRIBUTES is non-null, when creating a new declaration, + add the attributes to DECL_ATTRIBUTES. And call valid_attribute_p + that will promote value of the attribute DECL_FUNCTION_SPECIFIC_TARGET + of the declaration. + Return the new version's cgraph node. */ cgraph_node *create_version_clone_with_body (vec redirect_callers, vec *tree_map, bitmap args_to_skip, bool skip_return, bitmap bbs_to_copy, basic_block new_entry_block, - const char *clone_name); + const char *clone_name, tree target_attributes = NULL_TREE); /* Insert a new cgraph_function_version_info node into cgraph_fnver_htab corresponding to cgraph_node. */ @@ -1258,6 +1263,9 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node { Note that at WPA stage, the function body may not be present in memory. */ inline bool has_gimple_body_p (void); + /* Return true if this node represents a former, i.e. an expanded, thunk. */ + inline bool former_thunk_p (void); + /* Return true if function should be optimized for size. */ bool optimize_for_size_p (void); @@ -2858,6 +2866,16 @@ cgraph_node::has_gimple_body_p (void) return definition && !thunk.thunk_p && !alias; } +/* Return true if this node represents a former, i.e. an expanded, thunk. */ + +inline bool +cgraph_node::former_thunk_p (void) +{ + return (!thunk.thunk_p + && (thunk.fixed_offset + || thunk.virtual_offset_p)); +} + /* Walk all functions with body defined. */ #define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \ for ((node) = symtab->first_function_with_gimple_body (); (node); \ diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 6e84a31c1a5..bdccde1ac35 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -938,6 +938,11 @@ cgraph_node::create_version_clone (tree new_decl, If non-NULL BLOCK_TO_COPY determine what basic blocks to copy. If non_NULL NEW_ENTRY determine new entry BB of the clone. + If TARGET_ATTRIBUTES is non-null, when creating a new declaration, + add the attributes to DECL_ATTRIBUTES. And call valid_attribute_p + that will promote value of the attribute DECL_FUNCTION_SPECIFIC_TARGET + of the declaration. + Return the new version's cgraph node. */ cgraph_node * @@ -945,7 +950,7 @@ cgraph_node::create_version_clone_with_body (vec redirect_callers, vec *tree_map, bitmap args_to_skip, bool skip_return, bitmap bbs_to_copy, basic_block new_entry_block, - const char *suffix) + const char *suffix, tree target_attributes) { tree old_decl = decl; cgraph_node *new_version_node = NULL; @@ -968,6 +973,19 @@ cgraph_node::create_version_clone_with_body SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl)); SET_DECL_RTL (new_decl, NULL); + if (target_attributes) + { + DECL_ATTRIBUTES (new_decl) = target_attributes; + + location_t saved_loc = input_location; + tree v = TREE_VALUE (target_attributes); + input_location = DECL_SOURCE_LOCATION (new_decl); + bool r = targetm.target_option.valid_attribute_p (new_decl, NULL, v, 0); + input_location = saved_loc; + if (!r) + return NULL; + } + /* When the old decl was a con-/destructor make sure the clone isn't. */ DECL_STATIC_CONSTRUCTOR (new_decl) = 0; DECL_STATIC_DESTRUCTOR (new_decl) = 0; diff --git a/gcc/combine.c b/gcc/combine.c index 3ad050fecf1..899b6f1649d 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -981,14 +981,17 @@ combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3, } -/* Delete any insns that copy a register to itself. */ +/* Delete any insns that copy a register to itself. + Return true if the CFG was changed. */ -static void +static bool delete_noop_moves (void) { rtx_insn *insn, *next; basic_block bb; + bool edges_deleted = false; + FOR_EACH_BB_FN (bb, cfun) { for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next) @@ -999,10 +1002,12 @@ delete_noop_moves (void) if (dump_file) fprintf (dump_file, "deleting noop move %d\n", INSN_UID (insn)); - delete_insn_and_edges (insn); + edges_deleted |= delete_insn_and_edges (insn); } } } + + return edges_deleted; } @@ -1141,8 +1146,8 @@ insn_a_feeds_b (rtx_insn *a, rtx_insn *b) /* Main entry point for combiner. F is the first insn of the function. NREGS is the first unused pseudo-reg number. - Return nonzero if the combiner has turned an indirect jump - instruction into a direct jump. */ + Return nonzero if the CFG was changed (e.g. if the combiner has + turned an indirect jump instruction into a direct jump). */ static int combine_instructions (rtx_insn *f, unsigned int nregs) { @@ -1527,7 +1532,7 @@ combine_instructions (rtx_insn *f, unsigned int nregs) default_rtl_profile (); clear_bb_flags (); new_direct_jump_p |= purge_all_dead_edges (); - delete_noop_moves (); + new_direct_jump_p |= delete_noop_moves (); /* Clean up. */ obstack_free (&insn_link_obstack, NULL); @@ -4007,7 +4012,10 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0, other insns to combine, but the destination of that SET is still live. Also do this if we started with two insns and (at least) one of the - resulting sets is a noop; this noop will be deleted later. */ + resulting sets is a noop; this noop will be deleted later. + + Also do this if we started with two insns neither of which was a simple + move. */ else if (insn_code_number < 0 && asm_noperands (newpat) < 0 && GET_CODE (newpat) == PARALLEL @@ -4035,13 +4043,15 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0, one which uses any regs/memory set in between i2 and i3 can't be first. The PARALLEL might also have been pre-existing in i3, so we need to make sure that we won't wrongly hoist a SET to i2 - that would conflict with a death note present in there. */ + that would conflict with a death note present in there, or would + have its dest modified between i2 and i3. */ if (!modified_between_p (SET_SRC (set1), i2, i3) && !(REG_P (SET_DEST (set1)) && find_reg_note (i2, REG_DEAD, SET_DEST (set1))) && !(GET_CODE (SET_DEST (set1)) == SUBREG && find_reg_note (i2, REG_DEAD, SUBREG_REG (SET_DEST (set1)))) + && !modified_between_p (SET_DEST (set1), i2, i3) && (!HAVE_cc0 || !reg_referenced_p (cc0_rtx, set0)) /* If I3 is a jump, ensure that set0 is a jump so that we do not create invalid RTL. */ @@ -4057,6 +4067,7 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0, && !(GET_CODE (SET_DEST (set0)) == SUBREG && find_reg_note (i2, REG_DEAD, SUBREG_REG (SET_DEST (set0)))) + && !modified_between_p (SET_DEST (set0), i2, i3) && (!HAVE_cc0 || !reg_referenced_p (cc0_rtx, set1)) /* If I3 is a jump, ensure that set1 is a jump so that we do not create invalid RTL. */ @@ -5904,8 +5915,9 @@ combine_simplify_rtx (rtx x, machine_mode op0_mode, int in_dest, && known_eq (subreg_lowpart_offset (int_mode, int_op0_mode), SUBREG_BYTE (x)) && HWI_COMPUTABLE_MODE_P (int_op0_mode) - && (nonzero_bits (SUBREG_REG (x), int_op0_mode) - & GET_MODE_MASK (int_mode)) == 0) + && ((nonzero_bits (SUBREG_REG (x), int_op0_mode) + & GET_MODE_MASK (int_mode)) == 0) + && !side_effects_p (SUBREG_REG (x))) return CONST0_RTX (int_mode); } @@ -6455,7 +6467,7 @@ simplify_if_then_else (rtx x) pc_rtx, pc_rtx, 0, 0, 0); if (reg_mentioned_p (from, false_rtx)) false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code, - from, false_val), + from, false_val), pc_rtx, pc_rtx, 0, 0, 0); SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx); @@ -7595,6 +7607,7 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos, /* We can't do this if we are widening INNER_MODE (it may not be aligned, for one thing). */ && !paradoxical_subreg_p (tmode, inner_mode) + && known_le (pos + len, GET_MODE_PRECISION (is_mode)) && (inner_mode == tmode || (! mode_dependent_address_p (XEXP (inner, 0), MEM_ADDR_SPACE (inner)) @@ -7737,6 +7750,10 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos, && partial_subreg_p (extraction_mode, mode)) extraction_mode = mode; + /* Punt if len is too large for extraction_mode. */ + if (maybe_gt (len, GET_MODE_PRECISION (extraction_mode))) + return NULL_RTX; + if (!MEM_P (inner)) wanted_inner_mode = wanted_inner_reg_mode; else @@ -9294,6 +9311,7 @@ if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse) if (COMPARISON_P (cond0) && COMPARISON_P (cond1) + && SCALAR_INT_MODE_P (mode) && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL) && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0)) && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1))) @@ -9474,12 +9492,12 @@ known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val) if (COMPARISON_P (x)) { if (comparison_dominates_p (cond, code)) - return const_true_rtx; + return VECTOR_MODE_P (GET_MODE (x)) ? x : const_true_rtx; code = reversed_comparison_code (x, NULL); if (code != UNKNOWN && comparison_dominates_p (cond, code)) - return const0_rtx; + return CONST0_RTX (GET_MODE (x)); else return x; } @@ -9522,7 +9540,7 @@ known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val) /* We must simplify subreg here, before we lose track of the original inner_mode. */ new_rtx = simplify_subreg (GET_MODE (x), r, - inner_mode, SUBREG_BYTE (x)); + inner_mode, SUBREG_BYTE (x)); if (new_rtx) return new_rtx; else @@ -9547,7 +9565,7 @@ known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val) /* We must simplify the zero_extend here, before we lose track of the original inner_mode. */ new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x), - r, inner_mode); + r, inner_mode); if (new_rtx) return new_rtx; else @@ -10165,7 +10183,8 @@ reg_nonzero_bits_for_combine (const_rtx x, scalar_int_mode xmode, rsp = ®_stat[REGNO (x)]; if (rsp->last_set_value != 0 && (rsp->last_set_mode == mode - || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT + || (REGNO (x) >= FIRST_PSEUDO_REGISTER + && GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT && GET_MODE_CLASS (mode) == MODE_INT)) && ((rsp->last_set_label >= label_tick_ebb_start && rsp->last_set_label < label_tick) @@ -13288,6 +13307,7 @@ record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data) && subreg_lowpart_p (SET_DEST (setter))) record_value_for_reg (dest, record_dead_insn, WORD_REGISTER_OPERATIONS + && word_register_operation_p (SET_SRC (setter)) && paradoxical_subreg_p (SET_DEST (setter)) ? SET_SRC (setter) : gen_lowpart (GET_MODE (dest), diff --git a/gcc/common/config/aarch64/aarch64-common.c b/gcc/common/config/aarch64/aarch64-common.c index a9fc5f1707e..4bd61e8be1f 100644 --- a/gcc/common/config/aarch64/aarch64-common.c +++ b/gcc/common/config/aarch64/aarch64-common.c @@ -41,6 +41,8 @@ #undef TARGET_OPTION_OPTIMIZATION_TABLE #define TARGET_OPTION_OPTIMIZATION_TABLE aarch_option_optimization_table +#undef TARGET_OPTION_INIT_STRUCT +#define TARGET_OPTION_INIT_STRUCT aarch64_option_init_struct /* Set default optimization options. */ static const struct default_options aarch_option_optimization_table[] = @@ -113,8 +115,6 @@ aarch64_handle_option (struct gcc_options *opts, } } -struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER; - /* An ISA extension in the co-processor and main instruction set space. */ struct aarch64_option_extension { @@ -122,15 +122,28 @@ struct aarch64_option_extension const unsigned long flag_canonical; const unsigned long flags_on; const unsigned long flags_off; + const bool is_synthetic; }; /* ISA extensions in AArch64. */ static const struct aarch64_option_extension all_extensions[] = { -#define AARCH64_OPT_EXTENSION(NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, Z) \ - {NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF}, +#define AARCH64_OPT_EXTENSION(NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, \ + SYNTHETIC, Z) \ + {NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, SYNTHETIC}, +#include "config/aarch64/aarch64-option-extensions.def" + {NULL, 0, 0, 0, false} +}; + +/* A copy of the ISA extensions list for AArch64 sorted by the popcount of + bits and extension turned on. Cached for efficiency. */ +static struct aarch64_option_extension all_extensions_by_on[] = +{ +#define AARCH64_OPT_EXTENSION(NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, \ + SYNTHETIC, Z) \ + {NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, SYNTHETIC}, #include "config/aarch64/aarch64-option-extensions.def" - {NULL, 0, 0, 0} + {NULL, 0, 0, 0, false} }; struct processor_name_to_arch @@ -232,6 +245,76 @@ aarch64_parse_extension (const char *str, unsigned long *isa_flags) return AARCH64_PARSE_OK; } +/* Comparer to sort aarch64's feature extensions by population count. Largest + first. */ + +typedef const struct aarch64_option_extension opt_ext; + +int opt_ext_cmp (const void* a, const void* b) +{ + opt_ext *opt_a = (opt_ext *)a; + opt_ext *opt_b = (opt_ext *)b; + + /* We consider the total set of bits an options turns on to be the union of + the singleton set containing the option itself and the set of options it + turns on as a dependency. As an example +dotprod turns on FL_DOTPROD and + FL_SIMD. As such the set of bits represented by this option is + {FL_DOTPROD, FL_SIMD}. */ + unsigned long total_flags_a = opt_a->flag_canonical & opt_a->flags_on; + unsigned long total_flags_b = opt_b->flag_canonical & opt_b->flags_on; + int popcnt_a = popcount_hwi ((HOST_WIDE_INT)total_flags_a); + int popcnt_b = popcount_hwi ((HOST_WIDE_INT)total_flags_b); + int order = popcnt_b - popcnt_a; + + /* If they have the same amount of bits set, give it a more + deterministic ordering by using the value of the bits themselves. */ + if (order == 0) + return total_flags_b - total_flags_a; + + return order; +} + +/* Implement TARGET_OPTION_INIT_STRUCT. */ + +static void +aarch64_option_init_struct (struct gcc_options *opts ATTRIBUTE_UNUSED) +{ + /* Sort the extensions based on how many bits they set, order the larger + counts first. We sort the list because this makes processing the + feature bits O(n) instead of O(n^2). While n is small, the function + to calculate the feature strings is called on every options push, + pop and attribute change (arm_neon headers, lto etc all cause this to + happen quite frequently). It is a trade-off between time and space and + so time won. */ + int n_extensions + = sizeof (all_extensions) / sizeof (struct aarch64_option_extension); + qsort (&all_extensions_by_on, n_extensions, + sizeof (struct aarch64_option_extension), opt_ext_cmp); +} + +/* Checks to see if enough bits from the option OPT are enabled in + ISA_FLAG_BITS to be able to replace the individual options with the + canonicalized version of the option. This is done based on two rules: + + 1) Synthetic groups, such as +crypto we only care about the bits that are + turned on. e.g. +aes+sha2 can be replaced with +crypto. + + 2) Options that themselves have a bit, such as +rdma, in this case, all the + feature bits they turn on must be available and the bit for the option + itself must be. In this case it's effectively a reduction rather than a + grouping. e.g. +fp+simd is not enough to turn on +rdma, for that you would + need +rdma+fp+simd which is reduced down to +rdma. +*/ + +static bool +aarch64_contains_opt (unsigned long isa_flag_bits, opt_ext *opt) +{ + unsigned long flags_check + = opt->is_synthetic ? opt->flags_on : opt->flag_canonical; + + return (isa_flag_bits & flags_check) == flags_check; +} + /* Return a string representation of ISA_FLAGS. DEFAULT_ARCH_FLAGS gives the default set of flags which are implied by whatever -march we'd put out. Our job is to figure out the minimal set of "+" and @@ -245,26 +328,97 @@ aarch64_get_extension_string_for_isa_flags (unsigned long isa_flags, const struct aarch64_option_extension *opt = NULL; std::string outstr = ""; - /* Pass one: Find all the things we need to turn on. As a special case, - we always want to put out +crc if it is enabled. */ - for (opt = all_extensions; opt->name != NULL; opt++) - if ((isa_flags & opt->flag_canonical - && !(default_arch_flags & opt->flag_canonical)) - || (default_arch_flags & opt->flag_canonical - && opt->flag_canonical == AARCH64_ISA_CRC)) - { - outstr += "+"; - outstr += opt->name; - } + unsigned long isa_flag_bits = isa_flags; - /* Pass two: Find all the things we need to turn off. */ - for (opt = all_extensions; opt->name != NULL; opt++) - if ((~isa_flags) & opt->flag_canonical - && !((~default_arch_flags) & opt->flag_canonical)) + /* Pass one: Minimize the search space by reducing the set of options + to the smallest set that still turns on the same features as before in + conjunction with the bits that are turned on by default for the selected + architecture. */ + for (opt = all_extensions_by_on; opt->name != NULL; opt++) + { + /* If the bit is on by default, then all the options it turns on are also + on by default due to the transitive dependencies. + + If the option is enabled explicitly in the set then we need to emit + an option for it. Since this list is sorted by extensions setting the + largest number of featers first, we can be sure that nothing else will + ever need to set the bits we already set. Consider the following + situation: + + Feat1 = A + B + C + Feat2 = A + B + Feat3 = A + D + Feat4 = B + C + Feat5 = C + + The following results are expected: + + A + C = A + Feat5 + B + C = Feat4 + Feat4 + A = Feat1 + Feat2 + Feat5 = Feat1 + Feat1 + C = Feat1 + Feat3 + Feat4 = Feat1 + D + + This search assumes that all invidual feature bits are use visible, + in other words the user must be able to do +A, +B, +C and +D. */ + if (aarch64_contains_opt (isa_flag_bits | default_arch_flags, opt)) { - outstr += "+no"; - outstr += opt->name; + /* We remove all the dependent bits, to prevent them from being turned + on twice. This only works because we assume that all there are + individual options to set all bits standalone. */ + isa_flag_bits &= ~opt->flags_on; + isa_flag_bits |= opt->flag_canonical; } + } + + /* By toggling bits on and off, we may have set bits on that are already + enabled by default. So we mask the default set out so we don't emit an + option for them. Instead of checking for this each time during Pass One + we just mask all default bits away at the end. */ + isa_flag_bits &= ~default_arch_flags; + + /* We now have the smallest set of features we need to process. A subsequent + linear scan of the bits in isa_flag_bits will allow us to print the ext + names. However as a special case if CRC was enabled before, always print + it. This is required because some CPUs have an incorrect specification + in older assemblers. Even though CRC should be the default for these + cases the -mcpu values won't turn it on. */ + if (isa_flags & AARCH64_ISA_CRC) + isa_flag_bits |= AARCH64_ISA_CRC; + + /* Pass Two: + Print the option names that we're sure we must turn on. These are only + optional extension names. Mandatory ones have already been removed and + ones we explicitly want off have been too. */ + for (opt = all_extensions_by_on; opt->name != NULL; opt++) + { + if (isa_flag_bits & opt->flag_canonical) + { + outstr += "+"; + outstr += opt->name; + } + } + + /* Pass Three: + Print out a +no for any mandatory extension that we are + turning off. By this point aarch64_parse_extension would have ensured + that any optional extensions are turned off. The only things left are + things that can't be turned off usually, e.g. something that is on by + default because it's mandatory and we want it off. For turning off bits + we don't guarantee the smallest set of flags, but instead just emit all + options the user has specified. + + The assembler requires all + to be printed before +no. */ + for (opt = all_extensions_by_on; opt->name != NULL; opt++) + { + if ((~isa_flags) & opt->flag_canonical + && !((~default_arch_flags) & opt->flag_canonical)) + { + outstr += "+no"; + outstr += opt->name; + } + } return outstr; } @@ -345,5 +499,7 @@ aarch64_rewrite_mcpu (int argc, const char **argv) return aarch64_rewrite_selected_cpu (argv[argc - 1]); } +struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER; + #undef AARCH64_CPU_NAME_LENGTH diff --git a/gcc/common/config/i386/i386-common.c b/gcc/common/config/i386/i386-common.c index 2629ae62a28..3d961320ed2 100644 --- a/gcc/common/config/i386/i386-common.c +++ b/gcc/common/config/i386/i386-common.c @@ -59,7 +59,7 @@ along with GCC; see the file COPYING3. If not see #define OPTION_MASK_ISA_FXSR_SET OPTION_MASK_ISA_FXSR #define OPTION_MASK_ISA_XSAVE_SET OPTION_MASK_ISA_XSAVE #define OPTION_MASK_ISA_XSAVEOPT_SET \ - (OPTION_MASK_ISA_XSAVEOPT | OPTION_MASK_ISA_XSAVE) + (OPTION_MASK_ISA_XSAVEOPT | OPTION_MASK_ISA_XSAVE_SET) #define OPTION_MASK_ISA_AVX512F_SET \ (OPTION_MASK_ISA_AVX512F | OPTION_MASK_ISA_AVX2_SET) #define OPTION_MASK_ISA_AVX512CD_SET \ @@ -95,9 +95,9 @@ along with GCC; see the file COPYING3. If not see #define OPTION_MASK_ISA_PREFETCHWT1_SET OPTION_MASK_ISA_PREFETCHWT1 #define OPTION_MASK_ISA_CLFLUSHOPT_SET OPTION_MASK_ISA_CLFLUSHOPT #define OPTION_MASK_ISA_XSAVES_SET \ - (OPTION_MASK_ISA_XSAVES | OPTION_MASK_ISA_XSAVE) + (OPTION_MASK_ISA_XSAVES | OPTION_MASK_ISA_XSAVE_SET) #define OPTION_MASK_ISA_XSAVEC_SET \ - (OPTION_MASK_ISA_XSAVEC | OPTION_MASK_ISA_XSAVE) + (OPTION_MASK_ISA_XSAVEC | OPTION_MASK_ISA_XSAVE_SET) #define OPTION_MASK_ISA_CLWB_SET OPTION_MASK_ISA_CLWB /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same @@ -183,7 +183,8 @@ along with GCC; see the file COPYING3. If not see #define OPTION_MASK_ISA_FMA_UNSET OPTION_MASK_ISA_FMA #define OPTION_MASK_ISA_FXSR_UNSET OPTION_MASK_ISA_FXSR #define OPTION_MASK_ISA_XSAVE_UNSET \ - (OPTION_MASK_ISA_XSAVE | OPTION_MASK_ISA_XSAVEOPT_UNSET) + (OPTION_MASK_ISA_XSAVE | OPTION_MASK_ISA_XSAVEOPT_UNSET \ + | OPTION_MASK_ISA_XSAVES_UNSET | OPTION_MASK_ISA_XSAVEC_UNSET) #define OPTION_MASK_ISA_XSAVEOPT_UNSET OPTION_MASK_ISA_XSAVEOPT #define OPTION_MASK_ISA_AVX2_UNSET \ (OPTION_MASK_ISA_AVX2 | OPTION_MASK_ISA_AVX512F_UNSET) diff --git a/gcc/config.gcc b/gcc/config.gcc index 262d6253078..23cc6dcce46 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -647,7 +647,7 @@ x86_cpus="generic intel" # Common parts for widely ported systems. case ${target} in *-*-darwin*) - tmake_file="t-darwin ${cpu_type}/t-darwin" + tmake_file="t-darwin " tm_file="${tm_file} darwin.h" case ${target} in *-*-darwin9*) @@ -1077,7 +1077,10 @@ arc*-*-linux*) case ${with_endian} in big*) tm_file="arc/big.h ${tm_file}" esac - ;; + # Force .init_array support. The configure script cannot always + # automatically detect that GAS supports it, yet we require it. + gcc_cv_initfini_array=yes + ;; arm-wrs-vxworks|arm-wrs-vxworks7) extra_options="${extra_options} arm/vxworks.opt" tmake_file="${tmake_file} arm/t-arm arm/t-vxworks" @@ -1476,16 +1479,25 @@ hppa[12]*-*-hpux11*) dwarf2=no fi ;; +i[34567]86-*-darwin1[89]*) + echo "Error: 32bit target is not supported after Darwin17" 1>&2 + ;; i[34567]86-*-darwin*) need_64bit_isa=yes # Baseline choice for a machine that allows m64 support. with_cpu=${with_cpu:-core2} + tmake_file="${tmake_file} ${cpu_type}/t-darwin32-biarch t-slibgcc" + tm_file="${tm_file} ${cpu_type}/darwin32-biarch.h" + ;; +x86_64-*-darwin1[89]* | x86_64-*-darwin2[01]*) + # Only 64b from now + with_cpu=${with_cpu:-core2} tmake_file="${tmake_file} t-slibgcc" ;; x86_64-*-darwin*) with_cpu=${with_cpu:-core2} - tmake_file="${tmake_file} ${cpu_type}/t-darwin64 t-slibgcc" - tm_file="${tm_file} ${cpu_type}/darwin64.h" + tmake_file="${tmake_file} ${cpu_type}/t-darwin64-biarch t-slibgcc" + tm_file="${tm_file} ${cpu_type}/darwin64-biarch.h" ;; i[34567]86-*-elfiamcu) tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h newlib-stdint.h i386/iamcu.h" @@ -2383,16 +2395,23 @@ pdp11-*-*) # extra_headers= # ;; powerpc-*-darwin*) - extra_options="${extra_options} rs6000/darwin.opt" + extra_options="${extra_options} ${cpu_type}/darwin.opt" case ${target} in - *-darwin1[0-9]* | *-darwin[8-9]*) - tmake_file="${tmake_file} rs6000/t-darwin8" - tm_file="${tm_file} rs6000/darwin8.h" + *-darwin1[0-9]* | *-darwin9*) + tmake_file="${tmake_file} ${cpu_type}/t-darwin32-biarch" + tm_file="${tm_file} ${cpu_type}/darwin32-biarch.h" + ;; + *-darwin8*) + tmake_file="${tmake_file} ${cpu_type}/t-darwin32-biarch" + tm_file="${tm_file} ${cpu_type}/darwin32-biarch.h" + tm_file="${tm_file} ${cpu_type}/darwin8.h" ;; *-darwin7*) - tm_file="${tm_file} rs6000/darwin7.h" + tm_file="${tm_file} ${cpu_type}/darwin7.h" ;; - *-darwin[0-6]*) + *-darwin[456]*) + # Earlier - ingle arch, with 32b only + # OS X 10.0, the first edition is Darwin4 ;; esac tmake_file="${tmake_file} t-slibgcc" @@ -2400,8 +2419,8 @@ powerpc-*-darwin*) ;; powerpc64-*-darwin*) extra_options="${extra_options} ${cpu_type}/darwin.opt" - tmake_file="${tmake_file} ${cpu_type}/t-darwin64 t-slibgcc" - tm_file="${tm_file} ${cpu_type}/darwin8.h ${cpu_type}/darwin64.h" + tmake_file="${tmake_file} ${cpu_type}/t-darwin64-biarch t-slibgcc" + tm_file="${tm_file} ${cpu_type}/darwin64-biarch.h" extra_headers=altivec.h ;; powerpc*-*-freebsd*) @@ -4455,14 +4474,12 @@ case "${target}" in echo "#undef LINK_OS_EXTRA_SPEC32" echo "#define LINK_OS_EXTRA_SPEC32" \ "\"%(link_os_new_dtags)" \ - "-rpath $prefix/lib -rpath $at/lib" \ - "-L $prefix/lib -L $at/lib\"" + "-rpath $prefix/lib -rpath $at/lib\"" echo echo "#undef LINK_OS_EXTRA_SPEC64" echo "#define LINK_OS_EXTRA_SPEC64" \ "\"%(link_os_new_dtags)" \ - "-rpath $prefix/lib64 -rpath $at/lib64" \ - "-L $prefix/lib64 -L $at/lib64\"" + "-rpath $prefix/lib64 -rpath $at/lib64\"" echo echo "#undef LINK_OS_NEW_DTAGS_SPEC" echo "#define LINK_OS_NEW_DTAGS_SPEC" \ @@ -4475,7 +4492,10 @@ case "${target}" in echo "#define MD_EXEC_PREFIX \"$at/bin/\"" echo echo "#undef MD_STARTFILE_PREFIX" - echo "#define MD_STARTFILE_PREFIX \"$at/lib/\"") \ + echo "#define MD_STARTFILE_PREFIX \"$prefix/lib/\"" + echo + echo "#undef MD_STARTFILE_PREFIX_1" + echo "#define MD_STARTFILE_PREFIX_1 \"$at/lib/\"") \ > advance-toolchain.h else echo "Unknown advance-toolchain $with_advance_toolchain" @@ -4684,7 +4704,10 @@ case ${target} in ;; i[34567]86-*-dragonfly* | x86_64-*-dragonfly*) ;; - i[34567]86-*-freebsd* | x86_64-*-freebsd*) + i[34567]86-*-freebsd*) + ;; + x86_64-*-freebsd*) + tmake_file="${tmake_file} i386/t-freebsd64" ;; ia64*-*-linux*) ;; diff --git a/gcc/config/aarch64/aarch64-c.c b/gcc/config/aarch64/aarch64-c.c index 40c738c7c3b..108c0120394 100644 --- a/gcc/config/aarch64/aarch64-c.c +++ b/gcc/config/aarch64/aarch64-c.c @@ -146,6 +146,7 @@ aarch64_update_cpp_builtins (cpp_reader *pfile) builtin_define_with_int_value ("__ARM_FEATURE_SVE_BITS", bits); } + aarch64_def_or_undef (TARGET_LSE, "__ARM_FEATURE_ATOMICS", pfile); aarch64_def_or_undef (TARGET_AES, "__ARM_FEATURE_AES", pfile); aarch64_def_or_undef (TARGET_SHA2, "__ARM_FEATURE_SHA2", pfile); aarch64_def_or_undef (TARGET_SHA3, "__ARM_FEATURE_SHA3", pfile); diff --git a/gcc/config/aarch64/aarch64-cores.def b/gcc/config/aarch64/aarch64-cores.def index 33b96ca2861..f48b7c22b2d 100644 --- a/gcc/config/aarch64/aarch64-cores.def +++ b/gcc/config/aarch64/aarch64-cores.def @@ -85,6 +85,9 @@ AARCH64_CORE("thunderx2t99", thunderx2t99, thunderx2t99, 8_1A, AARCH64_FL_FOR /* ARM ('A') cores. */ AARCH64_CORE("cortex-a55", cortexa55, cortexa53, 8_2A, AARCH64_FL_FOR_ARCH8_2 | AARCH64_FL_F16 | AARCH64_FL_RCPC | AARCH64_FL_DOTPROD, cortexa53, 0x41, 0xd05, -1) AARCH64_CORE("cortex-a75", cortexa75, cortexa57, 8_2A, AARCH64_FL_FOR_ARCH8_2 | AARCH64_FL_F16 | AARCH64_FL_RCPC | AARCH64_FL_DOTPROD, cortexa73, 0x41, 0xd0a, -1) +AARCH64_CORE("cortex-a76", cortexa76, cortexa57, 8_2A, AARCH64_FL_FOR_ARCH8_2 | AARCH64_FL_F16 | AARCH64_FL_RCPC | AARCH64_FL_DOTPROD, cortexa72, 0x41, 0xd0b, -1) +AARCH64_CORE("ares", ares, cortexa57, 8_2A, AARCH64_FL_FOR_ARCH8_2 | AARCH64_FL_F16 | AARCH64_FL_RCPC | AARCH64_FL_DOTPROD, cortexa72, 0x41, 0xd0c, -1) +AARCH64_CORE("neoverse-n1", neoversen1,cortexa57, 8_2A, AARCH64_FL_FOR_ARCH8_2 | AARCH64_FL_F16 | AARCH64_FL_RCPC | AARCH64_FL_DOTPROD, cortexa72, 0x41, 0xd0c, -1) /* ARMv8.3-A Architecture Processors. */ diff --git a/gcc/config/aarch64/aarch64-option-extensions.def b/gcc/config/aarch64/aarch64-option-extensions.def index 5fe5e3f7ddd..a575448e406 100644 --- a/gcc/config/aarch64/aarch64-option-extensions.def +++ b/gcc/config/aarch64/aarch64-option-extensions.def @@ -21,88 +21,97 @@ Before using #include to read this file, define a macro: - AARCH64_OPT_EXTENSION(EXT_NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) - - EXT_NAME is the name of the extension, represented as a string constant. - FLAGS_CANONICAL is the canonical internal name for this flag. - FLAGS_ON are the bitwise-or of the features that enabling the extension - adds, or zero if enabling this extension has no effect on other features. - FLAGS_OFF are the bitwise-or of the features that disabling the extension - removes, or zero if disabling this extension has no effect on other - features. - FEAT_STRING is a string containing the entries in the 'Features' field of - /proc/cpuinfo on a GNU/Linux system that correspond to this architecture - extension being available. Sometimes multiple entries are needed to enable - the extension (for example, the 'crypto' extension depends on four - entries: aes, pmull, sha1, sha2 being present). In that case this field - should contain a space (" ") separated list of the strings in 'Features' - that are required. Their order is not important. */ + AARCH64_OPT_EXTENSION(EXT_NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, + SYNTHETIC, FEATURE_STRING) + + - EXT_NAME is the name of the extension, represented as a string constant. + - FLAGS_CANONICAL is the canonical internal name for this flag. + - FLAGS_ON are the bitwise-or of the features that enabling the extension + adds, or zero if enabling this extension has no effect on other features. + - FLAGS_OFF are the bitwise-or of the features that disabling the extension + removes, or zero if disabling this extension has no effect on other + features. + - SYNTHETIC is a boolean to indicate whether the option is a purely synthetic + grouping of options and that the option itself has no feature bit (e.g. + crypto). This is used to determine when sum of the individual options in + FLAGS_ON can be replaced by FLAG_CANONICAL in options minimization. If the + group is synthetic then they can be replaced when all options in FLAGS_ON + are enabled, otherwise they can only be replaced when + FLAGS_ON | FLAG_CANONICAL are enabled. + - FEAT_STRING is a string containing the entries in the 'Features' field of + /proc/cpuinfo on a GNU/Linux system that correspond to this architecture + extension being available. Sometimes multiple entries are needed to enable + the extension (for example, the 'crypto' extension depends on four + entries: aes, pmull, sha1, sha2 being present). In that case this field + should contain a space (" ") separated list of the strings in 'Features' + that are required. Their order is not important. An empty string means + do not detect this feature during auto detection. */ + +/* NOTE: This file is being parsed by config.gcc and so the + AARCH64_OPT_EXTENSION must adhere to a strict format: + 1) No space between the AARCH64_OPT_EXTENSION and the opening (. + 2) No space between the opening ( and the extension name. + 3) No space after the extension name before the ,. + 4) Spaces are only allowed after a , and around |. + 5) Everything must be on one line. */ /* Enabling "fp" just enables "fp". Disabling "fp" also disables "simd", "crypto", "fp16", "aes", "sha2", "sha3", sm3/sm4 and "sve". */ -AARCH64_OPT_EXTENSION("fp", AARCH64_FL_FP, 0, AARCH64_FL_SIMD | AARCH64_FL_CRYPTO |\ - AARCH64_FL_F16 | AARCH64_FL_AES | AARCH64_FL_SHA2 |\ - AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE, "fp") +AARCH64_OPT_EXTENSION("fp", AARCH64_FL_FP, 0, AARCH64_FL_SIMD | AARCH64_FL_CRYPTO | AARCH64_FL_F16 | AARCH64_FL_AES | AARCH64_FL_SHA2 | AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE, false, "fp") /* Enabling "simd" also enables "fp". Disabling "simd" also disables "crypto", "dotprod", "aes", "sha2", "sha3", "sm3/sm4" and "sve". */ -AARCH64_OPT_EXTENSION("simd", AARCH64_FL_SIMD, AARCH64_FL_FP, AARCH64_FL_CRYPTO |\ - AARCH64_FL_DOTPROD | AARCH64_FL_AES | AARCH64_FL_SHA2 |\ - AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE, - "asimd") +AARCH64_OPT_EXTENSION("simd", AARCH64_FL_SIMD, AARCH64_FL_FP, AARCH64_FL_CRYPTO | AARCH64_FL_DOTPROD | AARCH64_FL_AES | AARCH64_FL_SHA2 | AARCH64_FL_SHA3 | AARCH64_FL_SM4 | AARCH64_FL_SVE, false, "asimd") -/* Enabling "crypto" also enables "fp" and "simd". +/* Enabling "crypto" also enables "fp", "simd", "aes" and "sha2". Disabling "crypto" disables "crypto", "aes", "sha2", "sha3" and "sm3/sm4". */ -AARCH64_OPT_EXTENSION("crypto", AARCH64_FL_CRYPTO, AARCH64_FL_FP | AARCH64_FL_SIMD,\ - AARCH64_FL_AES | AARCH64_FL_SHA2 |AARCH64_FL_SHA3 | AARCH64_FL_SM4,\ - "aes pmull sha1 sha2") +AARCH64_OPT_EXTENSION("crypto", AARCH64_FL_CRYPTO, AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_AES | AARCH64_FL_SHA2, AARCH64_FL_AES | AARCH64_FL_SHA2 |AARCH64_FL_SHA3 | AARCH64_FL_SM4, true, "aes pmull sha1 sha2") /* Enabling or disabling "crc" only changes "crc". */ -AARCH64_OPT_EXTENSION("crc", AARCH64_FL_CRC, 0, 0, "crc32") +AARCH64_OPT_EXTENSION("crc", AARCH64_FL_CRC, 0, 0, false, "crc32") /* Enabling or disabling "lse" only changes "lse". */ -AARCH64_OPT_EXTENSION("lse", AARCH64_FL_LSE, 0, 0, "atomics") +AARCH64_OPT_EXTENSION("lse", AARCH64_FL_LSE, 0, 0, false, "atomics") /* Enabling "fp16" also enables "fp". Disabling "fp16" disables "fp16", "fp16fml" and "sve". */ -AARCH64_OPT_EXTENSION("fp16", AARCH64_FL_F16, AARCH64_FL_FP, - AARCH64_FL_F16FML | AARCH64_FL_SVE, "fphp asimdhp") +AARCH64_OPT_EXTENSION("fp16", AARCH64_FL_F16, AARCH64_FL_FP, AARCH64_FL_F16FML | AARCH64_FL_SVE, false, "fphp asimdhp") /* Enabling or disabling "rcpc" only changes "rcpc". */ -AARCH64_OPT_EXTENSION("rcpc", AARCH64_FL_RCPC, 0, 0, "lrcpc") +AARCH64_OPT_EXTENSION("rcpc", AARCH64_FL_RCPC, 0, 0, false, "lrcpc") /* Enabling "rdma" also enables "fp", "simd". Disabling "rdma" just disables "rdma". */ -AARCH64_OPT_EXTENSION("rdma", AARCH64_FL_RDMA, AARCH64_FL_FP | AARCH64_FL_SIMD, 0, "asimdrdm") +AARCH64_OPT_EXTENSION("rdma", AARCH64_FL_RDMA, AARCH64_FL_FP | AARCH64_FL_SIMD, 0, false, "asimdrdm") /* Enabling "dotprod" also enables "simd". Disabling "dotprod" only disables "dotprod". */ -AARCH64_OPT_EXTENSION("dotprod", AARCH64_FL_DOTPROD, AARCH64_FL_SIMD, 0, "asimddp") +AARCH64_OPT_EXTENSION("dotprod", AARCH64_FL_DOTPROD, AARCH64_FL_SIMD, 0, false, "asimddp") /* Enabling "aes" also enables "simd". Disabling "aes" just disables "aes". */ -AARCH64_OPT_EXTENSION("aes", AARCH64_FL_AES, AARCH64_FL_SIMD, 0, "aes") +AARCH64_OPT_EXTENSION("aes", AARCH64_FL_AES, AARCH64_FL_SIMD, 0, false, "aes") /* Enabling "sha2" also enables "simd". Disabling "sha2" just disables "sha2". */ -AARCH64_OPT_EXTENSION("sha2", AARCH64_FL_SHA2, AARCH64_FL_SIMD, 0, "sha1 sha2") +AARCH64_OPT_EXTENSION("sha2", AARCH64_FL_SHA2, AARCH64_FL_SIMD, 0, false, "sha1 sha2") /* Enabling "sha3" enables "simd" and "sha2". Disabling "sha3" just disables "sha3". */ -AARCH64_OPT_EXTENSION("sha3", AARCH64_FL_SHA3, AARCH64_FL_SIMD | AARCH64_FL_SHA2, 0, "sha3 sha512") +AARCH64_OPT_EXTENSION("sha3", AARCH64_FL_SHA3, AARCH64_FL_SIMD | AARCH64_FL_SHA2, 0, false, "sha3 sha512") /* Enabling "sm4" also enables "simd". Disabling "sm4" just disables "sm4". */ -AARCH64_OPT_EXTENSION("sm4", AARCH64_FL_SM4, AARCH64_FL_SIMD, 0, "sm3 sm4") +AARCH64_OPT_EXTENSION("sm4", AARCH64_FL_SM4, AARCH64_FL_SIMD, 0, false, "sm3 sm4") /* Enabling "fp16fml" also enables "fp" and "fp16". Disabling "fp16fml" just disables "fp16fml". */ -AARCH64_OPT_EXTENSION("fp16fml", AARCH64_FL_F16FML, AARCH64_FL_FP | AARCH64_FL_F16, 0, "asimdfml") +AARCH64_OPT_EXTENSION("fp16fml", AARCH64_FL_F16FML, AARCH64_FL_FP | AARCH64_FL_F16, 0, false, "asimdfml") /* Enabling "sve" also enables "fp16", "fp" and "simd". Disabling "sve" just disables "sve". */ -AARCH64_OPT_EXTENSION("sve", AARCH64_FL_SVE, AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_F16, 0, "sve") +AARCH64_OPT_EXTENSION("sve", AARCH64_FL_SVE, AARCH64_FL_FP | AARCH64_FL_SIMD | AARCH64_FL_F16, 0, false, "sve") #undef AARCH64_OPT_EXTENSION diff --git a/gcc/config/aarch64/aarch64-tune.md b/gcc/config/aarch64/aarch64-tune.md index 7b3a7460561..f08b7e44b27 100644 --- a/gcc/config/aarch64/aarch64-tune.md +++ b/gcc/config/aarch64/aarch64-tune.md @@ -1,5 +1,5 @@ ;; -*- buffer-read-only: t -*- ;; Generated automatically by gentune.sh from aarch64-cores.def (define_attr "tune" - "cortexa35,cortexa53,cortexa57,cortexa72,cortexa73,thunderx,thunderxt88p1,thunderxt88,thunderxt81,thunderxt83,xgene1,falkor,qdf24xx,exynosm1,thunderx2t99p1,vulcan,thunderx2t99,cortexa55,cortexa75,saphira,cortexa57cortexa53,cortexa72cortexa53,cortexa73cortexa35,cortexa73cortexa53,cortexa75cortexa55" + "cortexa35,cortexa53,cortexa57,cortexa72,cortexa73,thunderx,thunderxt88p1,thunderxt88,thunderxt81,thunderxt83,xgene1,falkor,qdf24xx,exynosm1,thunderx2t99p1,vulcan,thunderx2t99,cortexa55,cortexa75,cortexa76,ares,neoversen1,saphira,cortexa57cortexa53,cortexa72cortexa53,cortexa73cortexa35,cortexa73cortexa53,cortexa75cortexa55" (const (symbol_ref "((enum attr_tune) aarch64_tune)"))) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 175f13dc264..64eab084683 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -325,7 +325,7 @@ static const struct cpu_addrcost_table qdf24xx_addrcost_table = 1, /* pre_modify */ 1, /* post_modify */ 3, /* register_offset */ - 4, /* register_sextend */ + 3, /* register_sextend */ 3, /* register_zextend */ 2, /* imm_offset */ }; @@ -426,6 +426,26 @@ static const struct cpu_vector_cost generic_vector_cost = 1 /* cond_not_taken_branch_cost */ }; +/* QDF24XX costs for vector insn classes. */ +static const struct cpu_vector_cost qdf24xx_vector_cost = +{ + 1, /* scalar_int_stmt_cost */ + 1, /* scalar_fp_stmt_cost */ + 1, /* scalar_load_cost */ + 1, /* scalar_store_cost */ + 1, /* vec_int_stmt_cost */ + 3, /* vec_fp_stmt_cost */ + 2, /* vec_permute_cost */ + 1, /* vec_to_scalar_cost */ + 1, /* scalar_to_vec_cost */ + 1, /* vec_align_load_cost */ + 1, /* vec_unalign_load_cost */ + 1, /* vec_unalign_store_cost */ + 1, /* vec_store_cost */ + 3, /* cond_taken_branch_cost */ + 1 /* cond_not_taken_branch_cost */ +}; + /* ThunderX costs for vector insn classes. */ static const struct cpu_vector_cost thunderx_vector_cost = { @@ -874,7 +894,7 @@ static const struct tune_params qdf24xx_tunings = &qdf24xx_extra_costs, &qdf24xx_addrcost_table, &qdf24xx_regmove_cost, - &generic_vector_cost, + &qdf24xx_vector_cost, &generic_branch_cost, &generic_approx_modes, 4, /* memmov_cost */ @@ -7074,8 +7094,13 @@ aarch64_print_address_internal (FILE *f, machine_mode mode, rtx x, unsigned int size; /* Check all addresses are Pmode - including ILP32. */ - if (GET_MODE (x) != Pmode) - output_operand_lossage ("invalid address mode"); + if (GET_MODE (x) != Pmode + && (!CONST_INT_P (x) + || trunc_int_for_mode (INTVAL (x), Pmode) != INTVAL (x))) + { + output_operand_lossage ("invalid address mode"); + return false; + } if (aarch64_classify_address (&addr, x, mode, true, type)) switch (addr.type) @@ -8405,7 +8430,8 @@ aarch64_mask_and_shift_for_ubfiz_p (scalar_int_mode mode, rtx mask, return CONST_INT_P (mask) && CONST_INT_P (shft_amnt) && INTVAL (shft_amnt) < GET_MODE_BITSIZE (mode) && exact_log2 ((INTVAL (mask) >> INTVAL (shft_amnt)) + 1) >= 0 - && (INTVAL (mask) & ((1 << INTVAL (shft_amnt)) - 1)) == 0; + && (INTVAL (mask) + & ((HOST_WIDE_INT_1U << INTVAL (shft_amnt)) - 1)) == 0; } /* Calculate the cost of calculating X, storing it in *COST. Result @@ -15597,7 +15623,7 @@ aarch64_expand_vec_perm_const_1 (struct expand_vec_perm_d *d) return true; if (d->vec_flags == VEC_SVE_DATA) return aarch64_evpc_sve_tbl (d); - else if (d->vec_flags == VEC_SVE_DATA) + else if (d->vec_flags == VEC_ADVSIMD) return aarch64_evpc_tbl (d); } return false; @@ -16498,8 +16524,6 @@ aarch_macro_fusion_pair_p (rtx_insn *prev, rtx_insn *curr) if (aarch64_fusion_enabled_p (AARCH64_FUSE_CMP_BRANCH) && any_condjump_p (curr)) { - enum attr_type prev_type = get_attr_type (prev); - unsigned int condreg1, condreg2; rtx cc_reg_1; aarch64_fixed_condition_code_regs (&condreg1, &condreg2); @@ -16509,6 +16533,8 @@ aarch_macro_fusion_pair_p (rtx_insn *prev, rtx_insn *curr) && prev && modified_in_p (cc_reg_1, prev)) { + enum attr_type prev_type = get_attr_type (prev); + /* FIXME: this misses some which is considered simple arthematic instructions for ThunderX. Simple shifts are missed here. */ if (prev_type == TYPE_ALUS_SREG diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 32a0e1f3685..82db038c77a 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -189,6 +189,7 @@ UNSPEC_CLASTB UNSPEC_FADDA UNSPEC_REV_SUBREG + UNSPEC_COPYSIGN ]) (define_c_enum "unspecv" [ @@ -974,8 +975,8 @@ (match_operand:GPI 1 "general_operand" ""))] "" " - if (MEM_P (operands[0]) && CONST_INT_P (operands[1]) - && mode == DImode + if (MEM_P (operands[0]) && !MEM_VOLATILE_P (operands[0]) + && CONST_INT_P (operands[1]) && mode == DImode && aarch64_split_dimode_const_store (operands[0], operands[1])) DONE; @@ -5412,7 +5413,7 @@ [(match_operand:GPI 0 "register_operand") (match_operand:GPF 1 "register_operand")] "TARGET_FLOAT - && ((GET_MODE_SIZE (mode) <= GET_MODE_SIZE (mode)) + && ((GET_MODE_BITSIZE (mode) <= LONG_TYPE_SIZE) || !flag_trapping_math || flag_fp_int_builtin_inexact)" { rtx cvt = gen_reg_rtx (mode); @@ -5427,49 +5428,48 @@ ;; LDR d2, #(1 << 63) ;; BSL v2.8b, [y], [x] ;; -;; or another, equivalent, sequence using one of BSL/BIT/BIF. -;; aarch64_simd_bsldf will select the best suited of these instructions -;; to generate based on register allocation, and knows how to partially -;; constant fold based on the values of X and Y, so expand through that. - -(define_expand "copysigndf3" - [(match_operand:DF 0 "register_operand") - (match_operand:DF 1 "register_operand") - (match_operand:DF 2 "register_operand")] +;; or another, equivalent, sequence using one of BSL/BIT/BIF. Because +;; we expect these operations to nearly always operate on +;; floating-point values, we do not want the operation to be +;; simplified into a bit-field insert operation that operates on the +;; integer side, since typically that would involve three inter-bank +;; register copies. As we do not expect copysign to be followed by +;; other logical operations on the result, it seems preferable to keep +;; this as an unspec operation, rather than exposing the underlying +;; logic to the compiler. + +(define_expand "copysign3" + [(match_operand:GPF 0 "register_operand") + (match_operand:GPF 1 "register_operand") + (match_operand:GPF 2 "register_operand")] "TARGET_FLOAT && TARGET_SIMD" { - rtx mask = gen_reg_rtx (DImode); - emit_move_insn (mask, GEN_INT (HOST_WIDE_INT_1U << 63)); - emit_insn (gen_aarch64_simd_bsldf (operands[0], mask, - operands[2], operands[1])); + rtx bitmask = gen_reg_rtx (mode); + emit_move_insn (bitmask, GEN_INT (HOST_WIDE_INT_M1U + << (GET_MODE_BITSIZE (mode) - 1))); + emit_insn (gen_copysign3_insn (operands[0], operands[1], operands[2], + bitmask)); DONE; } ) -;; As above, but we must first get to a 64-bit value if we wish to use -;; aarch64_simd_bslv2sf. - -(define_expand "copysignsf3" - [(match_operand:SF 0 "register_operand") - (match_operand:SF 1 "register_operand") - (match_operand:SF 2 "register_operand")] +(define_insn "copysign3_insn" + [(set (match_operand:GPF 0 "register_operand" "=w,w,w,r") + (unspec:GPF [(match_operand:GPF 1 "register_operand" "w,0,w,r") + (match_operand:GPF 2 "register_operand" "w,w,0,0") + (match_operand: 3 "register_operand" + "0,w,w,X")] + UNSPEC_COPYSIGN))] "TARGET_FLOAT && TARGET_SIMD" -{ - rtx v_bitmask = gen_reg_rtx (V2SImode); - - /* Juggle modes to get us in to a vector mode for BSL. */ - rtx op1 = lowpart_subreg (DImode, operands[1], SFmode); - rtx op2 = lowpart_subreg (V2SFmode, operands[2], SFmode); - rtx tmp = gen_reg_rtx (V2SFmode); - emit_move_insn (v_bitmask, - aarch64_simd_gen_const_vector_dup (V2SImode, - HOST_WIDE_INT_M1U << 31)); - emit_insn (gen_aarch64_simd_bslv2sf (tmp, v_bitmask, op2, op1)); - emit_move_insn (operands[0], lowpart_subreg (SFmode, tmp, V2SFmode)); - DONE; -} + "@ + bsl\\t%0., %2., %1. + bit\\t%0., %2., %3. + bif\\t%0., %1., %3. + bfxil\\t%0, %1, #0, " + [(set_attr "type" "neon_bsl,neon_bsl,neon_bsl,bfm")] ) + ;; For xorsign (x, y), we want to generate: ;; ;; LDR d2, #1<<63 diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index c45c29ae815..115cedcaa5b 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -31971,7 +31971,7 @@ vdotq_laneq_s32 (int32x4_t __r, int8x16_t __a, int8x16_t __b, const int __index) #pragma GCC pop_options #pragma GCC push_options -#pragma GCC target(("arch=armv8.2-a+sm4")) +#pragma GCC target ("arch=armv8.2-a+sm4") __extension__ extern __inline uint32x4_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) @@ -32038,7 +32038,7 @@ vsm4ekeyq_u32 (uint32x4_t __a, uint32x4_t __b) #pragma GCC pop_options #pragma GCC push_options -#pragma GCC target(("arch=armv8.2-a+crypto")) +#pragma GCC target ("arch=armv8.2-a+sha3") __extension__ extern __inline uint64x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) @@ -32098,7 +32098,7 @@ vbcaxq_u16 (uint16x8_t __a, uint16x8_t __b, uint16x8_t __c) #pragma GCC pop_options #pragma GCC push_options -#pragma GCC target(("arch=armv8.2-a+fp16fml")) +#pragma GCC target ("arch=armv8.2-a+fp16fml") __extension__ extern __inline float32x2_t __attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) diff --git a/gcc/config/aarch64/driver-aarch64.c b/gcc/config/aarch64/driver-aarch64.c index 4e83c7a7679..823b9bd9fce 100644 --- a/gcc/config/aarch64/driver-aarch64.c +++ b/gcc/config/aarch64/driver-aarch64.c @@ -36,7 +36,8 @@ struct aarch64_arch_extension const char *feat_string; }; -#define AARCH64_OPT_EXTENSION(EXT_NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, FEATURE_STRING) \ +#define AARCH64_OPT_EXTENSION(EXT_NAME, FLAG_CANONICAL, FLAGS_ON, FLAGS_OFF, \ + SYNTHETIC, FEATURE_STRING) \ { EXT_NAME, FLAG_CANONICAL, FEATURE_STRING }, static struct aarch64_arch_extension aarch64_extensions[] = { @@ -178,7 +179,6 @@ host_detect_local_cpu (int argc, const char **argv) unsigned int variants[2] = { ALL_VARIANTS, ALL_VARIANTS }; unsigned int n_variants = 0; bool processed_exts = false; - const char *ext_string = ""; unsigned long extension_flags = 0; unsigned long default_flags = 0; @@ -249,27 +249,35 @@ host_detect_local_cpu (int argc, const char **argv) { for (i = 0; i < num_exts; i++) { - char *p = NULL; - char *feat_string - = concat (aarch64_extensions[i].feat_string, NULL); + const char *p = aarch64_extensions[i].feat_string; + + /* If the feature contains no HWCAPS string then ignore it for the + auto detection. */ + if (*p == '\0') + continue; + bool enabled = true; /* This may be a multi-token feature string. We need - to match all parts, which could be in any order. - If this isn't a multi-token feature string, strtok is - just going to return a pointer to feat_string. */ - p = strtok (feat_string, " "); - while (p != NULL) + to match all parts, which could be in any order. */ + size_t len = strlen (buf); + do { - if (strstr (buf, p) == NULL) + const char *end = strchr (p, ' '); + if (end == NULL) + end = strchr (p, '\0'); + if (memmem (buf, len, p, end - p) == NULL) { /* Failed to match this token. Turn off the features we'd otherwise enable. */ enabled = false; break; } - p = strtok (NULL, " "); + if (*end == '\0') + break; + p = end + 1; } + while (1); if (enabled) extension_flags |= aarch64_extensions[i].flag; @@ -348,23 +356,24 @@ host_detect_local_cpu (int argc, const char **argv) if (tune) return res; - ext_string - = aarch64_get_extension_string_for_isa_flags (extension_flags, - default_flags).c_str (); - - res = concat (res, ext_string, NULL); + { + std::string extension + = aarch64_get_extension_string_for_isa_flags (extension_flags, + default_flags); + res = concat (res, extension.c_str (), NULL); + } return res; not_found: { /* If detection fails we ignore the option. - Clean up and return empty string. */ + Clean up and return NULL. */ if (f) fclose (f); - return ""; + return NULL; } } diff --git a/gcc/config/aarch64/falkor.md b/gcc/config/aarch64/falkor.md index 5cbc5150ef3..45cbff93b24 100644 --- a/gcc/config/aarch64/falkor.md +++ b/gcc/config/aarch64/falkor.md @@ -322,6 +322,12 @@ (eq_attr "type" "neon_from_gp_q")) "falkor_gtov,falkor_gtov") +;; DUP does not use vector pipes in Q mode, only gtov+gtov. +(define_insn_reservation "falkor_am_1_gtov_gtov" 1 + (and (eq_attr "tune" "falkor") + (eq_attr "type" "neon_dup_q")) + "falkor_gtov*2") + ;; neon_to_gp_q is used for 32-bit ARM instructions that move 64-bits of data ;; so no use needed here. @@ -337,7 +343,7 @@ (define_insn_reservation "falkor_am_1_vxvy_vxvy" 1 (and (eq_attr "tune" "falkor") - (eq_attr "type" "neon_bsl_q,neon_dup_q,neon_ext_q,neon_move_q,neon_rev_q,neon_tbl1_q,neon_permute_q")) + (eq_attr "type" "neon_bsl_q,neon_ext_q,neon_move_q,neon_rev_q,neon_tbl1_q,neon_permute_q")) "falkor_vxvy+falkor_vxvy") (define_insn_reservation "falkor_am_2_vxvy" 2 diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index 25991d97836..21d66d36f82 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -578,7 +578,8 @@ (define_mode_attr sizen [(QI "8") (HI "16") (SI "32") (DI "64")]) ;; Give the ordinal of the MSB in the mode -(define_mode_attr sizem1 [(QI "#7") (HI "#15") (SI "#31") (DI "#63")]) +(define_mode_attr sizem1 [(QI "#7") (HI "#15") (SI "#31") (DI "#63") + (HF "#15") (SF "#31") (DF "#63")]) ;; Attribute to describe constants acceptable in logical operations (define_mode_attr lconst [(SI "K") (DI "L")]) @@ -664,7 +665,7 @@ (V8HF "16b") (V2SF "8b") (V4SF "16b") (V2DF "16b") (DI "8b") (DF "8b") - (SI "8b")]) + (SI "8b") (SF "8b")]) ;; Define element mode for each vector mode. (define_mode_attr VEL [(V8QI "QI") (V16QI "QI") (VNx16QI "QI") diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 26d89f3ea13..ee95b4428ec 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -6377,8 +6377,40 @@ alpha_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p, offset = get_initialized_tmp_var (t, pre_p, NULL); indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false); + if (indirect) - type = build_pointer_type_for_mode (type, ptr_mode, true); + { + if (TREE_CODE (type) == COMPLEX_TYPE + && targetm.calls.split_complex_arg (type)) + { + tree real_part, imag_part, real_temp; + + tree ptr_type = build_pointer_type_for_mode (TREE_TYPE (type), + ptr_mode, true); + + real_part = alpha_gimplify_va_arg_1 (ptr_type, base, + offset, pre_p); + real_part = build_va_arg_indirect_ref (real_part); + + /* Copy the value into a new temporary, lest the formal temporary + be reused out from under us. */ + real_temp = get_initialized_tmp_var (real_part, pre_p, NULL); + + imag_part = alpha_gimplify_va_arg_1 (ptr_type, base, + offset, pre_p); + imag_part = build_va_arg_indirect_ref (imag_part); + + r = build2 (COMPLEX_EXPR, type, real_temp, imag_part); + + /* Stuff the offset temporary back into its field. */ + gimplify_assign (unshare_expr (offset_field), + fold_convert (TREE_TYPE (offset_field), offset), + pre_p); + return r; + } + else + type = build_pointer_type_for_mode (type, ptr_mode, true); + } /* Find the value. Note that this will be a stable indirection, or a composite of stable indirections in the case of complex. */ @@ -8803,6 +8835,9 @@ alpha_handle_trap_shadows (void) case CODE_LABEL: goto close_shadow; + case DEBUG_INSN: + break; + default: gcc_unreachable (); } diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index 1d3238565d5..b3b34ee041a 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -678,7 +678,7 @@ enum reg_class { #define CONSTANT_ADDRESS_P(X) \ (CONST_INT_P (X) \ - && (unsigned HOST_WIDE_INT) (INTVAL (X) + 0x8000) < 0x10000) + && (UINTVAL (X) + 0x8000) < 0x10000) /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx and check its validity for a certain class. diff --git a/gcc/config/arc/arc-protos.h b/gcc/config/arc/arc-protos.h index cb5909564ea..8464f2f772a 100644 --- a/gcc/config/arc/arc-protos.h +++ b/gcc/config/arc/arc-protos.h @@ -111,7 +111,7 @@ extern bool arc_legitimize_reload_address (rtx *, machine_mode, int, int); extern void arc_secondary_reload_conv (rtx, rtx, rtx, bool); extern void arc_cpu_cpp_builtins (cpp_reader *); extern bool arc_store_addr_hazard_p (rtx_insn *, rtx_insn *); -extern rtx arc_eh_return_address_location (void); +extern void arc_eh_return_address_location (rtx); extern bool arc_is_jli_call_p (rtx); extern void arc_file_end (void); extern bool arc_is_secure_call_p (rtx); diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index 77099899eb7..7cb99ba0959 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -3457,10 +3457,13 @@ arc_expand_epilogue (int sibcall_p) /* Return rtx for the location of the return address on the stack, suitable for use in __builtin_eh_return. The new return address will be written to this location in order to redirect the return to - the exception handler. */ + the exception handler. Our ABI says the blink is pushed first on + stack followed by an unknown number of register saves, and finally + by fp. Hence we cannot use the EH_RETURN_ADDRESS macro as the + stack is not finalized. */ -rtx -arc_eh_return_address_location (void) +void +arc_eh_return_address_location (rtx source) { rtx mem; int offset; @@ -3488,8 +3491,8 @@ arc_eh_return_address_location (void) remove this store seems perfectly sensible. Marking the memory address as volatile obviously has the effect of preventing DSE from removing the store. */ - MEM_VOLATILE_P (mem) = 1; - return mem; + MEM_VOLATILE_P (mem) = true; + emit_move_insn (mem, source); } /* PIC */ @@ -7303,7 +7306,17 @@ hwloop_optimize (hwloop_info loop) for (insn = loop->start_label; insn && insn != loop->loop_end; insn = NEXT_INSN (insn)) - length += NONDEBUG_INSN_P (insn) ? get_attr_length (insn) : 0; + { + length += NONDEBUG_INSN_P (insn) ? get_attr_length (insn) : 0; + if (JUMP_TABLES_IN_TEXT_SECTION + && JUMP_TABLE_DATA_P (insn)) + { + if (dump_file) + fprintf (dump_file, ";; loop %d has a jump table\n", + loop->loop_no); + return false; + } + } if (!insn) { @@ -9912,7 +9925,7 @@ arc_return_address_register (unsigned int fn_type) if (ARC_INTERRUPT_P (fn_type)) { - if (((fn_type & ARC_FUNCTION_ILINK1) | ARC_FUNCTION_FIRQ) != 0) + if ((fn_type & (ARC_FUNCTION_ILINK1 | ARC_FUNCTION_FIRQ)) != 0) regno = ILINK1_REGNUM; else if ((fn_type & ARC_FUNCTION_ILINK2) != 0) regno = ILINK2_REGNUM; diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h index a8d03ced643..dc65d3e8de6 100644 --- a/gcc/config/arc/arc.h +++ b/gcc/config/arc/arc.h @@ -811,15 +811,9 @@ extern int arc_initial_elimination_offset(int from, int to); #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ (OFFSET) = arc_initial_elimination_offset ((FROM), (TO)) -/* Output assembler code to FILE to increment profiler label # LABELNO - for profiling a function entry. */ -#define FUNCTION_PROFILER(FILE, LABELNO) \ - do { \ - if (flag_pic) \ - fprintf (FILE, "\tbl\t__mcount@plt\n"); \ - else \ - fprintf (FILE, "\tbl\t__mcount\n"); \ - } while (0) +/* All the work done in PROFILE_HOOK, but still required. */ +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER(STREAM, LABELNO) do { } while (0) #define NO_PROFILE_COUNTERS 1 @@ -1367,8 +1361,6 @@ do { \ #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 2) -#define EH_RETURN_HANDLER_RTX arc_eh_return_address_location () - /* Turn off splitting of long stabs. */ #define DBX_CONTIN_LENGTH 0 diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md index fcc6e0692dd..779a2aea368 100644 --- a/gcc/config/arc/arc.md +++ b/gcc/config/arc/arc.md @@ -162,6 +162,7 @@ VUNSPEC_ARC_SC VUNSPEC_ARC_LL VUNSPEC_ARC_BLOCKAGE + VUNSPEC_ARC_EH_RETURN ]) (define_constants @@ -6613,6 +6614,20 @@ [(set (reg:CC CC_REG) (compare:CC (match_dup 3) (ashift:SI (match_dup 1) (match_dup 2))))]) +;; Patterns for exception handling +(define_insn_and_split "eh_return" + [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")] + VUNSPEC_ARC_EH_RETURN)] + "" + "#" + "reload_completed" + [(const_int 0)] + " + { + arc_eh_return_address_location (operands[0]); + DONE; + }" +) ;; include the arc-FPX instructions (include "fpx.md") diff --git a/gcc/config/arc/atomic.md b/gcc/config/arc/atomic.md index 13a2e34549c..71d02318edc 100644 --- a/gcc/config/arc/atomic.md +++ b/gcc/config/arc/atomic.md @@ -44,7 +44,7 @@ { if (TARGET_HS) { - return "dmb"; + return "dmb\\t3"; } else { diff --git a/gcc/config/arc/elf.h b/gcc/config/arc/elf.h index 43ced3b720f..f0147613939 100644 --- a/gcc/config/arc/elf.h +++ b/gcc/config/arc/elf.h @@ -73,3 +73,12 @@ along with GCC; see the file COPYING3. If not see #undef TARGET_ASM_FILE_END #define TARGET_ASM_FILE_END arc_file_end + +/* Emit rtl for profiling. Output assembler code to FILE + to call "_mcount" for profiling a function entry. */ +#define PROFILE_HOOK(LABEL) \ + { \ + rtx fun; \ + fun = gen_rtx_SYMBOL_REF (Pmode, "__mcount"); \ + emit_library_call (fun, LCT_NORMAL, VOIDmode); \ + } diff --git a/gcc/config/arc/linux.h b/gcc/config/arc/linux.h index 4e87dfe3ac1..993f445d2a0 100644 --- a/gcc/config/arc/linux.h +++ b/gcc/config/arc/linux.h @@ -98,7 +98,7 @@ along with GCC; see the file COPYING3. If not see Signalize that because we have fde-glibc, we don't need all C shared libs linked against -lgcc_s. */ #undef LINK_EH_SPEC -#define LINK_EH_SPEC "--eh-frame-hdr" +#define LINK_EH_SPEC "--eh-frame-hdr " #endif #undef SUBTARGET_CPP_SPEC @@ -109,3 +109,27 @@ along with GCC; see the file COPYING3. If not see /* Build attribute: procedure call standard. */ #undef ATTRIBUTE_PCS #define ATTRIBUTE_PCS 3 + +/* Clear the instruction cache from `beg' to `end'. This makes an + inline system call to SYS_cacheflush. */ +#undef CLEAR_INSN_CACHE +#define CLEAR_INSN_CACHE(beg, end) \ +{ \ + register unsigned long _beg __asm ("r0") = (unsigned long) (beg); \ + register unsigned long _end __asm ("r1") = (unsigned long) (end); \ + register unsigned long _xtr __asm ("r2") = 0; \ + register unsigned long _scno __asm ("r8") = 244; \ + __asm __volatile ("trap_s 0 ; sys_cache_sync" \ + : "=r" (_beg) \ + : "0" (_beg), "r" (_end), "r" (_xtr), "r" (_scno)); \ +} + +/* Emit rtl for profiling. Output assembler code to FILE + to call "_mcount" for profiling a function entry. */ +#define PROFILE_HOOK(LABEL) \ + { \ + rtx fun, rt; \ + rt = get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM); \ + fun = gen_rtx_SYMBOL_REF (Pmode, "_mcount"); \ + emit_library_call (fun, LCT_NORMAL, VOIDmode, rt, Pmode); \ + } diff --git a/gcc/config/arm/arm-cpus.in b/gcc/config/arm/arm-cpus.in index 545321b0bbe..ba194a80229 100644 --- a/gcc/config/arm/arm-cpus.in +++ b/gcc/config/arm/arm-cpus.in @@ -96,6 +96,12 @@ define feature armv7em # Architecture rel 7. define feature armv7 +# MP extension to ArmV7-A +define feature mp + +# SEC extension to ArmV7-A +define feature sec + # ARM division instructions. define feature adiv @@ -240,7 +246,7 @@ define fgroup ARMv6m mode32 armv3m armv4 thumb armv5 armv5e armv6 be8 define fgroup ARMv7 ARMv6m thumb2 armv7 define fgroup ARMv7a ARMv7 notm armv6k -define fgroup ARMv7ve ARMv7a adiv tdiv lpae +define fgroup ARMv7ve ARMv7a adiv tdiv lpae mp sec define fgroup ARMv7r ARMv7a tdiv define fgroup ARMv7m ARMv7 tdiv define fgroup ARMv7em ARMv7m armv7em @@ -474,6 +480,8 @@ begin arch armv7-a base 7A profile A isa ARMv7a + option mp add mp + option sec add sec # fp => VFPv3-d16, simd => neon-vfpv3 option fp add VFPv3 FP_DBL optalias vfpv3-d16 fp @@ -525,6 +533,8 @@ begin arch armv7-r optalias vfpv3xd fp.sp option fp add VFPv3 FP_DBL optalias vfpv3-d16 fp + option vfpv3xd-fp16 add VFPv3 fp16conv + option vfpv3-d16-fp16 add VFPv3 FP_DBL fp16conv option idiv add adiv option nofp remove ALL_FP option noidiv remove adiv @@ -1222,6 +1232,8 @@ begin cpu generic-armv7-a cname genericv7a tune flags LDSCHED architecture armv7-a + option mp add mp + option sec add sec fpu vfpv3-d16 option vfpv3-d16 add VFPv3 FP_DBL option vfpv3 add VFPv3 FP_D32 @@ -1242,7 +1254,7 @@ end cpu generic-armv7-a begin cpu cortex-a5 cname cortexa5 tune flags LDSCHED - architecture armv7-a + architecture armv7-a+mp+sec fpu neon-fp16 option nosimd remove ALL_SIMD option nofp remove ALL_FP @@ -1262,7 +1274,7 @@ end cpu cortex-a7 begin cpu cortex-a8 cname cortexa8 tune flags LDSCHED - architecture armv7-a + architecture armv7-a+sec fpu neon-vfpv3 option nofp remove ALL_FP costs cortex_a8 @@ -1271,7 +1283,7 @@ end cpu cortex-a8 begin cpu cortex-a9 cname cortexa9 tune flags LDSCHED - architecture armv7-a + architecture armv7-a+mp+sec fpu neon-fp16 option nosimd remove ALL_SIMD option nofp remove ALL_FP @@ -1335,7 +1347,8 @@ begin cpu cortex-r7 cname cortexr7 tune flags LDSCHED architecture armv7-r+idiv - fpu vfpv3-d16 + fpu vfpv3-d16-fp16 + option nofp.dp remove FP_DBL option nofp remove ALL_FP costs cortex end cpu cortex-r7 @@ -1345,7 +1358,8 @@ begin cpu cortex-r8 tune for cortex-r7 tune flags LDSCHED architecture armv7-r+idiv - fpu vfpv3-d16 + fpu vfpv3-d16-fp16 + option nofp.dp remove FP_DBL option nofp remove ALL_FP costs cortex end cpu cortex-r8 @@ -1380,7 +1394,7 @@ end cpu cortex-m3 begin cpu marvell-pj4 tune flags LDSCHED - architecture armv7-a + architecture armv7-a+mp+sec costs marvell_pj4 end cpu marvell-pj4 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 08120c6272b..b7e734e897d 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -3091,7 +3091,8 @@ arm_option_override_internal (struct gcc_options *opts, /* Thumb2 inline assembly code should always use unified syntax. This will apply to ARM and Thumb1 eventually. */ - opts->x_inline_asm_unified = TARGET_THUMB2_P (opts->x_target_flags); + if (TARGET_THUMB2_P (opts->x_target_flags)) + opts->x_inline_asm_unified = true; #ifdef SUBTARGET_OVERRIDE_INTERNAL_OPTIONS SUBTARGET_OVERRIDE_INTERNAL_OPTIONS; @@ -8878,11 +8879,16 @@ static bool arm_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x) { rtx base, offset; + split_const (x, &base, &offset); - if (ARM_OFFSETS_MUST_BE_WITHIN_SECTIONS_P) + if (SYMBOL_REF_P (base)) { - split_const (x, &base, &offset); - if (GET_CODE (base) == SYMBOL_REF + /* Function symbols cannot have an offset due to the Thumb bit. */ + if ((SYMBOL_REF_FLAGS (base) & SYMBOL_FLAG_FUNCTION) + && INTVAL (offset) != 0) + return true; + + if (ARM_OFFSETS_MUST_BE_WITHIN_SECTIONS_P && !offset_within_block_p (base, INTVAL (offset))) return true; } @@ -11929,8 +11935,7 @@ neon_valid_immediate (rtx op, machine_mode mode, int inverse, else { n_elts = 1; - if (mode == VOIDmode) - mode = DImode; + gcc_assert (mode != VOIDmode); } innersize = GET_MODE_UNIT_SIZE (mode); @@ -13094,6 +13099,9 @@ ldm_stm_operation_p (rtx op, bool load, machine_mode mode, if (load && (REGNO (reg) == SP_REGNUM) && (REGNO (addr) != SP_REGNUM)) return false; + if (regno == REGNO (addr)) + addr_reg_in_reglist = true; + for (; i < count; i++) { elt = XVECEXP (op, 0, i); @@ -13288,7 +13296,6 @@ load_multiple_sequence (rtx *operands, int nops, int *regs, int *saved_order, int unsorted_regs[MAX_LDM_STM_OPS]; HOST_WIDE_INT unsorted_offsets[MAX_LDM_STM_OPS]; int order[MAX_LDM_STM_OPS]; - rtx base_reg_rtx = NULL; int base_reg = -1; int i, ldm_case; @@ -13333,7 +13340,6 @@ load_multiple_sequence (rtx *operands, int nops, int *regs, int *saved_order, if (i == 0) { base_reg = REGNO (reg); - base_reg_rtx = reg; if (TARGET_THUMB1 && base_reg > LAST_LO_REGNUM) return 0; } @@ -13392,10 +13398,6 @@ load_multiple_sequence (rtx *operands, int nops, int *regs, int *saved_order, *load_offset = unsorted_offsets[order[0]]; } - if (TARGET_THUMB1 - && !peep2_reg_dead_p (nops, base_reg_rtx)) - return 0; - if (unsorted_offsets[order[0]] == 0) ldm_case = 1; /* ldmia */ else if (TARGET_ARM && unsorted_offsets[order[0]] == 4) @@ -13771,9 +13773,17 @@ gen_ldm_seq (rtx *operands, int nops, bool sort_regs) if (TARGET_THUMB1) { - gcc_assert (peep2_reg_dead_p (nops, base_reg_rtx)); gcc_assert (ldm_case == 1 || ldm_case == 5); - write_back = TRUE; + + /* Thumb-1 ldm uses writeback except if the base is loaded. */ + write_back = true; + for (i = 0; i < nops; i++) + if (base_reg == regs[i]) + write_back = false; + + /* Ensure the base is dead if it is updated. */ + if (write_back && !peep2_reg_dead_p (nops, base_reg_rtx)) + return false; } if (ldm_case == 5) @@ -13781,8 +13791,7 @@ gen_ldm_seq (rtx *operands, int nops, bool sort_regs) rtx newbase = TARGET_THUMB1 ? base_reg_rtx : gen_rtx_REG (SImode, regs[0]); emit_insn (gen_addsi3 (newbase, base_reg_rtx, GEN_INT (offset))); offset = 0; - if (!TARGET_THUMB1) - base_reg_rtx = newbase; + base_reg_rtx = newbase; } for (i = 0; i < nops; i++) @@ -17663,7 +17672,11 @@ arm_reorg (void) if (use_cmse) cmse_nonsecure_call_clear_caller_saved (); - if (TARGET_THUMB1) + + /* We cannot run the Thumb passes for thunks because there is no CFG. */ + if (cfun->is_thunk) + ; + else if (TARGET_THUMB1) thumb1_reorg (); else if (TARGET_THUMB2) thumb2_reorg (); @@ -18483,12 +18496,18 @@ output_move_double (rtx *operands, bool emit, int *count) gcc_assert ((REGNO (operands[1]) != IP_REGNUM) || (TARGET_ARM && TARGET_LDRD)); + /* For TARGET_ARM the first source register of an STRD + must be even. This is usually the case for double-word + values but user assembly constraints can force an odd + starting register. */ + bool allow_strd = TARGET_LDRD + && !(TARGET_ARM && (REGNO (operands[1]) & 1) == 1); switch (GET_CODE (XEXP (operands[0], 0))) { case REG: if (emit) { - if (TARGET_LDRD) + if (allow_strd) output_asm_insn ("strd%?\t%1, [%m0]", operands); else output_asm_insn ("stm%?\t%m0, %M1", operands); @@ -18496,7 +18515,7 @@ output_move_double (rtx *operands, bool emit, int *count) break; case PRE_INC: - gcc_assert (TARGET_LDRD); + gcc_assert (allow_strd); if (emit) output_asm_insn ("strd%?\t%1, [%m0, #8]!", operands); break; @@ -18504,7 +18523,7 @@ output_move_double (rtx *operands, bool emit, int *count) case PRE_DEC: if (emit) { - if (TARGET_LDRD) + if (allow_strd) output_asm_insn ("strd%?\t%1, [%m0, #-8]!", operands); else output_asm_insn ("stmdb%?\t%m0!, %M1", operands); @@ -18514,7 +18533,7 @@ output_move_double (rtx *operands, bool emit, int *count) case POST_INC: if (emit) { - if (TARGET_LDRD) + if (allow_strd) output_asm_insn ("strd%?\t%1, [%m0], #8", operands); else output_asm_insn ("stm%?\t%m0!, %M1", operands); @@ -18522,7 +18541,7 @@ output_move_double (rtx *operands, bool emit, int *count) break; case POST_DEC: - gcc_assert (TARGET_LDRD); + gcc_assert (allow_strd); if (emit) output_asm_insn ("strd%?\t%1, [%m0], #-8", operands); break; @@ -18533,8 +18552,8 @@ output_move_double (rtx *operands, bool emit, int *count) otherops[1] = XEXP (XEXP (XEXP (operands[0], 0), 1), 0); otherops[2] = XEXP (XEXP (XEXP (operands[0], 0), 1), 1); - /* IWMMXT allows offsets larger than ldrd can handle, - fix these up with a pair of ldr. */ + /* IWMMXT allows offsets larger than strd can handle, + fix these up with a pair of str. */ if (!TARGET_THUMB2 && CONST_INT_P (otherops[2]) && (INTVAL(otherops[2]) <= -256 @@ -18599,7 +18618,7 @@ output_move_double (rtx *operands, bool emit, int *count) return ""; } } - if (TARGET_LDRD + if (allow_strd && (REG_P (otherops[2]) || TARGET_THUMB2 || (CONST_INT_P (otherops[2]) @@ -19497,6 +19516,35 @@ arm_compute_save_core_reg_mask (void) return save_reg_mask; } +/* Return a mask for the call-clobbered low registers that are unused + at the end of the prologue. */ +static unsigned long +thumb1_prologue_unused_call_clobbered_lo_regs (void) +{ + unsigned long mask = 0; + + for (int reg = 0; reg <= LAST_LO_REGNUM; reg++) + if (!callee_saved_reg_p (reg) + && !REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR_FOR_FN (cfun)), + reg)) + mask |= 1 << reg; + return mask; +} + +/* Similarly for the start of the epilogue. */ +static unsigned long +thumb1_epilogue_unused_call_clobbered_lo_regs (void) +{ + unsigned long mask = 0; + + for (int reg = 0; reg <= LAST_LO_REGNUM; reg++) + if (!callee_saved_reg_p (reg) + && !REGNO_REG_SET_P (df_get_live_in (EXIT_BLOCK_PTR_FOR_FN (cfun)), + reg)) + mask |= 1 << reg; + return mask; +} + /* Compute a bit mask of which core registers need to be saved on the stack for the current function. */ static unsigned long @@ -19528,10 +19576,19 @@ thumb1_compute_save_core_reg_mask (void) if (mask & 0xff || thumb_force_lr_save ()) mask |= (1 << LR_REGNUM); - /* Make sure we have a low work register if we need one. - We will need one if we are going to push a high register, - but we are not currently intending to push a low register. */ + bool call_clobbered_scratch + = (thumb1_prologue_unused_call_clobbered_lo_regs () + && thumb1_epilogue_unused_call_clobbered_lo_regs ()); + + /* Make sure we have a low work register if we need one. We will + need one if we are going to push a high register, but we are not + currently intending to push a low register. However if both the + prologue and epilogue have a spare call-clobbered low register, + then we won't need to find an additional work register. It does + not need to be the same register in the prologue and + epilogue. */ if ((mask & 0xff) == 0 + && !call_clobbered_scratch && ((mask & 0x0f00) || TARGET_BACKTRACE)) { /* Use thumb_find_work_register to choose which register @@ -24757,12 +24814,7 @@ thumb1_unexpanded_epilogue (void) unsigned long mask = live_regs_mask & 0xff; int next_hi_reg; - /* The available low registers depend on the size of the value we are - returning. */ - if (size <= 12) - mask |= 1 << 3; - if (size <= 8) - mask |= 1 << 2; + mask |= thumb1_epilogue_unused_call_clobbered_lo_regs (); if (mask == 0) /* Oh dear! We have no low registers into which we can pop @@ -24770,7 +24822,7 @@ thumb1_unexpanded_epilogue (void) internal_error ("no low registers available for popping high registers"); - for (next_hi_reg = 8; next_hi_reg < 13; next_hi_reg++) + for (next_hi_reg = 12; next_hi_reg > LAST_LO_REGNUM; next_hi_reg--) if (live_regs_mask & (1 << next_hi_reg)) break; @@ -24778,7 +24830,7 @@ thumb1_unexpanded_epilogue (void) { /* Find lo register(s) into which the high register(s) can be popped. */ - for (regno = 0; regno <= LAST_LO_REGNUM; regno++) + for (regno = LAST_LO_REGNUM; regno >= 0; regno--) { if (mask & (1 << regno)) high_regs_pushed--; @@ -24786,20 +24838,22 @@ thumb1_unexpanded_epilogue (void) break; } - mask &= (2 << regno) - 1; /* A noop if regno == 8 */ + if (high_regs_pushed == 0 && regno >= 0) + mask &= ~((1 << regno) - 1); /* Pop the values into the low register(s). */ thumb_pop (asm_out_file, mask); /* Move the value(s) into the high registers. */ - for (regno = 0; regno <= LAST_LO_REGNUM; regno++) + for (regno = LAST_LO_REGNUM; regno >= 0; regno--) { if (mask & (1 << regno)) { asm_fprintf (asm_out_file, "\tmov\t%r, %r\n", next_hi_reg, regno); - for (next_hi_reg++; next_hi_reg < 13; next_hi_reg++) + for (next_hi_reg--; next_hi_reg > LAST_LO_REGNUM; + next_hi_reg--) if (live_regs_mask & (1 << next_hi_reg)) break; } @@ -25181,10 +25235,20 @@ thumb1_expand_prologue (void) break; /* Here we need to mask out registers used for passing arguments - even if they can be pushed. This is to avoid using them to stash the high - registers. Such kind of stash may clobber the use of arguments. */ + even if they can be pushed. This is to avoid using them to + stash the high registers. Such kind of stash may clobber the + use of arguments. */ pushable_regs = l_mask & (~arg_regs_mask); - if (lr_needs_saving) + pushable_regs |= thumb1_prologue_unused_call_clobbered_lo_regs (); + + /* Normally, LR can be used as a scratch register once it has been + saved; but if the function examines its own return address then + the value is still live and we need to avoid using it. */ + bool return_addr_live + = REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR_FOR_FN (cfun)), + LR_REGNUM); + + if (lr_needs_saving || return_addr_live) pushable_regs &= ~(1 << LR_REGNUM); if (pushable_regs == 0) @@ -25225,6 +25289,11 @@ thumb1_expand_prologue (void) push_mask |= 1 << LR_REGNUM; real_regs_mask |= 1 << LR_REGNUM; lr_needs_saving = false; + /* If the return address is not live at this point, we + can add LR to the list of registers that we can use + for pushes. */ + if (!return_addr_live) + pushable_regs |= 1 << LR_REGNUM; } insn = thumb1_emit_multi_reg_push (push_mask, real_regs_mask); @@ -26731,6 +26800,8 @@ static void arm32_output_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset, tree function) { + const bool long_call_p = arm_is_long_call_p (function); + /* On ARM, this_regno is R0 or R1 depending on whether the function returns an aggregate or not. */ @@ -26768,9 +26839,22 @@ arm32_output_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta, TREE_USED (function) = 1; } rtx funexp = XEXP (DECL_RTL (function), 0); + if (long_call_p) + { + emit_move_insn (temp, funexp); + funexp = temp; + } funexp = gen_rtx_MEM (FUNCTION_MODE, funexp); - rtx_insn * insn = emit_call_insn (gen_sibcall (funexp, const0_rtx, NULL_RTX)); + rtx_insn *insn = emit_call_insn (gen_sibcall (funexp, const0_rtx, NULL_RTX)); SIBLING_CALL_P (insn) = 1; + emit_barrier (); + + /* Indirect calls require a bit of fixup in PIC mode. */ + if (long_call_p) + { + split_all_insns_noflow (); + arm_reorg (); + } insn = get_insns (); shorten_branches (insn); @@ -30059,7 +30143,6 @@ arm_block_set_aligned_vect (rtx dstbase, rtx dst, addr, mem; rtx val_vec, reg; machine_mode mode; - unsigned HOST_WIDE_INT v = value; unsigned int offset = 0; gcc_assert ((align & 0x3) == 0); @@ -30078,10 +30161,8 @@ arm_block_set_aligned_vect (rtx dstbase, dst = copy_addr_to_reg (XEXP (dstbase, 0)); - v = sext_hwi (v, BITS_PER_WORD); - reg = gen_reg_rtx (mode); - val_vec = gen_const_vec_duplicate (mode, GEN_INT (v)); + val_vec = gen_const_vec_duplicate (mode, gen_int_mode (value, QImode)); /* Emit instruction loading the constant value. */ emit_move_insn (reg, val_vec); diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index 2809112f68d..b12ae385802 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -191,7 +191,7 @@ extern tree arm_fp16_type_node; /* FPU supports converting between HFmode and DFmode in a single hardware step. */ #define TARGET_FP16_TO_DOUBLE \ - (TARGET_HARD_FLOAT && (TARGET_FP16 && TARGET_VFP5)) + (TARGET_HARD_FLOAT && TARGET_FP16 && TARGET_VFP5 && TARGET_VFP_DOUBLE) /* FPU supports fused-multiply-add operations. */ #define TARGET_FMA (bitmap_bit_p (arm_active_target.isa, isa_bit_vfpv4)) diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 2d5359e532f..f78e1477eab 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -4448,62 +4448,78 @@ ; ARMv6+ unaligned load/store instructions (used for packed structure accesses). (define_insn "unaligned_loadsi" - [(set (match_operand:SI 0 "s_register_operand" "=l,r") - (unspec:SI [(match_operand:SI 1 "memory_operand" "Uw,m")] + [(set (match_operand:SI 0 "s_register_operand" "=l,l,r") + (unspec:SI [(match_operand:SI 1 "memory_operand" "m,Uw,m")] UNSPEC_UNALIGNED_LOAD))] "unaligned_access" - "ldr%?\t%0, %1\t@ unaligned" - [(set_attr "arch" "t2,any") - (set_attr "length" "2,4") - (set_attr "predicable" "yes") - (set_attr "predicable_short_it" "yes,no") + "@ + ldr\t%0, %1\t@ unaligned + ldr%?\t%0, %1\t@ unaligned + ldr%?\t%0, %1\t@ unaligned" + [(set_attr "arch" "t1,t2,32") + (set_attr "length" "2,2,4") + (set_attr "predicable" "no,yes,yes") + (set_attr "predicable_short_it" "no,yes,no") (set_attr "type" "load_4")]) +;; The 16-bit Thumb1 variant of ldrsh requires two registers in the +;; address (there's no immediate format). That's tricky to support +;; here and we don't really need this pattern for that case, so only +;; enable for 32-bit ISAs. (define_insn "unaligned_loadhis" [(set (match_operand:SI 0 "s_register_operand" "=r") (sign_extend:SI (unspec:HI [(match_operand:HI 1 "memory_operand" "Uh")] UNSPEC_UNALIGNED_LOAD)))] - "unaligned_access" + "unaligned_access && TARGET_32BIT" "ldrsh%?\t%0, %1\t@ unaligned" [(set_attr "predicable" "yes") (set_attr "type" "load_byte")]) (define_insn "unaligned_loadhiu" - [(set (match_operand:SI 0 "s_register_operand" "=l,r") + [(set (match_operand:SI 0 "s_register_operand" "=l,l,r") (zero_extend:SI - (unspec:HI [(match_operand:HI 1 "memory_operand" "Uw,m")] + (unspec:HI [(match_operand:HI 1 "memory_operand" "m,Uw,m")] UNSPEC_UNALIGNED_LOAD)))] "unaligned_access" - "ldrh%?\t%0, %1\t@ unaligned" - [(set_attr "arch" "t2,any") - (set_attr "length" "2,4") - (set_attr "predicable" "yes") - (set_attr "predicable_short_it" "yes,no") + "@ + ldrh\t%0, %1\t@ unaligned + ldrh%?\t%0, %1\t@ unaligned + ldrh%?\t%0, %1\t@ unaligned" + [(set_attr "arch" "t1,t2,32") + (set_attr "length" "2,2,4") + (set_attr "predicable" "no,yes,yes") + (set_attr "predicable_short_it" "no,yes,no") (set_attr "type" "load_byte")]) (define_insn "unaligned_storesi" - [(set (match_operand:SI 0 "memory_operand" "=Uw,m") - (unspec:SI [(match_operand:SI 1 "s_register_operand" "l,r")] + [(set (match_operand:SI 0 "memory_operand" "=m,Uw,m") + (unspec:SI [(match_operand:SI 1 "s_register_operand" "l,l,r")] UNSPEC_UNALIGNED_STORE))] "unaligned_access" - "str%?\t%1, %0\t@ unaligned" - [(set_attr "arch" "t2,any") - (set_attr "length" "2,4") - (set_attr "predicable" "yes") - (set_attr "predicable_short_it" "yes,no") + "@ + str\t%1, %0\t@ unaligned + str%?\t%1, %0\t@ unaligned + str%?\t%1, %0\t@ unaligned" + [(set_attr "arch" "t1,t2,32") + (set_attr "length" "2,2,4") + (set_attr "predicable" "no,yes,yes") + (set_attr "predicable_short_it" "no,yes,no") (set_attr "type" "store_4")]) (define_insn "unaligned_storehi" - [(set (match_operand:HI 0 "memory_operand" "=Uw,m") - (unspec:HI [(match_operand:HI 1 "s_register_operand" "l,r")] + [(set (match_operand:HI 0 "memory_operand" "=m,Uw,m") + (unspec:HI [(match_operand:HI 1 "s_register_operand" "l,l,r")] UNSPEC_UNALIGNED_STORE))] "unaligned_access" - "strh%?\t%1, %0\t@ unaligned" - [(set_attr "arch" "t2,any") - (set_attr "length" "2,4") - (set_attr "predicable" "yes") - (set_attr "predicable_short_it" "yes,no") + "@ + strh\t%1, %0\t@ unaligned + strh%?\t%1, %0\t@ unaligned + strh%?\t%1, %0\t@ unaligned" + [(set_attr "arch" "t1,t2,32") + (set_attr "length" "2,2,4") + (set_attr "predicable" "no,yes,yes") + (set_attr "predicable_short_it" "no,yes,no") (set_attr "type" "store_4")]) @@ -5976,52 +5992,29 @@ } } - if (ARM_OFFSETS_MUST_BE_WITHIN_SECTIONS_P) + split_const (operands[1], &base, &offset); + if (INTVAL (offset) != 0 + && targetm.cannot_force_const_mem (SImode, operands[1])) { - split_const (operands[1], &base, &offset); - if (GET_CODE (base) == SYMBOL_REF - && !offset_within_block_p (base, INTVAL (offset))) - { - tmp = can_create_pseudo_p () ? gen_reg_rtx (SImode) : operands[0]; - emit_move_insn (tmp, base); - emit_insn (gen_addsi3 (operands[0], tmp, offset)); - DONE; - } + tmp = can_create_pseudo_p () ? gen_reg_rtx (SImode) : operands[0]; + emit_move_insn (tmp, base); + emit_insn (gen_addsi3 (operands[0], tmp, offset)); + DONE; } + tmp = can_create_pseudo_p () ? NULL_RTX : operands[0]; + /* Recognize the case where operand[1] is a reference to thread-local - data and load its address to a register. */ + data and load its address to a register. Offsets have been split off + already. */ if (arm_tls_referenced_p (operands[1])) - { - rtx tmp = operands[1]; - rtx addend = NULL; - - if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS) - { - addend = XEXP (XEXP (tmp, 0), 1); - tmp = XEXP (XEXP (tmp, 0), 0); - } - - gcc_assert (GET_CODE (tmp) == SYMBOL_REF); - gcc_assert (SYMBOL_REF_TLS_MODEL (tmp) != 0); - - tmp = legitimize_tls_address (tmp, - !can_create_pseudo_p () ? operands[0] : 0); - if (addend) - { - tmp = gen_rtx_PLUS (SImode, tmp, addend); - tmp = force_operand (tmp, operands[0]); - } - operands[1] = tmp; - } + operands[1] = legitimize_tls_address (operands[1], tmp); else if (flag_pic && (CONSTANT_P (operands[1]) || symbol_mentioned_p (operands[1]) || label_mentioned_p (operands[1]))) - operands[1] = legitimize_pic_address (operands[1], SImode, - (!can_create_pseudo_p () - ? operands[0] - : 0)); + operands[1] = + legitimize_pic_address (operands[1], SImode, tmp); } " ) diff --git a/gcc/config/arm/arm_acle.h b/gcc/config/arm/arm_acle.h index c0f6ea2d156..eb1b218bc76 100644 --- a/gcc/config/arm/arm_acle.h +++ b/gcc/config/arm/arm_acle.h @@ -174,8 +174,12 @@ __arm_mrrc2 (const unsigned int __coproc, const unsigned int __opc1, #endif /* (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4. */ #pragma GCC push_options -#if __ARM_ARCH >= 8 +#ifdef __ARM_FEATURE_CRC32 +#ifdef __ARM_FP +#pragma GCC target ("arch=armv8-a+crc+simd") +#else #pragma GCC target ("arch=armv8-a+crc") +#endif __extension__ static __inline uint32_t __attribute__ ((__always_inline__)) __crc32b (uint32_t __a, uint8_t __b) @@ -235,7 +239,7 @@ __crc32cd (uint32_t __a, uint64_t __b) } #endif -#endif /* __ARM_ARCH >= 8. */ +#endif /* __ARM_FEATURE_CRC32 */ #pragma GCC pop_options #ifdef __cplusplus diff --git a/gcc/config/arm/constraints.md b/gcc/config/arm/constraints.md index 7576c6fc401..09161620074 100644 --- a/gcc/config/arm/constraints.md +++ b/gcc/config/arm/constraints.md @@ -31,7 +31,8 @@ ;; 'H' was previously used for FPA. ;; The following multi-letter normal constraints have been used: -;; in ARM/Thumb-2 state: Da, Db, Dc, Dd, Dn, Dl, DL, Do, Dv, Dy, Di, Dt, Dp, Dz +;; in ARM/Thumb-2 state: Da, Db, Dc, Dd, Dn, DN, Dm, Dl, DL, Do, Dv, Dy, Di, +;; Dt, Dp, Dz ;; in Thumb-1 state: Pa, Pb, Pc, Pd, Pe ;; in Thumb-2 state: Pj, PJ, Ps, Pt, Pu, Pv, Pw, Px, Py ;; in all states: Pf @@ -294,14 +295,28 @@ (and (match_code "const_double,const_int") (match_test "TARGET_32BIT && arm_const_double_by_immediates (op)"))) -(define_constraint "Dn" +(define_constraint "Dm" "@internal - In ARM/Thumb-2 state a const_vector or const_int which can be loaded with a - Neon vmov immediate instruction." - (and (match_code "const_vector,const_int") + In ARM/Thumb-2 state a const_vector which can be loaded with a Neon vmov + immediate instruction." + (and (match_code "const_vector") (match_test "TARGET_32BIT && imm_for_neon_mov_operand (op, GET_MODE (op))"))) +(define_constraint "Dn" + "@internal + In ARM/Thumb-2 state a DImode const_int which can be loaded with a Neon vmov + immediate instruction." + (and (match_code "const_int") + (match_test "TARGET_32BIT && imm_for_neon_mov_operand (op, DImode)"))) + +(define_constraint "DN" + "@internal + In ARM/Thumb-2 state a TImode const_int which can be loaded with a Neon vmov + immediate instruction." + (and (match_code "const_int") + (match_test "TARGET_32BIT && imm_for_neon_mov_operand (op, TImode)"))) + (define_constraint "Dl" "@internal In ARM/Thumb-2 state a const_vector which can be used with a Neon vorr or diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index 1646b217297..dd062225a49 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -25,14 +25,14 @@ (define_insn "*neon_mov" [(set (match_operand:VDX 0 "nonimmediate_operand" - "=w,Un,w, w, ?r,?w,?r,?r, ?Us") + "=w,Un,w, w, w, ?r,?w,?r,?r, ?Us") (match_operand:VDX 1 "general_operand" - " w,w, Dn,Uni, w, r, r, Usi,r"))] + " w,w, Dm,Dn,Uni, w, r, r, Usi,r"))] "TARGET_NEON && (register_operand (operands[0], mode) || register_operand (operands[1], mode))" { - if (which_alternative == 2) + if (which_alternative == 2 || which_alternative == 3) { int width, is_valid; static char templ[40]; @@ -53,31 +53,32 @@ switch (which_alternative) { case 0: return "vmov\t%P0, %P1 @ "; - case 1: case 3: return output_move_neon (operands); - case 2: gcc_unreachable (); - case 4: return "vmov\t%Q0, %R0, %P1 @ "; - case 5: return "vmov\t%P0, %Q1, %R1 @ "; + case 1: case 4: return output_move_neon (operands); + case 2: case 3: gcc_unreachable (); + case 5: return "vmov\t%Q0, %R0, %P1 @ "; + case 6: return "vmov\t%P0, %Q1, %R1 @ "; default: return output_move_double (operands, true, NULL); } } [(set_attr "type" "neon_move,neon_store1_1reg,neon_move,\ - neon_load1_1reg, neon_to_gp,neon_from_gp,mov_reg,\ - neon_load1_2reg, neon_store1_2reg") - (set_attr "length" "4,4,4,4,4,4,8,8,8") - (set_attr "arm_pool_range" "*,*,*,1020,*,*,*,1020,*") - (set_attr "thumb2_pool_range" "*,*,*,1018,*,*,*,1018,*") - (set_attr "neg_pool_range" "*,*,*,1004,*,*,*,1004,*")]) + neon_move,neon_load1_1reg, neon_to_gp,\ + neon_from_gp,mov_reg,neon_load1_2reg,\ + neon_store1_2reg") + (set_attr "length" "4,4,4,4,4,4,4,8,8,8") + (set_attr "arm_pool_range" "*,*,*,*,1020,*,*,*,1020,*") + (set_attr "thumb2_pool_range" "*,*,*,*,1018,*,*,*,1018,*") + (set_attr "neg_pool_range" "*,*,*,*,1004,*,*,*,1004,*")]) (define_insn "*neon_mov" [(set (match_operand:VQXMOV 0 "nonimmediate_operand" - "=w,Un,w, w, ?r,?w,?r,?r, ?Us") + "=w,Un,w, w, w, ?r,?w,?r,?r, ?Us") (match_operand:VQXMOV 1 "general_operand" - " w,w, Dn,Uni, w, r, r, Usi, r"))] + " w,w, Dm,DN,Uni, w, r, r, Usi, r"))] "TARGET_NEON && (register_operand (operands[0], mode) || register_operand (operands[1], mode))" { - if (which_alternative == 2) + if (which_alternative == 2 || which_alternative == 3) { int width, is_valid; static char templ[40]; @@ -98,20 +99,27 @@ switch (which_alternative) { case 0: return "vmov\t%q0, %q1 @ "; - case 1: case 3: return output_move_neon (operands); - case 2: gcc_unreachable (); - case 4: return "vmov\t%Q0, %R0, %e1 @ \;vmov\t%J0, %K0, %f1"; - case 5: return "vmov\t%e0, %Q1, %R1 @ \;vmov\t%f0, %J1, %K1"; + case 1: case 4: return output_move_neon (operands); + case 2: case 3: gcc_unreachable (); + case 5: return "vmov\t%Q0, %R0, %e1 @ \;vmov\t%J0, %K0, %f1"; + case 6: return "vmov\t%e0, %Q1, %R1 @ \;vmov\t%f0, %J1, %K1"; default: return output_move_quad (operands); } } [(set_attr "type" "neon_move_q,neon_store2_2reg_q,neon_move_q,\ - neon_load2_2reg_q,neon_to_gp_q,neon_from_gp_q,\ - mov_reg,neon_load1_4reg,neon_store1_4reg") - (set_attr "length" "4,8,4,8,8,8,16,8,16") - (set_attr "arm_pool_range" "*,*,*,1020,*,*,*,1020,*") - (set_attr "thumb2_pool_range" "*,*,*,1018,*,*,*,1018,*") - (set_attr "neg_pool_range" "*,*,*,996,*,*,*,996,*")]) + neon_move_q,neon_load2_2reg_q,neon_to_gp_q,\ + neon_from_gp_q,mov_reg,neon_load1_4reg,neon_store1_4reg") + (set_attr "length" "4,8,4,4,8,8,8,16,8,16") + (set_attr "arm_pool_range" "*,*,*,*,1020,*,*,*,1020,*") + (set_attr "thumb2_pool_range" "*,*,*,*,1018,*,*,*,1018,*") + (set_attr "neg_pool_range" "*,*,*,*,996,*,*,*,996,*")]) + +/* We define these mov expanders to match the standard mov$a optab to prevent + the mid-end from trying to do a subreg for these modes which is the most + inefficient way to expand the move. Also big-endian subreg's aren't + allowed for a subset of modes, See TARGET_CAN_CHANGE_MODE_CLASS. + Without these RTL generation patterns the mid-end would attempt to take a + sub-reg and may ICE if it can't. */ (define_expand "movti" [(set (match_operand:TI 0 "nonimmediate_operand" "") @@ -137,33 +145,15 @@ } }) -(define_expand "movv4hf" - [(set (match_operand:V4HF 0 "s_register_operand") - (match_operand:V4HF 1 "s_register_operand"))] - "TARGET_NEON && TARGET_FP16" +(define_expand "mov" + [(set (match_operand:VH 0 "s_register_operand") + (match_operand:VH 1 "s_register_operand"))] + "TARGET_NEON" { - /* We need to use force_reg to avoid TARGET_CAN_CHANGE_MODE_CLASS - causing an ICE on big-endian because it cannot extract subregs in - this case. */ if (can_create_pseudo_p ()) { if (!REG_P (operands[0])) - operands[1] = force_reg (V4HFmode, operands[1]); - } -}) - -(define_expand "movv8hf" - [(set (match_operand:V8HF 0 "") - (match_operand:V8HF 1 ""))] - "TARGET_NEON && TARGET_FP16" -{ - /* We need to use force_reg to avoid TARGET_CAN_CHANGE_MODE_CLASS - causing an ICE on big-endian because it cannot extract subregs in - this case. */ - if (can_create_pseudo_p ()) - { - if (!REG_P (operands[0])) - operands[1] = force_reg (V8HFmode, operands[1]); + operands[1] = force_reg (mode, operands[1]); } }) @@ -1044,7 +1034,7 @@ (define_insn "vashl3" [(set (match_operand:VDQIW 0 "s_register_operand" "=w,w") (ashift:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w,w") - (match_operand:VDQIW 2 "imm_lshift_or_reg_neon" "w,Dn")))] + (match_operand:VDQIW 2 "imm_lshift_or_reg_neon" "w,Dm")))] "TARGET_NEON" { switch (which_alternative) @@ -1063,7 +1053,7 @@ (define_insn "vashr3_imm" [(set (match_operand:VDQIW 0 "s_register_operand" "=w") (ashiftrt:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w") - (match_operand:VDQIW 2 "imm_for_neon_rshift_operand" "Dn")))] + (match_operand:VDQIW 2 "imm_for_neon_rshift_operand" "Dm")))] "TARGET_NEON" { return neon_output_shift_immediate ("vshr", 's', &operands[2], @@ -1076,7 +1066,7 @@ (define_insn "vlshr3_imm" [(set (match_operand:VDQIW 0 "s_register_operand" "=w") (lshiftrt:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w") - (match_operand:VDQIW 2 "imm_for_neon_rshift_operand" "Dn")))] + (match_operand:VDQIW 2 "imm_for_neon_rshift_operand" "Dm")))] "TARGET_NEON" { return neon_output_shift_immediate ("vshr", 'u', &operands[2], diff --git a/gcc/config/arm/t-aprofile b/gcc/config/arm/t-aprofile index 7b55599d429..6f319c42ca5 100644 --- a/gcc/config/arm/t-aprofile +++ b/gcc/config/arm/t-aprofile @@ -49,14 +49,26 @@ MULTILIB_REQUIRED += mthumb/march=armv8-a+simd/mfloat-abi=softfp # Matches # Arch Matches +# Map all basic v7-a arch extensions to v7-a +MULTILIB_MATCHES += $(foreach ARCH, $(v7_a_arch_variants), \ + march?armv7-a=march?armv7-a$(ARCH)) + # Map all v7-a FP variants to vfpv3-d16 (+fp) MULTILIB_MATCHES += $(foreach ARCH, $(filter-out +fp, $(v7_a_nosimd_variants)), \ march?armv7-a+fp=march?armv7-a$(ARCH)) +MULTILIB_MATCHES += $(foreach ARCHVAR, $(v7_a_arch_variants), \ + $(foreach ARCH, $(v7_a_nosimd_variants), \ + march?armv7-a+fp=march?armv7-a$(ARCHVAR)$(ARCH))) + # Map all v7-a SIMD variants to neon-vfpv3 (+simd) MULTILIB_MATCHES += $(foreach ARCH, $(filter-out +simd, $(v7_a_simd_variants)), \ march?armv7-a+simd=march?armv7-a$(ARCH)) +MULTILIB_MATCHES += $(foreach ARCHVAR, $(v7_a_arch_variants), \ + $(foreach ARCH, $(v7_a_simd_variants), \ + march?armv7-a+simd=march?armv7-a$(ARCHVAR)$(ARCH))) + # Neither FP nor SIMD: map v7ve to v7-a MULTILIB_MATCHES += march?armv7-a=march?armv7ve diff --git a/gcc/config/arm/t-multilib b/gcc/config/arm/t-multilib index 3d0c824b4ec..573fbeb16a4 100644 --- a/gcc/config/arm/t-multilib +++ b/gcc/config/arm/t-multilib @@ -60,6 +60,7 @@ all_feat_combs = +$(firstword $(1)) \ # Variables used. all_early_arch := armv5e armv5tej armv6 armv6j armv6k armv6z armv6kz \ armv6zk armv6t2 iwmmxt iwmmxt2 +v7_a_arch_variants := $(call all_feat_combs, mp sec) v7_a_nosimd_variants := +fp +vfpv3 +vfpv3-d16-fp16 +vfpv3-fp16 +vfpv4-d16 +vfpv4 v7_a_simd_variants := +simd +neon-fp16 +neon-vfpv4 v7ve_nosimd_variants := +vfpv3-d16 +vfpv3 +vfpv3-d16-fp16 +vfpv3-fp16 +fp +vfpv4 diff --git a/gcc/config/arm/t-rtems b/gcc/config/arm/t-rtems index c07378657c8..94a2eb7dd0b 100644 --- a/gcc/config/arm/t-rtems +++ b/gcc/config/arm/t-rtems @@ -17,8 +17,8 @@ MULTILIB_DIRNAMES += eb MULTILIB_OPTIONS += mthumb MULTILIB_DIRNAMES += thumb -MULTILIB_OPTIONS += march=armv5te+fp/march=armv6-m/march=armv7-a/march=armv7-a+simd/march=armv7-r/march=armv7-r+fp/march=armv7-m/march=armv7e-m+fp/march=armv7e-m+fp.dp -MULTILIB_DIRNAMES += armv5te+fp armv6-m armv7-a armv7-a+simd armv7-r armv7-r+fp armv7-m armv7e-m+fp armv7e-m+fp.dp +MULTILIB_OPTIONS += march=armv5te+fp/march=armv6-m/march=armv7-a/march=armv7-a+simd/march=armv7-r/march=armv7-r+fp/mcpu=cortex-m3/mcpu=cortex-m4/mcpu=cortex-m4+nofp/mcpu=cortex-m7 +MULTILIB_DIRNAMES += armv5te+fp armv6-m armv7-a armv7-a+simd armv7-r armv7-r+fp cortex-m3 cortex-m4 cortex-m4+nofp cortex-m7 MULTILIB_OPTIONS += mfloat-abi=hard MULTILIB_DIRNAMES += hard @@ -31,7 +31,8 @@ MULTILIB_REQUIRED += mthumb/march=armv7-a+simd/mfloat-abi=hard MULTILIB_REQUIRED += mthumb/march=armv7-a MULTILIB_REQUIRED += mthumb/march=armv7-r+fp/mfloat-abi=hard MULTILIB_REQUIRED += mthumb/march=armv7-r -MULTILIB_REQUIRED += mthumb/march=armv7e-m+fp/mfloat-abi=hard -MULTILIB_REQUIRED += mthumb/march=armv7e-m+fp.dp/mfloat-abi=hard -MULTILIB_REQUIRED += mthumb/march=armv7-m +MULTILIB_REQUIRED += mthumb/mcpu=cortex-m3 +MULTILIB_REQUIRED += mthumb/mcpu=cortex-m4/mfloat-abi=hard +MULTILIB_REQUIRED += mthumb/mcpu=cortex-m4+nofp +MULTILIB_REQUIRED += mthumb/mcpu=cortex-m7/mfloat-abi=hard MULTILIB_REQUIRED += mthumb diff --git a/gcc/config/avr/avr-arch.h b/gcc/config/avr/avr-arch.h index 922a5c005d1..03f86225d41 100644 --- a/gcc/config/avr/avr-arch.h +++ b/gcc/config/avr/avr-arch.h @@ -126,6 +126,9 @@ typedef struct /* Flash size in bytes. */ int flash_size; + + /* Offset where flash is seen in the RAM address space. */ + int flash_pm_offset; } avr_mcu_t; /* AVR device specific features. diff --git a/gcc/config/avr/avr-devices.c b/gcc/config/avr/avr-devices.c index afd9921f650..31ba5348697 100644 --- a/gcc/config/avr/avr-devices.c +++ b/gcc/config/avr/avr-devices.c @@ -76,7 +76,7 @@ avr_texinfo[] = "the @code{MOVW} instruction." }, { ARCH_AVR3, "``Classic'' devices with 16@tie{}KiB up to 64@tie{}KiB of " - " program memory." }, + "program memory." }, { ARCH_AVR31, "``Classic'' devices with 128@tie{}KiB of program memory." }, { ARCH_AVR35, @@ -117,12 +117,12 @@ avr_texinfo[] = const avr_mcu_t avr_mcu_types[] = { -#define AVR_MCU(NAME, ARCH, DEV_ATTRIBUTE, MACRO, DATA_SEC, TEXT_SEC, FLASH_SIZE)\ - { NAME, ARCH, DEV_ATTRIBUTE, MACRO, DATA_SEC, TEXT_SEC, FLASH_SIZE }, +#define AVR_MCU(NAME, ARCH, DEV_ATTRIBUTE, MACRO, DATA_SEC, TEXT_SEC, FLASH_SIZE, PMOFF) \ + { NAME, ARCH, DEV_ATTRIBUTE, MACRO, DATA_SEC, TEXT_SEC, FLASH_SIZE, PMOFF }, #include "avr-mcus.def" #undef AVR_MCU /* End of list. */ - { NULL, ARCH_UNKNOWN, AVR_ISA_NONE, NULL, 0, 0, 0 } + { NULL, ARCH_UNKNOWN, AVR_ISA_NONE, NULL, 0, 0, 0, 0 } }; diff --git a/gcc/config/avr/avr-mcus.def b/gcc/config/avr/avr-mcus.def index 21c8fbff464..5991505a643 100644 --- a/gcc/config/avr/avr-mcus.def +++ b/gcc/config/avr/avr-mcus.def @@ -23,7 +23,6 @@ This will regenerate / update the following source files: - - $(srcdir)/config/avr/t-multilib - $(srcdir)/doc/avr-mmcu.texi After that, rebuild everything and check-in the new sources to the repo. @@ -36,338 +35,364 @@ Before including this file, define a macro: - AVR_MCU (NAME, ARCH, DEV_ATTRIBUTE, MACRO, DATA_SEC, N_FLASH) + AVR_MCU (NAME, ARCH, ATTR, MACRO, TDATA, TTEXT, FLASH_SIZE, PM_OFFSET) where the arguments are the fields of avr_mcu_t: - NAME Name of the device as specified by -mmcu=. Also - used by DRIVER_SELF_SPECS and gen-avr-mmcu-specs.c for - - the name of the device specific specs file - in -specs=device-specs/spec- - - the name of the startup file crt.o - - to link the device library by means of -l + NAME Name of the device as specified by -mmcu=. Also + used by DRIVER_SELF_SPECS and gen-avr-mmcu-specs.c for + - the name of the device specific specs file + in -specs=device-specs/spec- + - the name of the startup file crt.o + - the name of the device library to be linked with -l - ARCH Specifies the multilib variant together with AVR_SHORT_SP + ARCH Specifies the multilib variant together with AVR_SHORT_SP - DEV_ATTRIBUTE Specifies the device specific features - - additional ISA, short SP, errata skip etc., + ATTR Specifies the device specific features + - additional ISA, short SP, errata skip etc., - MACRO If NULL, this is a core and not a device. If non-NULL, - supply respective built-in macro. + MACRO If NULL, this is a core and not a device. If non-NULL, + supply respective built-in macro. - DATA_START First address of SRAM, used in -Tdata=. + TDATA First address of SRAM, used in -Tdata=. - TEXT_START First address of Flash, used in -Ttext=. + TTEXT First address of Flash, used in -Ttext=. - FLASH_SIZE Flash size in bytes. + FLASH_SIZE + Flash size in bytes. + + PM_OFFSET + Either 0x0 or the offset where flash memory is mirrored + into the RAM address space accessible by LD, LDD and LDS. + This is only needed if that value deviates from the + value for the respective device family. "avr2" must be first for the "0" default to work as intended. */ /* Classic, <= 8K. */ -AVR_MCU ("avr2", ARCH_AVR2, AVR_ERRATA_SKIP, NULL, 0x0060, 0x0, 0x60000) +AVR_MCU ("avr2", ARCH_AVR2, AVR_ERRATA_SKIP, NULL, 0x0060, 0x0, 0x60000, 0) -AVR_MCU ("at90s2313", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2313__", 0x0060, 0x0, 0x800) -AVR_MCU ("at90s2323", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2323__", 0x0060, 0x0, 0x800) -AVR_MCU ("at90s2333", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2333__", 0x0060, 0x0, 0x800) -AVR_MCU ("at90s2343", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2343__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny22", ARCH_AVR2, AVR_SHORT_SP, "__AVR_ATtiny22__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny26", ARCH_AVR2, AVR_SHORT_SP, "__AVR_ATtiny26__", 0x0060, 0x0, 0x800) -AVR_MCU ("at90s4414", ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S4414__", 0x0060, 0x0, 0x1000) -AVR_MCU ("at90s4433", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S4433__", 0x0060, 0x0, 0x1000) -AVR_MCU ("at90s4434", ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S4434__", 0x0060, 0x0, 0x1000) -AVR_MCU ("at90s8515", ARCH_AVR2, AVR_ERRATA_SKIP, "__AVR_AT90S8515__", 0x0060, 0x0, 0x2000) -AVR_MCU ("at90c8534", ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90C8534__", 0x0060, 0x0, 0x2000) -AVR_MCU ("at90s8535", ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S8535__", 0x0060, 0x0, 0x2000) +AVR_MCU ("at90s2313", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2313__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("at90s2323", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2323__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("at90s2333", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2333__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("at90s2343", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S2343__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny22", ARCH_AVR2, AVR_SHORT_SP, "__AVR_ATtiny22__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny26", ARCH_AVR2, AVR_SHORT_SP, "__AVR_ATtiny26__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("at90s4414", ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S4414__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("at90s4433", ARCH_AVR2, AVR_SHORT_SP, "__AVR_AT90S4433__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("at90s4434", ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S4434__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("at90s8515", ARCH_AVR2, AVR_ERRATA_SKIP, "__AVR_AT90S8515__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("at90c8534", ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90C8534__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("at90s8535", ARCH_AVR2, AVR_ISA_NONE, "__AVR_AT90S8535__", 0x0060, 0x0, 0x2000, 0) /* Classic + MOVW, <= 8K. */ -AVR_MCU ("avr25", ARCH_AVR25, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x2000) -AVR_MCU ("ata5272", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATA5272__", 0x0100, 0x0, 0x2000) -AVR_MCU ("ata6616c", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATA6616C__", 0x0100, 0x0, 0x2000) -AVR_MCU ("attiny13", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny13__", 0x0060, 0x0, 0x400) -AVR_MCU ("attiny13a", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny13A__", 0x0060, 0x0, 0x400) -AVR_MCU ("attiny2313", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny2313__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny2313a", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny2313A__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny24", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny24__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny24a", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny24A__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny4313", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny4313__", 0x0060, 0x0, 0x1000) -AVR_MCU ("attiny44", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny44__", 0x0060, 0x0, 0x1000) -AVR_MCU ("attiny44a", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny44A__", 0x0060, 0x0, 0x1000) -AVR_MCU ("attiny441", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny441__", 0x0100, 0x0, 0x1000) -AVR_MCU ("attiny84", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny84__", 0x0060, 0x0, 0x2000) -AVR_MCU ("attiny84a", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny84A__", 0x0060, 0x0, 0x2000) -AVR_MCU ("attiny25", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny25__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny45", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny45__", 0x0060, 0x0, 0x1000) -AVR_MCU ("attiny85", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny85__", 0x0060, 0x0, 0x2000) -AVR_MCU ("attiny261", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny261__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny261a", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny261A__", 0x0060, 0x0, 0x800) -AVR_MCU ("attiny461", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny461__", 0x0060, 0x0, 0x1000) -AVR_MCU ("attiny461a", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny461A__", 0x0060, 0x0, 0x1000) -AVR_MCU ("attiny861", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny861__", 0x0060, 0x0, 0x2000) -AVR_MCU ("attiny861a", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny861A__", 0x0060, 0x0, 0x2000) -AVR_MCU ("attiny43u", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny43U__", 0x0060, 0x0, 0x1000) -AVR_MCU ("attiny87", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny87__", 0x0100, 0x0, 0x2000) -AVR_MCU ("attiny48", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny48__", 0x0100, 0x0, 0x1000) -AVR_MCU ("attiny88", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny88__", 0x0100, 0x0, 0x2000) -AVR_MCU ("attiny828", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny828__", 0x0100, 0x0, 0x2000) -AVR_MCU ("attiny841", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny841__", 0x0100, 0x0, 0x2000) -AVR_MCU ("at86rf401", ARCH_AVR25, AVR_ISA_NONE, "__AVR_AT86RF401__", 0x0060, 0x0, 0x800) +AVR_MCU ("avr25", ARCH_AVR25, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("ata5272", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATA5272__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("ata6616c", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATA6616C__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("attiny13", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny13__", 0x0060, 0x0, 0x400, 0) +AVR_MCU ("attiny13a", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny13A__", 0x0060, 0x0, 0x400, 0) +AVR_MCU ("attiny2313", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny2313__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny2313a", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny2313A__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny24", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny24__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny24a", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny24A__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny4313", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny4313__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("attiny44", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny44__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("attiny44a", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny44A__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("attiny441", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny441__", 0x0100, 0x0, 0x1000, 0) +AVR_MCU ("attiny84", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny84__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("attiny84a", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny84A__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("attiny25", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny25__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny45", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny45__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("attiny85", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny85__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("attiny261", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny261__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny261a", ARCH_AVR25, AVR_SHORT_SP, "__AVR_ATtiny261A__", 0x0060, 0x0, 0x800, 0) +AVR_MCU ("attiny461", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny461__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("attiny461a", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny461A__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("attiny861", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny861__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("attiny861a", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny861A__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("attiny43u", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny43U__", 0x0060, 0x0, 0x1000, 0) +AVR_MCU ("attiny87", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny87__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("attiny48", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny48__", 0x0100, 0x0, 0x1000, 0) +AVR_MCU ("attiny88", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny88__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("attiny828", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny828__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("attiny841", ARCH_AVR25, AVR_ISA_NONE, "__AVR_ATtiny841__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("at86rf401", ARCH_AVR25, AVR_ISA_NONE, "__AVR_AT86RF401__", 0x0060, 0x0, 0x800, 0) /* Classic, > 8K, <= 64K. */ -AVR_MCU ("avr3", ARCH_AVR3, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x6000) -AVR_MCU ("at43usb355", ARCH_AVR3, AVR_ISA_NONE, "__AVR_AT43USB355__", 0x0060, 0x0, 0x6000) -AVR_MCU ("at76c711", ARCH_AVR3, AVR_ISA_NONE, "__AVR_AT76C711__", 0x0060, 0x0, 0x4000) +AVR_MCU ("avr3", ARCH_AVR3, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x6000, 0) +AVR_MCU ("at43usb355", ARCH_AVR3, AVR_ISA_NONE, "__AVR_AT43USB355__", 0x0060, 0x0, 0x6000, 0) +AVR_MCU ("at76c711", ARCH_AVR3, AVR_ISA_NONE, "__AVR_AT76C711__", 0x0060, 0x0, 0x4000, 0) /* Classic, == 128K. */ -AVR_MCU ("avr31", ARCH_AVR31, AVR_ERRATA_SKIP, NULL, 0x0060, 0x0, 0x20000) -AVR_MCU ("atmega103", ARCH_AVR31, AVR_ERRATA_SKIP, "__AVR_ATmega103__", 0x0060, 0x0, 0x20000) -AVR_MCU ("at43usb320", ARCH_AVR31, AVR_ISA_NONE, "__AVR_AT43USB320__", 0x0060, 0x0, 0x10000) +AVR_MCU ("avr31", ARCH_AVR31, AVR_ERRATA_SKIP, NULL, 0x0060, 0x0, 0x20000, 0) +AVR_MCU ("atmega103", ARCH_AVR31, AVR_ERRATA_SKIP, "__AVR_ATmega103__", 0x0060, 0x0, 0x20000, 0) +AVR_MCU ("at43usb320", ARCH_AVR31, AVR_ISA_NONE, "__AVR_AT43USB320__", 0x0060, 0x0, 0x10000, 0) /* Classic + MOVW + JMP/CALL. */ -AVR_MCU ("avr35", ARCH_AVR35, AVR_ISA_NONE, NULL, 0x0100, 0x0, 0x4000) -AVR_MCU ("ata5505", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATA5505__", 0x0100, 0x0, 0x4000) -AVR_MCU ("ata6617c", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATA6617C__", 0x0100, 0x0, 0x4000) -AVR_MCU ("ata664251", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATA664251__", 0x0100, 0x0, 0x4000) -AVR_MCU ("at90usb82", ARCH_AVR35, AVR_ISA_NONE, "__AVR_AT90USB82__", 0x0100, 0x0, 0x2000) -AVR_MCU ("at90usb162", ARCH_AVR35, AVR_ISA_NONE, "__AVR_AT90USB162__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega8u2", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega8U2__", 0x0100, 0x0, 0x2000) -AVR_MCU ("atmega16u2", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega16U2__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega32u2", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega32U2__", 0x0100, 0x0, 0x8000) -AVR_MCU ("attiny167", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATtiny167__", 0x0100, 0x0, 0x4000) -AVR_MCU ("attiny1634", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATtiny1634__", 0x0100, 0x0, 0x4000) +AVR_MCU ("avr35", ARCH_AVR35, AVR_ISA_NONE, NULL, 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("ata5505", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATA5505__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("ata6617c", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATA6617C__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("ata664251", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATA664251__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("at90usb82", ARCH_AVR35, AVR_ISA_NONE, "__AVR_AT90USB82__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("at90usb162", ARCH_AVR35, AVR_ISA_NONE, "__AVR_AT90USB162__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega8u2", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega8U2__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("atmega16u2", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega16U2__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega32u2", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATmega32U2__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("attiny167", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATtiny167__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("attiny1634", ARCH_AVR35, AVR_ISA_NONE, "__AVR_ATtiny1634__", 0x0100, 0x0, 0x4000, 0) /* Enhanced, <= 8K. */ -AVR_MCU ("avr4", ARCH_AVR4, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x2000) -AVR_MCU ("ata6285", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATA6285__", 0x0100, 0x0, 0x2000) -AVR_MCU ("ata6286", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATA6286__", 0x0100, 0x0, 0x2000) -AVR_MCU ("ata6289", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATA6289__", 0x0100, 0x0, 0x2000) -AVR_MCU ("ata6612c", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATA6612C__", 0x0100, 0x0, 0x2000) -AVR_MCU ("atmega8", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8__", 0x0060, 0x0, 0x2000) -AVR_MCU ("atmega8a", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8A__", 0x0060, 0x0, 0x2000) -AVR_MCU ("atmega48", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48__", 0x0100, 0x0, 0x1000) -AVR_MCU ("atmega48a", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48A__", 0x0100, 0x0, 0x1000) -AVR_MCU ("atmega48p", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48P__", 0x0100, 0x0, 0x1000) -AVR_MCU ("atmega48pa", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48PA__", 0x0100, 0x0, 0x1000) -AVR_MCU ("atmega48pb", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48PB__", 0x0100, 0x0, 0x1000) -AVR_MCU ("atmega88", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88__", 0x0100, 0x0, 0x2000) -AVR_MCU ("atmega88a", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88A__", 0x0100, 0x0, 0x2000) -AVR_MCU ("atmega88p", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88P__", 0x0100, 0x0, 0x2000) -AVR_MCU ("atmega88pa", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88PA__", 0x0100, 0x0, 0x2000) -AVR_MCU ("atmega88pb", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88PB__", 0x0100, 0x0, 0x2000) -AVR_MCU ("atmega8515", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8515__", 0x0060, 0x0, 0x2000) -AVR_MCU ("atmega8535", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8535__", 0x0060, 0x0, 0x2000) -AVR_MCU ("atmega8hva", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8HVA__", 0x0100, 0x0, 0x2000) -AVR_MCU ("at90pwm1", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM1__", 0x0100, 0x0, 0x2000) -AVR_MCU ("at90pwm2", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM2__", 0x0100, 0x0, 0x2000) -AVR_MCU ("at90pwm2b", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM2B__", 0x0100, 0x0, 0x2000) -AVR_MCU ("at90pwm3", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM3__", 0x0100, 0x0, 0x2000) -AVR_MCU ("at90pwm3b", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM3B__", 0x0100, 0x0, 0x2000) -AVR_MCU ("at90pwm81", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM81__", 0x0100, 0x0, 0x2000) +AVR_MCU ("avr4", ARCH_AVR4, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("ata6285", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATA6285__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("ata6286", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATA6286__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("ata6289", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATA6289__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("ata6612c", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATA6612C__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("atmega8", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("atmega8a", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8A__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("atmega48", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48__", 0x0100, 0x0, 0x1000, 0) +AVR_MCU ("atmega48a", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48A__", 0x0100, 0x0, 0x1000, 0) +AVR_MCU ("atmega48p", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48P__", 0x0100, 0x0, 0x1000, 0) +AVR_MCU ("atmega48pa", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48PA__", 0x0100, 0x0, 0x1000, 0) +AVR_MCU ("atmega48pb", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega48PB__", 0x0100, 0x0, 0x1000, 0) +AVR_MCU ("atmega88", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("atmega88a", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88A__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("atmega88p", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88P__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("atmega88pa", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88PA__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("atmega88pb", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega88PB__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("atmega8515", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8515__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("atmega8535", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8535__", 0x0060, 0x0, 0x2000, 0) +AVR_MCU ("atmega8hva", ARCH_AVR4, AVR_ISA_NONE, "__AVR_ATmega8HVA__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("at90pwm1", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM1__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("at90pwm2", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM2__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("at90pwm2b", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM2B__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("at90pwm3", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM3__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("at90pwm3b", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM3B__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("at90pwm81", ARCH_AVR4, AVR_ISA_NONE, "__AVR_AT90PWM81__", 0x0100, 0x0, 0x2000, 0) /* Enhanced, > 8K, <= 64K. */ -AVR_MCU ("avr5", ARCH_AVR5, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x4000) -AVR_MCU ("ata5702m322", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5702M322__", 0x0200, 0x0, 0x10000) -AVR_MCU ("ata5782", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5782__", 0x0200, 0x8000, 0xd000) -AVR_MCU ("ata5790", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5790__", 0x0100, 0x0, 0x4000) -AVR_MCU ("ata5790n", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5790N__", 0x0100, 0x0, 0x4000) -AVR_MCU ("ata5791", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5791__", 0x0100, 0x0, 0x4000) -AVR_MCU ("ata5795", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5795__", 0x0100, 0x0, 0x2000) -AVR_MCU ("ata5831", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5831__", 0x0200, 0x8000, 0xd000) -AVR_MCU ("ata6613c", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA6613C__", 0x0100, 0x0, 0x4000) -AVR_MCU ("ata6614q", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA6614Q__", 0x0100, 0x0, 0x8000) -AVR_MCU ("ata8210", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA8210__", 0x0200, 0x8000, 0xd000) -AVR_MCU ("ata8510", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA8510__", 0x0200, 0x8000, 0xd000) -AVR_MCU ("atmega16", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16__", 0x0060, 0x0, 0x4000) -AVR_MCU ("atmega16a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16A__", 0x0060, 0x0, 0x4000) -AVR_MCU ("atmega161", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega161__", 0x0060, 0x0, 0x4000) -AVR_MCU ("atmega162", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega162__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega163", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega163__", 0x0060, 0x0, 0x4000) -AVR_MCU ("atmega164a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164A__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega164p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164P__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega164pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164PA__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega165", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega165a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165A__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega165p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165P__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega165pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165PA__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega168", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega168a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168A__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega168p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168P__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega168pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168PA__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega168pb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168PB__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega169", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega169a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169A__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega169p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169P__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega169pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169PA__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega16hvb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVB__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega16hvbrevb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVBREVB__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega16m1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16M1__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega16u4", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16U4__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega32a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32A__", 0x0060, 0x0, 0x8000) -AVR_MCU ("atmega32", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32__", 0x0060, 0x0, 0x8000) -AVR_MCU ("atmega323", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega323__", 0x0060, 0x0, 0x8000) -AVR_MCU ("atmega324a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324A__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega324p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324P__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega324pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324PA__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega325", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega325a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325A__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega325p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325P__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega325pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325PA__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega3250", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega3250a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250A__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega3250p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250P__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega3250pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250PA__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega328", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega328__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega328p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega328P__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega328pb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega328PB__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega329", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega329a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329A__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega329p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329P__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega329pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329PA__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega3290", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega3290a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290A__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega3290p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290P__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega3290pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290PA__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega32c1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32C1__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega32m1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32M1__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega32u4", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32U4__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega32u6", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32U6__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega406", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega406__", 0x0100, 0x0, 0xa000) -AVR_MCU ("atmega64", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega64a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64A__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega640", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega640__", 0x0200, 0x0, 0x10000) -AVR_MCU ("atmega644", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega644a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644A__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega644p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644P__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega644pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644PA__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega645", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega645a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645A__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega645p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645P__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega6450", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega6450a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450A__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega6450p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450P__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega649", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega649a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649A__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega649p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649P__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega6490", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega16hva", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVA__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega16hva2", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVA2__", 0x0100, 0x0, 0x4000) -AVR_MCU ("atmega32hvb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32HVB__", 0x0100, 0x0, 0x8000) -AVR_MCU ("atmega6490a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490A__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega6490p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490P__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega64c1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64C1__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega64m1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64M1__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega64hve", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64HVE__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega64hve2", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64HVE2__", 0x0100, 0x0, 0x10000) -AVR_MCU ("atmega64rfr2", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64RFR2__", 0x0200, 0x0, 0x10000) -AVR_MCU ("atmega644rfr2", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644RFR2__", 0x0200, 0x0, 0x10000) -AVR_MCU ("atmega32hvbrevb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32HVBREVB__", 0x0100, 0x0, 0x8000) -AVR_MCU ("at90can32", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90CAN32__", 0x0100, 0x0, 0x8000) -AVR_MCU ("at90can64", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90CAN64__", 0x0100, 0x0, 0x10000) -AVR_MCU ("at90pwm161", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM161__", 0x0100, 0x0, 0x4000) -AVR_MCU ("at90pwm216", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM216__", 0x0100, 0x0, 0x4000) -AVR_MCU ("at90pwm316", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM316__", 0x0100, 0x0, 0x4000) -AVR_MCU ("at90scr100", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90SCR100__", 0x0100, 0x0, 0x10000) -AVR_MCU ("at90usb646", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90USB646__", 0x0100, 0x0, 0x10000) -AVR_MCU ("at90usb647", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90USB647__", 0x0100, 0x0, 0x10000) -AVR_MCU ("at94k", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT94K__", 0x0060, 0x0, 0x8000) -AVR_MCU ("m3000", ARCH_AVR5, AVR_ISA_NONE, "__AVR_M3000__", 0x1000, 0x0, 0x10000) +AVR_MCU ("avr5", ARCH_AVR5, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x4000, 0) +AVR_MCU ("ata5702m322", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5702M322__", 0x0200, 0x0, 0x10000, 0) +AVR_MCU ("ata5782", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5782__", 0x0200, 0x8000, 0xd000, 0) +AVR_MCU ("ata5790", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5790__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("ata5790n", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5790N__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("ata5791", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5791__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("ata5795", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5795__", 0x0100, 0x0, 0x2000, 0) +AVR_MCU ("ata5831", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA5831__", 0x0200, 0x8000, 0xd000, 0) +AVR_MCU ("ata6613c", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA6613C__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("ata6614q", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA6614Q__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("ata8210", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA8210__", 0x0200, 0x8000, 0xd000, 0) +AVR_MCU ("ata8510", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATA8510__", 0x0200, 0x8000, 0xd000, 0) +AVR_MCU ("atmega16", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16__", 0x0060, 0x0, 0x4000, 0) +AVR_MCU ("atmega16a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16A__", 0x0060, 0x0, 0x4000, 0) +AVR_MCU ("atmega161", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega161__", 0x0060, 0x0, 0x4000, 0) +AVR_MCU ("atmega162", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega162__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega163", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega163__", 0x0060, 0x0, 0x4000, 0) +AVR_MCU ("atmega164a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164A__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega164p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164P__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega164pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega164PA__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega165", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega165a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165A__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega165p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165P__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega165pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega165PA__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega168", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega168a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168A__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega168p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168P__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega168pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168PA__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega168pb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega168PB__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega169", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega169a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169A__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega169p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169P__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega169pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega169PA__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega16hvb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVB__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega16hvbrevb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVBREVB__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega16m1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16M1__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega16u4", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16U4__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega32a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32A__", 0x0060, 0x0, 0x8000, 0) +AVR_MCU ("atmega32", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32__", 0x0060, 0x0, 0x8000, 0) +AVR_MCU ("atmega323", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega323__", 0x0060, 0x0, 0x8000, 0) +AVR_MCU ("atmega324a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324A__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega324p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324P__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega324pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega324PA__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega325", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega325a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325A__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega325p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325P__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega325pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega325PA__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega3250", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega3250a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250A__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega3250p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250P__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega3250pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3250PA__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega328", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega328__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega328p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega328P__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega328pb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega328PB__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega329", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega329a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329A__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega329p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329P__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega329pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega329PA__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega3290", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega3290a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290A__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega3290p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290P__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega3290pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega3290PA__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega32c1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32C1__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega32m1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32M1__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega32u4", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32U4__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega32u6", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32U6__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega406", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega406__", 0x0100, 0x0, 0xa000, 0) +AVR_MCU ("atmega64", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega64a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64A__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega640", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega640__", 0x0200, 0x0, 0x10000, 0) +AVR_MCU ("atmega644", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega644a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644A__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega644p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644P__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega644pa", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644PA__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega645", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega645a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645A__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega645p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega645P__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega6450", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega6450a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450A__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega6450p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6450P__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega649", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega649a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649A__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega649p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega649P__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega6490", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega16hva", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVA__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega16hva2", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega16HVA2__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("atmega32hvb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32HVB__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("atmega6490a", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490A__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega6490p", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega6490P__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega64c1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64C1__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega64m1", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64M1__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega64hve", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64HVE__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega64hve2", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64HVE2__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("atmega64rfr2", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega64RFR2__", 0x0200, 0x0, 0x10000, 0) +AVR_MCU ("atmega644rfr2", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega644RFR2__", 0x0200, 0x0, 0x10000, 0) +AVR_MCU ("atmega32hvbrevb", ARCH_AVR5, AVR_ISA_NONE, "__AVR_ATmega32HVBREVB__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("at90can32", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90CAN32__", 0x0100, 0x0, 0x8000, 0) +AVR_MCU ("at90can64", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90CAN64__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("at90pwm161", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM161__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("at90pwm216", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM216__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("at90pwm316", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90PWM316__", 0x0100, 0x0, 0x4000, 0) +AVR_MCU ("at90scr100", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90SCR100__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("at90usb646", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90USB646__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("at90usb647", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT90USB647__", 0x0100, 0x0, 0x10000, 0) +AVR_MCU ("at94k", ARCH_AVR5, AVR_ISA_NONE, "__AVR_AT94K__", 0x0060, 0x0, 0x8000, 0) +AVR_MCU ("m3000", ARCH_AVR5, AVR_ISA_NONE, "__AVR_M3000__", 0x1000, 0x0, 0x10000, 0) /* Enhanced, == 128K. */ -AVR_MCU ("avr51", ARCH_AVR51, AVR_ISA_NONE, NULL, 0x0100, 0x0, 0x20000) -AVR_MCU ("atmega128", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128__", 0x0100, 0x0, 0x20000) -AVR_MCU ("atmega128a", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128A__", 0x0100, 0x0, 0x20000) -AVR_MCU ("atmega1280", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1280__", 0x0200, 0x0, 0x20000) -AVR_MCU ("atmega1281", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1281__", 0x0200, 0x0, 0x20000) -AVR_MCU ("atmega1284", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1284__", 0x0100, 0x0, 0x20000) -AVR_MCU ("atmega1284p", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1284P__", 0x0100, 0x0, 0x20000) -AVR_MCU ("atmega128rfa1", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128RFA1__", 0x0200, 0x0, 0x20000) -AVR_MCU ("atmega128rfr2", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128RFR2__", 0x0200, 0x0, 0x20000) -AVR_MCU ("atmega1284rfr2", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1284RFR2__", 0x0200, 0x0, 0x20000) -AVR_MCU ("at90can128", ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90CAN128__", 0x0100, 0x0, 0x20000) -AVR_MCU ("at90usb1286", ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90USB1286__", 0x0100, 0x0, 0x20000) -AVR_MCU ("at90usb1287", ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90USB1287__", 0x0100, 0x0, 0x20000) +AVR_MCU ("avr51", ARCH_AVR51, AVR_ISA_NONE, NULL, 0x0100, 0x0, 0x20000, 0) +AVR_MCU ("atmega128", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128__", 0x0100, 0x0, 0x20000, 0) +AVR_MCU ("atmega128a", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128A__", 0x0100, 0x0, 0x20000, 0) +AVR_MCU ("atmega1280", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1280__", 0x0200, 0x0, 0x20000, 0) +AVR_MCU ("atmega1281", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1281__", 0x0200, 0x0, 0x20000, 0) +AVR_MCU ("atmega1284", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1284__", 0x0100, 0x0, 0x20000, 0) +AVR_MCU ("atmega1284p", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1284P__", 0x0100, 0x0, 0x20000, 0) +AVR_MCU ("atmega128rfa1", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128RFA1__", 0x0200, 0x0, 0x20000, 0) +AVR_MCU ("atmega128rfr2", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega128RFR2__", 0x0200, 0x0, 0x20000, 0) +AVR_MCU ("atmega1284rfr2", ARCH_AVR51, AVR_ISA_NONE, "__AVR_ATmega1284RFR2__", 0x0200, 0x0, 0x20000, 0) +AVR_MCU ("at90can128", ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90CAN128__", 0x0100, 0x0, 0x20000, 0) +AVR_MCU ("at90usb1286", ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90USB1286__", 0x0100, 0x0, 0x20000, 0) +AVR_MCU ("at90usb1287", ARCH_AVR51, AVR_ISA_NONE, "__AVR_AT90USB1287__", 0x0100, 0x0, 0x20000, 0) /* 3-Byte PC. */ -AVR_MCU ("avr6", ARCH_AVR6, AVR_ISA_NONE, NULL, 0x0200, 0x0, 0x40000) -AVR_MCU ("atmega2560", ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega2560__", 0x0200, 0x0, 0x40000) -AVR_MCU ("atmega2561", ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega2561__", 0x0200, 0x0, 0x40000) -AVR_MCU ("atmega256rfr2", ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega256RFR2__", 0x0200, 0x0, 0x40000) -AVR_MCU ("atmega2564rfr2", ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega2564RFR2__", 0x0200, 0x0, 0x40000) +AVR_MCU ("avr6", ARCH_AVR6, AVR_ISA_NONE, NULL, 0x0200, 0x0, 0x40000, 0) +AVR_MCU ("atmega2560", ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega2560__", 0x0200, 0x0, 0x40000, 0) +AVR_MCU ("atmega2561", ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega2561__", 0x0200, 0x0, 0x40000, 0) +AVR_MCU ("atmega256rfr2", ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega256RFR2__", 0x0200, 0x0, 0x40000, 0) +AVR_MCU ("atmega2564rfr2", ARCH_AVR6, AVR_ISA_NONE, "__AVR_ATmega2564RFR2__", 0x0200, 0x0, 0x40000, 0) /* Xmega, 16K <= Flash < 64K, RAM <= 64K */ -AVR_MCU ("avrxmega2", ARCH_AVRXMEGA2, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x9000) -AVR_MCU ("atxmega8e5", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega8E5__", 0x2000, 0x0, 0x2800) -AVR_MCU ("atxmega16a4", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega16A4__", 0x2000, 0x0, 0x5000) -AVR_MCU ("atxmega16d4", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega16D4__", 0x2000, 0x0, 0x5000) -AVR_MCU ("atxmega16e5", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega16E5__", 0x2000, 0x0, 0x5000) -AVR_MCU ("atxmega32a4", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32A4__", 0x2000, 0x0, 0x9000) -AVR_MCU ("atxmega32c3", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega32C3__", 0x2000, 0x0, 0x9000) -AVR_MCU ("atxmega32d3", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32D3__", 0x2000, 0x0, 0x9000) -AVR_MCU ("atxmega32d4", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32D4__", 0x2000, 0x0, 0x9000) -AVR_MCU ("atxmega16a4u", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega16A4U__", 0x2000, 0x0, 0x5000) -AVR_MCU ("atxmega16c4", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega16C4__", 0x2000, 0x0, 0x5000) -AVR_MCU ("atxmega32a4u", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega32A4U__", 0x2000, 0x0, 0x9000) -AVR_MCU ("atxmega32c4", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega32C4__", 0x2000, 0x0, 0x9000) -AVR_MCU ("atxmega32e5", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32E5__", 0x2000, 0x0, 0x9000) +AVR_MCU ("avrxmega2", ARCH_AVRXMEGA2, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x9000, 0) +AVR_MCU ("atxmega8e5", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega8E5__", 0x2000, 0x0, 0x2800, 0) +AVR_MCU ("atxmega16a4", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega16A4__", 0x2000, 0x0, 0x5000, 0) +AVR_MCU ("atxmega16d4", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega16D4__", 0x2000, 0x0, 0x5000, 0) +AVR_MCU ("atxmega16e5", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega16E5__", 0x2000, 0x0, 0x5000, 0) +AVR_MCU ("atxmega32a4", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32A4__", 0x2000, 0x0, 0x9000, 0) +AVR_MCU ("atxmega32c3", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega32C3__", 0x2000, 0x0, 0x9000, 0) +AVR_MCU ("atxmega32d3", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32D3__", 0x2000, 0x0, 0x9000, 0) +AVR_MCU ("atxmega32d4", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32D4__", 0x2000, 0x0, 0x9000, 0) +AVR_MCU ("atxmega16a4u", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega16A4U__", 0x2000, 0x0, 0x5000, 0) +AVR_MCU ("atxmega16c4", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega16C4__", 0x2000, 0x0, 0x5000, 0) +AVR_MCU ("atxmega32a4u", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega32A4U__", 0x2000, 0x0, 0x9000, 0) +AVR_MCU ("atxmega32c4", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega32C4__", 0x2000, 0x0, 0x9000, 0) +AVR_MCU ("atxmega32e5", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32E5__", 0x2000, 0x0, 0x9000, 0) /* Xmega, Flash + RAM < 64K, flash visible in RAM address space */ -AVR_MCU ("avrxmega3", ARCH_AVRXMEGA3, AVR_ISA_NONE, NULL, 0x3f00, 0x0, 0x8000) -AVR_MCU ("attiny212", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny212__", 0x3f80, 0x0, 0x800) -AVR_MCU ("attiny214", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny214__", 0x3f80, 0x0, 0x800) -AVR_MCU ("attiny412", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny412__", 0x3f00, 0x0, 0x1000) -AVR_MCU ("attiny414", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny414__", 0x3f00, 0x0, 0x1000) -AVR_MCU ("attiny416", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny416__", 0x3f00, 0x0, 0x1000) -AVR_MCU ("attiny417", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny417__", 0x3f00, 0x0, 0x1000) -AVR_MCU ("attiny814", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny814__", 0x3e00, 0x0, 0x2000) -AVR_MCU ("attiny816", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny816__", 0x3e00, 0x0, 0x2000) -AVR_MCU ("attiny817", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny817__", 0x3e00, 0x0, 0x2000) -AVR_MCU ("attiny1614", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1614__", 0x3800, 0x0, 0x4000) -AVR_MCU ("attiny1616", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1616__", 0x3800, 0x0, 0x4000) -AVR_MCU ("attiny1617", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1617__", 0x3800, 0x0, 0x4000) -AVR_MCU ("attiny3214", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3214__", 0x3800, 0x0, 0x8000) -AVR_MCU ("attiny3216", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3216__", 0x3800, 0x0, 0x8000) -AVR_MCU ("attiny3217", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3217__", 0x3800, 0x0, 0x8000) +AVR_MCU ("avrxmega3", ARCH_AVRXMEGA3, AVR_ISA_NONE, NULL, 0x3f00, 0x0, 0x8000, 0) +AVR_MCU ("attiny202", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny202__", 0x3f80, 0x0, 0x800, 0x8000) +AVR_MCU ("attiny204", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny204__", 0x3f80, 0x0, 0x800, 0x8000) +AVR_MCU ("attiny402", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny402__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny404", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny404__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny406", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny406__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny804", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny804__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny806", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny806__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny807", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny807__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny1604", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1604__", 0x3c00, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1606", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1606__", 0x3c00, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1607", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1607__", 0x3c00, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny212", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny212__", 0x3f80, 0x0, 0x800, 0x8000) +AVR_MCU ("attiny214", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny214__", 0x3f80, 0x0, 0x800, 0x8000) +AVR_MCU ("attiny412", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny412__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny414", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny414__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny416", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny416__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny417", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny417__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny814", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny814__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny816", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny816__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny817", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny817__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny1614", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1614__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1616", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1616__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1617", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1617__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny3214", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3214__", 0x3800, 0x0, 0x8000, 0x8000) +AVR_MCU ("attiny3216", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3216__", 0x3800, 0x0, 0x8000, 0x8000) +AVR_MCU ("attiny3217", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3217__", 0x3800, 0x0, 0x8000, 0x8000) +AVR_MCU ("atmega808", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATmega808__", 0x3c00, 0x0, 0x2000, 0x4000) +AVR_MCU ("atmega809", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATmega809__", 0x3c00, 0x0, 0x2000, 0x4000) +AVR_MCU ("atmega1608", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega1608__", 0x3800, 0x0, 0x4000, 0x4000) +AVR_MCU ("atmega1609", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega1609__", 0x3800, 0x0, 0x4000, 0x4000) +AVR_MCU ("atmega3208", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega3208__", 0x3800, 0x0, 0x8000, 0x4000) +AVR_MCU ("atmega3209", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega3209__", 0x3800, 0x0, 0x8000, 0x4000) +AVR_MCU ("atmega4808", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega4808__", 0x2800, 0x0, 0xc000, 0x4000) +AVR_MCU ("atmega4809", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega4809__", 0x2800, 0x0, 0xc000, 0x4000) /* Xmega, 64K < Flash <= 128K, RAM <= 64K */ -AVR_MCU ("avrxmega4", ARCH_AVRXMEGA4, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64a3", ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64A3__", 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64d3", ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64D3__", 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64a3u", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64A3U__", 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64a4u", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64A4U__", 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64b1", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64B1__", 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64b3", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64B3__", 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64c3", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64C3__", 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64d4", ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64D4__", 0x2000, 0x0, 0x11000) +AVR_MCU ("avrxmega4", ARCH_AVRXMEGA4, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64a3", ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64A3__", 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64d3", ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64D3__", 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64a3u", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64A3U__", 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64a4u", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64A4U__", 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64b1", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64B1__", 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64b3", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64B3__", 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64c3", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64C3__", 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64d4", ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64D4__", 0x2000, 0x0, 0x11000, 0) /* Xmega, 64K < Flash <= 128K, RAM > 64K */ -AVR_MCU ("avrxmega5", ARCH_AVRXMEGA5, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64a1", ARCH_AVRXMEGA5, AVR_ISA_NONE, "__AVR_ATxmega64A1__", 0x2000, 0x0, 0x11000) -AVR_MCU ("atxmega64a1u", ARCH_AVRXMEGA5, AVR_ISA_RMW, "__AVR_ATxmega64A1U__", 0x2000, 0x0, 0x11000) +AVR_MCU ("avrxmega5", ARCH_AVRXMEGA5, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64a1", ARCH_AVRXMEGA5, AVR_ISA_NONE, "__AVR_ATxmega64A1__", 0x2000, 0x0, 0x11000, 0) +AVR_MCU ("atxmega64a1u", ARCH_AVRXMEGA5, AVR_ISA_RMW, "__AVR_ATxmega64A1U__", 0x2000, 0x0, 0x11000, 0) /* Xmega, 128K < Flash, RAM <= 64K */ -AVR_MCU ("avrxmega6", ARCH_AVRXMEGA6, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x60000) -AVR_MCU ("atxmega128a3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128A3__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega128d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128D3__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega192a3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega192A3__", 0x2000, 0x0, 0x32000) -AVR_MCU ("atxmega192d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega192D3__", 0x2000, 0x0, 0x32000) -AVR_MCU ("atxmega256a3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3__", 0x2000, 0x0, 0x42000) -AVR_MCU ("atxmega256a3b", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3B__", 0x2000, 0x0, 0x42000) -AVR_MCU ("atxmega256a3bu", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3BU__", 0x2000, 0x0, 0x42000) -AVR_MCU ("atxmega256d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256D3__", 0x2000, 0x0, 0x42000) -AVR_MCU ("atxmega128a3u", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128A3U__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega128b1", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128B1__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega128b3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128B3__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega128c3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128C3__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega128d4", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128D4__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega192a3u", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega192A3U__", 0x2000, 0x0, 0x32000) -AVR_MCU ("atxmega192c3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega192C3__", 0x2000, 0x0, 0x32000) -AVR_MCU ("atxmega256a3u", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega256A3U__", 0x2000, 0x0, 0x42000) -AVR_MCU ("atxmega256c3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega256C3__", 0x2000, 0x0, 0x42000) -AVR_MCU ("atxmega384c3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega384C3__", 0x2000, 0x0, 0x62000) -AVR_MCU ("atxmega384d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega384D3__", 0x2000, 0x0, 0x62000) +AVR_MCU ("avrxmega6", ARCH_AVRXMEGA6, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x60000, 0) +AVR_MCU ("atxmega128a3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128A3__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega128d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128D3__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega192a3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega192A3__", 0x2000, 0x0, 0x32000, 0) +AVR_MCU ("atxmega192d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega192D3__", 0x2000, 0x0, 0x32000, 0) +AVR_MCU ("atxmega256a3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3__", 0x2000, 0x0, 0x42000, 0) +AVR_MCU ("atxmega256a3b", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3B__", 0x2000, 0x0, 0x42000, 0) +AVR_MCU ("atxmega256a3bu", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3BU__", 0x2000, 0x0, 0x42000, 0) +AVR_MCU ("atxmega256d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256D3__", 0x2000, 0x0, 0x42000, 0) +AVR_MCU ("atxmega128a3u", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128A3U__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega128b1", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128B1__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega128b3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128B3__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega128c3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128C3__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega128d4", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega128D4__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega192a3u", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega192A3U__", 0x2000, 0x0, 0x32000, 0) +AVR_MCU ("atxmega192c3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega192C3__", 0x2000, 0x0, 0x32000, 0) +AVR_MCU ("atxmega256a3u", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega256A3U__", 0x2000, 0x0, 0x42000, 0) +AVR_MCU ("atxmega256c3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega256C3__", 0x2000, 0x0, 0x42000, 0) +AVR_MCU ("atxmega384c3", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega384C3__", 0x2000, 0x0, 0x62000, 0) +AVR_MCU ("atxmega384d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega384D3__", 0x2000, 0x0, 0x62000, 0) /* Xmega, 128K < Flash, RAM > 64K RAM. */ -AVR_MCU ("avrxmega7", ARCH_AVRXMEGA7, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega128a1", ARCH_AVRXMEGA7, AVR_ISA_NONE, "__AVR_ATxmega128A1__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega128a1u", ARCH_AVRXMEGA7, AVR_ISA_RMW, "__AVR_ATxmega128A1U__", 0x2000, 0x0, 0x22000) -AVR_MCU ("atxmega128a4u", ARCH_AVRXMEGA7, AVR_ISA_RMW, "__AVR_ATxmega128A4U__", 0x2000, 0x0, 0x22000) +AVR_MCU ("avrxmega7", ARCH_AVRXMEGA7, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega128a1", ARCH_AVRXMEGA7, AVR_ISA_NONE, "__AVR_ATxmega128A1__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega128a1u", ARCH_AVRXMEGA7, AVR_ISA_RMW, "__AVR_ATxmega128A1U__", 0x2000, 0x0, 0x22000, 0) +AVR_MCU ("atxmega128a4u", ARCH_AVRXMEGA7, AVR_ISA_RMW, "__AVR_ATxmega128A4U__", 0x2000, 0x0, 0x22000, 0) /* Tiny family */ -AVR_MCU ("avrtiny", ARCH_AVRTINY, AVR_ISA_NONE, NULL, 0x0040, 0x0, 0x400) -AVR_MCU ("attiny4", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny4__", 0x0040, 0x0, 0x200) -AVR_MCU ("attiny5", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny5__", 0x0040, 0x0, 0x200) -AVR_MCU ("attiny9", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny9__", 0x0040, 0x0, 0x400) -AVR_MCU ("attiny10", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny10__", 0x0040, 0x0, 0x400) -AVR_MCU ("attiny20", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny20__", 0x0040, 0x0, 0x800) -AVR_MCU ("attiny40", ARCH_AVRTINY, AVR_ISA_NONE, "__AVR_ATtiny40__", 0x0040, 0x0, 0x1000) +AVR_MCU ("avrtiny", ARCH_AVRTINY, AVR_ISA_NONE, NULL, 0x0040, 0x0, 0x400, 0) +AVR_MCU ("attiny4", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny4__", 0x0040, 0x0, 0x200, 0) +AVR_MCU ("attiny5", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny5__", 0x0040, 0x0, 0x200, 0) +AVR_MCU ("attiny9", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny9__", 0x0040, 0x0, 0x400, 0) +AVR_MCU ("attiny10", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny10__", 0x0040, 0x0, 0x400, 0) +AVR_MCU ("attiny20", ARCH_AVRTINY, AVR_ISA_LDS, "__AVR_ATtiny20__", 0x0040, 0x0, 0x800, 0) +AVR_MCU ("attiny40", ARCH_AVRTINY, AVR_ISA_NONE, "__AVR_ATtiny40__", 0x0040, 0x0, 0x1000, 0) /* Assembler only. */ -AVR_MCU ("avr1", ARCH_AVR1, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x400) -AVR_MCU ("at90s1200", ARCH_AVR1, AVR_ISA_NONE, "__AVR_AT90S1200__", 0x0060, 0x0, 0x400) -AVR_MCU ("attiny11", ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny11__", 0x0060, 0x0, 0x400) -AVR_MCU ("attiny12", ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny12__", 0x0060, 0x0, 0x400) -AVR_MCU ("attiny15", ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny15__", 0x0060, 0x0, 0x400) -AVR_MCU ("attiny28", ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny28__", 0x0060, 0x0, 0x800) +AVR_MCU ("avr1", ARCH_AVR1, AVR_ISA_NONE, NULL, 0x0060, 0x0, 0x400, 0) +AVR_MCU ("at90s1200", ARCH_AVR1, AVR_ISA_NONE, "__AVR_AT90S1200__", 0x0060, 0x0, 0x400, 0) +AVR_MCU ("attiny11", ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny11__", 0x0060, 0x0, 0x400, 0) +AVR_MCU ("attiny12", ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny12__", 0x0060, 0x0, 0x400, 0) +AVR_MCU ("attiny15", ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny15__", 0x0060, 0x0, 0x400, 0) +AVR_MCU ("attiny28", ARCH_AVR1, AVR_ISA_NONE, "__AVR_ATtiny28__", 0x0060, 0x0, 0x800, 0) diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 81c35e7fbc2..21bf94fc16c 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -3797,13 +3797,14 @@ avr_out_lpm (rtx_insn *insn, rtx *op, int *plen) gcc_unreachable(); case 1: - return avr_asm_len ("%4lpm %0,%a2", xop, plen, 1); + avr_asm_len ("%4lpm %0,%a2", xop, plen, 1); + break; case 2: if (REGNO (dest) == REG_Z) - return avr_asm_len ("%4lpm %5,%a2+" CR_TAB - "%4lpm %B0,%a2" CR_TAB - "mov %A0,%5", xop, plen, 3); + avr_asm_len ("%4lpm %5,%a2+" CR_TAB + "%4lpm %B0,%a2" CR_TAB + "mov %A0,%5", xop, plen, 3); else { avr_asm_len ("%4lpm %A0,%a2+" CR_TAB @@ -3832,9 +3833,9 @@ avr_out_lpm (rtx_insn *insn, rtx *op, int *plen) "%4lpm %B0,%a2+", xop, plen, 2); if (REGNO (dest) == REG_Z - 2) - return avr_asm_len ("%4lpm %5,%a2+" CR_TAB - "%4lpm %C0,%a2" CR_TAB - "mov %D0,%5", xop, plen, 3); + avr_asm_len ("%4lpm %5,%a2+" CR_TAB + "%4lpm %C0,%a2" CR_TAB + "mov %D0,%5", xop, plen, 3); else { avr_asm_len ("%4lpm %C0,%a2+" CR_TAB diff --git a/gcc/config/avr/gen-avr-mmcu-specs.c b/gcc/config/avr/gen-avr-mmcu-specs.c index 7a008753216..67fdd292209 100644 --- a/gcc/config/avr/gen-avr-mmcu-specs.c +++ b/gcc/config/avr/gen-avr-mmcu-specs.c @@ -50,14 +50,6 @@ #define SPECFILE_USAGE_URL \ "https://gcc.gnu.org/gcc-5/changes.html" -/* Return true iff STR starts with PREFIX. */ - -static bool -str_prefix_p (const char *str, const char *prefix) -{ - return strncmp (str, prefix, strlen (prefix)) == 0; -} - static const char header[] = "#\n" @@ -105,7 +97,7 @@ static const char help_dev_lib_name[] = "# #include \n" "#\n" "# will include the desired device header. For ATmega8A the supplement\n" - "# to *cpp would read\n" + "# to *cpp_avrlibc would read\n" "#\n" "# -D__AVR_DEV_LIB_NAME__=m8a\n" "\n"; @@ -140,6 +132,14 @@ print_mcu (const avr_mcu_t *mcu) bool rcall = (mcu->dev_attribute & AVR_ISA_RCALL); bool is_arch = mcu->macro == NULL; bool is_device = ! is_arch; + int flash_pm_offset = 0; + + if (arch->flash_pm_offset + && mcu->flash_pm_offset + && mcu->flash_pm_offset != arch->flash_pm_offset) + { + flash_pm_offset = mcu->flash_pm_offset; + } if (is_arch && (ARCH_AVR2 == arch_id @@ -253,7 +253,11 @@ print_mcu (const avr_mcu_t *mcu) fprintf (f, "*link_relax:\n\t%s\n\n", LINK_RELAX_SPEC); - fprintf (f, "*link_arch:\n\t%s\n\n", LINK_ARCH_SPEC); + fprintf (f, "*link_arch:\n\t%s", LINK_ARCH_SPEC); + if (is_device + && flash_pm_offset) + fprintf (f, " --defsym=__RODATA_PM_OFFSET__=0x%x", flash_pm_offset); + fprintf (f, "\n\n"); if (is_device) { @@ -281,10 +285,26 @@ print_mcu (const avr_mcu_t *mcu) #if defined (WITH_AVRLIBC) fprintf (f, "%s\n", help_dev_lib_name); + + fprintf (f, "*cpp_avrlibc:\n"); + fprintf (f, "\t-D__AVR_DEVICE_NAME__=%s", mcu->name); + fprintf (f, "\n\n"); #endif // WITH_AVRLIBC + fprintf (f, "*cpp_mcu:\n"); + fprintf (f, "\t-D%s", mcu->macro); + if (flash_pm_offset) + { + fprintf (f, " -U__AVR_PM_BASE_ADDRESS__"); + fprintf (f, " -D__AVR_PM_BASE_ADDRESS__=0x%x", flash_pm_offset); + } + fprintf (f, "\n\n"); + fprintf (f, "*cpp:\n"); - fprintf (f, "\t-D%s -D__AVR_DEVICE_NAME__=%s", mcu->macro, mcu->name); + fprintf (f, "\t%%(cpp_mcu)"); +#if defined (WITH_AVRLIBC) + fprintf (f, " %%(cpp_avrlibc)"); +#endif // WITH_AVRLIBC fprintf (f, "\n\n"); } diff --git a/gcc/config/avr/gen-avr-mmcu-texi.c b/gcc/config/avr/gen-avr-mmcu-texi.c index ae4b39a4ce1..cfa4e789910 100644 --- a/gcc/config/avr/gen-avr-mmcu-texi.c +++ b/gcc/config/avr/gen-avr-mmcu-texi.c @@ -25,8 +25,8 @@ #include "avr-devices.c" -static const char* -mcu_name[sizeof avr_mcu_types / sizeof avr_mcu_types[0]]; +static const avr_mcu_t* +mcus[sizeof avr_mcu_types / sizeof avr_mcu_types[0]]; static int letter (char c) { @@ -38,25 +38,84 @@ static int digit (char c) return c >= '0' && c <= '9'; } +static int +str_prefix_p (const char *str, const char *prefix) +{ + return strncmp (str, prefix, strlen (prefix)) == 0; +} + + +/* Used by string comparator to group MCUs by their + name prefix like "attiny" or "atmega". */ + +static int +c_prefix (const char *str) +{ + static const char *const prefixes[] = + { + "attiny", "atmega", "atxmega", "ata", "at90" + }; + + int i, n = (int) (sizeof (prefixes) / sizeof (*prefixes)); + + for (i = 0; i < n; i++) + if (str_prefix_p (str, prefixes[i])) + return i; + + return n; +} + + +/* If A starts a group of digits, return their value as a number. */ + +static int +c_number (const char *a) +{ + int val = 0; + + if (digit (*a) && ! digit (*(a-1))) + { + while (digit (*a)) + val = 10 * val + (*a++) - '0'; + } + + return val; +} + + +/* Compare two MCUs and order them for easy lookup. */ + static int comparator (const void *va, const void *vb) { - const char *a = *(const char* const*) va; - const char *b = *(const char* const*) vb; + const avr_mcu_t *mcu_a = *(const avr_mcu_t* const*) va; + const avr_mcu_t *mcu_b = *(const avr_mcu_t* const*) vb; + const char *a = mcu_a->name; + const char *b = mcu_b->name; + + // First, group MCUs according to their pure-letter prefix. + + int c = c_prefix (a) - c_prefix (b); + if (c) + return c; + + // Second, if their prefixes are the same, group according to + // their flash size. + + c = (int) mcu_a->flash_size - (int) mcu_b->flash_size; + if (c) + return c; + + // Third, group according to aligned groups of digits. while (*a && *b) { - /* Make letters smaller than digits so that `atmega16a' follows - `atmega16' without `atmega161' etc. between them. */ - - if (letter (*a) && digit (*b)) - return -1; - - if (digit (*a) && letter (*b)) - return 1; + c = c_number (a) - c_number (b); + if (c) + return c; if (*a != *b) - return *a - *b; + return *a - *b; a++; b++; @@ -74,21 +133,21 @@ print_mcus (size_t n_mcus) if (!n_mcus) return; - qsort (mcu_name, n_mcus, sizeof (char*), comparator); + qsort (mcus, n_mcus, sizeof (avr_mcu_t*), comparator); printf ("@*@var{mcu}@tie{}="); for (i = 0; i < n_mcus; i++) { - printf (" @code{%s}%s", mcu_name[i], i == n_mcus-1 ? ".\n\n" : ","); + printf (" @code{%s}%s", mcus[i]->name, i == n_mcus-1 ? ".\n\n" : ","); - if (i && !strcmp (mcu_name[i], mcu_name[i-1])) - { - /* Sanity-check: Fail on devices that are present more than once. */ + if (i && !strcmp (mcus[i]->name, mcus[i-1]->name)) + { + // Sanity-check: Fail on devices that are present more than once. - duplicate = 1; - fprintf (stderr, "error: duplicate device: %s\n", mcu_name[i]); - } + duplicate = 1; + fprintf (stderr, "error: duplicate device: %s\n", mcus[i]->name); + } } if (duplicate) @@ -104,13 +163,13 @@ int main (void) printf ("@c Copyright (C) 2012-2018 Free Software Foundation, Inc.\n"); printf ("@c This is part of the GCC manual.\n"); printf ("@c For copying conditions, see the file " - "gcc/doc/include/fdl.texi.\n\n"); + "gcc/doc/include/fdl.texi.\n\n"); printf ("@c This file is generated automatically using\n"); printf ("@c gcc/config/avr/gen-avr-mmcu-texi.c from:\n"); - printf ("@c gcc/config/avr/avr-arch.h\n"); - printf ("@c gcc/config/avr/avr-devices.c\n"); - printf ("@c gcc/config/avr/avr-mcus.def\n\n"); + printf ("@c gcc/config/avr/avr-arch.h\n"); + printf ("@c gcc/config/avr/avr-devices.c\n"); + printf ("@c gcc/config/avr/avr-mcus.def\n\n"); printf ("@c Please do not edit manually.\n\n"); @@ -119,22 +178,21 @@ int main (void) for (mcu = avr_mcu_types; mcu->name; mcu++) { if (mcu->macro == NULL) - { - arch_id = mcu->arch_id; - - /* Start a new architecture: Flush the MCUs collected so far. */ + { + arch_id = mcu->arch_id; - print_mcus (n_mcus); - n_mcus = 0; + // Start a new architecture: Flush the MCUs collected so far. + print_mcus (n_mcus); + n_mcus = 0; - for (i = 0; i < sizeof (avr_texinfo) / sizeof (*avr_texinfo); i++) - if (arch_id == avr_texinfo[i].arch_id) - printf ("@item %s\n%s\n", mcu->name, avr_texinfo[i].texinfo); - } + for (i = 0; i < sizeof (avr_texinfo) / sizeof (*avr_texinfo); i++) + if (arch_id == avr_texinfo[i].arch_id) + printf ("@item %s\n%s\n", mcu->name, avr_texinfo[i].texinfo); + } else if (arch_id == (enum avr_arch_id) mcu->arch_id) - { - mcu_name[n_mcus++] = mcu->name; - } + { + mcus[n_mcus++] = mcu; + } } print_mcus (n_mcus); diff --git a/gcc/config/darwin-c.c b/gcc/config/darwin-c.c index 6d9d00435de..8fe02338bb1 100644 --- a/gcc/config/darwin-c.c +++ b/gcc/config/darwin-c.c @@ -463,41 +463,32 @@ static const char *framework_defaults [] = /* Register the GNU objective-C runtime include path if STDINC. */ void -darwin_register_objc_includes (const char *sysroot, const char *iprefix, - int stdinc) +darwin_register_objc_includes (const char *sysroot ATTRIBUTE_UNUSED, + const char *iprefix, int stdinc) { - const char *fname; - size_t len; - /* We do not do anything if we do not want the standard includes. */ - if (!stdinc) - return; - - fname = GCC_INCLUDE_DIR "-gnu-runtime"; - - /* Register the GNU OBJC runtime include path if we are compiling OBJC - with GNU-runtime. */ + /* If we want standard includes; Register the GNU OBJC runtime include + path if we are compiling OBJC with GNU-runtime. + This path is compiler-relative, we don't want to prepend the sysroot + since it's not expected to find the headers there. */ - if (c_dialect_objc () && !flag_next_runtime) + if (stdinc && c_dialect_objc () && !flag_next_runtime) { + const char *fname = GCC_INCLUDE_DIR "-gnu-runtime"; char *str; - /* See if our directory starts with the standard prefix. + size_t len; + + /* See if our directory starts with the standard prefix. "Translate" them, i.e. replace /usr/local/lib/gcc... with IPREFIX and search them first. */ - if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0 && !sysroot + if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0 && !strncmp (fname, cpp_GCC_INCLUDE_DIR, len)) { str = concat (iprefix, fname + len, NULL); - /* FIXME: wrap the headers for C++awareness. */ - add_path (str, INC_SYSTEM, /*c++aware=*/false, false); + add_path (str, INC_SYSTEM, /*c++aware=*/true, false); } - /* Should this directory start with the sysroot? */ - if (sysroot) - str = concat (sysroot, fname, NULL); - else - str = update_path (fname, ""); - - add_path (str, INC_SYSTEM, /*c++aware=*/false, false); + str = update_path (fname, ""); + add_path (str, INC_SYSTEM, /*c++aware=*/true, false); } } diff --git a/gcc/config/darwin-driver.c b/gcc/config/darwin-driver.c index 2b0de1e100d..2d72ab9a4d2 100644 --- a/gcc/config/darwin-driver.c +++ b/gcc/config/darwin-driver.c @@ -26,6 +26,91 @@ along with GCC; see the file COPYING3. If not see #include "opts.h" #include "diagnostic-core.h" +/* Validate a version string (either given on the command line or, perhaps + as MACOSX_DEPLOYMENT_TARGET). + + The specs %version-compare() function doesn't accept leading '0' on + numbers so strip them out. Do sanity checking here too. + + Return: + * original string means it was OK and we didn't want to change it. + * new string means it was OK but we rewrote it to avoid possible format + problems. + * NULL means we didn't like what we saw. +*/ + +static const char * +validate_macosx_version_min (const char *version_str) +{ + size_t version_len; + unsigned long major, minor, tiny = 0; + char *end; + const char *old_version = version_str; + bool need_rewrite = false; + + version_len = strlen (version_str); + if (version_len < 4) /* The minimum would be 10.x */ + return NULL; + + /* Version string must consist of digits and periods only. */ + if (strspn (version_str, "0123456789.") != version_len) + return NULL; + + if (!ISDIGIT (version_str[0]) || !ISDIGIT (version_str[version_len - 1])) + return NULL; + + if (version_str[0] == '0') + need_rewrite = true; + + major = strtoul (version_str, &end, 10); + version_str = end + ((*end == '.') ? 1 : 0); + + if (major != 10) /* So far .. all MacOS 10 ... */ + return NULL; + + /* Version string components must be present and numeric. */ + if (!ISDIGIT (version_str[0])) + return NULL; + + /* If we have one or more leading zeros on a component, then rewrite the + version string. */ + if (version_str[0] == '0' && version_str[1] != '\0' + && version_str[1] != '.') + need_rewrite = true; + + minor = strtoul (version_str, &end, 10); + version_str = end + ((*end == '.') ? 1 : 0); + if (minor > 99) + return NULL; + + /* If 'tiny' is present it must be numeric. */ + if (*end != '\0' && !ISDIGIT (version_str[0])) + return NULL; + + /* If we have one or more leading zeros on a component, then rewrite the + version string. */ + if (*end != '\0' && version_str[0] == '0' + && version_str[1] != '\0') + need_rewrite = true; + + tiny = strtoul (version_str, &end, 10); + if (tiny > 99) + return NULL; + + /* Version string must contain no more than three tokens. */ + if (*end != '\0') + return NULL; + + if (need_rewrite) + { + char *new_version; + asprintf (&new_version, "10.%lu.%lu", minor, tiny); + return new_version; + } + + return old_version; +} + #ifndef CROSS_DIRECTORY_STRUCTURE #include #include "xregex.h" @@ -114,16 +199,39 @@ darwin_default_min_version (void) if (new_flag != NULL) { - size_t len = strlen (new_flag); - if (len > 128) { /* Arbitrary limit, number should be like xx.yy.zz */ - warning (0, "couldn%'t understand version %s\n", new_flag); - return NULL; - } - new_flag = xstrndup (new_flag, len); + const char *checked = validate_macosx_version_min (new_flag); + if (checked == NULL) + { + warning (0, "couldn%'t understand version %s\n", new_flag); + return NULL; + } + new_flag = xstrndup (checked, strlen (checked)); } return new_flag; } +/* See if we can find the sysroot from the SDKROOT environment variable. */ + +static const char * +maybe_get_sysroot_from_sdkroot () +{ + const char *maybe_sysroot = getenv ("SDKROOT"); + + /* We'll use the same rules as the clang driver, for compatibility. + 1) The path must be absolute + 2) Ignore "/", that is the default anyway and we do not want the + sysroot semantics to be applied to it. + 3) It must exist (actually, we'll check it's readable too). */ + + if (maybe_sysroot == NULL + || *maybe_sysroot != '/' + || strlen (maybe_sysroot) == 1 + || access (maybe_sysroot, R_OK) == -1) + return NULL; + + return xstrndup (maybe_sysroot, strlen (maybe_sysroot)); +} + /* Translate -filelist and -framework options in *DECODED_OPTIONS (size *DECODED_OPTIONS_COUNT) to use -Xlinker so that they are considered to be linker inputs in the case that no other inputs are @@ -148,6 +256,7 @@ darwin_driver_init (unsigned int *decoded_options_count, bool appendM64 = false; const char *vers_string = NULL; bool seen_version_min = false; + bool seen_sysroot_p = false; for (i = 1; i < *decoded_options_count; i++) { @@ -175,7 +284,7 @@ darwin_driver_init (unsigned int *decoded_options_count, if (*decoded_options_count > i) { memmove (*decoded_options + i, *decoded_options + i + 1, - ((*decoded_options_count - i) + ((*decoded_options_count - i - 1) * sizeof (struct cl_decoded_option))); } --i; @@ -209,7 +318,29 @@ darwin_driver_init (unsigned int *decoded_options_count, case OPT_mmacosx_version_min_: seen_version_min = true; - vers_string = xstrndup ((*decoded_options)[i].arg, 32); + vers_string = + validate_macosx_version_min ((*decoded_options)[i].arg); + if (vers_string == NULL) + warning (0, "%qs is not valid for %\n", + (*decoded_options)[i].arg); + else if (vers_string == (*decoded_options)[i].arg) + vers_string = xstrndup ((*decoded_options)[i].arg, 32); + /* Now we've examined it, and verified/re-written, put it to + one side and append later. */ + if (*decoded_options_count > i) { + memmove (*decoded_options + i, + *decoded_options + i + 1, + ((*decoded_options_count - i - 1) + * sizeof (struct cl_decoded_option))); + } + --i; + --*decoded_options_count; + break; + + case OPT__sysroot_: + case OPT_isysroot: + seen_sysroot_p = true; + break; default: break; @@ -272,26 +403,40 @@ darwin_driver_init (unsigned int *decoded_options_count, &(*decoded_options)[*decoded_options_count - 1]); } - /* We will need to know the OS X version we're trying to build for here - so that we can figure out the mechanism and source for the sysroot to - be used. */ - if (! seen_version_min && *decoded_options_count > 1) + if (! seen_sysroot_p) { - /* Not set by the User, try to figure it out. */ - vers_string = darwin_default_min_version (); - if (vers_string != NULL) + /* We will pick up an SDKROOT if we didn't specify a sysroot and treat + it as overriding any configure-time --with-sysroot. */ + const char *sdkroot = maybe_get_sysroot_from_sdkroot (); + if (sdkroot) { ++*decoded_options_count; *decoded_options = XRESIZEVEC (struct cl_decoded_option, *decoded_options, *decoded_options_count); - generate_option (OPT_mmacosx_version_min_, vers_string, 1, CL_DRIVER, - &(*decoded_options)[*decoded_options_count - 1]); + generate_option (OPT__sysroot_, sdkroot, 1, CL_DRIVER, + &(*decoded_options)[*decoded_options_count - 1]); } } - /* Create and push the major version for assemblers that need it. */ + + /* We will need to know the OS X version we're trying to build for here + so that we can figure out the mechanism and source for the sysroot to + be used. */ + if (! seen_version_min && *decoded_options_count > 1) + /* Not set by the User, try to figure it out. */ + vers_string = darwin_default_min_version (); + + /* Create and push a cleaned up version, plus the major version for + assemblers and other cases that need it. */ if (vers_string != NULL) { + ++*decoded_options_count; + *decoded_options = XRESIZEVEC (struct cl_decoded_option, + *decoded_options, + *decoded_options_count); + generate_option (OPT_mmacosx_version_min_, vers_string, 1, CL_DRIVER, + &(*decoded_options)[*decoded_options_count - 1]); + char *asm_major = NULL; const char *first_period = strchr(vers_string, '.'); if (first_period != NULL) diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h index 56486919831..2dea40b65c8 100644 --- a/gcc/config/darwin-protos.h +++ b/gcc/config/darwin-protos.h @@ -53,8 +53,6 @@ extern void darwin_set_default_type_attributes (tree); #endif /* TREE_CODE */ -extern void machopic_finish (FILE *); - extern int machopic_reloc_rw_mask (void); extern section *machopic_select_section (tree, int, unsigned HOST_WIDE_INT); diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 3a08aea07be..2493a586cb0 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -74,15 +74,9 @@ along with GCC; see the file COPYING3. If not see setting the second word in the .non_lazy_symbol_pointer data structure to symbol. See indirect_data for the code that handles the extra indirection, and machopic_output_indirection and its use - of MACHO_SYMBOL_STATIC for the code that handles @code{static} + of MACHO_SYMBOL_FLAG_STATIC for the code that handles @code{static} symbol indirection. */ -/* For darwin >= 9 (OSX 10.5) the linker is capable of making the necessary - branch islands and we no longer need to emit darwin stubs. - However, if we are generating code for earlier systems (or for use in the - kernel) the stubs might still be required, and this will be set true. */ -int darwin_emit_branch_islands = false; - typedef struct GTY(()) cdtor_record { rtx symbol; int priority; /* [con/de]structor priority */ @@ -104,6 +98,10 @@ int generating_for_darwin_version ; for weak or single-definition items. */ static bool ld_uses_coal_sects = false; +/* Very old (ld_classic) linkers need a symbol to mark the start of + each FDE. */ +static bool ld_needs_eh_markers = false; + /* Section names. */ section * darwin_sections[NUM_DARWIN_SECTIONS]; @@ -249,7 +247,7 @@ name_needs_quotes (const char *name) int machopic_symbol_defined_p (rtx sym_ref) { - if (SYMBOL_REF_FLAGS (sym_ref) & MACHO_SYMBOL_FLAG_DEFINED) + if (MACHO_SYMBOL_DEFINED_P (sym_ref)) return true; /* If a symbol references local and is not an extern to this @@ -258,7 +256,7 @@ machopic_symbol_defined_p (rtx sym_ref) { /* If the symbol references a variable and the variable is a common symbol, then this symbol is not defined. */ - if (SYMBOL_REF_FLAGS (sym_ref) & MACHO_SYMBOL_FLAG_VARIABLE) + if (MACHO_SYMBOL_VARIABLE_P (sym_ref)) { tree decl = SYMBOL_REF_DECL (sym_ref); if (!decl) @@ -454,6 +452,13 @@ typedef struct GTY ((for_user)) machopic_indirection bool stub_p; /* True iff this stub or pointer has been referenced. */ bool used; + /* True iff a non-lazy symbol pointer should be emitted into the .data + section, rather than the non-lazy symbol pointers section. The cases + for which this occurred seem to have been unintentional, and later + toolchains emit all of the indirections to the 'usual' section. We + are keeping this in case it is necessary to preserve compatibility with + older toolchains. */ + bool nlsp_in_data_section; } machopic_indirection; struct indirection_hasher : ggc_ptr_hash @@ -488,7 +493,7 @@ indirection_hasher::equal (machopic_indirection *s, const char *k) /* Return the name of the non-lazy pointer (if STUB_P is false) or stub (if STUB_B is true) corresponding to the given name. - If we have a situation like: + PR71767 - If we have a situation like: global_weak_symbol: .... @@ -497,36 +502,22 @@ indirection_hasher::equal (machopic_indirection *s, const char *k) ld64 will be unable to split this into two atoms (because the "L" makes the second symbol 'invisible'). This means that legitimate direct accesses - to the second symbol will appear to be non-allowed direct accesses to an - atom of type weak, global which are not allowed. + to the second symbol will appear to be direct accesses to an atom of type + weak, global which are not allowed. - To avoid this, we make the indirections have a leading 'l' (lower-case L) - which has a special meaning: linker can see this and use it to determine - atoms, but it is not placed into the final symbol table. - - The implementation here is somewhat heavy-handed in that it will also mark - indirections to the __IMPORT,__pointers section the same way which is - really unnecessary, since ld64 _can_ split those into atoms as they are - fixed size. FIXME: determine if this is a penalty worth extra code to - fix. + To avoid this, we make any data-section indirections have a leading 'l' + (lower-case L) which has a special meaning: linker can see this and use + it to determine atoms, but it is not placed into the final symbol table. + Symbols in the non-lazy symbol pointers section (or stubs) do not have this + problem because ld64 already knows the size of each entry. */ const char * machopic_indirection_name (rtx sym_ref, bool stub_p) { - char *buffer; const char *name = XSTR (sym_ref, 0); - size_t namelen = strlen (name); - machopic_indirection *p; - bool needs_quotes; - const char *suffix; - char L_or_l = 'L'; - const char *prefix = user_label_prefix; - const char *quote = ""; - tree id; - - id = maybe_get_identifier (name); + tree id = maybe_get_identifier (name); if (id) { tree id_orig = id; @@ -534,43 +525,47 @@ machopic_indirection_name (rtx sym_ref, bool stub_p) while (IDENTIFIER_TRANSPARENT_ALIAS (id)) id = TREE_CHAIN (id); if (id != id_orig) - { - name = IDENTIFIER_POINTER (id); - namelen = strlen (name); - } + name = IDENTIFIER_POINTER (id); } + const char *prefix = user_label_prefix; + /* If we are emitting the label 'verbatim' then omit the U_L_P and count + the name without the leading '*'. */ if (name[0] == '*') { prefix = ""; ++name; - --namelen; - } - - needs_quotes = name_needs_quotes (name); - if (needs_quotes) - { - quote = "\""; - } - - if (stub_p) - suffix = STUB_SUFFIX; - else - { - suffix = NON_LAZY_POINTER_SUFFIX; - /* Let the linker see this. */ - L_or_l = 'l'; } - buffer = XALLOCAVEC (char, 2 /* strlen ("&L") or ("&l") */ - + strlen (prefix) - + namelen - + strlen (suffix) - + 2 * strlen (quote) - + 1 /* '\0' */); + /* Here we are undoing a number of causes that placed some indirections + (apparently erroneously) into the .data section. Specifically, some + symbols that are ABI mandated indirections and some hidden symbols + were being placed there - which cause difficulties with later + versions of ld64. Iff (after these checks) some symbol still gets an + indirection in the data section, we want to adjust the indirection + name to be linker visible to deal with PR71767 (notes above). */ + bool nlsp_in_data_section = + ! MACHO_SYMBOL_MUST_INDIRECT_P (sym_ref) + && ! MACHO_SYMBOL_HIDDEN_VIS_P (sym_ref) + && (machopic_symbol_defined_p (sym_ref) || SYMBOL_REF_LOCAL_P (sym_ref)) + && ! indirect_data (sym_ref); + + const char *suffix = stub_p ? STUB_SUFFIX : NON_LAZY_POINTER_SUFFIX; + /* If the indirection is in the data section, let the linker see it. */ + char L_or_l = (!stub_p && nlsp_in_data_section) ? 'l' : 'L'; + /* We have mangled symbols with spaces and punctuation which typically + need surrounding in quotes for the assembler to consume them. */ + const char *quote = name_needs_quotes (name) ? "\"" : ""; + char *buffer = XALLOCAVEC (char, 2 /* strlen ("&L") or ("&l") */ + + strlen (prefix) + + strlen (name) + + strlen (suffix) + + 2 * strlen (quote) + + 1 /* '\0' */); /* Construct the name of the non-lazy pointer or stub. */ - sprintf (buffer, "&%s%c%s%s%s%s", quote, L_or_l, prefix, name, suffix, quote); + sprintf (buffer, "&%s%c%s%s%s%s", quote, L_or_l, prefix, name, + suffix, quote); if (!machopic_indirections) machopic_indirections = hash_table::create_ggc (37); @@ -579,10 +574,9 @@ machopic_indirection_name (rtx sym_ref, bool stub_p) = machopic_indirections->find_slot_with_hash (buffer, htab_hash_string (buffer), INSERT); + machopic_indirection *p; if (*slot) - { - p = *slot; - } + p = *slot; else { p = ggc_alloc (); @@ -590,6 +584,7 @@ machopic_indirection_name (rtx sym_ref, bool stub_p) p->ptr_name = xstrdup (buffer); p->stub_p = stub_p; p->used = false; + p->nlsp_in_data_section = nlsp_in_data_section; *slot = p; } @@ -665,7 +660,7 @@ machopic_indirect_data_reference (rtx orig, rtx reg) /* some other cpu -- writeme! */ gcc_unreachable (); } - else if (defined) + else if (defined && ! MACHO_SYMBOL_MUST_INDIRECT_P (orig)) { rtx offset = NULL; if (DARWIN_PPC || HAVE_lo_sum) @@ -707,6 +702,7 @@ machopic_indirect_data_reference (rtx orig, rtx reg) machopic_indirection_name (orig, /*stub_p=*/false))); SYMBOL_REF_DATA (ptr_ref) = SYMBOL_REF_DATA (orig); + SYMBOL_REF_FLAGS (ptr_ref) |= MACHO_SYMBOL_FLAG_INDIRECTION; ptr_ref = gen_const_mem (Pmode, ptr_ref); machopic_define_symbol (ptr_ref); @@ -789,7 +785,7 @@ machopic_indirect_data_reference (rtx orig, rtx reg) rtx machopic_indirect_call_target (rtx target) { - if (! darwin_emit_branch_islands) + if (! darwin_symbol_stubs) return target; if (GET_CODE (target) != MEM) @@ -797,8 +793,7 @@ machopic_indirect_call_target (rtx target) if (MACHOPIC_INDIRECT && GET_CODE (XEXP (target, 0)) == SYMBOL_REF - && !(SYMBOL_REF_FLAGS (XEXP (target, 0)) - & MACHO_SYMBOL_FLAG_DEFINED)) + && ! MACHO_SYMBOL_DEFINED_P (XEXP (target, 0))) { rtx sym_ref = XEXP (target, 0); const char *stub_name = machopic_indirection_name (sym_ref, @@ -807,6 +802,7 @@ machopic_indirect_call_target (rtx target) XEXP (target, 0) = gen_rtx_SYMBOL_REF (mode, stub_name); SYMBOL_REF_DATA (XEXP (target, 0)) = SYMBOL_REF_DATA (sym_ref); + SYMBOL_REF_FLAGS (XEXP (target, 0)) |= MACHO_SYMBOL_FLAG_INDIRECTION; MEM_READONLY_P (target) = 1; MEM_NOTRAP_P (target) = 1; } @@ -844,7 +840,7 @@ machopic_legitimize_pic_address (rtx orig, machine_mode mode, rtx reg) { if (reg == 0) { - gcc_assert (!reload_in_progress); + gcc_assert (!lra_in_progress); reg = gen_reg_rtx (Pmode); } @@ -928,7 +924,7 @@ machopic_legitimize_pic_address (rtx orig, machine_mode mode, rtx reg) emit_use (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM)); #endif - if (reload_in_progress) + if (lra_in_progress) df_set_regs_ever_live (REGNO (pic), true); pic_ref = gen_rtx_PLUS (Pmode, pic, machopic_gen_offset (XEXP (orig, 0))); @@ -952,7 +948,7 @@ machopic_legitimize_pic_address (rtx orig, machine_mode mode, rtx reg) if (reg == 0) { - gcc_assert (!reload_in_progress); + gcc_assert (!lra_in_progress); reg = gen_reg_rtx (Pmode); } @@ -998,7 +994,7 @@ machopic_legitimize_pic_address (rtx orig, machine_mode mode, rtx reg) #if 0 emit_use (pic_offset_table_rtx); #endif - if (reload_in_progress) + if (lra_in_progress) df_set_regs_ever_live (REGNO (pic), true); pic_ref = gen_rtx_PLUS (Pmode, pic, @@ -1075,129 +1071,160 @@ machopic_legitimize_pic_address (rtx orig, machine_mode mode, rtx reg) return pic_ref; } -/* Output the stub or non-lazy pointer in *SLOT, if it has been used. - DATA is the FILE* for assembly output. Called from - htab_traverse. */ +/* Callbacks to output the stub or non-lazy pointers. + Each works on the item in *SLOT,if it has been used. + DATA is the FILE* for assembly output. + Called from htab_traverses, invoked from machopic_finish(). */ int -machopic_output_indirection (machopic_indirection **slot, FILE *asm_out_file) +machopic_output_data_section_indirection (machopic_indirection **slot, + FILE *asm_out_file) { machopic_indirection *p = *slot; - rtx symbol; - const char *sym_name; - const char *ptr_name; - if (!p->used) + if (!p->used || !p->nlsp_in_data_section) return 1; - symbol = p->symbol; - sym_name = XSTR (symbol, 0); - ptr_name = p->ptr_name; + rtx symbol = p->symbol; + /* The original symbol name. */ + const char *sym_name = XSTR (symbol, 0); + /* The name of the indirection symbol. */ + const char *ptr_name = p->ptr_name; - if (p->stub_p) - { - char *sym; - char *stub; - tree id; + switch_to_section (data_section); + assemble_align (GET_MODE_ALIGNMENT (Pmode)); + assemble_label (asm_out_file, ptr_name); + assemble_integer (gen_rtx_SYMBOL_REF (Pmode, sym_name), + GET_MODE_SIZE (Pmode), + GET_MODE_ALIGNMENT (Pmode), 1); - id = maybe_get_identifier (sym_name); - if (id) - { - tree id_orig = id; + return 1; +} - while (IDENTIFIER_TRANSPARENT_ALIAS (id)) - id = TREE_CHAIN (id); - if (id != id_orig) - sym_name = IDENTIFIER_POINTER (id); - } +int +machopic_output_stub_indirection (machopic_indirection **slot, + FILE *asm_out_file) +{ + machopic_indirection *p = *slot; - sym = XALLOCAVEC (char, strlen (sym_name) + 2); - if (sym_name[0] == '*' || sym_name[0] == '&') - strcpy (sym, sym_name + 1); - else if (sym_name[0] == '-' || sym_name[0] == '+') - strcpy (sym, sym_name); - else - sprintf (sym, "%s%s", user_label_prefix, sym_name); + if (!p->used || !p->stub_p) + return 1; - stub = XALLOCAVEC (char, strlen (ptr_name) + 2); - if (ptr_name[0] == '*' || ptr_name[0] == '&') - strcpy (stub, ptr_name + 1); - else - sprintf (stub, "%s%s", user_label_prefix, ptr_name); + rtx symbol = p->symbol; + /* The original symbol name. */ + const char *sym_name = XSTR (symbol, 0); + /* The name of the stub symbol. */ + const char *ptr_name = p->ptr_name; - machopic_output_stub (asm_out_file, sym, stub); - } - else if (! indirect_data (symbol) - && (machopic_symbol_defined_p (symbol) - || SYMBOL_REF_LOCAL_P (symbol))) + tree id = maybe_get_identifier (sym_name); + if (id) { - switch_to_section (data_section); - assemble_align (GET_MODE_ALIGNMENT (Pmode)); - assemble_label (asm_out_file, ptr_name); - assemble_integer (gen_rtx_SYMBOL_REF (Pmode, sym_name), - GET_MODE_SIZE (Pmode), - GET_MODE_ALIGNMENT (Pmode), 1); + tree id_orig = id; + + while (IDENTIFIER_TRANSPARENT_ALIAS (id)) + id = TREE_CHAIN (id); + if (id != id_orig) + sym_name = IDENTIFIER_POINTER (id); } + + char *sym = XALLOCAVEC (char, strlen (sym_name) + 2); + if (sym_name[0] == '*' || sym_name[0] == '&') + strcpy (sym, sym_name + 1); + else if (sym_name[0] == '-' || sym_name[0] == '+') + strcpy (sym, sym_name); else - { - rtx init = const0_rtx; + sprintf (sym, "%s%s", user_label_prefix, sym_name); + + char *stub = XALLOCAVEC (char, strlen (ptr_name) + 2); + if (ptr_name[0] == '*' || ptr_name[0] == '&') + strcpy (stub, ptr_name + 1); + else + sprintf (stub, "%s%s", user_label_prefix, ptr_name); + + machopic_output_stub (asm_out_file, sym, stub); + + return 1; +} + +int +machopic_output_indirection (machopic_indirection **slot, FILE *asm_out_file) +{ + machopic_indirection *p = *slot; + + if (!p->used || p->stub_p || p->nlsp_in_data_section) + return 1; + + rtx symbol = p->symbol; + /* The original symbol name. */ + const char *sym_name = XSTR (symbol, 0); + /* The nonlazy-stub symbol name. */ + const char *ptr_name = p->ptr_name; + + switch_to_section (darwin_sections[machopic_nl_symbol_ptr_section]); - switch_to_section (darwin_sections[machopic_nl_symbol_ptr_section]); + /* Mach-O symbols are passed around in code through indirect references and + the original symbol_ref hasn't passed through the generic handling and + reference-catching in output_operand, so we need to manually mark weak + references as such. */ - /* Mach-O symbols are passed around in code through indirect - references and the original symbol_ref hasn't passed through - the generic handling and reference-catching in - output_operand, so we need to manually mark weak references - as such. */ - if (SYMBOL_REF_WEAK (symbol)) + if (SYMBOL_REF_WEAK (symbol)) + { + tree decl = SYMBOL_REF_DECL (symbol); + gcc_checking_assert (DECL_P (decl)); + + if (decl != NULL_TREE + && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl) + /* Handle only actual external-only definitions, not + e.g. extern inline code or variables for which + storage has been allocated. */ + && !TREE_STATIC (decl)) { - tree decl = SYMBOL_REF_DECL (symbol); - gcc_assert (DECL_P (decl)); - - if (decl != NULL_TREE - && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl) - /* Handle only actual external-only definitions, not - e.g. extern inline code or variables for which - storage has been allocated. */ - && !TREE_STATIC (decl)) - { - fputs ("\t.weak_reference ", asm_out_file); - assemble_name (asm_out_file, sym_name); - fputc ('\n', asm_out_file); - } + fputs ("\t.weak_reference ", asm_out_file); + assemble_name (asm_out_file, sym_name); + fputc ('\n', asm_out_file); } + } - assemble_name (asm_out_file, ptr_name); - fprintf (asm_out_file, ":\n"); + assemble_name (asm_out_file, ptr_name); + fprintf (asm_out_file, ":\n"); - fprintf (asm_out_file, "\t.indirect_symbol "); - assemble_name (asm_out_file, sym_name); - fprintf (asm_out_file, "\n"); + fprintf (asm_out_file, "\t.indirect_symbol "); + assemble_name (asm_out_file, sym_name); + fprintf (asm_out_file, "\n"); - /* Variables that are marked with MACHO_SYMBOL_STATIC need to - have their symbol name instead of 0 in the second entry of - the non-lazy symbol pointer data structure when they are - defined. This allows the runtime to rebind newer instances - of the translation unit with the original instance of the - symbol. */ + /* Variables that are marked with MACHO_SYMBOL_FLAG_STATIC need to + have their symbol name instead of 0 in the second entry of + the non-lazy symbol pointer data structure when they are + defined. This allows the runtime to rebind newer instances + of the translation unit with the original instance of the + symbol. */ - if ((SYMBOL_REF_FLAGS (symbol) & MACHO_SYMBOL_STATIC) - && machopic_symbol_defined_p (symbol)) - init = gen_rtx_SYMBOL_REF (Pmode, sym_name); + rtx init = const0_rtx; + if (MACHO_SYMBOL_STATIC_P (symbol) && machopic_symbol_defined_p (symbol)) + init = gen_rtx_SYMBOL_REF (Pmode, sym_name); - assemble_integer (init, GET_MODE_SIZE (Pmode), - GET_MODE_ALIGNMENT (Pmode), 1); - } + assemble_integer (init, GET_MODE_SIZE (Pmode), + GET_MODE_ALIGNMENT (Pmode), 1); return 1; } -void +static void machopic_finish (FILE *asm_out_file) { - if (machopic_indirections) - machopic_indirections - ->traverse_noresize (asm_out_file); + if (!machopic_indirections) + return; + + /* First output an symbol indirections that have been placed into .data + (we don't expect these now). */ + machopic_indirections->traverse_noresize + (asm_out_file); + + machopic_indirections->traverse_noresize + (asm_out_file); + + machopic_indirections->traverse_noresize + (asm_out_file); } int @@ -1212,25 +1239,51 @@ machopic_operand_p (rtx op) && XINT (XEXP (op, 0), 1) == UNSPEC_MACHOPIC_OFFSET); } -/* This function records whether a given name corresponds to a defined - or undefined function or variable, for machopic_classify_ident to - use later. */ +/* This function: + computes and caches a series of flags that characterise the symbol's + properties that affect Mach-O code gen (including accidental cases + from older toolchains). + + TODO: + Here we also need to do enough analysis to determine if a symbol's + name needs to be made linker-visible. This is more tricky - since + it depends on whether we've previously seen a global weak definition + in the same section. + */ void -darwin_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED) +darwin_encode_section_info (tree decl, rtx rtl, int first) { - rtx sym_ref; + /* Careful not to prod global register variables. */ + if (!MEM_P (rtl)) + return; - /* Do the standard encoding things first. */ + /* Do the standard encoding things first; this sets: + SYMBOL_FLAG_FUNCTION, + SYMBOL_FLAG_LOCAL, (binds_local_p) + TLS_MODEL, SYMBOL_FLAG_SMALL + SYMBOL_FLAG_EXTERNAL. */ default_encode_section_info (decl, rtl, first); - if (TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL) + if (! VAR_OR_FUNCTION_DECL_P (decl)) return; - sym_ref = XEXP (rtl, 0); - if (TREE_CODE (decl) == VAR_DECL) + rtx sym_ref = XEXP (rtl, 0); + if (VAR_P (decl)) SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_VARIABLE; + /* Only really common if there's no initialiser. */ + bool really_common_p = (DECL_COMMON (decl) + && (DECL_INITIAL (decl) == NULL + || (!in_lto_p + && DECL_INITIAL (decl) == error_mark_node))); + + /* For Darwin, if we have specified visibility and it's not the default + that's counted 'hidden'. */ + if (DECL_VISIBILITY_SPECIFIED (decl) + && DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT) + SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_HIDDEN_VIS; + if (!DECL_EXTERNAL (decl) && (!TREE_PUBLIC (decl) || !DECL_WEAK (decl)) && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)) @@ -1241,7 +1294,13 @@ darwin_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED) SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_DEFINED; if (! TREE_PUBLIC (decl)) - SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_STATIC; + SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_STATIC; + + /* Short cut check for Darwin 'must indirect' rules. */ + if (really_common_p + || (DECL_WEAK (decl) && ! MACHO_SYMBOL_HIDDEN_VIS_P (sym_ref)) + || lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) + SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_MUST_INDIRECT; } void @@ -1258,12 +1317,13 @@ darwin_mark_decl_preserved (const char *name) } static section * -darwin_rodata_section (int use_coal, bool zsize) +darwin_rodata_section (int use_coal, bool zsize, int reloc) { return (use_coal ? darwin_sections[const_coal_section] : (zsize ? darwin_sections[zobj_const_section] - : darwin_sections[const_section])); + : reloc ? darwin_sections[const_data_section] + : darwin_sections[const_section])); } static section * @@ -1556,7 +1616,7 @@ machopic_select_section (tree decl, case SECCAT_RODATA: case SECCAT_SRODATA: - base_section = darwin_rodata_section (use_coal, zsize); + base_section = darwin_rodata_section (use_coal, zsize, reloc); break; case SECCAT_RODATA_MERGE_STR: @@ -2092,11 +2152,11 @@ darwin_emit_unwind_label (FILE *file, tree decl, int for_eh, int empty) static int invok_count = 0; static tree last_fun_decl = NULL_TREE; - /* We use the linker to emit the .eh labels for Darwin 9 and above. */ - if (! for_eh || generating_for_darwin_version >= 9) + /* Modern linkers can produce distinct FDEs without compiler support. */ + if (! for_eh || ! ld_needs_eh_markers) return; - /* FIXME: This only works when the eh for all sections of a function is + /* FIXME: This only works when the eh for all sections of a function are emitted at the same time. If that changes, we would need to use a lookup table of some form to determine what to do. Also, we should emit the unadorned label for the partition containing the public label for a @@ -2945,12 +3005,10 @@ darwin_file_end (void) if (flag_objc_abi >= 2) { flags = 16; - output_section_asm_op - (darwin_sections[objc2_image_info_section]->unnamed.data); + switch_to_section (darwin_sections[objc2_image_info_section]); } else - output_section_asm_op - (darwin_sections[objc_image_info_section]->unnamed.data); + switch_to_section (darwin_sections[objc_image_info_section]); ASM_OUTPUT_ALIGN (asm_out_file, 2); fputs ("L_OBJC_ImageInfo:\n", asm_out_file); @@ -3156,17 +3214,19 @@ darwin_override_options (void) : (generating_for_darwin_version >= 9) ? 1 : 0); - /* Objective-C family ABI 2 is only valid for next/m64 at present. */ if (global_options_set.x_flag_objc_abi && flag_next_runtime) { - if (TARGET_64BIT && global_options.x_flag_objc_abi < 2) - error_at (UNKNOWN_LOCATION, "%<-fobjc-abi-version%> >= 2 must be" - " used for %<-m64%> targets with" - " %<-fnext-runtime%>"); - if (!TARGET_64BIT && global_options.x_flag_objc_abi >= 2) - error_at (UNKNOWN_LOCATION, "%<-fobjc-abi-version%> >= 2 is not" - " supported on %<-m32%> targets with" - " %<-fnext-runtime%>"); + if (TARGET_64BIT && global_options.x_flag_objc_abi != 2) + /* The Objective-C family ABI 2 is the only valid version NeXT/m64. */ + error_at (UNKNOWN_LOCATION, + "%<-fobjc-abi-version%> 2 must be used for 64 bit targets" + " with %<-fnext-runtime%>"); + else if (!TARGET_64BIT && global_options.x_flag_objc_abi >= 2) + /* ABI versions 0 and 1 are the only valid versions NeXT/m32. */ + error_at (UNKNOWN_LOCATION, + "%<-fobjc-abi-version%> %d is not supported for 32 bit" + " targets with %<-fnext-runtime%>", + global_options.x_flag_objc_abi); } /* Don't emit DWARF3/4 unless specifically selected. This is a @@ -3176,6 +3236,14 @@ darwin_override_options (void) if (!global_options_set.x_dwarf_version) dwarf_version = 2; + if (global_options_set.x_dwarf_split_debug_info) + { + inform (input_location, + "-gsplit-dwarf is not supported on this platform, ignored"); + dwarf_split_debug_info = 0; + global_options_set.x_dwarf_split_debug_info = 0; + } + /* Do not allow unwind tables to be generated by default for m32. fnon-call-exceptions will override this, regardless of what we do. */ if (generating_for_darwin_version < 10 @@ -3234,8 +3302,6 @@ darwin_override_options (void) /* so no tables either.. */ flag_unwind_tables = 0; flag_asynchronous_unwind_tables = 0; - /* We still need to emit branch islands for kernel context. */ - darwin_emit_branch_islands = true; } if (flag_var_tracking_uninit == 0 @@ -3245,6 +3311,8 @@ darwin_override_options (void) && write_symbols == DWARF2_DEBUG) flag_var_tracking_uninit = flag_var_tracking; + /* Final check on PCI options; for Darwin these are not dependent on the PIE + ones, although PIE does require PIC to support it. */ if (MACHO_DYNAMIC_NO_PIC_P) { if (flag_pic) @@ -3253,17 +3321,52 @@ darwin_override_options (void) " %<-fpie%> or %<-fPIE%>"); flag_pic = 0; } - else if (flag_pic == 1) + else if (flag_pic == 1 + || (flag_pic == 0 && !(flag_mkernel || flag_apple_kext))) { - /* Darwin's -fpic is -fPIC. */ + /* Darwin's -fpic is -fPIC. + We only support "static" code in the kernel and kernel exts. */ flag_pic = 2; } - /* It is assumed that branch island stubs are needed for earlier systems. */ - if (generating_for_darwin_version < 9) - darwin_emit_branch_islands = true; - else - emit_aligned_common = true; /* Later systems can support aligned common. */ + /* Linkers >= ld64-62.1 (at least) are capable of making the necessary PIC + indirections and we no longer need to emit pic symbol stubs. + However, if we are generating code for earlier ones (or for use in the + kernel) the stubs might still be required, and this will be set true. + If the user sets it on or off - then that takes precedence. + + Linkers that don't need stubs, don't need the EH symbol markers either. + */ + + if (!global_options_set.x_darwin_symbol_stubs) + { + if (darwin_target_linker) + { + if (strverscmp (darwin_target_linker, MIN_LD64_OMIT_STUBS) < 0) + { + darwin_symbol_stubs = true; + ld_needs_eh_markers = true; + } + } + else if (generating_for_darwin_version < 9) + { + /* If we don't know the linker version and we're targeting an old + system, we know no better than to assume the use of an earlier + linker. */ + darwin_symbol_stubs = true; + ld_needs_eh_markers = true; + } + } + else if (DARWIN_X86 && darwin_symbol_stubs && TARGET_64BIT) + { + inform (input_location, + "%<-msymbol-stubs%> is not required for 64b code (ignored)"); + darwin_symbol_stubs = false; + } + + if (generating_for_darwin_version >= 9) + /* Later systems can support aligned common. */ + emit_aligned_common = true; /* The c_dialect...() macros are not available to us here. */ darwin_running_cxx = (strstr (lang_hooks.name, "C++") != 0); @@ -3711,19 +3814,4 @@ darwin_function_section (tree decl, enum node_frequency freq, : text_section; } -/* When a function is partitioned between sections, we need to insert a label - at the start of each new chunk - so that it may become a valid 'atom' for - eh and debug purposes. Without this the linker will emit warnings if one - tries to add line location information (since the switched fragment will - be anonymous). */ - -void -darwin_function_switched_text_sections (FILE *fp, tree decl, bool new_is_cold) -{ - /* Make sure we pick up all the relevant quotes etc. */ - assemble_name_raw (fp, new_is_cold ? "__cold_sect_of_" : "__hot_sect_of_"); - assemble_name_raw (fp, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))); - fputs (":\n", fp); -} - #include "gt-darwin.h" diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index 16c3b60bb07..10b5e49172c 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -125,7 +125,27 @@ extern GTY(()) int darwin_ms_struct; "%{gfull:-g -fno-eliminate-unused-debug-symbols} %= 10.5 mmacosx-version-min= -pie) }} " + +#define DARWIN_NOPIE_SPEC \ +"%{no-pie|fno-pie|fno-PIE: \ + %:version-compare(>= 10.7 mmacosx-version-min= -no_pie) }" #define DARWIN_CC1_SPEC \ "%{findirect-virtual-calls: -fapple-kext} %= 10.6 mmacosx-version-min= -no_compact_unwind) " + +/* In Darwin linker specs we can put -lcrt0.o and ld will search the library + path for crt0.o or -lcrtx.a and it will search for for libcrtx.a. As for + other ports, we can also put xxx.{o,a}%s and get the appropriate complete + startfile absolute directory. This latter point is important when we want + to override ld's rule of .dylib being found ahead of .a and the user wants + the convenience library to be linked. */ + +/* The LINK_COMMAND spec is mostly a clone of the standard LINK_COMMAND_SPEC, + plus precomp, libtool, and fat build additions. In general, random Darwin linker flags should go into LINK_SPEC instead of LINK_COMMAND_SPEC. The command spec is better for specifying the handling of options understood by generic Unix linkers, and for positional arguments like libraries. */ -#if LD64_HAS_EXPORT_DYNAMIC -#define DARWIN_EXPORT_DYNAMIC " %{rdynamic:-export_dynamic}" -#else -#define DARWIN_EXPORT_DYNAMIC " %{rdynamic: %nrdynamic is not supported}" -#endif - #define LINK_COMMAND_SPEC_A \ "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ %(linker)" \ LINK_PLUGIN_SPEC \ "%{flto*:% 10.5 mmacosx-version-min= -lgcc_s.10.4) \ + shared-libgcc|fexceptions|fobjc-exceptions|fgnu-runtime: \ + %:version-compare(!> 10.3.9 mmacosx-version-min= -lgcc_eh) \ + %:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_s.10.4) \ %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ - %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ + %:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ -lgcc ; \ :%:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_s.10.4) \ %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ - %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ + %:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ -lgcc }" -/* We specify crt0.o as -lcrt0.o so that ld will search the library path. - - crt3.o provides __cxa_atexit on systems that don't have it. Since - it's only used with C++, which requires passing -shared-libgcc, key - off that to avoid unnecessarily adding a destructor to every - powerpc program built. */ +/* We specify crt0.o as -lcrt0.o so that ld will search the library path. */ #undef STARTFILE_SPEC #define STARTFILE_SPEC \ - "%{Zdynamiclib: %(darwin_dylib1) %{fgnu-tm: -lcrttms.o}} \ - %{!Zdynamiclib:%{Zbundle:%{!static: \ - %:version-compare(< 10.6 mmacosx-version-min= -lbundle1.o) \ - %{fgnu-tm: -lcrttms.o}}} \ +"%{Zdynamiclib: %(darwin_dylib1) %{fgnu-tm: -lcrttms.o}} \ + %{!Zdynamiclib:%{Zbundle:%(darwin_bundle1)} \ %{!Zbundle:%{pg:%{static:-lgcrt0.o} \ %{!static:%{object:-lgcrt0.o} \ %{!object:%{preload:-lgcrt0.o} \ @@ -378,7 +407,7 @@ extern GTY(()) int darwin_ms_struct; %{!object:%{preload:-lcrt0.o} \ %{!preload: %(darwin_crt1) \ %(darwin_crt2)}}}}}} \ - %{shared-libgcc:%:version-compare(< 10.5 mmacosx-version-min= crt3.o%s)}" + %(darwin_crt3)" /* We want a destructor last in the list. */ #define TM_DESTRUCTOR "%{fgnu-tm: -lcrttme.o}" @@ -386,11 +415,10 @@ extern GTY(()) int darwin_ms_struct; #define DARWIN_EXTRA_SPECS \ { "darwin_crt1", DARWIN_CRT1_SPEC }, \ - { "darwin_dylib1", DARWIN_DYLIB1_SPEC }, - -#define DARWIN_DYLIB1_SPEC \ - "%:version-compare(!> 10.5 mmacosx-version-min= -ldylib1.o) \ - %:version-compare(>< 10.5 10.6 mmacosx-version-min= -ldylib1.10.5.o)" + { "darwin_crt2", DARWIN_CRT2_SPEC }, \ + { "darwin_crt3", DARWIN_CRT3_SPEC }, \ + { "darwin_dylib1", DARWIN_DYLIB1_SPEC }, \ + { "darwin_bundle1", DARWIN_BUNDLE1_SPEC }, #define DARWIN_CRT1_SPEC \ "%:version-compare(!> 10.5 mmacosx-version-min= -lcrt1.o) \ @@ -398,6 +426,24 @@ extern GTY(()) int darwin_ms_struct; %:version-compare(>< 10.6 10.8 mmacosx-version-min= -lcrt1.10.6.o) \ %{fgnu-tm: -lcrttms.o}" +#define DARWIN_CRT2_SPEC "" + +/* crt3.o provides __cxa_atexit on systems that don't have it (and a fix + up for faulty versions on 10.4). Since it's only used with C++, which + requires passing -shared-libgcc, key off that to avoid unnecessarily + adding a destructor to every program built for 10.4 or earlier. */ + +#define DARWIN_CRT3_SPEC \ +"%{shared-libgcc:%:version-compare(< 10.5 mmacosx-version-min= crt3.o%s)}" + +#define DARWIN_DYLIB1_SPEC \ + "%:version-compare(!> 10.5 mmacosx-version-min= -ldylib1.o) \ + %:version-compare(>< 10.5 10.6 mmacosx-version-min= -ldylib1.10.5.o)" + +#define DARWIN_BUNDLE1_SPEC \ +"%{!static:%:version-compare(< 10.6 mmacosx-version-min= -lbundle1.o) \ + %{fgnu-tm: -lcrttms.o}}" + #ifdef HAVE_AS_MMACOSX_VERSION_MIN_OPTION /* Emit macosx version (but only major). */ #define ASM_MMACOSX_VERSION_MIN_SPEC \ @@ -424,6 +470,8 @@ extern GTY(()) int darwin_ms_struct; debugging data. */ #define ASM_DEBUG_SPEC "%{g*:%{%:debug-level-gt(0):%{!gdwarf*:--gstabs}}}" +#define ASM_FINAL_SPEC \ + "%{gsplit-dwarf:%ngsplit-dwarf is not supported on this platform } %. -; Various linker options have a -Z added so that they can get to specs -; processing without interference. Note that an option name with a -; prefix that matches another option name, that also takes an -; argument, being mapped to a -Z linker option, needs to be modified -; so the prefix is different, otherwise a '*' after the shorter option -; will match with the longer one. +; We have a lot of Driver options, many of which are obsolete or very very +; rarely used so, to keep this file easier to manage: + +; Please place all Non-driver options first (in alphabetical order), followed +; by Driver-only options. + +; Non-driver options. + +dependency-file +C ObjC C++ ObjC++ Separate Alias(MF) MissingArgError(missing filename after %qs) + +fapple-kext +Target Report C++ Var(flag_apple_kext) +Generate code for darwin loadable kernel extensions. + +iframework +Target RejectNegative C ObjC C++ ObjC++ Joined Separate +-iframework Add to the end of the system framework include path. + +mconstant-cfstrings +Target Report Var(darwin_constant_cfstrings) Init(1) +Generate compile-time CFString objects. + +Wnonportable-cfstrings +Target Report Var(darwin_warn_nonportable_cfstrings) Init(1) Warning +Warn if constant CFString objects contain non-portable characters. + +; Use new-style pic stubs if this is true, x86 only so far. +matt-stubs +Target Report Var(darwin_macho_att_stub) Init(1) +Generate AT&T-style stubs for Mach-O. + +mdynamic-no-pic +Target Common Report Mask(MACHO_DYNAMIC_NO_PIC) +Generate code suitable for executables (NOT shared libs). + +mfix-and-continue +Target Report Var(darwin_fix_and_continue) +Generate code suitable for fast turn around debugging. + +mkernel +Target Report Var(flag_mkernel) +Generate code for the kernel or loadable kernel extensions. + +; The Init here is for the convenience of GCC developers, so that cc1 +; and cc1plus don't crash if no -mmacosx-version-min is passed. The +; driver will always pass a -mmacosx-version-min, so in normal use the +; Init is never used. +mmacosx-version-min= +Target RejectNegative Joined Report Var(darwin_macosx_version_min) Init(DEF_MIN_OSX_VERSION) +The earliest MacOS X version on which this program will run. + +; Really, only relevant to PowerPC which has a 4 byte bool by default. +mone-byte-bool +Target RejectNegative Report Var(darwin_one_byte_bool) +Set sizeof(bool) to 1. + +msymbol-stubs +Target Report Var(darwin_symbol_stubs) Init(0) +Force generation of external symbol indirection stubs. + +; Some code-gen may be improved / adjusted if the linker is sufficiently modern. +mtarget-linker= +Target RejectNegative Joined Report Alias(mtarget-linker) + +mtarget-linker +Target RejectNegative Joined Separate Report Var(darwin_target_linker) Init(LD64_VERSION) +The version of ld64 in use for this toolchain. + +; Driver options. all_load -Driver Alias(Zall_load) +Driver RejectNegative Alias(Zall_load) +Loads all members of archive libraries allowable_client -Driver Separate Alias(Zallowable_client) +Driver RejectNegative Separate Alias(Zallowable_client) +-allowable_client The output dylib is private to the client(s) named arch Driver RejectNegative Separate +-arch Specify that the output file should be generated for architecture \"name\" arch_errors_fatal -Driver Alias(Zarch_errors_fatal) +Driver RejectNegative Alias(Zarch_errors_fatal) +Mismatches between file architecture and the \"-arch\" are errors instead of warnings asm_macosx_version_min= Driver RejectNegative Joined +The earliest MacOS X version on which this program will run (formatted for the assembler) bind_at_load -Driver Alias(Zbind_at_load) +Driver RejectNegative Alias(Zbind_at_load) +Produce an output file that will bind symbols on load, rather than lazily. bundle -Driver Alias(Zbundle) +Driver RejectNegative Alias(Zbundle) +Produce a Mach-O bundle (file type MH_BUNDLE) bundle_loader -Driver Separate Alias(Zbundle_loader) +Driver RejectNegative Separate Alias(Zbundle_loader) +-bundle_loader Treat \"executable\" (that will be loading this bundle) as if it was one of the dynamic libraries the bundle is linked against for symbol resolution -dead_strip -Driver Alias(Zdead_strip) +client_name +Driver RejectNegative Separate +-client_name Enable the executable being built to link against a private dylib (using allowable_client) -dependency-file -C ObjC C++ ObjC++ Separate Alias(MF) MissingArgError(missing filename after %qs) +compatibility_version +Driver RejectNegative Separate +-compatibility_version Set the minimum version for the client interface. Clients must record a greater number than this or the binding will fail at runtime + +current_version +Driver RejectNegative Separate +-current_version Set the current version for the library. + +dead_strip +Driver RejectNegative Alias(Zdead_strip) +Remove code and data that is unreachable from any exported symbol (including the entry point) dylib_file Driver Separate Alias(Zdylib_file) dylinker -Driver +Driver RejectNegative +Produce a Mach-O dylinker (file type MH_DYLINKER), only used for building dyld. + +dylinker_install_name +Driver RejectNegative Separate +-dylinker_install_name Only used for building dyld. dynamic -Driver Alias(Zdynamic) +Driver RejectNegative Alias(Zdynamic) +The default (and opposite of -static), implied by user mode executables, shared libraries and bundles. dynamiclib -Driver Alias(Zdynamiclib) +Driver RejectNegative Alias(Zdynamiclib) +Produce a Mach-O shared library (file type MH_DYLIB), synonym for -shared exported_symbols_list -Driver Separate Alias(Zexported_symbols_list) +Driver RejectNegative Separate Alias(Zexported_symbols_list) +-exported_symbols_list Global symbols in \"filename\" will be exported from the linked output file, any symbols not mentioned will be treated as hidden. filelist Driver RejectNegative Separate +Supply a list of objects to be linked from a file, rather than the command line findirect-virtual-calls Driver RejectNegative +Used for generating code for some older kernel revisions. flat_namespace Driver RejectNegative Alias(Zflat_namespace) +Ignore the normal two-level namespace; resolve symbols in command line order and do not record which library provided the resolved symbol. force_cpusubtype_ALL Driver RejectNegative Alias(Zforce_cpusubtype_ALL) +For the assembler (and linker) permit any architecture sub-variant to be used without error. force_flat_namespace Driver RejectNegative Alias(Zforce_flat_namespace) +Set the output object such that, on loading, dyld will ignore any two-level information and resolve symbols in the discovery order for loaded libs. framework Driver RejectNegative Separate +-framework The linker should search for the named framework in the framework search path. fterminated-vtables Driver RejectNegative +Used for generating code for some older kernel revisions. gfull Driver RejectNegative +Abbreviation for \"-g -fno-eliminate-unused-debug-symbols\" gused Driver RejectNegative +Abbreviation for \"-g -feliminate-unused-debug-symbols\" headerpad_max_install_names -Driver +Driver RejectNegative +Automatically adds space for longer path names in load commands (up to MAXPATHLEN) image_base -Driver Separate Alias(Zimage_base) +Driver RejectNegative Separate Alias(Zimage_base) +-image_base
Choose a base address for a dylib or bundle. init -Driver Separate Alias(Zinit) +Driver RejectNegative Separate Alias(Zinit) +-init The symbol \"symbol_name\" will be used as the first initialiser for a dylib. install_name -Driver Separate Alias(Zinstall_name) +Driver RejectNegative Separate Alias(Zinstall_name) +-install_name Set the install name for a dylib. keep_private_externs -Driver - -mconstant-cfstrings -Target Report Var(darwin_constant_cfstrings) Init(1) -Generate compile-time CFString objects. +Driver RejectNegative +Usually \"private extern\" (hidden) symbols are made local when linking, this command suppresses that such that they remain exported. multi_module Driver RejectNegative Alias(Zmulti_module) +(Obsolete after 10.4) Multi modules are ignored at runtime since MacOS 10.4 multiply_defined Driver RejectNegative Separate Alias(Zmultiply_defined) +(Obsolete after 10.4) -multiply_defined Provided a mechanism for warning about symbols defined in multiple dylibs. multiply_defined_unused Driver RejectNegative Separate Alias(Zmultiplydefinedunused) +(Obsolete after 10.4) -multiply_defined_unused Provided a mechanism for warning about symbols defined in the current executable also being defined in linked dylibs. no_dead_strip_inits_and_terms -Driver Alias(Zno_dead_strip_inits_and_terms) +Driver RejectNegative Alias(Zno_dead_strip_inits_and_terms) +(Obsolete) The linker never dead strips these items, so the option is not needed. nofixprebinding -Driver +Driver RejectNegative +(Obsolete after 10.3.9) Set MH_NOPREFIXBINDING, in an exectuable. nomultidefs -Driver +Driver RejectNegative +(Obsolete after 10.4) Set MH_NOMULTIDEFS in an umbrella framework. noprebind -Driver +Driver RejectNegative Negative(prebind) +(Obsolete) LD_PREBIND is no longer supported. noseglinkedit -Driver +Driver RejectNegative Negative(seglinkedit) +(Obsolete) This is the default. object -Driver +Driver RejectNegative + +pagezero_size +Driver RejectNegative Separate +-pagezero_size size Allows setting the page 0 size to 4kb for certain special cases. prebind -Driver +Driver RejectNegative Negative(noprebind) +(Obsolete) LD_PREBIND is no longer supported. prebind_all_twolevel_modules -Driver +Driver RejectNegative +(Obsolete) LD_PREBIND is no longer supported. preload -Driver +Driver RejectNegative +Produces a Mach-O file suitable for embedded/ROM use. private_bundle -Driver +Driver RejectNegative +(Obsolete) Allowed linking to proceed with \"-flat_namespace\" when a linked bundle contained a symbol also exported from the main executable. pthread -Driver +Driver RejectNegative rdynamic -Driver +Driver RejectNegative +Synonym for \"-export-dynamic\" for linker versions that support it. + +read_only_relocs +Driver RejectNegative Separate +-read_only_relocs This will allow relocs in read-only pages (not advisable). + +sectalign +Driver RejectNegative Separate Args(3) +-sectalign Set section \"sectname\" in segment \"segname\" to have alignment \"value\" which must be an integral power of two expressed in hexadecimal form. + +sectcreate +Driver RejectNegative Separate Args(3) +-sectcreate Create section \"sectname\" in segment \"segname\" from the contents of \"file\". + +sectobjectsymbols +Driver RejectNegative Separate Args(2) +(Obsolete) -sectobjectsymbols Setting a local symbol at the start of a section is no longer supported. + +sectorder +Driver RejectNegative Separate Args(3) +(Obsolete) -sectorder orderfile Replaced by a more general option \"-order_file\". seg_addr_table -Driver Separate Alias(Zseg_addr_table) +Driver RejectNegative Separate Alias(Zseg_addr_table) +-seg_addr_table Specify the base addresses for dynamic libraries, \"file\" contains a line for each library. +; This is only usable by the ld_classic linker. seg_addr_table_filename -Driver Separate Alias(Zfn_seg_addr_table_filename) +Driver RejectNegative Separate Alias(Zfn_seg_addr_table_filename) +(Obsolete, ld_classic only) -seg_addr_table_filename + +seg1addr +Driver RejectNegative Separate +Synonym for \"image_base\" segaddr -Driver Separate Args(2) Alias(Zsegaddr) +Driver RejectNegative Separate Args(2) Alias(Zsegaddr) +-segaddr
Set the base address of segment \"name\" to \"address\" which must be aligned to a page boundary (currently 4kb). + +; This is only usable by the ld_classic linker. +segcreate +Driver RejectNegative Separate Args(3) +(Obsolete, ld_classic only) -sectcreate segname sectname file seglinkedit -Driver +Driver RejectNegative Negative(noseglinkedit) +(Obsolete) Object files with LINKEDIT sections are no longer supported. + +segprot +Driver RejectNegative Separate Args(3) +-segprot max_prot init_prot The protection values are \"r\", \"w\", \"x\" or \"-\" the latter meaning \"no access\". segs_read_only_addr -Driver Separate Alias(Zsegs_read_only_addr) +Driver RejectNegative Separate Alias(Zsegs_read_only_addr) +-segs_read_only_addr address Allows specifying the address of the read only portion of a dylib. segs_read_write_addr -Driver Separate Alias(Zsegs_read_write_addr) +Driver RejectNegative Separate Alias(Zsegs_read_write_addr) +-segs_read_write_addr address Allows specifying the address of the read/write portion of a dylib. single_module -Driver Alias(Zsingle_module) +Driver RejectNegative Alias(Zsingle_module) +(Obsolete) This is the default. + +sub_library +Driver RejectNegative Separate +-sub_library Library named \"name\" will be re-exported (only useful for dylibs). + +sub_umbrella +Driver RejectNegative Separate +-sub_umbrella Framework named \"name\" will be re-exported (only useful for dylibs). twolevel_namespace -Driver +Driver RejectNegative +This is the default twolevel_namespace_hints -Driver +Driver RejectNegative +Specifies content that can speed up dynamic loading when the binaries are unchanged. umbrella -Driver Separate Alias(Zumbrella) +Driver RejectNegative Separate Alias(Zumbrella) +-umbrella The specified framework will be re-exported. + +undefined +Driver RejectNegative Separate +-undefined Specify the handling for undefined symbols (default is error). unexported_symbols_list -Driver Separate Alias(Zunexported_symbols_list) +Driver RejectNegative Separate Alias(Zunexported_symbols_list) +-unexported_symbols_list Don't export global symbols listed in filename. weak_reference_mismatches -Driver Separate Alias(Zweak_reference_mismatches) +Driver RejectNegative Separate Alias(Zweak_reference_mismatches) +-weak_reference_mismatches Specifies what to do if a symbol import conflicts between file (weak in one and not in another) the default is to treat the symbol as non-weak. whatsloaded -Driver +Driver RejectNegative +Logs the object files the linker loads whyload -Driver +Driver RejectNegative +Logs which symbol(s) caused an object to be loaded. + +;(Obsolete, ignored) Strip symbols starting with "L", this is the default. +X +Driver RejectNegative y -Driver Joined +Driver RejectNegative Joined +(Obsolete, ignored) Old support similar to whyload. Mach -Driver - -Wnonportable-cfstrings -Target Report Var(darwin_warn_nonportable_cfstrings) Init(1) Warning -Warn if constant CFString objects contain non-portable characters. - -; Use new-style pic stubs if this is true, x86 only so far. -matt-stubs -Target Report Var(darwin_macho_att_stub) Init(1) -Generate AT&T-style stubs for Mach-O. - -mdynamic-no-pic -Target Common Report Mask(MACHO_DYNAMIC_NO_PIC) -Generate code suitable for executables (NOT shared libs). - -mfix-and-continue -Target Report Var(darwin_fix_and_continue) -Generate code suitable for fast turn around debugging. - -; The Init here is for the convenience of GCC developers, so that cc1 -; and cc1plus don't crash if no -mmacosx-version-min is passed. The -; driver will always pass a -mmacosx-version-min, so in normal use the -; Init is never used. -mmacosx-version-min= -Target Joined Report Var(darwin_macosx_version_min) Init(DEF_MIN_OSX_VERSION) -The earliest MacOS X version on which this program will run. - -mone-byte-bool -Target RejectNegative Report Var(darwin_one_byte_bool) -Set sizeof(bool) to 1. - -fapple-kext -Target Report C++ Var(flag_apple_kext) -Generate code for darwin loadable kernel extensions. - -mkernel -Target Report Var(flag_mkernel) -Generate code for the kernel or loadable kernel extensions. - -iframework -Target RejectNegative C ObjC C++ ObjC++ Joined Separate --iframework Add to the end of the system framework include path. +Driver RejectNegative +(Obsolete and unhandled by ld64, ignored) ld should produce an executable (only handled by ld_classic). -X -Driver +;; These are not "real" options, but placeholders used to hide the real options +;; from generic options processing... FIXME: they can be eliminated now. Zall_load Driver @@ -343,62 +485,3 @@ Driver Separate Zweak_reference_mismatches Driver Separate -client_name -Driver Separate - -compatibility_version -Driver Separate - -current_version -Driver Separate - -dylinker_install_name -Driver Separate - -pagezero_size -Driver Separate - -read_only_relocs -Driver Separate - -sectalign -Driver Separate Args(3) - -sectcreate -Driver Separate Args(3) - -sectobjectsymbols -Driver Separate Args(2) - -sectorder -Driver Separate Args(3) - -seg1addr -Driver Separate - -segcreate -Driver Separate Args(3) - -segprot -Driver Separate Args(3) - -segs_read_only_addr -Driver Separate - -segs_read_write_addr -Driver Separate - -sub_library -Driver Separate - -sub_umbrella -Driver Separate - -; Certain aspects of code-gen may be improved / adjusted if the version of ld64 -; is sufficiently modern. -mtarget-linker -Target RejectNegative Joined Separate Report Var(darwin_target_linker) Init(LD64_VERSION) -The version of ld64 in use for this toolchain. - -undefined -Driver Separate diff --git a/gcc/config/darwin10.h b/gcc/config/darwin10.h index 7da32917742..a0657ca08b0 100644 --- a/gcc/config/darwin10.h +++ b/gcc/config/darwin10.h @@ -18,17 +18,13 @@ You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ -/* Fix PR41260 by passing -no_compact_unwind on darwin10 and later until - unwinder in libSystem is fixed to digest new epilog unwinding notes. +/* Fix PR47558 by linking against libSystem ahead of libgcc_ext. */ - Fix PR47558 by linking against libSystem ahead of libgcc_ext. */ #undef LINK_GCC_C_SEQUENCE_SPEC #define LINK_GCC_C_SEQUENCE_SPEC \ -"%:version-compare(>= 10.6 mmacosx-version-min= -no_compact_unwind) \ - %{!static:%{!static-libgcc: \ - %:version-compare(>= 10.6 mmacosx-version-min= -lSystem) } } \ - %{fno-pic|fno-PIC|fno-pie|fno-PIE|fapple-kext|mkernel|static|mdynamic-no-pic: \ - %:version-compare(>= 10.7 mmacosx-version-min= -no_pie) } %G %L" +"%{!static:%{!static-libgcc: \ + %:version-compare(>= 10.6 mmacosx-version-min= -lSystem) } } \ + %G %L" #undef DEF_MIN_OSX_VERSION #define DEF_MIN_OSX_VERSION "10.6" diff --git a/gcc/config/darwin9.h b/gcc/config/darwin9.h index 72f593951e1..71adea978ce 100644 --- a/gcc/config/darwin9.h +++ b/gcc/config/darwin9.h @@ -35,12 +35,6 @@ along with GCC; see the file COPYING3. If not see /* Tell collect2 to run dsymutil for us as necessary. */ #define COLLECT_RUN_DSYMUTIL 1 -#undef DARWIN_PIE_SPEC -#define DARWIN_PIE_SPEC \ - "%{fpie|pie|fPIE: \ - %{mdynamic-no-pic: %n'-mdynamic-no-pic' overrides '-pie', '-fpie' or '-fPIE'; \ - :-pie}}" - /* Only ask as for debug data if the debug style is stabs (since as doesn't yet generate dwarf.) */ diff --git a/gcc/config/i386/avx2intrin.h b/gcc/config/i386/avx2intrin.h index a56d3fc804a..f6a2555de33 100644 --- a/gcc/config/i386/avx2intrin.h +++ b/gcc/config/i386/avx2intrin.h @@ -258,7 +258,7 @@ extern __inline __m256i __attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) _mm256_cmpgt_epi8 (__m256i __A, __m256i __B) { - return (__m256i) ((__v32qi)__A > (__v32qi)__B); + return (__m256i) ((__v32qs)__A > (__v32qs)__B); } extern __inline __m256i diff --git a/gcc/config/i386/avx512fintrin.h b/gcc/config/i386/avx512fintrin.h index 363194ff3fc..74184ff8a17 100644 --- a/gcc/config/i386/avx512fintrin.h +++ b/gcc/config/i386/avx512fintrin.h @@ -3762,7 +3762,7 @@ _mm512_maskz_fnmsub_round_ps (__mmask16 __U, __m512 __A, __m512 __B, (__m512d)__builtin_ia32_vfmaddsubpd512_mask(A, B, C, -1, R) #define _mm512_mask_fmaddsub_round_pd(A, U, B, C, R) \ - (__m512d)__builtin_ia32_vfmaddpd512_mask(A, B, C, U, R) + (__m512d)__builtin_ia32_vfmaddsubpd512_mask(A, B, C, U, R) #define _mm512_mask3_fmaddsub_round_pd(A, B, C, U, R) \ (__m512d)__builtin_ia32_vfmaddsubpd512_mask3(A, B, C, U, R) @@ -7727,7 +7727,7 @@ _mm512_mask_abs_ps (__m512 __W, __mmask16 __U, __m512 __A) extern __inline __m512d __attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) -_mm512_abs_pd (__m512 __A) +_mm512_abs_pd (__m512d __A) { return (__m512d) _mm512_and_epi64 ((__m512i) __A, _mm512_set1_epi64 (0x7fffffffffffffffLL)); @@ -7735,7 +7735,7 @@ _mm512_abs_pd (__m512 __A) extern __inline __m512d __attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) -_mm512_mask_abs_pd (__m512d __W, __mmask8 __U, __m512 __A) +_mm512_mask_abs_pd (__m512d __W, __mmask8 __U, __m512d __A) { return (__m512d) _mm512_mask_and_epi64 ((__m512i) __W, __U, (__m512i) __A, diff --git a/gcc/config/i386/avxintrin.h b/gcc/config/i386/avxintrin.h index 3891ffd099c..ca201b51be9 100644 --- a/gcc/config/i386/avxintrin.h +++ b/gcc/config/i386/avxintrin.h @@ -47,6 +47,7 @@ typedef unsigned int __v8su __attribute__ ((__vector_size__ (32))); typedef short __v16hi __attribute__ ((__vector_size__ (32))); typedef unsigned short __v16hu __attribute__ ((__vector_size__ (32))); typedef char __v32qi __attribute__ ((__vector_size__ (32))); +typedef signed char __v32qs __attribute__ ((__vector_size__ (32))); typedef unsigned char __v32qu __attribute__ ((__vector_size__ (32))); /* The Intel API is flexible enough that we must allow aliasing with other diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h index a26c5e49795..962e7532a85 100644 --- a/gcc/config/i386/cpuid.h +++ b/gcc/config/i386/cpuid.h @@ -178,10 +178,27 @@ #define signature_VORTEX_ecx 0x436f5320 #define signature_VORTEX_edx 0x36387865 +#ifndef __x86_64__ +/* At least one cpu (Winchip 2) does not set %ebx and %ecx + for cpuid leaf 1. Forcibly zero the two registers before + calling cpuid as a precaution. */ +#define __cpuid(level, a, b, c, d) \ + do { \ + if (__builtin_constant_p (level) && (level) != 1) \ + __asm__ ("cpuid\n\t" \ + : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ + : "0" (level)); \ + else \ + __asm__ ("cpuid\n\t" \ + : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ + : "0" (level), "1" (0), "2" (0)); \ + } while (0) +#else #define __cpuid(level, a, b, c, d) \ __asm__ ("cpuid\n\t" \ : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ : "0" (level)) +#endif #define __cpuid_count(level, count, a, b, c, d) \ __asm__ ("cpuid\n\t" \ diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index 1d358858106..560cbcf4ed6 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -268,9 +268,6 @@ do { \ bytes in one go. */ #define CHECK_STACK_LIMIT 4000 -#undef STACK_BOUNDARY -#define STACK_BOUNDARY (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) - /* By default, target has a 80387, uses IEEE compatible arithmetic, returns float values in the 387 and needs stack probes. We also align doubles to 64-bits for MSVC default compatibility. */ diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h index cf7d4effd1e..2d0dc1f2605 100644 --- a/gcc/config/i386/darwin.h +++ b/gcc/config/i386/darwin.h @@ -47,12 +47,13 @@ along with GCC; see the file COPYING3. If not see image. Therefore, for 64b exes at least, we must use the libunwind implementation, even when static-libgcc is specified. We put libSystem first so that - unwinder symbols are satisfied from there. */ + unwinder symbols are satisfied from there. + We default to 64b for single-arch builds, so apply this unconditionally. */ #undef REAL_LIBGCC_SPEC #define REAL_LIBGCC_SPEC \ "%{static-libgcc|static: \ - %{m64:%:version-compare(>= 10.6 mmacosx-version-min= -lSystem)} \ - -lgcc_eh -lgcc; \ + %:version-compare(>= 10.6 mmacosx-version-min= -lSystem) \ + -lgcc_eh -lgcc; \ shared-libgcc|fexceptions|fgnu-runtime: \ %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_s.10.4) \ %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ @@ -88,14 +89,12 @@ along with GCC; see the file COPYING3. If not see #undef WCHAR_TYPE_SIZE #define WCHAR_TYPE_SIZE 32 -/* Generate branch islands stubs if this is true. */ -extern int darwin_emit_branch_islands; - -#undef TARGET_MACHO_BRANCH_ISLANDS -#define TARGET_MACHO_BRANCH_ISLANDS darwin_emit_branch_islands +/* Generate pic symbol indirection stubs if this is true. */ +#undef TARGET_MACHO_SYMBOL_STUBS +#define TARGET_MACHO_SYMBOL_STUBS (darwin_symbol_stubs) /* For compatibility with OSX system tools, use the new style of pic stub - if this is set. */ + if this is set (default). */ #undef MACHOPIC_ATT_STUB #define MACHOPIC_ATT_STUB (darwin_macho_att_stub) @@ -111,10 +110,6 @@ extern int darwin_emit_branch_islands; /* On Darwin, the stack is 128-bit aligned at the point of every call. Failure to ensure this will lead to a crash in the system libraries or dynamic loader. */ -#undef STACK_BOUNDARY -#define STACK_BOUNDARY \ - ((profile_flag || (TARGET_64BIT && ix86_abi == MS_ABI)) \ - ? 128 : BITS_PER_WORD) #undef MAIN_STACK_BOUNDARY #define MAIN_STACK_BOUNDARY 128 @@ -134,7 +129,8 @@ extern int darwin_emit_branch_islands; #undef CC1_SPEC #define CC1_SPEC "%(cc1_cpu) \ %{!mkernel:%{!static:%{!mdynamic-no-pic:-fPIC}}} \ - %{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }} " \ + %{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }} \ + %{mx32:%eDarwin is not an mx32 platform}" \ DARWIN_CC1_SPEC #undef ASM_SPEC @@ -142,9 +138,6 @@ extern int darwin_emit_branch_islands; " ASM_OPTIONS " -force_cpusubtype_ALL \ %{static}" ASM_MMACOSX_VERSION_MIN_SPEC -#define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}" -#define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC - #undef ENDFILE_SPEC #define ENDFILE_SPEC \ "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ @@ -152,12 +145,15 @@ extern int darwin_emit_branch_islands; %{mpc64:crtprec64.o%s} \ %{mpc80:crtprec80.o%s}" TM_DESTRUCTOR +/* We default to x86_64 for single-arch builds, bi-arch overrides. */ +#define DARWIN_ARCH_SPEC "x86_64" + #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ DARWIN_EXTRA_SPECS \ - { "darwin_arch", DARWIN_ARCH_SPEC }, \ + { "darwin_arch", DARWIN_ARCH_SPEC }, \ { "darwin_crt2", "" }, \ - { "darwin_subarch", DARWIN_SUBARCH_SPEC }, + { "darwin_subarch", DARWIN_ARCH_SPEC }, /* The Darwin assembler mostly follows AT&T syntax. */ #undef ASSEMBLER_DIALECT @@ -223,19 +219,36 @@ extern int darwin_emit_branch_islands; } \ } while (0) +#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN +#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \ + do { \ + if ((LOG) != 0) { \ + if ((MAX_SKIP) == 0 || (MAX_SKIP) >= (1 << (LOG)) - 1) \ + fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ + else \ + fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \ + } \ + } while (0) +#endif + +/* Darwin x86 assemblers support the .ident directive. */ + +#undef TARGET_ASM_OUTPUT_IDENT +#define TARGET_ASM_OUTPUT_IDENT default_asm_output_ident_directive + /* Darwin profiling -- call mcount. */ #undef FUNCTION_PROFILER #define FUNCTION_PROFILER(FILE, LABELNO) \ - do { \ - if (TARGET_MACHO_BRANCH_ISLANDS \ - && MACHOPIC_INDIRECT && !TARGET_64BIT) \ - { \ - const char *name = machopic_mcount_stub_name (); \ - fprintf (FILE, "\tcall %s\n", name+1); /* skip '&' */ \ - machopic_validate_stub_or_non_lazy_ptr (name); \ - } \ - else fprintf (FILE, "\tcall mcount\n"); \ - } while (0) + do { \ + if (TARGET_MACHO_SYMBOL_STUBS \ + && MACHOPIC_INDIRECT && !TARGET_64BIT) \ + { \ + const char *name = machopic_mcount_stub_name (); \ + fprintf (FILE, "\tcall %s\n", name+1); /* skip '&' */ \ + machopic_validate_stub_or_non_lazy_ptr (name); \ + } \ + else fprintf (FILE, "\tcall mcount\n"); \ + } while (0) #define C_COMMON_OVERRIDE_OPTIONS \ do { \ @@ -308,10 +321,8 @@ do { \ } \ } -/* This needs to move since i386 uses the first flag and other flags are - used in Mach-O. */ -#undef MACHO_SYMBOL_FLAG_VARIABLE -#define MACHO_SYMBOL_FLAG_VARIABLE ((SYMBOL_FLAG_MACH_DEP) << 3) +/* First available SYMBOL flag bit for use by subtargets. */ +#define SYMBOL_FLAG_SUBT_DEP (SYMBOL_FLAG_MACH_DEP << 5) #undef MACHOPIC_NL_SYMBOL_PTR_SECTION #define MACHOPIC_NL_SYMBOL_PTR_SECTION \ diff --git a/gcc/config/i386/darwin32-biarch.h b/gcc/config/i386/darwin32-biarch.h new file mode 100644 index 00000000000..8dcc4a3b0b3 --- /dev/null +++ b/gcc/config/i386/darwin32-biarch.h @@ -0,0 +1,58 @@ +/* Target definitions for i386 running Darwin with a 32b host and supporting + a 64b multilib. + Copyright (C) 2019 Free Software Foundation, Inc. + +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 +. */ + +#undef DARWIN_ARCH_SPEC +#define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}" + +/* WORKAROUND pr80556: + For x86_64 Darwin10 and later, the unwinder is in libunwind (redirected + from libSystem). This doesn't use the keymgr (see keymgr.c) and therefore + the calls that libgcc makes to obtain the KEYMGR_GCC3_DW2_OBJ_LIST are not + updated to include new images, and might not even be valid for a single + image. + Therefore, for 64b exes at least, we must use the libunwind implementation, + even when static-libgcc is specified. We put libSystem first so that + unwinder symbols are satisfied from there. */ +#undef REAL_LIBGCC_SPEC +#define REAL_LIBGCC_SPEC \ + "%{static-libgcc|static: \ + %{m64:%:version-compare(>= 10.6 mmacosx-version-min= -lSystem)} \ + -lgcc_eh -lgcc; \ + shared-libgcc|fexceptions|fgnu-runtime: \ + %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_s.10.4) \ + %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ + %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ + %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ + -lgcc ; \ + :%:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_s.10.4) \ + %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ + %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ + %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ + -lgcc }" + +#undef DARWIN_SUBARCH_SPEC +#define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC + +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS \ + DARWIN_EXTRA_SPECS \ + { "darwin_arch", DARWIN_ARCH_SPEC }, \ + { "darwin_crt2", "" }, \ + { "darwin_subarch", DARWIN_SUBARCH_SPEC }, diff --git a/gcc/config/i386/darwin64.h b/gcc/config/i386/darwin64-biarch.h similarity index 94% rename from gcc/config/i386/darwin64.h rename to gcc/config/i386/darwin64-biarch.h index 87c4b8c14d3..5af7665c2a7 100644 --- a/gcc/config/i386/darwin64.h +++ b/gcc/config/i386/darwin64-biarch.h @@ -1,5 +1,6 @@ -/* Target definitions for x86_64 running Darwin. - Copyright (C) 2006-2018 Free Software Foundation, Inc. +/* Target definitions for x86_64 running Darwin with a 64b host supporting a + 32b multilib. + Copyright (C) 2006-2019 Free Software Foundation, Inc. Contributed by Apple Computer Inc. This file is part of GCC. diff --git a/gcc/config/i386/djgpp.c b/gcc/config/i386/djgpp.c index f168eed6f06..d187c3a7452 100644 --- a/gcc/config/i386/djgpp.c +++ b/gcc/config/i386/djgpp.c @@ -47,3 +47,20 @@ i386_djgpp_asm_named_section(const char *name, unsigned int flags, fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars); } + +/* Kludge because of missing COFF support for early LTO debug. */ + +static enum debug_info_levels saved_debug_info_level; + +void +i386_djgpp_asm_lto_start (void) +{ + saved_debug_info_level = debug_info_level; + debug_info_level = DINFO_LEVEL_NONE; +} + +void +i386_djgpp_asm_lto_end (void) +{ + debug_info_level = saved_debug_info_level; +} diff --git a/gcc/config/i386/djgpp.h b/gcc/config/i386/djgpp.h index 42130edf95c..e95bc09bf69 100644 --- a/gcc/config/i386/djgpp.h +++ b/gcc/config/i386/djgpp.h @@ -160,8 +160,19 @@ along with GCC; see the file COPYING3. If not see #undef MAKE_DECL_ONE_ONLY #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1) +#undef TARGET_COFF +#define TARGET_COFF 1 + +/* Kludge because of missing COFF support for early LTO debug. */ +#undef TARGET_ASM_LTO_START +#define TARGET_ASM_LTO_START i386_djgpp_asm_lto_start +#undef TARGET_ASM_LTO_END +#define TARGET_ASM_LTO_END i386_djgpp_asm_lto_end + /* Function protypes for gcc/i386/djgpp.c */ void i386_djgpp_asm_named_section(const char *name, unsigned int flags, tree decl); +void i386_djgpp_asm_lto_start (void); +void i386_djgpp_asm_lto_end (void); diff --git a/gcc/config/i386/emmintrin.h b/gcc/config/i386/emmintrin.h index b940a39d27b..33e3b64b1d0 100644 --- a/gcc/config/i386/emmintrin.h +++ b/gcc/config/i386/emmintrin.h @@ -45,6 +45,7 @@ typedef unsigned int __v4su __attribute__ ((__vector_size__ (16))); typedef short __v8hi __attribute__ ((__vector_size__ (16))); typedef unsigned short __v8hu __attribute__ ((__vector_size__ (16))); typedef char __v16qi __attribute__ ((__vector_size__ (16))); +typedef signed char __v16qs __attribute__ ((__vector_size__ (16))); typedef unsigned char __v16qu __attribute__ ((__vector_size__ (16))); /* The Intel API is flexible enough that we must allow aliasing with other @@ -1313,7 +1314,7 @@ _mm_cmpeq_epi32 (__m128i __A, __m128i __B) extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_cmplt_epi8 (__m128i __A, __m128i __B) { - return (__m128i) ((__v16qi)__A < (__v16qi)__B); + return (__m128i) ((__v16qs)__A < (__v16qs)__B); } extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) @@ -1331,7 +1332,7 @@ _mm_cmplt_epi32 (__m128i __A, __m128i __B) extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_cmpgt_epi8 (__m128i __A, __m128i __B) { - return (__m128i) ((__v16qi)__A > (__v16qi)__B); + return (__m128i) ((__v16qs)__A > (__v16qs)__B); } extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) diff --git a/gcc/config/i386/freebsd64.h b/gcc/config/i386/freebsd64.h index d7fbe946698..f4a4548595d 100644 --- a/gcc/config/i386/freebsd64.h +++ b/gcc/config/i386/freebsd64.h @@ -31,7 +31,7 @@ along with GCC; see the file COPYING3. If not see #undef LINK_SPEC #define LINK_SPEC "\ - %{m32:-m elf_i386_fbsd} \ + %{m32:-m elf_i386_fbsd}%{!m32:-m elf_x86_64_fbsd} \ %{p:%nconsider using '-pg' instead of '-p' with gprof(1)} \ %{v:-V} \ %{assert*} %{R*} %{rpath*} %{defsym*} \ @@ -42,3 +42,6 @@ along with GCC; see the file COPYING3. If not see -dynamic-linker %(fbsd_dynamic_linker) } \ %{static:-Bstatic}} \ %{symbolic:-Bsymbolic}" + +#undef MULTILIB_DEFAULTS +#define MULTILIB_DEFAULTS { "m64" } diff --git a/gcc/config/i386/gnu-user.h b/gcc/config/i386/gnu-user.h index d1dad685e72..93a7f8d4c6b 100644 --- a/gcc/config/i386/gnu-user.h +++ b/gcc/config/i386/gnu-user.h @@ -67,7 +67,7 @@ along with GCC; see the file COPYING3. If not see #undef ASM_SPEC #define ASM_SPEC \ - "--32 %{!mno-sse2avx:%{mavx:-msse2avx}} %{msse2avx:%{!mavx:-msse2avx}}" + "--32 %{msse2avx:%{!mavx:-msse2avx}}" #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ diff --git a/gcc/config/i386/gnu-user64.h b/gcc/config/i386/gnu-user64.h index 491416fec0c..d9400638f12 100644 --- a/gcc/config/i386/gnu-user64.h +++ b/gcc/config/i386/gnu-user64.h @@ -50,7 +50,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define ASM_SPEC "%{" SPEC_32 ":--32} \ %{" SPEC_64 ":--64} \ %{" SPEC_X32 ":--x32} \ - %{!mno-sse2avx:%{mavx:-msse2avx}} %{msse2avx:%{!mavx:-msse2avx}}" + %{msse2avx:%{!mavx:-msse2avx}}" #define GNU_USER_TARGET_LINK_SPEC \ "%{" SPEC_64 ":-m " GNU_USER_LINK_EMULATION64 "} \ diff --git a/gcc/config/i386/i386-builtin.def b/gcc/config/i386/i386-builtin.def index 1b9c63a16db..fe23ab0b829 100644 --- a/gcc/config/i386/i386-builtin.def +++ b/gcc/config/i386/i386-builtin.def @@ -90,6 +90,7 @@ BDESC_END (PCMPISTR, SPECIAL_ARGS) BDESC_FIRST (special_args, SPECIAL_ARGS, 0, CODE_FOR_nothing, "__builtin_ia32_rdtsc", IX86_BUILTIN_RDTSC, UNKNOWN, (int) UINT64_FTYPE_VOID) BDESC (0, CODE_FOR_nothing, "__builtin_ia32_rdtscp", IX86_BUILTIN_RDTSCP, UNKNOWN, (int) UINT64_FTYPE_PUNSIGNED) +BDESC (0, CODE_FOR_nothing, "__builtin_ia32_rdpmc", IX86_BUILTIN_RDPMC, UNKNOWN, (int) UINT64_FTYPE_INT) BDESC (0, CODE_FOR_pause, "__builtin_ia32_pause", IX86_BUILTIN_PAUSE, UNKNOWN, (int) VOID_FTYPE_VOID) /* 80387 (for use internally for atomic compound assignment). */ @@ -427,7 +428,6 @@ BDESC_END (SPECIAL_ARGS, ARGS) BDESC_FIRST (args, ARGS, 0, CODE_FOR_bsr, "__builtin_ia32_bsrsi", IX86_BUILTIN_BSRSI, UNKNOWN, (int) INT_FTYPE_INT) BDESC (OPTION_MASK_ISA_64BIT, CODE_FOR_bsr_rex64, "__builtin_ia32_bsrdi", IX86_BUILTIN_BSRDI, UNKNOWN, (int) INT64_FTYPE_INT64) -BDESC (0, CODE_FOR_nothing, "__builtin_ia32_rdpmc", IX86_BUILTIN_RDPMC, UNKNOWN, (int) UINT64_FTYPE_INT) BDESC (0, CODE_FOR_rotlqi3, "__builtin_ia32_rolqi", IX86_BUILTIN_ROLQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT) BDESC (0, CODE_FOR_rotlhi3, "__builtin_ia32_rolhi", IX86_BUILTIN_ROLHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT) BDESC (0, CODE_FOR_rotrqi3, "__builtin_ia32_rorqi", IX86_BUILTIN_RORQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT) @@ -806,11 +806,11 @@ BDESC (OPTION_MASK_ISA_SSE3, CODE_FOR_sse3_hsubv2df3, "__builtin_ia32_hsubpd", I /* SSSE3 */ BDESC (OPTION_MASK_ISA_SSSE3, CODE_FOR_absv16qi2, "__builtin_ia32_pabsb128", IX86_BUILTIN_PABSB128, UNKNOWN, (int) V16QI_FTYPE_V16QI) -BDESC (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX, CODE_FOR_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI) +BDESC (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX, CODE_FOR_ssse3_absv8qi2, "__builtin_ia32_pabsb", IX86_BUILTIN_PABSB, UNKNOWN, (int) V8QI_FTYPE_V8QI) BDESC (OPTION_MASK_ISA_SSSE3, CODE_FOR_absv8hi2, "__builtin_ia32_pabsw128", IX86_BUILTIN_PABSW128, UNKNOWN, (int) V8HI_FTYPE_V8HI) -BDESC (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX, CODE_FOR_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI) +BDESC (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX, CODE_FOR_ssse3_absv4hi2, "__builtin_ia32_pabsw", IX86_BUILTIN_PABSW, UNKNOWN, (int) V4HI_FTYPE_V4HI) BDESC (OPTION_MASK_ISA_SSSE3, CODE_FOR_absv4si2, "__builtin_ia32_pabsd128", IX86_BUILTIN_PABSD128, UNKNOWN, (int) V4SI_FTYPE_V4SI) -BDESC (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX, CODE_FOR_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI) +BDESC (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX, CODE_FOR_ssse3_absv2si2, "__builtin_ia32_pabsd", IX86_BUILTIN_PABSD, UNKNOWN, (int) V2SI_FTYPE_V2SI) BDESC (OPTION_MASK_ISA_SSSE3, CODE_FOR_ssse3_phaddwv8hi3, "__builtin_ia32_phaddw128", IX86_BUILTIN_PHADDW128, UNKNOWN, (int) V8HI_FTYPE_V8HI_V8HI) BDESC (OPTION_MASK_ISA_SSSE3 | OPTION_MASK_ISA_MMX, CODE_FOR_ssse3_phaddwv4hi3, "__builtin_ia32_phaddw", IX86_BUILTIN_PHADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI) diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 8a032371e7f..f156f7e66a4 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -91,6 +91,8 @@ along with GCC; see the file COPYING3. If not see #include "ipa-prop.h" #include "ipa-fnsummary.h" #include "wide-int-bitmask.h" +#include "debug.h" +#include "dwarf2out.h" /* This file should be included last. */ #include "target-def.h" @@ -1022,16 +1024,8 @@ dimode_scalar_to_vector_candidate_p (rtx_insn *insn) case ASHIFT: case LSHIFTRT: - if (!REG_P (XEXP (src, 1)) - && (!SUBREG_P (XEXP (src, 1)) - || SUBREG_BYTE (XEXP (src, 1)) != 0 - || !REG_P (SUBREG_REG (XEXP (src, 1)))) - && (!CONST_INT_P (XEXP (src, 1)) - || !IN_RANGE (INTVAL (XEXP (src, 1)), 0, 63))) - return false; - - if (GET_MODE (XEXP (src, 1)) != QImode - && !CONST_INT_P (XEXP (src, 1))) + if (!CONST_INT_P (XEXP (src, 1)) + || !IN_RANGE (INTVAL (XEXP (src, 1)), 0, 63)) return false; break; @@ -1628,15 +1622,10 @@ dimode_scalar_chain::compute_convert_gain () { if (CONST_INT_P (XEXP (src, 0))) gain -= vector_const_cost (XEXP (src, 0)); - if (CONST_INT_P (XEXP (src, 1))) - { - gain += ix86_cost->shift_const; - if (INTVAL (XEXP (src, 1)) >= 32) - gain -= COSTS_N_INSNS (1); - } - else - /* Additional gain for omitting two CMOVs. */ - gain += ix86_cost->shift_var + COSTS_N_INSNS (2); + + gain += ix86_cost->shift_const; + if (INTVAL (XEXP (src, 1)) >= 32) + gain -= COSTS_N_INSNS (1); } else if (GET_CODE (src) == PLUS || GET_CODE (src) == MINUS @@ -1752,60 +1741,14 @@ dimode_scalar_chain::make_vector_copies (unsigned regno) { rtx reg = regno_reg_rtx[regno]; rtx vreg = gen_reg_rtx (DImode); - bool count_reg = false; df_ref ref; for (ref = DF_REG_DEF_CHAIN (regno); ref; ref = DF_REF_NEXT_REG (ref)) if (!bitmap_bit_p (insns, DF_REF_INSN_UID (ref))) { - df_ref use; - - /* Detect the count register of a shift instruction. */ - for (use = DF_REG_USE_CHAIN (regno); use; use = DF_REF_NEXT_REG (use)) - if (bitmap_bit_p (insns, DF_REF_INSN_UID (use))) - { - rtx_insn *insn = DF_REF_INSN (use); - rtx def_set = single_set (insn); - - gcc_assert (def_set); - - rtx src = SET_SRC (def_set); - - if ((GET_CODE (src) == ASHIFT - || GET_CODE (src) == ASHIFTRT - || GET_CODE (src) == LSHIFTRT) - && !CONST_INT_P (XEXP (src, 1)) - && reg_or_subregno (XEXP (src, 1)) == regno) - count_reg = true; - } - start_sequence (); - if (count_reg) - { - rtx qreg = gen_lowpart (QImode, reg); - rtx tmp = gen_reg_rtx (SImode); - - if (TARGET_ZERO_EXTEND_WITH_AND - && optimize_function_for_speed_p (cfun)) - { - emit_move_insn (tmp, const0_rtx); - emit_insn (gen_movstrictqi - (gen_lowpart (QImode, tmp), qreg)); - } - else - emit_insn (gen_rtx_SET - (tmp, gen_rtx_ZERO_EXTEND (SImode, qreg))); - if (!TARGET_INTER_UNIT_MOVES_TO_VEC) - { - rtx slot = assign_386_stack_local (SImode, SLOT_STV_TEMP); - emit_move_insn (slot, tmp); - tmp = copy_rtx (slot); - } - - emit_insn (gen_zero_extendsidi2 (vreg, tmp)); - } - else if (!TARGET_INTER_UNIT_MOVES_TO_VEC) + if (!TARGET_INTER_UNIT_MOVES_TO_VEC) { rtx tmp = assign_386_stack_local (DImode, SLOT_STV_TEMP); emit_move_insn (adjust_address (tmp, SImode, 0), @@ -1853,22 +1796,8 @@ dimode_scalar_chain::make_vector_copies (unsigned regno) if (bitmap_bit_p (insns, DF_REF_INSN_UID (ref))) { rtx_insn *insn = DF_REF_INSN (ref); - if (count_reg) - { - rtx def_set = single_set (insn); - gcc_assert (def_set); - - rtx src = SET_SRC (def_set); - if ((GET_CODE (src) == ASHIFT - || GET_CODE (src) == ASHIFTRT - || GET_CODE (src) == LSHIFTRT) - && !CONST_INT_P (XEXP (src, 1)) - && reg_or_subregno (XEXP (src, 1)) == regno) - XEXP (src, 1) = vreg; - } - else - replace_with_subreg_in_insn (insn, reg, vreg); + replace_with_subreg_in_insn (insn, reg, vreg); if (dump_file) fprintf (dump_file, " Replaced r%d with r%d in insn %d\n", @@ -1971,42 +1900,7 @@ dimode_scalar_chain::convert_reg (unsigned regno) rtx src = SET_SRC (def_set); rtx dst = SET_DEST (def_set); - if ((GET_CODE (src) == ASHIFT - || GET_CODE (src) == ASHIFTRT - || GET_CODE (src) == LSHIFTRT) - && !CONST_INT_P (XEXP (src, 1)) - && reg_or_subregno (XEXP (src, 1)) == regno) - { - rtx tmp2 = gen_reg_rtx (V2DImode); - - start_sequence (); - - if (TARGET_SSE4_1) - emit_insn (gen_sse4_1_zero_extendv2qiv2di2 - (tmp2, gen_rtx_SUBREG (V16QImode, reg, 0))); - else - { - rtx vec_cst - = gen_rtx_CONST_VECTOR (V2DImode, - gen_rtvec (2, GEN_INT (0xff), - const0_rtx)); - vec_cst - = validize_mem (force_const_mem (V2DImode, vec_cst)); - - emit_insn (gen_rtx_SET - (tmp2, - gen_rtx_AND (V2DImode, - gen_rtx_SUBREG (V2DImode, reg, 0), - vec_cst))); - } - rtx_insn *seq = get_insns (); - end_sequence (); - - emit_insn_before (seq, insn); - - XEXP (src, 1) = gen_rtx_SUBREG (DImode, tmp2, 0); - } - else if (!MEM_P (dst) || !REG_P (src)) + if (!MEM_P (dst) || !REG_P (src)) replace_with_subreg_in_insn (insn, reg, reg); bitmap_clear_bit (conv, INSN_UID (insn)); @@ -2606,11 +2500,17 @@ rest_of_insert_endbranch (void) TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl))) && !cgraph_node::get (cfun->decl)->only_called_directly_p ()) { - cet_eb = gen_nop_endbr (); + /* Queue ENDBR insertion to x86_function_profiler. */ + if (crtl->profile && flag_fentry) + cfun->machine->endbr_queued_at_entrance = true; + else + { + cet_eb = gen_nop_endbr (); - bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; - insn = BB_HEAD (bb); - emit_insn_before (cet_eb, insn); + bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; + insn = BB_HEAD (bb); + emit_insn_before (cet_eb, insn); + } } bb = 0; @@ -3480,7 +3380,7 @@ ix86_option_override_internal (bool main_args_p, | PTA_AVX512VBMI | PTA_AVX512IFMA | PTA_SHA; const wide_int_bitmask PTA_ICELAKE_CLIENT = PTA_CANNONLAKE | PTA_AVX512VNNI | PTA_GFNI | PTA_VAES | PTA_AVX512VBMI2 | PTA_VPCLMULQDQ | PTA_AVX512BITALG - | PTA_RDPID | PTA_CLWB; + | PTA_RDPID | PTA_CLWB | PTA_AVX512VPOPCNTDQ; const wide_int_bitmask PTA_ICELAKE_SERVER = PTA_ICELAKE_CLIENT | PTA_PCONFIG | PTA_WBNOINVD; const wide_int_bitmask PTA_KNL = PTA_BROADWELL | PTA_AVX512PF | PTA_AVX512ER @@ -4848,8 +4748,14 @@ ix86_option_override_internal (bool main_args_p, /* Handle stack protector */ if (!opts_set->x_ix86_stack_protector_guard) - opts->x_ix86_stack_protector_guard - = TARGET_HAS_BIONIC ? SSP_GLOBAL : SSP_TLS; + { +#ifdef TARGET_THREAD_SSP_OFFSET + if (!TARGET_HAS_BIONIC) + opts->x_ix86_stack_protector_guard = SSP_TLS; + else +#endif + opts->x_ix86_stack_protector_guard = SSP_GLOBAL; + } #ifdef TARGET_THREAD_SSP_OFFSET ix86_stack_protector_guard_offset = TARGET_THREAD_SSP_OFFSET; @@ -4944,6 +4850,12 @@ ix86_option_override_internal (bool main_args_p, opts->x_param_values, opts_set->x_param_values); + /* PR86952: jump table usage with retpolines is slow. + The PR provides some numbers about the slowness. */ + if (ix86_indirect_branch != indirect_branch_keep + && !opts_set->x_flag_jump_tables) + opts->x_flag_jump_tables = 0; + return true; } @@ -5538,7 +5450,25 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], ret = false; } else - p_strings[opt] = xstrdup (p + opt_len); + { + p_strings[opt] = xstrdup (p + opt_len); + if (opt == IX86_FUNCTION_SPECIFIC_ARCH) + { + /* If arch= is set, clear all bits in x_ix86_isa_flags, + except for ISA_64BIT, ABI_64, ABI_X32, and CODE16 + and all bits in x_ix86_isa_flags2. */ + opts->x_ix86_isa_flags &= (OPTION_MASK_ISA_64BIT + | OPTION_MASK_ABI_64 + | OPTION_MASK_ABI_X32 + | OPTION_MASK_CODE16); + opts->x_ix86_isa_flags_explicit &= (OPTION_MASK_ISA_64BIT + | OPTION_MASK_ABI_64 + | OPTION_MASK_ABI_X32 + | OPTION_MASK_CODE16); + opts->x_ix86_isa_flags2 = 0; + opts->x_ix86_isa_flags2_explicit = 0; + } + } } else if (type == ix86_opt_enum) @@ -5613,18 +5543,8 @@ ix86_valid_target_attribute_tree (tree args, /* If we are using the default tune= or arch=, undo the string assigned, and use the default. */ if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH]) - { - opts->x_ix86_arch_string - = ggc_strdup (option_strings[IX86_FUNCTION_SPECIFIC_ARCH]); - - /* If arch= is set, clear all bits in x_ix86_isa_flags, - except for ISA_64BIT, ABI_64, ABI_X32, and CODE16. */ - opts->x_ix86_isa_flags &= (OPTION_MASK_ISA_64BIT - | OPTION_MASK_ABI_64 - | OPTION_MASK_ABI_X32 - | OPTION_MASK_CODE16); - opts->x_ix86_isa_flags2 = 0; - } + opts->x_ix86_arch_string + = ggc_strdup (option_strings[IX86_FUNCTION_SPECIFIC_ARCH]); else if (!orig_arch_specified) opts->x_ix86_arch_string = NULL; @@ -8193,7 +8113,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, case X86_64_SSEDF_CLASS: if (mode != BLKmode) return gen_reg_or_parallel (mode, orig_mode, - SSE_REGNO (sse_regno)); + GET_SSE_REGNO (sse_regno)); break; case X86_64_X87_CLASS: case X86_64_COMPLEX_X87_CLASS: @@ -8209,7 +8129,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, && regclass[1] == X86_64_SSEUP_CLASS && mode != BLKmode) return gen_reg_or_parallel (mode, orig_mode, - SSE_REGNO (sse_regno)); + GET_SSE_REGNO (sse_regno)); if (n == 4 && regclass[0] == X86_64_SSE_CLASS && regclass[1] == X86_64_SSEUP_CLASS @@ -8217,7 +8137,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, && regclass[3] == X86_64_SSEUP_CLASS && mode != BLKmode) return gen_reg_or_parallel (mode, orig_mode, - SSE_REGNO (sse_regno)); + GET_SSE_REGNO (sse_regno)); if (n == 8 && regclass[0] == X86_64_SSE_CLASS && regclass[1] == X86_64_SSEUP_CLASS @@ -8229,7 +8149,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, && regclass[7] == X86_64_SSEUP_CLASS && mode != BLKmode) return gen_reg_or_parallel (mode, orig_mode, - SSE_REGNO (sse_regno)); + GET_SSE_REGNO (sse_regno)); if (n == 2 && regclass[0] == X86_64_X87_CLASS && regclass[1] == X86_64_X87UP_CLASS) @@ -8238,9 +8158,22 @@ construct_container (machine_mode mode, machine_mode orig_mode, if (n == 2 && regclass[0] == X86_64_INTEGER_CLASS && regclass[1] == X86_64_INTEGER_CLASS - && (mode == CDImode || mode == TImode) + && (mode == CDImode || mode == TImode || mode == BLKmode) && intreg[0] + 1 == intreg[1]) - return gen_rtx_REG (mode, intreg[0]); + { + if (mode == BLKmode) + { + /* Use TImode for BLKmode values in 2 integer registers. */ + exp[0] = gen_rtx_EXPR_LIST (VOIDmode, + gen_rtx_REG (TImode, intreg[0]), + GEN_INT (0)); + ret = gen_rtx_PARALLEL (mode, rtvec_alloc (1)); + XVECEXP (ret, 0, 0) = exp[0]; + return ret; + } + else + return gen_rtx_REG (mode, intreg[0]); + } /* Otherwise figure out the entries of the PARALLEL. */ for (i = 0; i < n; i++) @@ -8276,7 +8209,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (SFmode, - SSE_REGNO (sse_regno)), + GET_SSE_REGNO (sse_regno)), GEN_INT (i*8)); sse_regno++; break; @@ -8284,7 +8217,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (DFmode, - SSE_REGNO (sse_regno)), + GET_SSE_REGNO (sse_regno)), GEN_INT (i*8)); sse_regno++; break; @@ -8330,7 +8263,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (tmpmode, - SSE_REGNO (sse_regno)), + GET_SSE_REGNO (sse_regno)), GEN_INT (pos*8)); sse_regno++; break; @@ -9766,7 +9699,7 @@ setup_incoming_varargs_64 (CUMULATIVE_ARGS *cum) set_mem_alias_set (mem, set); set_mem_align (mem, GET_MODE_ALIGNMENT (smode)); - emit_move_insn (mem, gen_rtx_REG (smode, SSE_REGNO (i))); + emit_move_insn (mem, gen_rtx_REG (smode, GET_SSE_REGNO (i))); } emit_label (label); @@ -10995,6 +10928,23 @@ output_indirect_thunk (enum indirect_thunk_prefix need_prefix, ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2); + /* The above call insn pushed a word to stack. Adjust CFI info. */ + if (flag_asynchronous_unwind_tables && dwarf2out_do_frame ()) + { + if (! dwarf2out_do_cfi_asm ()) + { + dw_cfi_ref xcfi = ggc_cleared_alloc (); + xcfi->dw_cfi_opc = DW_CFA_advance_loc4; + xcfi->dw_cfi_oprnd1.dw_cfi_addr = ggc_strdup (indirectlabel2); + vec_safe_push (cfun->fde->dw_fde_cfi, xcfi); + } + dw_cfi_ref xcfi = ggc_cleared_alloc (); + xcfi->dw_cfi_opc = DW_CFA_def_cfa_offset; + xcfi->dw_cfi_oprnd1.dw_cfi_offset = 2 * UNITS_PER_WORD; + vec_safe_push (cfun->fde->dw_fde_cfi, xcfi); + dwarf2out_emit_cfi (xcfi); + } + if (regno != INVALID_REGNUM) { /* MOV. */ @@ -11678,10 +11628,16 @@ ix86_compute_frame_layout (void) /* 64-bit MS ABI seem to require stack alignment to be always 16, except for function prologues, leaf functions and when the defult incoming stack boundary is overriden at command line or via - force_align_arg_pointer attribute. */ - if ((TARGET_64BIT_MS_ABI && crtl->preferred_stack_boundary < 128) + force_align_arg_pointer attribute. + + Darwin's ABI specifies 128b alignment for both 32 and 64 bit variants + at call sites, including profile function calls. + */ + if (((TARGET_64BIT_MS_ABI || TARGET_MACHO) + && crtl->preferred_stack_boundary < 128) && (!crtl->is_leaf || cfun->calls_alloca != 0 || ix86_current_function_calls_tls_descriptor + || (TARGET_MACHO && crtl->profile) || ix86_incoming_stack_boundary < 128)) { crtl->preferred_stack_boundary = 128; @@ -13438,12 +13394,14 @@ ix86_finalize_stack_frame_flags (void) recompute_frame_layout_p = true; } } - else if (crtl->max_used_stack_slot_alignment - > crtl->preferred_stack_boundary) + else if (crtl->max_used_stack_slot_alignment >= 128) { - /* We don't need to realign stack. But we still need to keep - stack frame properly aligned to satisfy the largest alignment - of stack slots. */ + /* We don't need to realign stack. max_used_stack_alignment is + used to decide how stack frame should be aligned. This is + independent of any psABIs nor 32-bit vs 64-bit. It is always + safe to compute max_used_stack_alignment. We compute it only + if 128-bit aligned load/store may be generated on misaligned + stack slot which will lead to segfault. */ if (ix86_find_max_used_stack_alignment (stack_alignment, true)) cfun->machine->max_used_stack_alignment = stack_alignment / BITS_PER_UNIT; @@ -14036,8 +13994,9 @@ ix86_expand_prologue (void) } m->fs.sp_offset += allocate; - /* Use stack_pointer_rtx for relative addressing so that code - works for realigned stack, too. */ + /* Use stack_pointer_rtx for relative addressing so that code works for + realigned stack. But this means that we need a blockage to prevent + stores based on the frame pointer from being scheduled before. */ if (r10_live && eax_live) { t = gen_rtx_PLUS (Pmode, stack_pointer_rtx, eax); @@ -14046,6 +14005,7 @@ ix86_expand_prologue (void) t = plus_constant (Pmode, t, UNITS_PER_WORD); emit_move_insn (gen_rtx_REG (word_mode, AX_REG), gen_frame_mem (word_mode, t)); + emit_insn (gen_memory_blockage ()); } else if (eax_live || r10_live) { @@ -14053,6 +14013,7 @@ ix86_expand_prologue (void) emit_move_insn (gen_rtx_REG (word_mode, (eax_live ? AX_REG : R10_REG)), gen_frame_mem (word_mode, t)); + emit_insn (gen_memory_blockage ()); } } gcc_assert (m->fs.sp_offset == frame.stack_pointer_offset); @@ -17258,7 +17219,7 @@ output_pic_addr_const (FILE *file, rtx x, int code) break; case SYMBOL_REF: - if (TARGET_64BIT || ! TARGET_MACHO_BRANCH_ISLANDS) + if (TARGET_64BIT || ! TARGET_MACHO_SYMBOL_STUBS) output_addr_const (file, x); else { @@ -18066,6 +18027,7 @@ print_reg (rtx x, int code, FILE *file) ; -- print a semicolon (after prefixes due to bug in older gas). ~ -- print "i" if TARGET_AVX2, "f" otherwise. ^ -- print addr32 prefix if TARGET_64BIT and Pmode != word_mode + M -- print addr32 prefix for TARGET_X32 with VSIB address. ! -- print MPX prefix for jxx/call/ret instructions if required. */ @@ -18613,6 +18575,26 @@ ix86_print_operand (FILE *file, rtx x, int code) putc (TARGET_AVX2 ? 'i' : 'f', file); return; + case 'M': + if (TARGET_X32) + { + /* NB: 32-bit indices in VSIB address are sign-extended + to 64 bits. In x32, if 32-bit address 0xf7fa3010 is + sign-extended to 0xfffffffff7fa3010 which is invalid + address. Add addr32 prefix if there is no base + register nor symbol. */ + bool ok; + struct ix86_address parts; + ok = ix86_decompose_address (x, &parts); + gcc_assert (ok && parts.index == NULL_RTX); + if (parts.base == NULL_RTX + && (parts.disp == NULL_RTX + || !symbolic_operand (parts.disp, + GET_MODE (parts.disp)))) + fputs ("addr32 ", file); + } + return; + case '^': if (TARGET_64BIT && Pmode != word_mode) fputs ("addr32 ", file); @@ -24007,6 +23989,8 @@ ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0, else { code = is_min ? SMIN : SMAX; + if (MEM_P (if_true) && MEM_P (if_false)) + if_true = force_reg (mode, if_true); tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false); } @@ -24014,7 +23998,7 @@ ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0, return true; } -/* Expand an sse vector comparison. Return the register with the result. */ +/* Expand an SSE comparison. Return the register with the result. */ static rtx ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1, @@ -24039,9 +24023,12 @@ ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1, else cmp_mode = cmp_ops_mode; - cmp_op0 = force_reg (cmp_ops_mode, cmp_op0); - if (!nonimmediate_operand (cmp_op1, cmp_ops_mode)) + + int (*op1_predicate)(rtx, machine_mode) + = VECTOR_MODE_P (cmp_ops_mode) ? vector_operand : nonimmediate_operand; + + if (!op1_predicate (cmp_op1, cmp_ops_mode)) cmp_op1 = force_reg (cmp_ops_mode, cmp_op1); if (optimize @@ -24161,7 +24148,7 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false) rtx (*gen) (rtx, rtx, rtx, rtx) = NULL; rtx d = dest; - if (!nonimmediate_operand (op_true, mode)) + if (!vector_operand (op_true, mode)) op_true = force_reg (mode, op_true); op_false = force_reg (mode, op_false); @@ -28699,6 +28686,25 @@ ix86_nopic_noplt_attribute_p (rtx call_op) return false; } +/* Helper to output the jmp/call. */ +static void +ix86_output_jmp_thunk_or_indirect (const char *thunk_name, + enum indirect_thunk_prefix need_prefix, + const int regno) +{ + if (thunk_name != NULL) + { + if (need_prefix == indirect_thunk_prefix_bnd) + fprintf (asm_out_file, "\tbnd jmp\t"); + else + fprintf (asm_out_file, "\tjmp\t"); + assemble_name (asm_out_file, thunk_name); + putc ('\n', asm_out_file); + } + else + output_indirect_thunk (need_prefix, regno); +} + /* Output indirect branch via a call and return thunk. CALL_OP is a register which contains the branch target. XASM is the assembly template for CALL_OP. Branch is a tail call if SIBCALL_P is true. @@ -28740,25 +28746,17 @@ ix86_output_indirect_branch_via_reg (rtx call_op, bool sibcall_p) thunk_name = NULL; if (sibcall_p) - { - if (thunk_name != NULL) - { - if (need_prefix == indirect_thunk_prefix_bnd) - fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); - else - fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); - } - else - output_indirect_thunk (need_prefix, regno); - } + ix86_output_jmp_thunk_or_indirect (thunk_name, need_prefix, regno); else { if (thunk_name != NULL) { if (need_prefix == indirect_thunk_prefix_bnd) - fprintf (asm_out_file, "\tbnd call\t%s\n", thunk_name); + fprintf (asm_out_file, "\tbnd call\t"); else - fprintf (asm_out_file, "\tcall\t%s\n", thunk_name); + fprintf (asm_out_file, "\tcall\t"); + assemble_name (asm_out_file, thunk_name); + putc ('\n', asm_out_file); return; } @@ -28782,15 +28780,7 @@ ix86_output_indirect_branch_via_reg (rtx call_op, bool sibcall_p) ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1); - if (thunk_name != NULL) - { - if (need_prefix == indirect_thunk_prefix_bnd) - fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); - else - fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); - } - else - output_indirect_thunk (need_prefix, regno); + ix86_output_jmp_thunk_or_indirect (thunk_name, need_prefix, regno); ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2); @@ -28855,15 +28845,7 @@ ix86_output_indirect_branch_via_push (rtx call_op, const char *xasm, if (sibcall_p) { output_asm_insn (push_buf, &call_op); - if (thunk_name != NULL) - { - if (need_prefix == indirect_thunk_prefix_bnd) - fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); - else - fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); - } - else - output_indirect_thunk (need_prefix, regno); + ix86_output_jmp_thunk_or_indirect (thunk_name, need_prefix, regno); } else { @@ -28922,15 +28904,7 @@ ix86_output_indirect_branch_via_push (rtx call_op, const char *xasm, output_asm_insn (push_buf, &call_op); - if (thunk_name != NULL) - { - if (need_prefix == indirect_thunk_prefix_bnd) - fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); - else - fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); - } - else - output_indirect_thunk (need_prefix, regno); + ix86_output_jmp_thunk_or_indirect (thunk_name, need_prefix, regno); ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2); @@ -28999,13 +28973,15 @@ ix86_output_function_return (bool long_p) if (need_prefix == indirect_thunk_prefix_bnd) { indirect_return_bnd_needed |= need_thunk; - fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); + fprintf (asm_out_file, "\tbnd jmp\t"); } else { indirect_return_needed |= need_thunk; - fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); + fprintf (asm_out_file, "\tjmp\t"); } + assemble_name (asm_out_file, thunk_name); + putc ('\n', asm_out_file); } else output_indirect_thunk (need_prefix, INVALID_REGNUM); @@ -29046,7 +29022,7 @@ ix86_output_indirect_function_return (rtx ret_op) indirect_return_via_cx_bnd = true; indirect_thunks_bnd_used |= 1 << CX_REG; } - fprintf (asm_out_file, "\tbnd jmp\t%s\n", thunk_name); + fprintf (asm_out_file, "\tbnd jmp\t"); } else { @@ -29055,8 +29031,10 @@ ix86_output_indirect_function_return (rtx ret_op) indirect_return_via_cx = true; indirect_thunks_used |= 1 << CX_REG; } - fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name); + fprintf (asm_out_file, "\tjmp\t"); } + assemble_name (asm_out_file, thunk_name); + putc ('\n', asm_out_file); } else output_indirect_thunk (need_prefix, regno); @@ -29985,6 +29963,10 @@ ix86_warn_parameter_passing_abi (cumulative_args_t cum_v, tree type) if (!TYPE_EMPTY_P (type)) return; + /* Don't warn if the function isn't visible outside of the TU. */ + if (cum->decl && !TREE_PUBLIC (cum->decl)) + return; + const_tree ctx = get_ultimate_context (cum->decl); if (ctx != NULL_TREE && !TRANSLATION_UNIT_WARN_EMPTY_P (ctx)) @@ -32861,6 +32843,7 @@ make_resolver_func (const tree default_decl, } /* Build result decl and add to function_decl. */ t = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, ptr_type_node); + DECL_CONTEXT (t) = decl; DECL_ARTIFICIAL (t) = 1; DECL_IGNORED_P (t) = 1; DECL_RESULT (decl) = t; @@ -37381,6 +37364,16 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget, unsigned char lsb_index = INTVAL (op1) & 0xFF; op1 = GEN_INT (length); op2 = GEN_INT (lsb_index); + + mode1 = insn_data[icode].operand[1].mode; + if (!insn_data[icode].operand[1].predicate (op0, mode1)) + op0 = copy_to_mode_reg (mode1, op0); + + mode0 = insn_data[icode].operand[0].mode; + if (target == 0 + || !register_operand (target, mode0)) + target = gen_reg_rtx (mode0); + pat = GEN_FCN (icode) (target, op0, op1, op2); if (pat) emit_insn (pat); @@ -39569,7 +39562,7 @@ ix86_vectorize_builtin_scatter (const_tree vectype, static bool use_rsqrt_p () { - return (TARGET_SSE_MATH + return (TARGET_SSE && TARGET_SSE_MATH && flag_finite_math_only && !flag_trapping_math && flag_unsafe_math_optimizations); @@ -41972,6 +41965,10 @@ x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED) { const char *mcount_name = (flag_fentry ? MCOUNT_NAME_BEFORE_PROLOGUE : MCOUNT_NAME); + + if (cfun->machine->endbr_queued_at_entrance) + fprintf (file, "\t%s\n", TARGET_64BIT ? "endbr64" : "endbr32"); + if (TARGET_64BIT) { #ifndef NO_PROFILE_COUNTERS @@ -45629,8 +45626,10 @@ ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor) x2 -= 1; Compensate. Ceil: if (x2 < x) - x2 -= -1; - return x2; + x2 += 1; + if (HONOR_SIGNED_ZEROS (mode)) + x2 = copysign (x2, x); + return x2; */ machine_mode mode = GET_MODE (operand0); rtx xa, TWO52, tmp, one, res, mask; @@ -45656,17 +45655,16 @@ ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor) /* xa = copysign (xa, operand1) */ ix86_sse_copysign_to_positive (xa, xa, res, mask); - /* generate 1.0 or -1.0 */ - one = force_reg (mode, - const_double_from_real_value (do_floor - ? dconst1 : dconstm1, mode)); + /* generate 1.0 */ + one = force_reg (mode, const_double_from_real_value (dconst1, mode)); /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */ tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor); emit_insn (gen_rtx_SET (tmp, gen_rtx_AND (mode, one, tmp))); - /* We always need to subtract here to preserve signed zero. */ - tmp = expand_simple_binop (mode, MINUS, + tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS, xa, tmp, NULL_RTX, 0, OPTAB_DIRECT); + if (!do_floor && HONOR_SIGNED_ZEROS (mode)) + ix86_sse_copysign_to_positive (tmp, tmp, res, mask); emit_move_insn (res, tmp); emit_label (label); @@ -46303,7 +46301,8 @@ static bool expand_vec_perm_blend (struct expand_vec_perm_d *d) { machine_mode mmode, vmode = d->vmode; - unsigned i, mask, nelt = d->nelt; + unsigned i, nelt = d->nelt; + unsigned HOST_WIDE_INT mask; rtx target, op0, op1, maskop, x; rtx rperm[32], vperm; @@ -46357,7 +46356,7 @@ expand_vec_perm_blend (struct expand_vec_perm_d *d) case E_V16SImode: case E_V8DImode: for (i = 0; i < nelt; ++i) - mask |= (d->perm[i] >= nelt) << i; + mask |= ((unsigned HOST_WIDE_INT) (d->perm[i] >= nelt)) << i; break; case E_V2DImode: @@ -50678,7 +50677,9 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node, case E_DFmode: /* case E_SCmode: */ /* case E_DCmode: */ - break; + if (!AGGREGATE_TYPE_P (ret_type)) + break; + /* FALLTHRU */ default: warning_at (DECL_SOURCE_LOCATION (node->decl), 0, "unsupported return type %qT for simd", ret_type); @@ -50687,25 +50688,34 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node, tree t; int i; + tree type_arg_types = TYPE_ARG_TYPES (TREE_TYPE (node->decl)); + bool decl_arg_p = (node->definition || type_arg_types == NULL_TREE); - for (t = DECL_ARGUMENTS (node->decl), i = 0; t; t = DECL_CHAIN (t), i++) - /* FIXME: Shouldn't we allow such arguments if they are uniform? */ - switch (TYPE_MODE (TREE_TYPE (t))) - { - case E_QImode: - case E_HImode: - case E_SImode: - case E_DImode: - case E_SFmode: - case E_DFmode: - /* case E_SCmode: */ - /* case E_DCmode: */ - break; - default: - warning_at (DECL_SOURCE_LOCATION (node->decl), 0, - "unsupported argument type %qT for simd", TREE_TYPE (t)); - return 0; - } + for (t = (decl_arg_p ? DECL_ARGUMENTS (node->decl) : type_arg_types), i = 0; + t && t != void_list_node; t = TREE_CHAIN (t), i++) + { + tree arg_type = decl_arg_p ? TREE_TYPE (t) : TREE_VALUE (t); + switch (TYPE_MODE (arg_type)) + { + case E_QImode: + case E_HImode: + case E_SImode: + case E_DImode: + case E_SFmode: + case E_DFmode: + /* case E_SCmode: */ + /* case E_DCmode: */ + if (!AGGREGATE_TYPE_P (arg_type)) + break; + /* FALLTHRU */ + default: + if (clonei->args[i].arg_type == SIMD_CLONE_ARG_TYPE_UNIFORM) + break; + warning_at (DECL_SOURCE_LOCATION (node->decl), 0, + "unsupported argument type %qT for simd", arg_type); + return 0; + } + } if (!TREE_PUBLIC (node->decl)) { @@ -50912,7 +50922,7 @@ ix86_float_exceptions_rounding_supported_p (void) there is no adddf3 pattern (since x87 floating point only has XFmode operations) so the default hook implementation gets this wrong. */ - return TARGET_80387 || TARGET_SSE_MATH; + return TARGET_80387 || (TARGET_SSE && TARGET_SSE_MATH); } /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV. */ @@ -50920,7 +50930,7 @@ ix86_float_exceptions_rounding_supported_p (void) static void ix86_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update) { - if (!TARGET_80387 && !TARGET_SSE_MATH) + if (!TARGET_80387 && !(TARGET_SSE && TARGET_SSE_MATH)) return; tree exceptions_var = create_tmp_var_raw (integer_type_node); if (TARGET_80387) @@ -50955,7 +50965,7 @@ ix86_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update) tree update_fldenv = build_call_expr (fldenv, 1, fenv_addr); *update = build2 (COMPOUND_EXPR, void_type_node, *update, update_fldenv); } - if (TARGET_SSE_MATH) + if (TARGET_SSE && TARGET_SSE_MATH) { tree mxcsr_orig_var = create_tmp_var_raw (unsigned_type_node); tree mxcsr_mod_var = create_tmp_var_raw (unsigned_type_node); @@ -51280,9 +51290,7 @@ ix86_expand_divmod_libfunc (rtx libfunc, machine_mode mode, rtx rem = assign_386_stack_local (mode, SLOT_TEMP); rtx quot = emit_library_call_value (libfunc, NULL_RTX, LCT_NORMAL, - mode, - op0, GET_MODE (op0), - op1, GET_MODE (op1), + mode, op0, mode, op1, mode, XEXP (rem, 0), Pmode); *quot_p = quot; *rem_p = rem; @@ -51314,7 +51322,7 @@ ix86_excess_precision (enum excess_precision_type type) return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT; else if (!TARGET_MIX_SSE_I387) { - if (!TARGET_SSE_MATH) + if (!(TARGET_SSE && TARGET_SSE_MATH)) return FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE; else if (TARGET_SSE2) return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT; diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 795ad2a322b..59357e07a07 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -621,7 +621,7 @@ extern tree x86_mfence; /* Replace MACH-O, ifdefs by in-line tests, where possible. (a) Macros defined in config/i386/darwin.h */ #define TARGET_MACHO 0 -#define TARGET_MACHO_BRANCH_ISLANDS 0 +#define TARGET_MACHO_SYMBOL_STUBS 0 #define MACHOPIC_ATT_STUB 0 /* (b) Macros defined in config/darwin.h */ #define MACHO_DYNAMIC_NO_PIC_P 0 @@ -790,8 +790,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); #define PARM_BOUNDARY BITS_PER_WORD /* Boundary (in *bits*) on which stack pointer should be aligned. */ -#define STACK_BOUNDARY \ - (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) +#define STACK_BOUNDARY (TARGET_64BIT_MS_ABI ? 128 : BITS_PER_WORD) /* Stack boundary of the main function guaranteed by OS. */ #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32) @@ -1536,10 +1535,10 @@ enum reg_class #define FIRST_FLOAT_REG FIRST_STACK_REG #define STACK_TOP_P(X) (REG_P (X) && REGNO (X) == FIRST_FLOAT_REG) -#define SSE_REGNO(N) \ - ((N) < 8 ? FIRST_SSE_REG + (N) \ - : (N) <= LAST_REX_SSE_REG ? (FIRST_REX_SSE_REG + (N) - 8) \ - : (FIRST_EXT_REX_SSE_REG + (N) - 16)) +#define GET_SSE_REGNO(N) \ + ((N) < 8 ? FIRST_SSE_REG + (N) \ + : (N) < 16 ? FIRST_REX_SSE_REG + (N) - 8 \ + : FIRST_EXT_REX_SSE_REG + (N) - 16) /* The class value for index registers, and the one for base regs. */ @@ -2635,6 +2634,9 @@ struct GTY(()) machine_function { /* Nonzero if the function places outgoing arguments on stack. */ BOOL_BITFIELD outgoing_args_on_stack : 1; + /* If true, ENDBR is queued at function entrance. */ + BOOL_BITFIELD endbr_queued_at_entrance : 1; + /* The largest alignment, in bytes, of stack slot actually used. */ unsigned int max_used_stack_alignment; diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index db2b4d9bf13..2bb58236d88 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -8942,7 +8942,24 @@ [(parallel [(set (match_dup 0) (zero_extend:DI (and:SI (match_dup 1) (match_dup 2)))) (clobber (reg:CC FLAGS_REG))])] - "operands[2] = gen_lowpart (SImode, operands[2]);") +{ + if (GET_CODE (operands[2]) == SYMBOL_REF + || GET_CODE (operands[2]) == LABEL_REF) + { + operands[2] = shallow_copy_rtx (operands[2]); + PUT_MODE (operands[2], SImode); + } + else if (GET_CODE (operands[2]) == CONST) + { + /* (const:DI (plus:DI (symbol_ref:DI ("...")) (const_int N))) */ + operands[2] = copy_rtx (operands[2]); + PUT_MODE (operands[2], SImode); + PUT_MODE (XEXP (operands[2], 0), SImode); + PUT_MODE (XEXP (XEXP (operands[2], 0), 0), SImode); + } + else + operands[2] = gen_lowpart (SImode, operands[2]); +}) ;; See comment for addsi_1_zext why we do use nonimmediate_operand (define_insn "*andsi_1_zext" @@ -13345,7 +13362,10 @@ stack address we wish to restore. */ tmp = gen_rtx_PLUS (Pmode, arg_pointer_rtx, sa); tmp = plus_constant (Pmode, tmp, -UNITS_PER_WORD); - tmp = gen_rtx_MEM (Pmode, tmp); + /* Return address is always in word_mode. */ + tmp = gen_rtx_MEM (word_mode, tmp); + if (GET_MODE (ra) != word_mode) + ra = convert_to_mode (word_mode, ra, 1); emit_move_insn (tmp, ra); emit_jump_insn (gen_eh_return_internal ()); @@ -19771,7 +19791,7 @@ (define_expand "stack_protect_set" [(match_operand 0 "memory_operand") (match_operand 1 "memory_operand")] - "TARGET_SSP_TLS_GUARD" + "" { rtx (*insn)(rtx, rtx); @@ -19789,7 +19809,7 @@ UNSPEC_SP_SET)) (set (match_scratch:PTR 2 "=&r") (const_int 0)) (clobber (reg:CC FLAGS_REG))] - "TARGET_SSP_TLS_GUARD" + "" "mov{}\t{%1, %2|%2, %1}\;mov{}\t{%2, %0|%0, %2}\;xor{l}\t%k2, %k2" [(set_attr "type" "multi")]) @@ -19797,7 +19817,7 @@ [(match_operand 0 "memory_operand") (match_operand 1 "memory_operand") (match_operand 2)] - "TARGET_SSP_TLS_GUARD" + "" { rtx flags = gen_rtx_REG (CCZmode, FLAGS_REG); @@ -19820,7 +19840,7 @@ (match_operand:PTR 2 "memory_operand" "m")] UNSPEC_SP_TEST)) (clobber (match_scratch:PTR 3 "=&r"))] - "TARGET_SSP_TLS_GUARD" + "" "mov{}\t{%1, %3|%3, %1}\;xor{}\t{%2, %3|%3, %2}" [(set_attr "type" "multi")]) diff --git a/gcc/config/i386/intelmic-mkoffload.c b/gcc/config/i386/intelmic-mkoffload.c index b8f116446e6..008968e3e37 100644 --- a/gcc/config/i386/intelmic-mkoffload.c +++ b/gcc/config/i386/intelmic-mkoffload.c @@ -453,8 +453,6 @@ prepare_target_image (const char *target_compiler, int argc, char **argv) if (verbose) obstack_ptr_grow (&argv_obstack, "-v"); obstack_ptr_grow (&argv_obstack, "-xlto"); - obstack_ptr_grow (&argv_obstack, "-shared"); - obstack_ptr_grow (&argv_obstack, "-fPIC"); obstack_ptr_grow (&argv_obstack, opt1); for (int i = 1; i < argc; i++) { @@ -466,6 +464,9 @@ prepare_target_image (const char *target_compiler, int argc, char **argv) if (!out_obj_filename) fatal_error (input_location, "output file not specified"); obstack_ptr_grow (&argv_obstack, opt2); + /* NB: Put -fPIC and -shared the last to create shared library. */ + obstack_ptr_grow (&argv_obstack, "-fPIC"); + obstack_ptr_grow (&argv_obstack, "-shared"); obstack_ptr_grow (&argv_obstack, "-o"); obstack_ptr_grow (&argv_obstack, target_so_filename); compile_for_target (&argv_obstack); diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index f6cdc86fc5f..211f7eea402 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -182,7 +182,7 @@ rtx op1 = XEXP (XEXP (op, 0), 0); rtx op2 = XEXP (XEXP (op, 0), 1); - if (ix86_cmodel == CM_LARGE) + if (ix86_cmodel == CM_LARGE && GET_CODE (op1) != UNSPEC) return false; if (!CONST_INT_P (op2)) return false; @@ -1517,7 +1517,7 @@ if (GET_CODE (elt) != SET || GET_CODE (SET_DEST (elt)) != REG || GET_MODE (SET_DEST (elt)) != V8SImode - || REGNO (SET_DEST (elt)) != SSE_REGNO (i) + || REGNO (SET_DEST (elt)) != GET_SSE_REGNO (i) || SET_SRC (elt) != CONST0_RTX (V8SImode)) return false; } diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 14df4b3e331..5c6d2948d65 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -21,6 +21,9 @@ ;; SSE UNSPEC_MOVNT + ;; SSE2 + UNSPEC_MOVDI_TO_SSE + ;; SSE3 UNSPEC_LDDQU @@ -1224,10 +1227,10 @@ ;; from there. (define_insn_and_split "movdi_to_sse" - [(parallel - [(set (match_operand:V4SI 0 "register_operand" "=?x,x") - (subreg:V4SI (match_operand:DI 1 "nonimmediate_operand" "r,m") 0)) - (clobber (match_scratch:V4SI 2 "=&x,X"))])] + [(set (match_operand:V4SI 0 "register_operand" "=?x,x") + (unspec:V4SI [(match_operand:DI 1 "nonimmediate_operand" "r,m")] + UNSPEC_MOVDI_TO_SSE)) + (clobber (match_scratch:V4SI 2 "=&x,X"))] "!TARGET_64BIT && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC" "#" "&& reload_completed" @@ -1905,7 +1908,7 @@ [(set (match_operand:VF1_128_256 0 "register_operand") (unspec:VF1_128_256 [(match_operand:VF1_128_256 1 "vector_operand")] UNSPEC_RSQRT))] - "TARGET_SSE_MATH" + "TARGET_SSE && TARGET_SSE_MATH" { ix86_emit_swsqrtsf (operands[0], operands[1], mode, true); DONE; @@ -4717,37 +4720,49 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define_insn "sse2_cvtpi2pd" - [(set (match_operand:V2DF 0 "register_operand" "=x,x") - (float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "y,m")))] + [(set (match_operand:V2DF 0 "register_operand" "=v,x") + (float:V2DF (match_operand:V2SI 1 "nonimmediate_operand" "vBm,?!y")))] "TARGET_SSE2" - "cvtpi2pd\t{%1, %0|%0, %1}" + "@ + %vcvtdq2pd\t{%1, %0|%0, %1} + cvtpi2pd\t{%1, %0|%0, %1}" [(set_attr "type" "ssecvt") - (set_attr "unit" "mmx,*") - (set_attr "prefix_data16" "1,*") + (set_attr "unit" "*,mmx") + (set_attr "prefix_data16" "*,1") + (set_attr "prefix" "maybe_vex,*") (set_attr "mode" "V2DF")]) (define_insn "sse2_cvtpd2pi" - [(set (match_operand:V2SI 0 "register_operand" "=y") - (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "xm")] + [(set (match_operand:V2SI 0 "register_operand" "=v,?!y") + (unspec:V2SI [(match_operand:V2DF 1 "nonimmediate_operand" "vBm,xm")] UNSPEC_FIX_NOTRUNC))] "TARGET_SSE2" - "cvtpd2pi\t{%1, %0|%0, %1}" + "@ + * return TARGET_AVX ? \"vcvtpd2dq{x}\t{%1, %0|%0, %1}\" : \"cvtpd2dq\t{%1, %0|%0, %1}\"; + cvtpd2pi\t{%1, %0|%0, %1}" [(set_attr "type" "ssecvt") - (set_attr "unit" "mmx") + (set_attr "unit" "*,mmx") + (set_attr "amdfam10_decode" "double") + (set_attr "athlon_decode" "vector") (set_attr "bdver1_decode" "double") - (set_attr "btver2_decode" "direct") - (set_attr "prefix_data16" "1") - (set_attr "mode" "DI")]) + (set_attr "prefix_data16" "*,1") + (set_attr "prefix" "maybe_vex,*") + (set_attr "mode" "TI")]) (define_insn "sse2_cvttpd2pi" - [(set (match_operand:V2SI 0 "register_operand" "=y") - (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "xm")))] + [(set (match_operand:V2SI 0 "register_operand" "=v,?!y") + (fix:V2SI (match_operand:V2DF 1 "nonimmediate_operand" "vBm,xm")))] "TARGET_SSE2" - "cvttpd2pi\t{%1, %0|%0, %1}" + "@ + * return TARGET_AVX ? \"vcvttpd2dq{x}\t{%1, %0|%0, %1}\" : \"cvttpd2dq\t{%1, %0|%0, %1}\"; + cvttpd2pi\t{%1, %0|%0, %1}" [(set_attr "type" "ssecvt") - (set_attr "unit" "mmx") + (set_attr "unit" "*,mmx") + (set_attr "amdfam10_decode" "double") + (set_attr "athlon_decode" "vector") (set_attr "bdver1_decode" "double") - (set_attr "prefix_data16" "1") + (set_attr "prefix_data16" "*,1") + (set_attr "prefix" "maybe_vex,*") (set_attr "mode" "TI")]) (define_insn "sse2_cvtsi2sd" @@ -12851,13 +12866,15 @@ (vec_concat: (match_operand:VI8F_256 1 "register_operand" "v") (match_operand:VI8F_256 2 "nonimmediate_operand" "vm")) - (parallel [(match_operand 3 "const_0_to_3_operand") - (match_operand 4 "const_0_to_3_operand") - (match_operand 5 "const_4_to_7_operand") - (match_operand 6 "const_4_to_7_operand")])))] + (parallel [(match_operand 3 "const_0_to_3_operand") + (match_operand 4 "const_0_to_3_operand") + (match_operand 5 "const_4_to_7_operand") + (match_operand 6 "const_4_to_7_operand")])))] "TARGET_AVX512VL - && (INTVAL (operands[3]) == (INTVAL (operands[4]) - 1) - && INTVAL (operands[5]) == (INTVAL (operands[6]) - 1))" + && (INTVAL (operands[3]) & 1) == 0 + && INTVAL (operands[3]) == INTVAL (operands[4]) - 1 + && (INTVAL (operands[5]) & 1) == 0 + && INTVAL (operands[5]) == INTVAL (operands[6]) - 1" { int mask; mask = INTVAL (operands[3]) / 2; @@ -12900,19 +12917,23 @@ (vec_concat: (match_operand:V8FI 1 "register_operand" "v") (match_operand:V8FI 2 "nonimmediate_operand" "vm")) - (parallel [(match_operand 3 "const_0_to_7_operand") - (match_operand 4 "const_0_to_7_operand") - (match_operand 5 "const_0_to_7_operand") - (match_operand 6 "const_0_to_7_operand") - (match_operand 7 "const_8_to_15_operand") - (match_operand 8 "const_8_to_15_operand") - (match_operand 9 "const_8_to_15_operand") - (match_operand 10 "const_8_to_15_operand")])))] + (parallel [(match_operand 3 "const_0_to_7_operand") + (match_operand 4 "const_0_to_7_operand") + (match_operand 5 "const_0_to_7_operand") + (match_operand 6 "const_0_to_7_operand") + (match_operand 7 "const_8_to_15_operand") + (match_operand 8 "const_8_to_15_operand") + (match_operand 9 "const_8_to_15_operand") + (match_operand 10 "const_8_to_15_operand")])))] "TARGET_AVX512F - && (INTVAL (operands[3]) == (INTVAL (operands[4]) - 1) - && INTVAL (operands[5]) == (INTVAL (operands[6]) - 1) - && INTVAL (operands[7]) == (INTVAL (operands[8]) - 1) - && INTVAL (operands[9]) == (INTVAL (operands[10]) - 1))" + && (INTVAL (operands[3]) & 1) == 0 + && INTVAL (operands[3]) == INTVAL (operands[4]) - 1 + && (INTVAL (operands[5]) & 1) == 0 + && INTVAL (operands[5]) == INTVAL (operands[6]) - 1 + && (INTVAL (operands[7]) & 1) == 0 + && INTVAL (operands[7]) == INTVAL (operands[8]) - 1 + && (INTVAL (operands[9]) & 1) == 0 + && INTVAL (operands[9]) == INTVAL (operands[10]) - 1" { int mask; mask = INTVAL (operands[3]) / 2; @@ -12958,21 +12979,23 @@ (vec_concat: (match_operand:VI4F_256 1 "register_operand" "v") (match_operand:VI4F_256 2 "nonimmediate_operand" "vm")) - (parallel [(match_operand 3 "const_0_to_7_operand") - (match_operand 4 "const_0_to_7_operand") - (match_operand 5 "const_0_to_7_operand") - (match_operand 6 "const_0_to_7_operand") - (match_operand 7 "const_8_to_15_operand") - (match_operand 8 "const_8_to_15_operand") - (match_operand 9 "const_8_to_15_operand") + (parallel [(match_operand 3 "const_0_to_7_operand") + (match_operand 4 "const_0_to_7_operand") + (match_operand 5 "const_0_to_7_operand") + (match_operand 6 "const_0_to_7_operand") + (match_operand 7 "const_8_to_15_operand") + (match_operand 8 "const_8_to_15_operand") + (match_operand 9 "const_8_to_15_operand") (match_operand 10 "const_8_to_15_operand")])))] "TARGET_AVX512VL - && (INTVAL (operands[3]) == (INTVAL (operands[4]) - 1) - && INTVAL (operands[3]) == (INTVAL (operands[5]) - 2) - && INTVAL (operands[3]) == (INTVAL (operands[6]) - 3) - && INTVAL (operands[7]) == (INTVAL (operands[8]) - 1) - && INTVAL (operands[7]) == (INTVAL (operands[9]) - 2) - && INTVAL (operands[7]) == (INTVAL (operands[10]) - 3))" + && (INTVAL (operands[3]) & 3) == 0 + && INTVAL (operands[3]) == INTVAL (operands[4]) - 1 + && INTVAL (operands[3]) == INTVAL (operands[5]) - 2 + && INTVAL (operands[3]) == INTVAL (operands[6]) - 3 + && (INTVAL (operands[7]) & 3) == 0 + && INTVAL (operands[7]) == INTVAL (operands[8]) - 1 + && INTVAL (operands[7]) == INTVAL (operands[9]) - 2 + && INTVAL (operands[7]) == INTVAL (operands[10]) - 3" { int mask; mask = INTVAL (operands[3]) / 4; @@ -13024,35 +13047,39 @@ (vec_concat: (match_operand:V16FI 1 "register_operand" "v") (match_operand:V16FI 2 "nonimmediate_operand" "vm")) - (parallel [(match_operand 3 "const_0_to_15_operand") - (match_operand 4 "const_0_to_15_operand") - (match_operand 5 "const_0_to_15_operand") - (match_operand 6 "const_0_to_15_operand") - (match_operand 7 "const_0_to_15_operand") - (match_operand 8 "const_0_to_15_operand") - (match_operand 9 "const_0_to_15_operand") - (match_operand 10 "const_0_to_15_operand") - (match_operand 11 "const_16_to_31_operand") - (match_operand 12 "const_16_to_31_operand") - (match_operand 13 "const_16_to_31_operand") - (match_operand 14 "const_16_to_31_operand") - (match_operand 15 "const_16_to_31_operand") - (match_operand 16 "const_16_to_31_operand") - (match_operand 17 "const_16_to_31_operand") - (match_operand 18 "const_16_to_31_operand")])))] + (parallel [(match_operand 3 "const_0_to_15_operand") + (match_operand 4 "const_0_to_15_operand") + (match_operand 5 "const_0_to_15_operand") + (match_operand 6 "const_0_to_15_operand") + (match_operand 7 "const_0_to_15_operand") + (match_operand 8 "const_0_to_15_operand") + (match_operand 9 "const_0_to_15_operand") + (match_operand 10 "const_0_to_15_operand") + (match_operand 11 "const_16_to_31_operand") + (match_operand 12 "const_16_to_31_operand") + (match_operand 13 "const_16_to_31_operand") + (match_operand 14 "const_16_to_31_operand") + (match_operand 15 "const_16_to_31_operand") + (match_operand 16 "const_16_to_31_operand") + (match_operand 17 "const_16_to_31_operand") + (match_operand 18 "const_16_to_31_operand")])))] "TARGET_AVX512F - && (INTVAL (operands[3]) == (INTVAL (operands[4]) - 1) - && INTVAL (operands[3]) == (INTVAL (operands[5]) - 2) - && INTVAL (operands[3]) == (INTVAL (operands[6]) - 3) - && INTVAL (operands[7]) == (INTVAL (operands[8]) - 1) - && INTVAL (operands[7]) == (INTVAL (operands[9]) - 2) - && INTVAL (operands[7]) == (INTVAL (operands[10]) - 3) - && INTVAL (operands[11]) == (INTVAL (operands[12]) - 1) - && INTVAL (operands[11]) == (INTVAL (operands[13]) - 2) - && INTVAL (operands[11]) == (INTVAL (operands[14]) - 3) - && INTVAL (operands[15]) == (INTVAL (operands[16]) - 1) - && INTVAL (operands[15]) == (INTVAL (operands[17]) - 2) - && INTVAL (operands[15]) == (INTVAL (operands[18]) - 3))" + && (INTVAL (operands[3]) & 3) == 0 + && INTVAL (operands[3]) == INTVAL (operands[4]) - 1 + && INTVAL (operands[3]) == INTVAL (operands[5]) - 2 + && INTVAL (operands[3]) == INTVAL (operands[6]) - 3 + && (INTVAL (operands[7]) & 3) == 0 + && INTVAL (operands[7]) == INTVAL (operands[8]) - 1 + && INTVAL (operands[7]) == INTVAL (operands[9]) - 2 + && INTVAL (operands[7]) == INTVAL (operands[10]) - 3 + && (INTVAL (operands[11]) & 3) == 0 + && INTVAL (operands[11]) == INTVAL (operands[12]) - 1 + && INTVAL (operands[11]) == INTVAL (operands[13]) - 2 + && INTVAL (operands[11]) == INTVAL (operands[14]) - 3 + && (INTVAL (operands[15]) & 3) == 0 + && INTVAL (operands[15]) == INTVAL (operands[16]) - 1 + && INTVAL (operands[15]) == INTVAL (operands[17]) - 2 + && INTVAL (operands[15]) == INTVAL (operands[18]) - 3" { int mask; mask = INTVAL (operands[3]) / 4; @@ -15145,7 +15172,7 @@ } }) -(define_insn "abs2" +(define_insn "ssse3_abs2" [(set (match_operand:MMXMODEI 0 "register_operand" "=y") (abs:MMXMODEI (match_operand:MMXMODEI 1 "nonimmediate_operand" "ym")))] @@ -16242,9 +16269,11 @@ switch (INTVAL (operands[4])) { case 3: - return "vgatherpf0ps\t{%5%{%0%}|%5%{%0%}}"; + /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as + gas changed what it requires incompatibly. */ + return "%M2vgatherpf0ps\t{%5%{%0%}|%X5%{%0%}}"; case 2: - return "vgatherpf1ps\t{%5%{%0%}|%5%{%0%}}"; + return "%M2vgatherpf1ps\t{%5%{%0%}|%X5%{%0%}}"; default: gcc_unreachable (); } @@ -16287,9 +16316,11 @@ switch (INTVAL (operands[4])) { case 3: - return "vgatherpf0pd\t{%5%{%0%}|%5%{%0%}}"; + /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as + gas changed what it requires incompatibly. */ + return "%M2vgatherpf0pd\t{%5%{%0%}|%X5%{%0%}}"; case 2: - return "vgatherpf1pd\t{%5%{%0%}|%5%{%0%}}"; + return "%M2vgatherpf1pd\t{%5%{%0%}|%X5%{%0%}}"; default: gcc_unreachable (); } @@ -16333,10 +16364,12 @@ { case 3: case 7: - return "vscatterpf0ps\t{%5%{%0%}|%5%{%0%}}"; + /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as + gas changed what it requires incompatibly. */ + return "%M2vscatterpf0ps\t{%5%{%0%}|%X5%{%0%}}"; case 2: case 6: - return "vscatterpf1ps\t{%5%{%0%}|%5%{%0%}}"; + return "%M2vscatterpf1ps\t{%5%{%0%}|%X5%{%0%}}"; default: gcc_unreachable (); } @@ -16380,10 +16413,12 @@ { case 3: case 7: - return "vscatterpf0pd\t{%5%{%0%}|%5%{%0%}}"; + /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as + gas changed what it requires incompatibly. */ + return "%M2vscatterpf0pd\t{%5%{%0%}|%X5%{%0%}}"; case 2: case 6: - return "vscatterpf1pd\t{%5%{%0%}|%5%{%0%}}"; + return "%M2vscatterpf1pd\t{%5%{%0%}|%X5%{%0%}}"; default: gcc_unreachable (); } @@ -17475,7 +17510,7 @@ for (regno = 0; regno < nregs; regno++) XVECEXP (operands[0], 0, regno + 1) - = gen_rtx_SET (gen_rtx_REG (V8SImode, SSE_REGNO (regno)), + = gen_rtx_SET (gen_rtx_REG (V8SImode, GET_SSE_REGNO (regno)), CONST0_RTX (V8SImode)); }) @@ -19122,7 +19157,7 @@ UNSPEC_GATHER)) (clobber (match_scratch:VEC_GATHER_MODE 1 "=&x"))] "TARGET_AVX2" - "vgatherd\t{%1, %7, %0|%0, %7, %1}" + "%M3vgatherd\t{%1, %7, %0|%0, %7, %1}" [(set_attr "type" "ssemov") (set_attr "prefix" "vex") (set_attr "mode" "")]) @@ -19142,7 +19177,7 @@ UNSPEC_GATHER)) (clobber (match_scratch:VEC_GATHER_MODE 1 "=&x"))] "TARGET_AVX2" - "vgatherd\t{%1, %6, %0|%0, %6, %1}" + "%M2vgatherd\t{%1, %6, %0|%0, %6, %1}" [(set_attr "type" "ssemov") (set_attr "prefix" "vex") (set_attr "mode" "")]) @@ -19183,7 +19218,7 @@ UNSPEC_GATHER)) (clobber (match_scratch:VEC_GATHER_MODE 1 "=&x"))] "TARGET_AVX2" - "vgatherq\t{%5, %7, %2|%2, %7, %5}" + "%M3vgatherq\t{%5, %7, %2|%2, %7, %5}" [(set_attr "type" "ssemov") (set_attr "prefix" "vex") (set_attr "mode" "")]) @@ -19205,8 +19240,8 @@ "TARGET_AVX2" { if (mode != mode) - return "vgatherq\t{%4, %6, %x0|%x0, %6, %4}"; - return "vgatherq\t{%4, %6, %0|%0, %6, %4}"; + return "%M2vgatherq\t{%4, %6, %x0|%x0, %6, %4}"; + return "%M2vgatherq\t{%4, %6, %0|%0, %6, %4}"; } [(set_attr "type" "ssemov") (set_attr "prefix" "vex") @@ -19230,7 +19265,7 @@ (const_int 2) (const_int 3)]))) (clobber (match_scratch:VI4F_256 1 "=&x"))] "TARGET_AVX2" - "vgatherq\t{%5, %7, %0|%0, %7, %5}" + "%M3vgatherq\t{%5, %7, %0|%0, %7, %5}" [(set_attr "type" "ssemov") (set_attr "prefix" "vex") (set_attr "mode" "")]) @@ -19253,17 +19288,11 @@ (const_int 2) (const_int 3)]))) (clobber (match_scratch:VI4F_256 1 "=&x"))] "TARGET_AVX2" - "vgatherq\t{%4, %6, %0|%0, %6, %4}" + "%M2vgatherq\t{%4, %6, %0|%0, %6, %4}" [(set_attr "type" "ssemov") (set_attr "prefix" "vex") (set_attr "mode" "")]) -;; Memory operand override for -masm=intel of the v*gatherq* patterns. -(define_mode_attr gatherq_mode - [(V4SI "q") (V2DI "x") (V4SF "q") (V2DF "x") - (V8SI "x") (V4DI "t") (V8SF "x") (V4DF "t") - (V16SI "t") (V8DI "g") (V16SF "t") (V8DF "g")]) - (define_expand "_gathersi" [(parallel [(set (match_operand:VI48F 0 "register_operand") (unspec:VI48F @@ -19297,7 +19326,9 @@ UNSPEC_GATHER)) (clobber (match_scratch: 2 "=&Yk"))] "TARGET_AVX512F" - "vgatherd\t{%6, %0%{%2%}|%0%{%2%}, %6}" +;; %X6 so that we don't emit any *WORD PTR for -masm=intel, as +;; gas changed what it requires incompatibly. + "%M4vgatherd\t{%6, %0%{%2%}|%0%{%2%}, %X6}" [(set_attr "type" "ssemov") (set_attr "prefix" "evex") (set_attr "mode" "")]) @@ -19316,7 +19347,9 @@ UNSPEC_GATHER)) (clobber (match_scratch: 1 "=&Yk"))] "TARGET_AVX512F" - "vgatherd\t{%5, %0%{%1%}|%0%{%1%}, %5}" +;; %X5 so that we don't emit any *WORD PTR for -masm=intel, as +;; gas changed what it requires incompatibly. + "%M3vgatherd\t{%5, %0%{%1%}|%0%{%1%}, %X5}" [(set_attr "type" "ssemov") (set_attr "prefix" "evex") (set_attr "mode" "")]) @@ -19355,9 +19388,9 @@ UNSPEC_GATHER)) (clobber (match_scratch:QI 2 "=&Yk"))] "TARGET_AVX512F" -{ - return "vgatherq\t{%6, %1%{%2%}|%1%{%2%}, %6}"; -} +;; %X6 so that we don't emit any *WORD PTR for -masm=intel, as +;; gas changed what it requires incompatibly. + "%M4vgatherq\t{%6, %1%{%2%}|%1%{%2%}, %X6}" [(set_attr "type" "ssemov") (set_attr "prefix" "evex") (set_attr "mode" "")]) @@ -19377,14 +19410,16 @@ (clobber (match_scratch:QI 1 "=&Yk"))] "TARGET_AVX512F" { + /* %X5 so that we don't emit any *WORD PTR for -masm=intel, as + gas changed what it requires incompatibly. */ if (mode != mode) { if ( != 64) - return "vgatherq\t{%5, %x0%{%1%}|%x0%{%1%}, %5}"; + return "%M3vgatherq\t{%5, %x0%{%1%}|%x0%{%1%}, %X5}"; else - return "vgatherq\t{%5, %t0%{%1%}|%t0%{%1%}, %t5}"; + return "%M3vgatherq\t{%5, %t0%{%1%}|%t0%{%1%}, %X5}"; } - return "vgatherq\t{%5, %0%{%1%}|%0%{%1%}, %5}"; + return "%M3vgatherq\t{%5, %0%{%1%}|%0%{%1%}, %X5}"; } [(set_attr "type" "ssemov") (set_attr "prefix" "evex") @@ -19421,7 +19456,9 @@ UNSPEC_SCATTER)) (clobber (match_scratch: 1 "=&Yk"))] "TARGET_AVX512F" - "vscatterd\t{%3, %5%{%1%}|%5%{%1%}, %3}" +;; %X5 so that we don't emit any *WORD PTR for -masm=intel, as +;; gas changed what it requires incompatibly. + "%M0vscatterd\t{%3, %5%{%1%}|%X5%{%1%}, %3}" [(set_attr "type" "ssemov") (set_attr "prefix" "evex") (set_attr "mode" "")]) @@ -19457,11 +19494,9 @@ UNSPEC_SCATTER)) (clobber (match_scratch:QI 1 "=&Yk"))] "TARGET_AVX512F" -{ - if (GET_MODE_SIZE (GET_MODE_INNER (mode)) == 8) - return "vscatterq\t{%3, %5%{%1%}|%5%{%1%}, %3}"; - return "vscatterq\t{%3, %5%{%1%}|%t5%{%1%}, %3}"; -} +;; %X5 so that we don't emit any *WORD PTR for -masm=intel, as +;; gas changed what it requires incompatibly. + "%M0vscatterq\t{%3, %5%{%1%}|%X5%{%1%}, %3}" [(set_attr "type" "ssemov") (set_attr "prefix" "evex") (set_attr "mode" "")]) diff --git a/gcc/config/i386/t-darwin b/gcc/config/i386/t-darwin32-biarch similarity index 100% rename from gcc/config/i386/t-darwin rename to gcc/config/i386/t-darwin32-biarch diff --git a/gcc/config/i386/t-darwin64 b/gcc/config/i386/t-darwin64-biarch similarity index 100% rename from gcc/config/i386/t-darwin64 rename to gcc/config/i386/t-darwin64-biarch diff --git a/gcc/config/i386/t-freebsd64 b/gcc/config/i386/t-freebsd64 new file mode 100644 index 00000000000..0dd05d479ac --- /dev/null +++ b/gcc/config/i386/t-freebsd64 @@ -0,0 +1,30 @@ +# Copyright (C) 2019 Free Software Foundation, Inc. +# +# 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 32-bit libraries are found in /usr/lib32 + +# To support i386 and x86-64, the directory structrue +# should be: +# +# /lib has x86-64 libraries. +# /lib32 has i386 libraries. +# + +MULTILIB_OPTIONS = m32 +MULTILIB_DIRNAMES = 32 +MULTILIB_OSDIRNAMES = ../lib32 diff --git a/gcc/config/i386/vpclmulqdqintrin.h b/gcc/config/i386/vpclmulqdqintrin.h index c70c5039b50..3fafa425dc5 100644 --- a/gcc/config/i386/vpclmulqdqintrin.h +++ b/gcc/config/i386/vpclmulqdqintrin.h @@ -78,9 +78,9 @@ _mm_clmulepi64_epi128 (__m128i __A, __m128i __B, const int __C) #pragma GCC pop_options #endif /* __DISABLE_VPCLMULQDQVL__ */ -#if !defined(__VPCLMULQDQ__) || !defined(__AVX512VL__) +#if !defined(__VPCLMULQDQ__) || !defined(__AVX__) #pragma GCC push_options -#pragma GCC target("vpclmulqdq,avx512vl") +#pragma GCC target("vpclmulqdq,avx") #define __DISABLE_VPCLMULQDQ__ #endif /* __VPCLMULQDQ__ */ @@ -103,6 +103,4 @@ _mm256_clmulepi64_epi128 (__m256i __A, __m256i __B, const int __C) #pragma GCC pop_options #endif /* __DISABLE_VPCLMULQDQ__ */ - #endif /* _VPCLMULQDQINTRIN_H_INCLUDED */ - diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md index a28e3cd9d31..88335cdd4f2 100644 --- a/gcc/config/m68k/m68k.md +++ b/gcc/config/m68k/m68k.md @@ -3240,7 +3240,10 @@ (const_int 32)))) (clobber (match_operand:SI 1 "register_operand" "=d"))] "TARGET_68020 && !TUNE_68060 && !TARGET_COLDFIRE" - "mulu%.l %3,%0:%1") +{ + CC_STATUS_INIT; + return "mulu%.l %3,%0:%1"; +}) (define_insn "const_umulsi3_highpart" [(set (match_operand:SI 0 "register_operand" "=d") @@ -3251,7 +3254,10 @@ (const_int 32)))) (clobber (match_operand:SI 1 "register_operand" "=d"))] "TARGET_68020 && !TUNE_68060 && !TARGET_COLDFIRE" - "mulu%.l %3,%0:%1") +{ + CC_STATUS_INIT; + return "mulu%.l %3,%0:%1"; +}) (define_expand "smulsi3_highpart" [(parallel @@ -3283,7 +3289,10 @@ (const_int 32)))) (clobber (match_operand:SI 1 "register_operand" "=d"))] "TARGET_68020 && !TUNE_68060 && !TARGET_COLDFIRE" - "muls%.l %3,%0:%1") +{ + CC_STATUS_INIT; + return "muls%.l %3,%0:%1"; +}) (define_insn "const_smulsi3_highpart" [(set (match_operand:SI 0 "register_operand" "=d") @@ -3294,7 +3303,10 @@ (const_int 32)))) (clobber (match_operand:SI 1 "register_operand" "=d"))] "TARGET_68020 && !TUNE_68060 && !TARGET_COLDFIRE" - "muls%.l %3,%0:%1") +{ + CC_STATUS_INIT; + return "muls%.l %3,%0:%1"; +}) (define_expand "mul3" [(set (match_operand:FP 0 "nonimmediate_operand" "") diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index aabd4b1580f..e7d65ad7af0 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -9532,7 +9532,7 @@ mips_dwarf_frame_reg_mode (int regno) { machine_mode mode = default_dwarf_frame_reg_mode (regno); - if (FP_REG_P (regno) && mips_abi == ABI_32 && TARGET_FLOAT64) + if (FP_REG_P (regno) && mips_abi == ABI_32 && !TARGET_FLOAT32) mode = SImode; return mode; @@ -16788,6 +16788,19 @@ mips_expand_builtin_insn (enum insn_code icode, unsigned int nops, std::swap (ops[1], ops[2]); break; + case CODE_FOR_msa_maddv_b: + case CODE_FOR_msa_maddv_h: + case CODE_FOR_msa_maddv_w: + case CODE_FOR_msa_maddv_d: + case CODE_FOR_msa_fmadd_w: + case CODE_FOR_msa_fmadd_d: + case CODE_FOR_msa_fmsub_w: + case CODE_FOR_msa_fmsub_d: + /* fma(a, b, c) results into (a * b + c), however builtin_msa_fmadd expects + it to be (a + b * c). Swap the 1st and 3rd operands. */ + std::swap (ops[1], ops[3]); + break; + case CODE_FOR_msa_slli_b: case CODE_FOR_msa_slli_h: case CODE_FOR_msa_slli_w: diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 061e57db533..c3fe8d9ddfc 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -5772,8 +5772,8 @@ "ISA_HAS_ROR" { if (CONST_INT_P (operands[2])) - gcc_assert (INTVAL (operands[2]) >= 0 - && INTVAL (operands[2]) < GET_MODE_BITSIZE (mode)); + operands[2] = GEN_INT (INTVAL (operands[2]) + & (GET_MODE_BITSIZE (mode) - 1)); return "ror\t%0,%1,%2"; } @@ -7502,7 +7502,7 @@ ;; __builtin_mips_get_fcsr: move the FCSR into operand 0. (define_expand "mips_get_fcsr" [(set (match_operand:SI 0 "register_operand") - (unspec_volatile [(const_int 0)] UNSPEC_GET_FCSR))] + (unspec_volatile:SI [(const_int 0)] UNSPEC_GET_FCSR))] "TARGET_HARD_FLOAT_ABI" { if (TARGET_MIPS16) @@ -7514,7 +7514,7 @@ (define_insn "*mips_get_fcsr" [(set (match_operand:SI 0 "register_operand" "=d") - (unspec_volatile [(const_int 0)] UNSPEC_GET_FCSR))] + (unspec_volatile:SI [(const_int 0)] UNSPEC_GET_FCSR))] "TARGET_HARD_FLOAT" "cfc1\t%0,$31") diff --git a/gcc/config/mmix/mmix.c b/gcc/config/mmix/mmix.c index 9da826ca926..9e3bc9437ce 100644 --- a/gcc/config/mmix/mmix.c +++ b/gcc/config/mmix/mmix.c @@ -60,19 +60,16 @@ along with GCC; see the file COPYING3. If not see /* We have no means to tell DWARF 2 about the register stack, so we need to store the return address on the stack if an exception can get into - this function. FIXME: Narrow condition. Before any whole-function - analysis, df_regs_ever_live_p () isn't initialized. We know it's up-to-date - after reload_completed; it may contain incorrect information some time - before that. Within a RTL sequence (after a call to start_sequence, - such as in RTL expanders), leaf_function_p doesn't see all insns - (perhaps any insn). But regs_ever_live is up-to-date when - leaf_function_p () isn't, so we "or" them together to get accurate - information. FIXME: Some tweak to leaf_function_p might be - preferable. */ + this function. We'll have an "initial value" recorded for the + return-register if we've seen a call instruction emitted. This note + will be inaccurate before instructions are emitted, but the only caller + at that time is looking for modulo from stack-boundary, to which the + return-address does not contribute, and which is always 0 for MMIX + anyway. Beware of calling leaf_function_p here, as it'll abort if + called within a sequence. */ #define MMIX_CFUN_NEEDS_SAVED_EH_RETURN_ADDRESS \ (flag_exceptions \ - && ((reload_completed && df_regs_ever_live_p (MMIX_rJ_REGNUM)) \ - || !leaf_function_p ())) + && has_hard_reg_initial_val (Pmode, MMIX_INCOMING_RETURN_ADDRESS_REGNUM)) #define IS_MMIX_EH_RETURN_DATA_REG(REGNO) \ (crtl->calls_eh_return \ @@ -1373,8 +1370,14 @@ mmix_assemble_integer (rtx x, unsigned int size, int aligned_p) case 1: if (GET_CODE (x) != CONST_INT) { - aligned_p = 0; - break; + /* There is no "unaligned byte" op or generic function to + which we can punt, so we have to handle this here. As + the expression isn't a plain literal, the generated + assembly-code can't be mmixal-equivalent (i.e. "BYTE" + won't work) and thus it's ok to emit the default op + ".byte". */ + assemble_integer_with_op ("\t.byte\t", x); + return true; } fputs ("\tBYTE\t", asm_out_file); mmix_print_operand (asm_out_file, x, 'B'); diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index ca3fea3002d..07ff1df4bb8 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -1377,7 +1377,7 @@ nvptx_output_softstack_switch (FILE *file, bool entering, fputs (";\n", file); if (!CONST_INT_P (size) || UINTVAL (align) > GET_MODE_SIZE (DImode)) fprintf (file, - "\t\tand.u%d %%r%d, %%r%d, -" HOST_WIDE_INT_PRINT_DEC ";\n", + "\t\tand.b%d %%r%d, %%r%d, -" HOST_WIDE_INT_PRINT_DEC ";\n", bits, regno, regno, UINTVAL (align)); } if (cfun->machine->has_softstack) diff --git a/gcc/config/pa/pa-linux.h b/gcc/config/pa/pa-linux.h index a4ad2dda18e..80eae4928dc 100644 --- a/gcc/config/pa/pa-linux.h +++ b/gcc/config/pa/pa-linux.h @@ -101,7 +101,7 @@ along with GCC; see the file COPYING3. If not see /* FIXME: Hacked from the one so that we avoid multiple labels in a function declaration (since pa.c seems determined to do - it differently) */ + it differently). */ #undef ASM_DECLARE_FUNCTION_NAME #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ @@ -109,9 +109,14 @@ along with GCC; see the file COPYING3. If not see { \ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \ ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ + pa_output_function_label (FILE); \ } \ while (0) +/* Output function prologue for linux. */ +#undef TARGET_ASM_FUNCTION_PROLOGUE +#define TARGET_ASM_FUNCTION_PROLOGUE pa_linux_output_function_prologue + /* As well as globalizing the label, we need to encode the label to ensure a plabel is generated in an indirect call. */ diff --git a/gcc/config/pa/pa-protos.h b/gcc/config/pa/pa-protos.h index 79685bae93a..3d1329c7cc1 100644 --- a/gcc/config/pa/pa-protos.h +++ b/gcc/config/pa/pa-protos.h @@ -108,5 +108,6 @@ extern void pa_asm_output_aligned_local (FILE *, const char *, extern void pa_hpux_asm_output_external (FILE *, tree, const char *); extern HOST_WIDE_INT pa_initial_elimination_offset (int, int); extern HOST_WIDE_INT pa_function_arg_size (machine_mode, const_tree); +extern void pa_output_function_label (FILE *); extern const int pa_magic_milli[]; diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index a32921a779d..715877d0b8b 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -118,11 +118,11 @@ static void set_reg_plus_d (int, int, HOST_WIDE_INT, int); static rtx pa_function_value (const_tree, const_tree, bool); static rtx pa_libcall_value (machine_mode, const_rtx); static bool pa_function_value_regno_p (const unsigned int); -static void pa_output_function_prologue (FILE *); +static void pa_output_function_prologue (FILE *) ATTRIBUTE_UNUSED; +static void pa_linux_output_function_prologue (FILE *) ATTRIBUTE_UNUSED; static void update_total_code_bytes (unsigned int); static void pa_output_function_epilogue (FILE *); static int pa_adjust_cost (rtx_insn *, int, rtx_insn *, int, unsigned int); -static int pa_adjust_priority (rtx_insn *, int); static int pa_issue_rate (void); static int pa_reloc_rw_mask (void); static void pa_som_asm_init_sections (void) ATTRIBUTE_UNUSED; @@ -263,8 +263,6 @@ static size_t n_deferred_plabels = 0; #undef TARGET_ASM_INTEGER #define TARGET_ASM_INTEGER pa_assemble_integer -#undef TARGET_ASM_FUNCTION_PROLOGUE -#define TARGET_ASM_FUNCTION_PROLOGUE pa_output_function_prologue #undef TARGET_ASM_FUNCTION_EPILOGUE #define TARGET_ASM_FUNCTION_EPILOGUE pa_output_function_epilogue @@ -280,8 +278,6 @@ static size_t n_deferred_plabels = 0; #undef TARGET_SCHED_ADJUST_COST #define TARGET_SCHED_ADJUST_COST pa_adjust_cost -#undef TARGET_SCHED_ADJUST_PRIORITY -#define TARGET_SCHED_ADJUST_PRIORITY pa_adjust_priority #undef TARGET_SCHED_ISSUE_RATE #define TARGET_SCHED_ISSUE_RATE pa_issue_rate @@ -3842,16 +3838,10 @@ pa_compute_frame_size (poly_int64 size, int *fregs_live) & ~(PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT - 1)); } -/* On HP-PA, move-double insns between fpu and cpu need an 8-byte block - of memory. If any fpu reg is used in the function, we allocate - such a block here, at the bottom of the frame, just in case it's needed. +/* Output function label, and associated .PROC and .CALLINFO statements. */ - If this function is a leaf procedure, then we may choose not - to do a "save" insn. The decision about whether or not - to do this is made in regclass.c. */ - -static void -pa_output_function_prologue (FILE *file) +void +pa_output_function_label (FILE *file) { /* The function's label and associated .PROC must never be separated and must be output *after* any profiling declarations @@ -3897,7 +3887,22 @@ pa_output_function_prologue (FILE *file) fprintf (file, ",ENTRY_FR=%d", fr_saved + 11); fputs ("\n\t.ENTRY\n", file); +} +/* Output function prologue. */ + +static void +pa_output_function_prologue (FILE *file) +{ + pa_output_function_label (file); + remove_useless_addtr_insns (0); +} + +/* The label is output by ASM_DECLARE_FUNCTION_NAME on linux. */ + +static void +pa_linux_output_function_prologue (FILE *file ATTRIBUTE_UNUSED) +{ remove_useless_addtr_insns (0); } @@ -4569,10 +4574,6 @@ output_deferred_profile_counters (void) void hppa_profile_hook (int label_no) { - /* We use SImode for the address of the function in both 32 and - 64-bit code to avoid having to provide DImode versions of the - lcla2 and load_offset_label_address insn patterns. */ - rtx reg = gen_reg_rtx (SImode); rtx_code_label *label_rtx = gen_label_rtx (); int reg_parm_stack_space = REG_PARM_STACK_SPACE (NULL_TREE); rtx arg_bytes, begin_label_rtx, mcount, sym; @@ -4604,18 +4605,13 @@ hppa_profile_hook (int label_no) if (!use_mcount_pcrel_call) { /* The address of the function is loaded into %r25 with an instruction- - relative sequence that avoids the use of relocations. The sequence - is split so that the load_offset_label_address instruction can - occupy the delay slot of the call to _mcount. */ + relative sequence that avoids the use of relocations. We use SImode + for the address of the function in both 32 and 64-bit code to avoid + having to provide DImode versions of the lcla2 pattern. */ if (TARGET_PA_20) - emit_insn (gen_lcla2 (reg, label_rtx)); + emit_insn (gen_lcla2 (gen_rtx_REG (SImode, 25), label_rtx)); else - emit_insn (gen_lcla1 (reg, label_rtx)); - - emit_insn (gen_load_offset_label_address (gen_rtx_REG (SImode, 25), - reg, - begin_label_rtx, - label_rtx)); + emit_insn (gen_lcla1 (gen_rtx_REG (SImode, 25), label_rtx)); } if (!NO_DEFERRED_PROFILE_COUNTERS) @@ -4992,37 +4988,6 @@ pa_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost, } } -/* Adjust scheduling priorities. We use this to try and keep addil - and the next use of %r1 close together. */ -static int -pa_adjust_priority (rtx_insn *insn, int priority) -{ - rtx set = single_set (insn); - rtx src, dest; - if (set) - { - src = SET_SRC (set); - dest = SET_DEST (set); - if (GET_CODE (src) == LO_SUM - && symbolic_operand (XEXP (src, 1), VOIDmode) - && ! read_only_operand (XEXP (src, 1), VOIDmode)) - priority >>= 3; - - else if (GET_CODE (src) == MEM - && GET_CODE (XEXP (src, 0)) == LO_SUM - && symbolic_operand (XEXP (XEXP (src, 0), 1), VOIDmode) - && ! read_only_operand (XEXP (XEXP (src, 0), 1), VOIDmode)) - priority >>= 1; - - else if (GET_CODE (dest) == MEM - && GET_CODE (XEXP (dest, 0)) == LO_SUM - && symbolic_operand (XEXP (XEXP (dest, 0), 1), VOIDmode) - && ! read_only_operand (XEXP (XEXP (dest, 0), 1), VOIDmode)) - priority >>= 3; - } - return priority; -} - /* The 700 can only issue a single insn at a time. The 7XXX processors can issue two insns at a time. The 8000 can issue 4 insns at a time. */ @@ -7888,7 +7853,7 @@ pa_attr_length_call (rtx_insn *insn, int sibcall) /* 64-bit plabel sequence. */ else if (TARGET_64BIT && !local_call) - length += sibcall ? 28 : 24; + length += 24; /* non-pic long absolute branch sequence. */ else if ((TARGET_LONG_ABS_CALL || local_call) && !flag_pic) @@ -7960,38 +7925,24 @@ pa_output_call (rtx_insn *insn, rtx call_dest, int sibcall) xoperands[0] = pa_get_deferred_plabel (call_dest); xoperands[1] = gen_label_rtx (); - /* If this isn't a sibcall, we put the load of %r27 into the - delay slot. We can't do this in a sibcall as we don't - have a second call-clobbered scratch register available. - We don't need to do anything when generating fast indirect - calls. */ - if (seq_length != 0 && !sibcall) + /* Put the load of %r27 into the delay slot. We don't need to + do anything when generating fast indirect calls. */ + if (seq_length != 0) { final_scan_insn (NEXT_INSN (insn), asm_out_file, optimize, 0, NULL); /* Now delete the delay insn. */ SET_INSN_DELETED (NEXT_INSN (insn)); - seq_length = 0; } output_asm_insn ("addil LT'%0,%%r27", xoperands); output_asm_insn ("ldd RT'%0(%%r1),%%r1", xoperands); output_asm_insn ("ldd 0(%%r1),%%r1", xoperands); - - if (sibcall) - { - output_asm_insn ("ldd 24(%%r1),%%r27", xoperands); - output_asm_insn ("ldd 16(%%r1),%%r1", xoperands); - output_asm_insn ("bve (%%r1)", xoperands); - } - else - { - output_asm_insn ("ldd 16(%%r1),%%r2", xoperands); - output_asm_insn ("bve,l (%%r2),%%r2", xoperands); - output_asm_insn ("ldd 24(%%r1),%%r27", xoperands); - seq_length = 1; - } + output_asm_insn ("ldd 16(%%r1),%%r2", xoperands); + output_asm_insn ("bve,l (%%r2),%%r2", xoperands); + output_asm_insn ("ldd 24(%%r1),%%r27", xoperands); + seq_length = 1; } else { @@ -8084,20 +8035,22 @@ pa_output_call (rtx_insn *insn, rtx call_dest, int sibcall) { output_asm_insn ("addil LT'%0,%%r19", xoperands); output_asm_insn ("ldw RT'%0(%%r1),%%r1", xoperands); - output_asm_insn ("ldw 0(%%r1),%%r1", xoperands); + output_asm_insn ("ldw 0(%%r1),%%r22", xoperands); } else { output_asm_insn ("addil LR'%0-$global$,%%r27", xoperands); - output_asm_insn ("ldw RR'%0-$global$(%%r1),%%r1", + output_asm_insn ("ldw RR'%0-$global$(%%r1),%%r22", xoperands); } - output_asm_insn ("bb,>=,n %%r1,30,.+16", xoperands); - output_asm_insn ("depi 0,31,2,%%r1", xoperands); - output_asm_insn ("ldw 4(%%sr0,%%r1),%%r19", xoperands); - output_asm_insn ("ldw 0(%%sr0,%%r1),%%r1", xoperands); + output_asm_insn ("bb,>=,n %%r22,30,.+16", xoperands); + output_asm_insn ("depi 0,31,2,%%r22", xoperands); + /* Should this be an ordered load to ensure the target + address is loaded before the global pointer? */ + output_asm_insn ("ldw 0(%%r22),%%r1", xoperands); + output_asm_insn ("ldw 4(%%r22),%%r19", xoperands); if (!sibcall && !TARGET_PA_20) { @@ -8190,10 +8143,6 @@ pa_attr_length_indirect_call (rtx_insn *insn) if (TARGET_PORTABLE_RUNTIME) return 16; - /* Inline version of $$dyncall. */ - if ((TARGET_NO_SPACE_REGS || TARGET_PA_20) && !optimize_size) - return 20; - if (!TARGET_LONG_CALLS && ((TARGET_PA_20 && !TARGET_SOM && distance < 7600000) || distance < MAX_PCREL17F_OFFSET)) @@ -8203,12 +8152,15 @@ pa_attr_length_indirect_call (rtx_insn *insn) if (!flag_pic) return 12; - /* Inline version of $$dyncall. */ - if (TARGET_NO_SPACE_REGS || TARGET_PA_20) - return 20; - + /* Inline versions of $$dyncall. */ if (!optimize_size) - return 36; + { + if (TARGET_NO_SPACE_REGS) + return 28; + + if (TARGET_PA_20) + return 32; + } /* Long PIC pc-relative call. */ return 20; @@ -8246,22 +8198,6 @@ pa_output_indirect_call (rtx_insn *insn, rtx call_dest) return "blr %%r0,%%r2\n\tbv,n %%r0(%%r31)"; } - /* Maybe emit a fast inline version of $$dyncall. */ - if ((TARGET_NO_SPACE_REGS || TARGET_PA_20) && !optimize_size) - { - output_asm_insn ("bb,>=,n %%r22,30,.+12\n\t" - "ldw 2(%%r22),%%r19\n\t" - "ldw -2(%%r22),%%r22", xoperands); - pa_output_arg_descriptor (insn); - if (TARGET_NO_SPACE_REGS) - { - if (TARGET_PA_20) - return "bve,l,n (%%r22),%%r2\n\tnop"; - return "ble 0(%%sr4,%%r22)\n\tcopy %%r31,%%r2"; - } - return "bve,l (%%r22),%%r2\n\tstw %%r2,-24(%%sp)"; - } - /* Now the normal case -- we can reach $$dyncall directly or we're sure that we can get there via a long-branch stub. @@ -8290,35 +8226,40 @@ pa_output_indirect_call (rtx_insn *insn, rtx call_dest) return "ble R'$$dyncall(%%sr4,%%r2)\n\tcopy %%r31,%%r2"; } - /* Maybe emit a fast inline version of $$dyncall. The long PIC - pc-relative call sequence is five instructions. The inline PA 2.0 - version of $$dyncall is also five instructions. The PA 1.X versions - are longer but still an overall win. */ - if (TARGET_NO_SPACE_REGS || TARGET_PA_20 || !optimize_size) + /* The long PIC pc-relative call sequence is five instructions. So, + let's use an inline version of $$dyncall when the calling sequence + has a roughly similar number of instructions and we are not optimizing + for size. We need two instructions to load the return pointer plus + the $$dyncall implementation. */ + if (!optimize_size) { - output_asm_insn ("bb,>=,n %%r22,30,.+12\n\t" - "ldw 2(%%r22),%%r19\n\t" - "ldw -2(%%r22),%%r22", xoperands); if (TARGET_NO_SPACE_REGS) { pa_output_arg_descriptor (insn); - if (TARGET_PA_20) - return "bve,l,n (%%r22),%%r2\n\tnop"; - return "ble 0(%%sr4,%%r22)\n\tcopy %%r31,%%r2"; + output_asm_insn ("bl .+8,%%r2\n\t" + "ldo 20(%%r2),%%r2\n\t" + "extru,<> %%r22,30,1,%%r0\n\t" + "bv,n %%r0(%%r22)\n\t" + "ldw -2(%%r22),%%r21\n\t" + "bv %%r0(%%r21)\n\t" + "ldw 2(%%r22),%%r19", xoperands); + return ""; } if (TARGET_PA_20) { pa_output_arg_descriptor (insn); - return "bve,l (%%r22),%%r2\n\tstw %%r2,-24(%%sp)"; + output_asm_insn ("bl .+8,%%r2\n\t" + "ldo 24(%%r2),%%r2\n\t" + "stw %%r2,-24(%%sp)\n\t" + "extru,<> %r22,30,1,%%r0\n\t" + "bve,n (%%r22)\n\t" + "ldw -2(%%r22),%%r21\n\t" + "bve (%%r21)\n\t" + "ldw 2(%%r22),%%r19", xoperands); + return ""; } - output_asm_insn ("bl .+8,%%r2\n\t" - "ldo 16(%%r2),%%r2\n\t" - "ldsid (%%r22),%%r1\n\t" - "mtsp %%r1,%%sr0", xoperands); - pa_output_arg_descriptor (insn); - return "be 0(%%sr0,%%r22)\n\tstw %%r2,-24(%%sp)"; } - + /* We need a long PIC call to $$dyncall. */ xoperands[0] = gen_rtx_SYMBOL_REF (Pmode, "$$dyncall"); xoperands[1] = gen_rtx_REG (Pmode, 2); @@ -10039,10 +9980,11 @@ pa_can_change_mode_class (machine_mode from, machine_mode to, /* There is no way to load QImode or HImode values directly from memory to a FP register. SImode loads to the FP registers are not zero extended. On the 64-bit target, this conflicts with the definition - of LOAD_EXTEND_OP. Thus, we can't allow changing between modes with - different sizes in the floating-point registers. */ + of LOAD_EXTEND_OP. Thus, we reject all mode changes in the FP registers + except for DImode to SImode on the 64-bit target. It is handled by + register renaming in pa_print_operand. */ if (MAYBE_FP_REG_CLASS_P (rclass)) - return false; + return TARGET_64BIT && from == DImode && to == SImode; /* TARGET_HARD_REGNO_MODE_OK places modes with sizes larger than a word in specific sets of registers. Thus, we cannot allow changing @@ -10076,7 +10018,7 @@ pa_modes_tieable_p (machine_mode mode1, machine_mode mode2) /* Length in units of the trampoline instruction code. */ -#define TRAMPOLINE_CODE_SIZE (TARGET_64BIT ? 24 : (TARGET_PA_20 ? 32 : 40)) +#define TRAMPOLINE_CODE_SIZE (TARGET_64BIT ? 24 : (TARGET_PA_20 ? 36 : 48)) /* Output assembler code for a block containing the constant parts @@ -10097,27 +10039,46 @@ pa_asm_trampoline_template (FILE *f) { if (!TARGET_64BIT) { - fputs ("\tldw 36(%r22),%r21\n", f); - fputs ("\tbb,>=,n %r21,30,.+16\n", f); - if (ASSEMBLER_DIALECT == 0) - fputs ("\tdepi 0,31,2,%r21\n", f); - else - fputs ("\tdepwi 0,31,2,%r21\n", f); - fputs ("\tldw 4(%r21),%r19\n", f); - fputs ("\tldw 0(%r21),%r21\n", f); if (TARGET_PA_20) { - fputs ("\tbve (%r21)\n", f); - fputs ("\tldw 40(%r22),%r29\n", f); + fputs ("\tmfia %r20\n", f); + fputs ("\tldw 48(%r20),%r22\n", f); + fputs ("\tcopy %r22,%r21\n", f); + fputs ("\tbb,>=,n %r22,30,.+16\n", f); + fputs ("\tdepwi 0,31,2,%r22\n", f); + fputs ("\tldw 0(%r22),%r21\n", f); + fputs ("\tldw 4(%r22),%r19\n", f); + fputs ("\tbve (%r21)\n", f); + fputs ("\tldw 52(%r1),%r29\n", f); + fputs ("\t.word 0\n", f); fputs ("\t.word 0\n", f); fputs ("\t.word 0\n", f); } else { + if (ASSEMBLER_DIALECT == 0) + { + fputs ("\tbl .+8,%r20\n", f); + fputs ("\tdepi 0,31,2,%r20\n", f); + } + else + { + fputs ("\tb,l .+8,%r20\n", f); + fputs ("\tdepwi 0,31,2,%r20\n", f); + } + fputs ("\tldw 40(%r20),%r22\n", f); + fputs ("\tcopy %r22,%r21\n", f); + fputs ("\tbb,>=,n %r22,30,.+16\n", f); + if (ASSEMBLER_DIALECT == 0) + fputs ("\tdepi 0,31,2,%r22\n", f); + else + fputs ("\tdepwi 0,31,2,%r22\n", f); + fputs ("\tldw 0(%r22),%r21\n", f); + fputs ("\tldw 4(%r22),%r19\n", f); fputs ("\tldsid (%r21),%r1\n", f); fputs ("\tmtsp %r1,%sr0\n", f); - fputs ("\tbe 0(%sr0,%r21)\n", f); - fputs ("\tldw 40(%r22),%r29\n", f); + fputs ("\tbe 0(%sr0,%r21)\n", f); + fputs ("\tldw 44(%r20),%r29\n", f); } fputs ("\t.word 0\n", f); fputs ("\t.word 0\n", f); @@ -10131,11 +10092,11 @@ pa_asm_trampoline_template (FILE *f) fputs ("\t.dword 0\n", f); fputs ("\t.dword 0\n", f); fputs ("\tmfia %r31\n", f); - fputs ("\tldd 24(%r31),%r1\n", f); - fputs ("\tldd 24(%r1),%r27\n", f); - fputs ("\tldd 16(%r1),%r1\n", f); - fputs ("\tbve (%r1)\n", f); + fputs ("\tldd 24(%r31),%r27\n", f); fputs ("\tldd 32(%r31),%r31\n", f); + fputs ("\tldd 16(%r27),%r1\n", f); + fputs ("\tbve (%r1)\n", f); + fputs ("\tldd 24(%r27),%r27\n", f); fputs ("\t.dword 0 ; fptr\n", f); fputs ("\t.dword 0 ; static link\n", f); } @@ -10145,10 +10106,10 @@ pa_asm_trampoline_template (FILE *f) FNADDR is an RTX for the address of the function's pure code. CXT is an RTX for the static chain value for the function. - Move the function address to the trampoline template at offset 36. - Move the static chain value to trampoline template at offset 40. - Move the trampoline address to trampoline template at offset 44. - Move r19 to trampoline template at offset 48. The latter two + Move the function address to the trampoline template at offset 48. + Move the static chain value to trampoline template at offset 52. + Move the trampoline address to trampoline template at offset 56. + Move r19 to trampoline template at offset 60. The latter two words create a plabel for the indirect call to the trampoline. A similar sequence is used for the 64-bit port but the plabel is @@ -10174,15 +10135,15 @@ pa_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value) if (!TARGET_64BIT) { - tmp = adjust_address (m_tramp, Pmode, 36); + tmp = adjust_address (m_tramp, Pmode, 48); emit_move_insn (tmp, fnaddr); - tmp = adjust_address (m_tramp, Pmode, 40); + tmp = adjust_address (m_tramp, Pmode, 52); emit_move_insn (tmp, chain_value); /* Create a fat pointer for the trampoline. */ - tmp = adjust_address (m_tramp, Pmode, 44); + tmp = adjust_address (m_tramp, Pmode, 56); emit_move_insn (tmp, r_tramp); - tmp = adjust_address (m_tramp, Pmode, 48); + tmp = adjust_address (m_tramp, Pmode, 60); emit_move_insn (tmp, gen_rtx_REG (Pmode, 19)); /* fdc and fic only use registers for the address to flush, @@ -10234,20 +10195,20 @@ pa_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value) } #ifdef HAVE_ENABLE_EXECUTE_STACK -  emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"), + emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"), LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode); #endif } /* Perform any machine-specific adjustment in the address of the trampoline. ADDR contains the address that was passed to pa_trampoline_init. - Adjust the trampoline address to point to the plabel at offset 44. */ + Adjust the trampoline address to point to the plabel at offset 56. */ static rtx pa_trampoline_adjust_address (rtx addr) { if (!TARGET_64BIT) - addr = memory_address (Pmode, plus_constant (Pmode, addr, 46)); + addr = memory_address (Pmode, plus_constant (Pmode, addr, 58)); return addr; } @@ -10680,6 +10641,8 @@ pa_output_addr_vec (rtx lab, rtx body) { int idx, vlen = XVECLEN (body, 0); + if (!TARGET_SOM) + fputs ("\t.align 4\n", asm_out_file); targetm.asm_out.internal_label (asm_out_file, "L", CODE_LABEL_NUMBER (lab)); if (TARGET_GAS) fputs ("\t.begin_brtab\n", asm_out_file); diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 67b3c714ea8..232495bd719 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -689,7 +689,7 @@ extern int may_call_alloca; /* Length in units of the trampoline for entering a nested function. */ -#define TRAMPOLINE_SIZE (TARGET_64BIT ? 72 : 52) +#define TRAMPOLINE_SIZE (TARGET_64BIT ? 72 : 64) /* Alignment required by the trampoline. */ @@ -1143,21 +1143,23 @@ do { \ #define ASM_OUTPUT_ASCII(FILE, P, SIZE) \ pa_output_ascii ((FILE), (P), (SIZE)) -/* Jump tables are always placed in the text section. Technically, it - is possible to put them in the readonly data section. This has the - benefit of getting the table out of .text and reducing branch lengths - as a result. +/* Jump tables are always placed in the text section. We have to do + this for the HP-UX SOM target as we can't switch sections in the + middle of a function. - The downside is that an additional insn (addil) is needed to access + On ELF targets, it is possible to put them in the readonly-data section. + This would get the table out of .text and reduce branch lengths. + + A downside is that an additional insn (addil) is needed to access the table when generating PIC code. The address difference table - also has to use 32-bit pc-relative relocations. Currently, GAS does - not support these relocations, although it is easily modified to do - this operation. + also has to use 32-bit pc-relative relocations. The table entries need to look like "$L1+(.+8-$L0)-$PIC_pcrel$0" when using ELF GAS. A simple difference can be used when using - SOM GAS or the HP assembler. The final downside is GDB complains - about the nesting of the label for the table when debugging. */ + the HP assembler. + + The final downside is GDB complains about the nesting of the label + for the table. */ #define JUMP_TABLES_IN_TEXT_SECTION 1 @@ -1291,12 +1293,14 @@ do { \ #endif /* The maximum offset in bytes for a PA 1.X pc-relative call to the - head of the preceding stub table. The selected offsets have been - chosen so that approximately one call stub is allocated for every - 86.7 instructions. A long branch stub is two instructions when - not generating PIC code. For HP-UX and ELF targets, PIC stubs are - seven and four instructions, respectively. */ -#define MAX_PCREL17F_OFFSET \ - (flag_pic ? (TARGET_HPUX ? 198164 : 221312) : 240000) + head of the preceding stub table. A long branch stub is two or three + instructions for non-PIC and PIC, respectively. Import stubs are + seven and five instructions for HP-UX and ELF targets, respectively. + The default stub group size for ELF targets is 217856 bytes. + FIXME: We need an option to set the maximum offset. */ +#define MAX_PCREL17F_OFFSET (TARGET_HPUX ? 198164 : 217856) #define NEED_INDICATE_EXEC_STACK 0 + +/* Output default function prologue for hpux. */ +#define TARGET_ASM_FUNCTION_PROLOGUE pa_output_function_prologue diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md index e748f053651..fb9a6c40fdd 100644 --- a/gcc/config/pa/pa.md +++ b/gcc/config/pa/pa.md @@ -84,6 +84,7 @@ UNSPEC_TLSGD_PIC UNSPEC_TLSLDM_PIC UNSPEC_TLSIE_PIC + UNSPEC_MEMORY_BARRIER ]) ;; UNSPEC_VOLATILE: @@ -5318,8 +5319,8 @@ (define_insn "umulsidi3" [(set (match_operand:DI 0 "register_operand" "=f") - (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f")) - (zero_extend:DI (match_operand:SI 2 "nonimmediate_operand" "f"))))] + (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "f")) + (zero_extend:DI (match_operand:SI 2 "register_operand" "f"))))] "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT" "xmpyu %1,%2,%0" [(set_attr "type" "fpmuldbl") @@ -5327,7 +5328,7 @@ (define_insn "" [(set (match_operand:DI 0 "register_operand" "=f") - (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f")) + (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "f")) (match_operand:DI 2 "uint32_operand" "f")))] "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT && !TARGET_64BIT" "xmpyu %1,%R2,%0" @@ -5336,7 +5337,7 @@ (define_insn "" [(set (match_operand:DI 0 "register_operand" "=f") - (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f")) + (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "f")) (match_operand:DI 2 "uint32_operand" "f")))] "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT && TARGET_64BIT" "xmpyu %1,%2R,%0" @@ -6903,21 +6904,24 @@ rtx stack = operands[2]; rtx fp = operands[3]; - lab = copy_to_reg (lab); - emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode))); emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx)); - /* Restore the frame pointer. The virtual_stack_vars_rtx is saved - instead of the hard_frame_pointer_rtx in the save area. As a - result, an extra instruction is needed to adjust for the offset - of the virtual stack variables and the hard frame pointer. */ - if (GET_CODE (fp) != REG) - fp = force_reg (Pmode, fp); - emit_move_insn (hard_frame_pointer_rtx, plus_constant (Pmode, fp, -8)); + lab = copy_to_reg (lab); + /* Restore the stack and frame pointers. The virtual_stack_vars_rtx + is saved instead of the hard_frame_pointer_rtx in the save area. + As a result, an extra instruction is needed to adjust for the offset + of the virtual stack variables and the hard frame pointer. */ + fp = copy_to_reg (fp); emit_stack_restore (SAVE_NONLOCAL, stack); + /* Ensure the frame pointer move is not optimized. */ + emit_insn (gen_blockage ()); + emit_clobber (hard_frame_pointer_rtx); + emit_clobber (frame_pointer_rtx); + emit_move_insn (hard_frame_pointer_rtx, plus_constant (Pmode, fp, -8)); + emit_use (hard_frame_pointer_rtx); emit_use (stack_pointer_rtx); @@ -8694,23 +8698,26 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode))); emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx)); - /* Restore the frame pointer. The virtual_stack_vars_rtx is saved - instead of the hard_frame_pointer_rtx in the save area. We need - to adjust for the offset between these two values. */ - if (GET_CODE (fp) != REG) - fp = force_reg (Pmode, fp); - emit_move_insn (hard_frame_pointer_rtx, plus_constant (Pmode, fp, -8)); - - /* This bit is the same as expand_builtin_longjmp. */ - emit_stack_restore (SAVE_NONLOCAL, stack); - emit_use (hard_frame_pointer_rtx); - emit_use (stack_pointer_rtx); - /* Load the label we are jumping through into r1 so that we know where to look for it when we get back to setjmp's function for restoring the gp. */ emit_move_insn (pv, lab); + /* Restore the stack and frame pointers. The virtual_stack_vars_rtx + is saved instead of the hard_frame_pointer_rtx in the save area. + We need to adjust for the offset between these two values. */ + fp = copy_to_reg (fp); + emit_stack_restore (SAVE_NONLOCAL, stack); + + /* Ensure the frame pointer move is not optimized. */ + emit_insn (gen_blockage ()); + emit_clobber (hard_frame_pointer_rtx); + emit_clobber (frame_pointer_rtx); + emit_move_insn (hard_frame_pointer_rtx, plus_constant (Pmode, fp, -8)); + + emit_use (hard_frame_pointer_rtx); + emit_use (stack_pointer_rtx); + /* Prevent the insns above from being scheduled into the delay slot of the interspace jump because the space register could change. */ emit_insn (gen_blockage ()); @@ -9955,14 +9962,8 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" ;; doubleword loads and stores are not guaranteed to be atomic ;; when referencing the I/O address space. -;; The kernel cmpxchg operation on linux is not atomic with respect to -;; memory stores on SMP machines, so we must do stores using a cmpxchg -;; operation. - ;; These patterns are at the bottom so the non atomic versions are preferred. -;; Implement atomic QImode store using exchange. - (define_expand "atomic_storeqi" [(match_operand:QI 0 "memory_operand") ;; memory (match_operand:QI 1 "register_operand") ;; val out @@ -10015,25 +10016,7 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" FAIL; }) -;; Implement atomic SFmode store using exchange. - -(define_expand "atomic_storesf" - [(match_operand:SF 0 "memory_operand") ;; memory - (match_operand:SF 1 "register_operand") ;; val out - (match_operand:SI 2 "const_int_operand")] ;; model - "" -{ - if (TARGET_SYNC_LIBCALL) - { - rtx mem = operands[0]; - rtx val = operands[1]; - if (pa_maybe_emit_compare_and_swap_exchange_loop (NULL_RTX, mem, val)) - DONE; - } - FAIL; -}) - -;; Implement atomic DImode load using 64-bit floating point load. +;; Implement atomic DImode load. (define_expand "atomic_loaddi" [(match_operand:DI 0 "register_operand") ;; val out @@ -10048,29 +10031,27 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" model = memmodel_from_int (INTVAL (operands[2])); operands[1] = force_reg (SImode, XEXP (operands[1], 0)); - expand_mem_thread_fence (model); - emit_insn (gen_atomic_loaddi_1 (operands[0], operands[1])); if (is_mm_seq_cst (model)) expand_mem_thread_fence (model); + emit_insn (gen_atomic_loaddi_1 (operands[0], operands[1])); + expand_mem_thread_fence (model); DONE; }) (define_insn "atomic_loaddi_1" - [(set (match_operand:DI 0 "register_operand" "=f,r") - (mem:DI (match_operand:SI 1 "register_operand" "r,r"))) - (clobber (match_scratch:DI 2 "=X,f"))] + [(set (match_operand:DI 0 "register_operand" "=r") + (mem:DI (match_operand:SI 1 "register_operand" "r"))) + (clobber (match_scratch:DI 2 "=f"))] "!TARGET_64BIT && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT" - "@ - {fldds|fldd} 0(%1),%0 - {fldds|fldd} 0(%1),%2\n\t{fstds|fstd} %2,-16(%%sp)\n\t{ldws|ldw} -16(%%sp),%0\n\t{ldws|ldw} -12(%%sp),%R0" - [(set_attr "type" "move,move") - (set_attr "length" "4,16")]) + "{fldds|fldd} 0(%1),%2\n\t{fstds|fstd} %2,-16(%%sp)\n\t{ldws|ldw} -16(%%sp),%0\n\t{ldws|ldw} -12(%%sp),%R0" + [(set_attr "type" "move") + (set_attr "length" "16")]) ;; Implement atomic DImode store. (define_expand "atomic_storedi" [(match_operand:DI 0 "memory_operand") ;; memory - (match_operand:DI 1 "register_operand") ;; val out + (match_operand:DI 1 "reg_or_cint_move_operand") ;; val out (match_operand:SI 2 "const_int_operand")] ;; model "" { @@ -10089,6 +10070,8 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" model = memmodel_from_int (INTVAL (operands[2])); operands[0] = force_reg (SImode, XEXP (operands[0], 0)); + if (operands[1] != CONST0_RTX (DImode)) + operands[1] = force_reg (DImode, operands[1]); expand_mem_thread_fence (model); emit_insn (gen_atomic_storedi_1 (operands[0], operands[1])); if (is_mm_seq_cst (model)) @@ -10098,87 +10081,65 @@ add,l %2,%3,%3\;bv,n %%r0(%3)" (define_insn "atomic_storedi_1" [(set (mem:DI (match_operand:SI 0 "register_operand" "r,r")) - (match_operand:DI 1 "register_operand" "f,r")) + (match_operand:DI 1 "reg_or_0_operand" "M,r")) (clobber (match_scratch:DI 2 "=X,f"))] - "!TARGET_64BIT && !TARGET_DISABLE_FPREGS - && !TARGET_SOFT_FLOAT && !TARGET_SYNC_LIBCALL" + "!TARGET_64BIT && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT" "@ - {fstds|fstd} %1,0(%0) + {fstds|fstd} %%fr0,0(%0) {stws|stw} %1,-16(%%sp)\n\t{stws|stw} %R1,-12(%%sp)\n\t{fldds|fldd} -16(%%sp),%2\n\t{fstds|fstd} %2,0(%0)" [(set_attr "type" "move,move") (set_attr "length" "4,16")]) -;; Implement atomic DFmode load using 64-bit floating point load. +;; PA 2.0 hardware supports out-of-order execution of loads and stores, so +;; we need memory barriers to enforce program order for memory references +;; when the TLB and PSW O bits are not set. We assume all PA 2.0 systems +;; are weakly ordered since neither HP-UX or Linux set the PSW O bit. Since +;; we want PA 1.x code to be PA 2.0 compatible, we also need barriers when +;; generating PA 1.x code even though all PA 1.x systems are strongly ordered. -(define_expand "atomic_loaddf" - [(match_operand:DF 0 "register_operand") ;; val out - (match_operand:DF 1 "memory_operand") ;; memory - (match_operand:SI 2 "const_int_operand")] ;; model +;; When barriers are needed, we use a strongly ordered ldcw instruction as +;; the barrier. Most PA 2.0 targets are cache coherent. In that case, we +;; can use the coherent cache control hint and avoid aligning the ldcw +;; address. In spite of its description, it is not clear that the sync +;; instruction works as a barrier. + +(define_expand "memory_barrier" + [(parallel + [(set (match_dup 0) (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BARRIER)) + (clobber (match_dup 1))])] "" { - enum memmodel model; - - if (TARGET_64BIT || TARGET_DISABLE_FPREGS || TARGET_SOFT_FLOAT) + /* We don't need a barrier if the target uses ordered memory references. */ + if (TARGET_ORDERED) FAIL; - - model = memmodel_from_int (INTVAL (operands[2])); - operands[1] = force_reg (SImode, XEXP (operands[1], 0)); - expand_mem_thread_fence (model); - emit_insn (gen_atomic_loaddf_1 (operands[0], operands[1])); - if (is_mm_seq_cst (model)) - expand_mem_thread_fence (model); - DONE; + operands[1] = gen_reg_rtx (Pmode); + operands[0] = gen_rtx_MEM (BLKmode, operands[1]); + MEM_VOLATILE_P (operands[0]) = 1; }) -(define_insn "atomic_loaddf_1" - [(set (match_operand:DF 0 "register_operand" "=f,r") - (mem:DF (match_operand:SI 1 "register_operand" "r,r"))) - (clobber (match_scratch:DF 2 "=X,f"))] - "!TARGET_64BIT && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT" - "@ - {fldds|fldd} 0(%1),%0 - {fldds|fldd} 0(%1),%2\n\t{fstds|fstd} %2,-16(%%sp)\n\t{ldws|ldw} -16(%%sp),%0\n\t{ldws|ldw} -12(%%sp),%R0" - [(set_attr "type" "move,move") - (set_attr "length" "4,16")]) +(define_insn "*memory_barrier_coherent" + [(set (match_operand:BLK 0 "" "") + (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BARRIER)) + (clobber (match_operand 1 "pmode_register_operand" "=r"))] + "TARGET_PA_20 && TARGET_COHERENT_LDCW" + "ldcw,co 0(%%sp),%1" + [(set_attr "type" "binary") + (set_attr "length" "4")]) -;; Implement atomic DFmode store using 64-bit floating point store. +(define_insn "*memory_barrier_64" + [(set (match_operand:BLK 0 "" "") + (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BARRIER)) + (clobber (match_operand 1 "pmode_register_operand" "=&r"))] + "TARGET_64BIT" + "ldo 15(%%sp),%1\n\tdepd %%r0,63,3,%1\n\tldcw 0(%1),%1" + [(set_attr "type" "binary") + (set_attr "length" "12")]) -(define_expand "atomic_storedf" - [(match_operand:DF 0 "memory_operand") ;; memory - (match_operand:DF 1 "register_operand") ;; val out - (match_operand:SI 2 "const_int_operand")] ;; model +(define_insn "*memory_barrier_32" + [(set (match_operand:BLK 0 "" "") + (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BARRIER)) + (clobber (match_operand 1 "pmode_register_operand" "=&r"))] "" -{ - enum memmodel model; - - if (TARGET_SYNC_LIBCALL) - { - rtx mem = operands[0]; - rtx val = operands[1]; - if (pa_maybe_emit_compare_and_swap_exchange_loop (NULL_RTX, mem, val)) - DONE; - } - - if (TARGET_64BIT || TARGET_DISABLE_FPREGS || TARGET_SOFT_FLOAT) - FAIL; - - model = memmodel_from_int (INTVAL (operands[2])); - operands[0] = force_reg (SImode, XEXP (operands[0], 0)); - expand_mem_thread_fence (model); - emit_insn (gen_atomic_storedf_1 (operands[0], operands[1])); - if (is_mm_seq_cst (model)) - expand_mem_thread_fence (model); - DONE; -}) - -(define_insn "atomic_storedf_1" - [(set (mem:DF (match_operand:SI 0 "register_operand" "r,r")) - (match_operand:DF 1 "register_operand" "f,r")) - (clobber (match_scratch:DF 2 "=X,f"))] - "!TARGET_64BIT && !TARGET_DISABLE_FPREGS - && !TARGET_SOFT_FLOAT && !TARGET_SYNC_LIBCALL" - "@ - {fstds|fstd} %1,0(%0) - {stws|stw} %1,-16(%%sp)\n\t{stws|stw} %R1,-12(%%sp)\n\t{fldds|fldd} -16(%%sp),%2\n\t{fstds|fstd} %2,0(%0)" - [(set_attr "type" "move,move") - (set_attr "length" "4,16")]) + "ldo 15(%%sp),%1\n\t{dep|depw} %%r0,31,3,%1\n\tldcw 0(%1),%1" + [(set_attr "type" "binary") + (set_attr "length" "12")]) diff --git a/gcc/config/pa/pa.opt b/gcc/config/pa/pa.opt index 4aaf6acc203..5a3707e5759 100644 --- a/gcc/config/pa/pa.opt +++ b/gcc/config/pa/pa.opt @@ -45,6 +45,10 @@ mcaller-copies Target Report Mask(CALLER_COPIES) Caller copies function arguments passed by hidden reference. +mcoherent-ldcw +Target Report Var(TARGET_COHERENT_LDCW) Init(1) +Use ldcw/ldcd coherent cache-control hint. + mdisable-fpregs Target Report Mask(DISABLE_FPREGS) Disable FP regs. @@ -90,6 +94,10 @@ mno-space-regs Target RejectNegative Report Mask(NO_SPACE_REGS) Disable space regs. +mordered +Target Report Var(TARGET_ORDERED) Init(0) +Assume memory references are ordered and barriers are not needed. + mpa-risc-1-0 Target RejectNegative Generate PA1.0 code. diff --git a/gcc/config/pa/pa32-linux.h b/gcc/config/pa/pa32-linux.h index ffcd1c6f17c..4b470447f19 100644 --- a/gcc/config/pa/pa32-linux.h +++ b/gcc/config/pa/pa32-linux.h @@ -67,3 +67,12 @@ call_ ## FUNC (void) \ layout compatibility with the original linux thread implementation. */ #undef MALLOC_ABI_ALIGNMENT #define MALLOC_ABI_ALIGNMENT 128 + +/* Place jump tables in the text section except when generating non-PIC + code. When generating non-PIC code, the relocations needed to load the + address of the jump table result in a text label in the final executable + if the jump table is placed in the text section. This breaks the unwind + data for the function. Thus, the jump table needs to be placed in + rodata when generating non-PIC code. */ +#undef JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c index 2a8f87d1e94..606d9aa7441 100644 --- a/gcc/config/riscv/riscv.c +++ b/gcc/config/riscv/riscv.c @@ -4389,6 +4389,32 @@ riscv_constant_alignment (const_tree exp, HOST_WIDE_INT align) return align; } +/* Implement TARGET_PROMOTE_FUNCTION_MODE. */ + +/* This function is equivalent to default_promote_function_mode_always_promote + except that it returns a promoted mode even if type is NULL_TREE. This is + needed by libcalls which have no type (only a mode) such as fixed conversion + routines that take a signed or unsigned char/short/int argument and convert + it to a fixed type. */ + +static machine_mode +riscv_promote_function_mode (const_tree type ATTRIBUTE_UNUSED, + machine_mode mode, + int *punsignedp ATTRIBUTE_UNUSED, + const_tree fntype ATTRIBUTE_UNUSED, + int for_return ATTRIBUTE_UNUSED) +{ + int unsignedp; + + if (type != NULL_TREE) + return promote_mode (type, mode, punsignedp); + + unsignedp = *punsignedp; + PROMOTE_MODE (mode, unsignedp, type); + *punsignedp = unsignedp; + return mode; +} + /* Initialize the GCC target structure. */ #undef TARGET_ASM_ALIGNED_HI_OP #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t" @@ -4430,7 +4456,7 @@ riscv_constant_alignment (const_tree exp, HOST_WIDE_INT align) #define TARGET_EXPAND_BUILTIN_VA_START riscv_va_start #undef TARGET_PROMOTE_FUNCTION_MODE -#define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote +#define TARGET_PROMOTE_FUNCTION_MODE riscv_promote_function_mode #undef TARGET_RETURN_IN_MEMORY #define TARGET_RETURN_IN_MEMORY riscv_return_in_memory diff --git a/gcc/config/rs6000/altivec.h b/gcc/config/rs6000/altivec.h index 5a3416235da..6c5757eadf5 100644 --- a/gcc/config/rs6000/altivec.h +++ b/gcc/config/rs6000/altivec.h @@ -418,6 +418,11 @@ #define vec_vupkhsw __builtin_vec_vupkhsw #define vec_vupklsw __builtin_vec_vupklsw #define vec_revb __builtin_vec_revb +#define vec_sbox_be __builtin_crypto_vsbox_be +#define vec_cipher_be __builtin_crypto_vcipher_be +#define vec_cipherlast_be __builtin_crypto_vcipherlast_be +#define vec_ncipher_be __builtin_crypto_vncipher_be +#define vec_ncipherlast_be __builtin_crypto_vncipherlast_be #endif #ifdef __POWER9_VECTOR__ diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 13f4654db6a..fb262236b0a 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -80,9 +80,6 @@ UNSPEC_VUPKHPX UNSPEC_VUPKLPX UNSPEC_CONVERT_4F32_8I16 - UNSPEC_DARN - UNSPEC_DARN_32 - UNSPEC_DARN_RAW UNSPEC_DST UNSPEC_DSTT UNSPEC_DSTST @@ -161,9 +158,6 @@ UNSPEC_BCDADD UNSPEC_BCDSUB UNSPEC_BCD_OVERFLOW - UNSPEC_CMPRB - UNSPEC_CMPRB2 - UNSPEC_CMPEQB UNSPEC_VRLMI UNSPEC_VRLNM ]) @@ -581,7 +575,7 @@ [(set_attr "type" "vecsimple")]) ;; -(define_insn "altivec_vavgu" +(define_insn "uavg3_ceil" [(set (match_operand:VI 0 "register_operand" "=v") (unspec:VI [(match_operand:VI 1 "register_operand" "v") (match_operand:VI 2 "register_operand" "v")] @@ -590,7 +584,7 @@ "vavgu %0,%1,%2" [(set_attr "type" "vecsimple")]) -(define_insn "altivec_vavgs" +(define_insn "avg3_ceil" [(set (match_operand:VI 0 "register_operand" "=v") (unspec:VI [(match_operand:VI 1 "register_operand" "v") (match_operand:VI 2 "register_operand" "v")] @@ -4317,223 +4311,6 @@ [(set_attr "length" "4") (set_attr "type" "vecsimple")]) -(define_insn "darn_32" - [(set (match_operand:SI 0 "register_operand" "=r") - (unspec:SI [(const_int 0)] UNSPEC_DARN_32))] - "TARGET_P9_MISC" - "darn %0,0" - [(set_attr "type" "integer")]) - -(define_insn "darn_raw" - [(set (match_operand:DI 0 "register_operand" "=r") - (unspec:DI [(const_int 0)] UNSPEC_DARN_RAW))] - "TARGET_P9_MISC && TARGET_64BIT" - "darn %0,2" - [(set_attr "type" "integer")]) - -(define_insn "darn" - [(set (match_operand:DI 0 "register_operand" "=r") - (unspec:DI [(const_int 0)] UNSPEC_DARN))] - "TARGET_P9_MISC && TARGET_64BIT" - "darn %0,1" - [(set_attr "type" "integer")]) - -;; Test byte within range. -;; -;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx -;; represents a byte whose value is ignored in this context and -;; vv, the least significant byte, holds the byte value that is to -;; be tested for membership within the range specified by operand 2. -;; The bytes of operand 2 are organized as xx:xx:hi:lo. -;; -;; Return in target register operand 0 a value of 1 if lo <= vv and -;; vv <= hi. Otherwise, set register operand 0 to 0. -;; -;; Though the instructions to which this expansion maps operate on -;; 64-bit registers, the current implementation only operates on -;; SI-mode operands as the high-order bits provide no information -;; that is not already available in the low-order bits. To avoid the -;; costs of data widening operations, future enhancements might allow -;; DI mode for operand 0 and/or might allow operand 1 to be QI mode. -(define_expand "cmprb" - [(set (match_dup 3) - (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") - (match_operand:SI 2 "gpc_reg_operand" "r")] - UNSPEC_CMPRB)) - (set (match_operand:SI 0 "gpc_reg_operand" "=r") - (if_then_else:SI (lt (match_dup 3) - (const_int 0)) - (const_int -1) - (if_then_else (gt (match_dup 3) - (const_int 0)) - (const_int 1) - (const_int 0))))] - "TARGET_P9_MISC" -{ - operands[3] = gen_reg_rtx (CCmode); -}) - -;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx -;; represents a byte whose value is ignored in this context and -;; vv, the least significant byte, holds the byte value that is to -;; be tested for membership within the range specified by operand 2. -;; The bytes of operand 2 are organized as xx:xx:hi:lo. -;; -;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if -;; lo <= vv and vv <= hi. Otherwise, set the GT bit to 0. The other -;; 3 bits of the target CR register are all set to 0. -(define_insn "*cmprb_internal" - [(set (match_operand:CC 0 "cc_reg_operand" "=y") - (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") - (match_operand:SI 2 "gpc_reg_operand" "r")] - UNSPEC_CMPRB))] - "TARGET_P9_MISC" - "cmprb %0,0,%1,%2" - [(set_attr "type" "logical")]) - -;; Set operand 0 register to -1 if the LT bit (0x8) of condition -;; register operand 1 is on. Otherwise, set operand 0 register to 1 -;; if the GT bit (0x4) of condition register operand 1 is on. -;; Otherwise, set operand 0 to 0. Note that the result stored into -;; register operand 0 is non-zero iff either the LT or GT bits are on -;; within condition register operand 1. -(define_insn "setb_signed" - [(set (match_operand:SI 0 "gpc_reg_operand" "=r") - (if_then_else:SI (lt (match_operand:CC 1 "cc_reg_operand" "y") - (const_int 0)) - (const_int -1) - (if_then_else (gt (match_dup 1) - (const_int 0)) - (const_int 1) - (const_int 0))))] - "TARGET_P9_MISC" - "setb %0,%1" - [(set_attr "type" "logical")]) - -(define_insn "setb_unsigned" - [(set (match_operand:SI 0 "gpc_reg_operand" "=r") - (if_then_else:SI (ltu (match_operand:CCUNS 1 "cc_reg_operand" "y") - (const_int 0)) - (const_int -1) - (if_then_else (gtu (match_dup 1) - (const_int 0)) - (const_int 1) - (const_int 0))))] - "TARGET_P9_MISC" - "setb %0,%1" - [(set_attr "type" "logical")]) - -;; Test byte within two ranges. -;; -;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx -;; represents a byte whose value is ignored in this context and -;; vv, the least significant byte, holds the byte value that is to -;; be tested for membership within the range specified by operand 2. -;; The bytes of operand 2 are organized as hi_1:lo_1:hi_2:lo_2. -;; -;; Return in target register operand 0 a value of 1 if (lo_1 <= vv and -;; vv <= hi_1) or if (lo_2 <= vv and vv <= hi_2). Otherwise, set register -;; operand 0 to 0. -;; -;; Though the instructions to which this expansion maps operate on -;; 64-bit registers, the current implementation only operates on -;; SI-mode operands as the high-order bits provide no information -;; that is not already available in the low-order bits. To avoid the -;; costs of data widening operations, future enhancements might allow -;; DI mode for operand 0 and/or might allow operand 1 to be QI mode. -(define_expand "cmprb2" - [(set (match_dup 3) - (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") - (match_operand:SI 2 "gpc_reg_operand" "r")] - UNSPEC_CMPRB2)) - (set (match_operand:SI 0 "gpc_reg_operand" "=r") - (if_then_else:SI (lt (match_dup 3) - (const_int 0)) - (const_int -1) - (if_then_else (gt (match_dup 3) - (const_int 0)) - (const_int 1) - (const_int 0))))] - "TARGET_P9_MISC" -{ - operands[3] = gen_reg_rtx (CCmode); -}) - -;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx -;; represents a byte whose value is ignored in this context and -;; vv, the least significant byte, holds the byte value that is to -;; be tested for membership within the ranges specified by operand 2. -;; The bytes of operand 2 are organized as hi_1:lo_1:hi_2:lo_2. -;; -;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if -;; (lo_1 <= vv and vv <= hi_1) or if (lo_2 <= vv and vv <= hi_2). -;; Otherwise, set the GT bit to 0. The other 3 bits of the target -;; CR register are all set to 0. -(define_insn "*cmprb2_internal" - [(set (match_operand:CC 0 "cc_reg_operand" "=y") - (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") - (match_operand:SI 2 "gpc_reg_operand" "r")] - UNSPEC_CMPRB2))] - "TARGET_P9_MISC" - "cmprb %0,1,%1,%2" - [(set_attr "type" "logical")]) - -;; Test byte membership within set of 8 bytes. -;; -;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx -;; represents a byte whose value is ignored in this context and -;; vv, the least significant byte, holds the byte value that is to -;; be tested for membership within the set specified by operand 2. -;; The bytes of operand 2 are organized as e0:e1:e2:e3:e4:e5:e6:e7. -;; -;; Return in target register operand 0 a value of 1 if vv equals one -;; of the values e0, e1, e2, e3, e4, e5, e6, or e7. Otherwise, set -;; register operand 0 to 0. Note that the 8 byte values held within -;; operand 2 need not be unique. -;; -;; Though the instructions to which this expansion maps operate on -;; 64-bit registers, the current implementation requires that operands -;; 0 and 1 have mode SI as the high-order bits provide no information -;; that is not already available in the low-order bits. To avoid the -;; costs of data widening operations, future enhancements might allow -;; DI mode for operand 0 and/or might allow operand 1 to be QI mode. -(define_expand "cmpeqb" - [(set (match_dup 3) - (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") - (match_operand:DI 2 "gpc_reg_operand" "r")] - UNSPEC_CMPEQB)) - (set (match_operand:SI 0 "gpc_reg_operand" "=r") - (if_then_else:SI (lt (match_dup 3) - (const_int 0)) - (const_int -1) - (if_then_else (gt (match_dup 3) - (const_int 0)) - (const_int 1) - (const_int 0))))] - "TARGET_P9_MISC && TARGET_64BIT" -{ - operands[3] = gen_reg_rtx (CCmode); -}) - -;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx -;; represents a byte whose value is ignored in this context and -;; vv, the least significant byte, holds the byte value that is to -;; be tested for membership within the set specified by operand 2. -;; The bytes of operand 2 are organized as e0:e1:e2:e3:e4:e5:e6:e7. -;; -;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if vv -;; equals one of the values e0, e1, e2, e3, e4, e5, e6, or e7. Otherwise, -;; set the GT bit to zero. The other 3 bits of the target CR register -;; are all set to 0. -(define_insn "*cmpeqb_internal" - [(set (match_operand:CC 0 "cc_reg_operand" "=y") - (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") - (match_operand:DI 2 "gpc_reg_operand" "r")] - UNSPEC_CMPEQB))] - "TARGET_P9_MISC && TARGET_64BIT" - "cmpeqb %0,%1,%2" - [(set_attr "type" "logical")]) - (define_expand "bcd_" [(parallel [(set (reg:CCFP CR6_REGNO) (compare:CCFP diff --git a/gcc/config/rs6000/crypto.md b/gcc/config/rs6000/crypto.md index 0f34e141580..5dc569996e2 100644 --- a/gcc/config/rs6000/crypto.md +++ b/gcc/config/rs6000/crypto.md @@ -48,6 +48,9 @@ ;; Iterator for VSHASIGMAD/VSHASIGMAW (define_mode_iterator CR_hash [V4SI V2DI]) +;; Iterator for VSBOX/VCIPHER/VNCIPHER/VCIPHERLAST/VNCIPHERLAST +(define_mode_iterator CR_vqdi [V16QI V2DI]) + ;; Iterator for the other crypto functions (define_int_iterator CR_code [UNSPEC_VCIPHER UNSPEC_VNCIPHER @@ -60,10 +63,10 @@ (UNSPEC_VNCIPHERLAST "vncipherlast")]) ;; 2 operand crypto instructions -(define_insn "crypto_" - [(set (match_operand:V2DI 0 "register_operand" "=v") - (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "v") - (match_operand:V2DI 2 "register_operand" "v")] +(define_insn "crypto__" + [(set (match_operand:CR_vqdi 0 "register_operand" "=v") + (unspec:CR_vqdi [(match_operand:CR_vqdi 1 "register_operand" "v") + (match_operand:CR_vqdi 2 "register_operand" "v")] CR_code))] "TARGET_CRYPTO" " %0,%1,%2" @@ -90,9 +93,9 @@ [(set_attr "type" "vecperm")]) ;; 1 operand crypto instruction -(define_insn "crypto_vsbox" - [(set (match_operand:V2DI 0 "register_operand" "=v") - (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "v")] +(define_insn "crypto_vsbox_" + [(set (match_operand:CR_vqdi 0 "register_operand" "=v") + (unspec:CR_vqdi [(match_operand:CR_vqdi 1 "register_operand" "v")] UNSPEC_VSBOX))] "TARGET_CRYPTO" "vsbox %0,%1" diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h index cea1aa94b0c..ab0ef92612c 100644 --- a/gcc/config/rs6000/darwin.h +++ b/gcc/config/rs6000/darwin.h @@ -53,17 +53,28 @@ #define TARGET_OS_CPP_BUILTINS() \ do \ { \ - if (!TARGET_64BIT) builtin_define ("__ppc__"); \ - if (TARGET_64BIT) builtin_define ("__ppc64__"); \ builtin_define ("__POWERPC__"); \ + builtin_define ("__PPC__"); \ + if (TARGET_64BIT) \ + { \ + builtin_define ("__ppc64__"); \ + builtin_define ("__PPC64__"); \ + builtin_define ("__powerpc64__"); \ + builtin_assert ("cpu=powerpc64"); \ + builtin_assert ("machine=powerpc64"); \ + } \ + else \ + { \ + builtin_define ("__ppc__"); \ + builtin_define_std ("PPC"); \ + builtin_assert ("cpu=powerpc"); \ + builtin_assert ("machine=powerpc"); \ + } \ builtin_define ("__NATURAL_ALIGNMENT__"); \ darwin_cpp_builtins (pfile); \ } \ while (0) -/* Generate branch islands stubs if this is true. */ -extern int darwin_emit_branch_islands; - #define SUBTARGET_OVERRIDE_OPTIONS darwin_rs6000_override_options () #define C_COMMON_OVERRIDE_OPTIONS do { \ @@ -98,11 +109,10 @@ extern int darwin_emit_branch_islands; % 10.5 mmacosx-version-min= -lcrt1.o) \ + %:version-compare(>< 10.5 10.7 mmacosx-version-min= -lcrt1.10.5.o) \ + %{fgnu-tm: -lcrttms.o}" + +/* crt2.o is at least partially required for 10.3.x and earlier. + It deals with registration of the unwind frames, where this is not + automatically provided by the system. So we need it for any case that + might use exceptions. */ +#undef DARWIN_CRT2_SPEC #define DARWIN_CRT2_SPEC \ - "%{!m64:%:version-compare(!> 10.4 mmacosx-version-min= crt2.o%s)}" +"%{!m64:%{shared-libgcc|static-libstdc++|fexceptions|fobjc-exceptions|fgnu-runtime: \ + %:version-compare(!> 10.4 mmacosx-version-min= crt2.o%s) \ + }}" + +/* crt3 deals with providing cxa_atexit on earlier systems (or fixing it up, + for broken versions). It's only needed for c++ code, so we can make it + conditional on shared-libgcc since that's forced on for c++. */ +#undef DARWIN_CRT3_SPEC +#define DARWIN_CRT3_SPEC \ +"%{!m64:%{shared-libgcc|static-libstdc++: \ + %:version-compare(>< 10.4 10.5 mmacosx-version-min= crt3.o%s) \ + %:version-compare(!> 10.4 mmacosx-version-min= crt3_2.o%s) \ + }}" + +/* As for crt1, we need to force the dylib crt for 10.6. */ +#undef DARWIN_DYLIB1_SPEC +#define DARWIN_DYLIB1_SPEC \ + "%:version-compare(!> 10.5 mmacosx-version-min= -ldylib1.o) \ + %:version-compare(>< 10.5 10.7 mmacosx-version-min= -ldylib1.10.5.o)" + +/* Likewise, the bundle crt. */ +#undef DARWIN_BUNDLE1_SPEC +#define DARWIN_BUNDLE1_SPEC \ +"%{!static:%:version-compare(< 10.7 mmacosx-version-min= -lbundle1.o) \ + %{fgnu-tm: -lcrttms.o}}" + +/* The PPC regs save/restore functions are leaves and could, conceivably + be used by the tm destructor. */ +#undef ENDFILE_SPEC +#define ENDFILE_SPEC TM_DESTRUCTOR " -lef_ppc" #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ @@ -146,17 +196,45 @@ extern int darwin_emit_branch_islands; #undef RS6000_PIC_OFFSET_TABLE_REGNUM #define RS6000_PIC_OFFSET_TABLE_REGNUM 31 -/* Pad the outgoing args area to 16 bytes instead of the usual 8. */ +/* Darwin's stack must remain 16-byte aligned for both 32 and 64 bit + ABIs. */ + +#undef STACK_BOUNDARY +#define STACK_BOUNDARY 128 + +/* Offset within stack frame to start allocating local variables at. + For supported Darwin versions, FRAME_GROWS_DOWNWARD is true, therefore + this value is the offset to the END of the first local allocated. + + On the RS/6000, the frame pointer is the same as the stack pointer, + except for dynamic allocations. So we start after the fixed area and + outgoing parameter area. + + If the function uses dynamic stack space (CALLS_ALLOCA is set), that + space needs to be aligned to STACK_BOUNDARY, i.e. the sum of the + sizes of the fixed area and the parameter area must be a multiple of + STACK_BOUNDARY. */ #undef RS6000_STARTING_FRAME_OFFSET #define RS6000_STARTING_FRAME_OFFSET \ - (RS6000_ALIGN (crtl->outgoing_args_size, 16) \ - + RS6000_SAVE_AREA) + (cfun->calls_alloca \ + ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16) \ + : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA)) + +/* Offset from the stack pointer register to an item dynamically + allocated on the stack, e.g., by `alloca'. + + The default value for this macro is `STACK_POINTER_OFFSET' plus the + length of the outgoing arguments. The default is correct for most + machines. See `function.c' for details. + + This value must be a multiple of STACK_BOUNDARY (hard coded in + `emit-rtl.c'). */ #undef STACK_DYNAMIC_OFFSET #define STACK_DYNAMIC_OFFSET(FUNDECL) \ - (RS6000_ALIGN (crtl->outgoing_args_size.to_constant (), 16) \ - + (STACK_POINTER_OFFSET)) + RS6000_ALIGN (crtl->outgoing_args_size.to_constant() \ + + STACK_POINTER_OFFSET, 16) /* Darwin uses a function call if everything needs to be saved/restored. */ @@ -237,9 +315,9 @@ extern int darwin_emit_branch_islands; /* This is supported in cctools 465 and later. The macro test above prevents using it in earlier build environments. */ #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \ - if ((LOG) != 0) \ + if ((LOG) > 0) \ { \ - if ((MAX_SKIP) == 0) \ + if ((MAX_SKIP) <= 0) \ fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ else \ fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \ @@ -354,6 +432,7 @@ extern int darwin_emit_branch_islands; do \ { \ DARWIN_REGISTER_TARGET_PRAGMAS(); \ + targetm.target_option.pragma_parse = rs6000_pragma_target_parse; \ targetm.resolve_overloaded_builtin = altivec_resolve_overloaded_builtin; \ } \ while (0) @@ -413,6 +492,9 @@ do { \ this will need to be modified similar to the x86 case. */ #define TARGET_FOLD_BUILTIN SUBTARGET_FOLD_BUILTIN +/* First available SYMBOL flag bit for use by subtargets. */ +#define SYMBOL_FLAG_SUBT_DEP (SYMBOL_FLAG_MACH_DEP) + /* Use standard DWARF numbering for DWARF debugging information. */ #define RS6000_USE_DWARF_NUMBERING diff --git a/gcc/config/rs6000/darwin.md b/gcc/config/rs6000/darwin.md index 48fd5b9613c..157326d3559 100644 --- a/gcc/config/rs6000/darwin.md +++ b/gcc/config/rs6000/darwin.md @@ -137,38 +137,6 @@ You should have received a copy of the GNU General Public License [(set_attr "type" "store") (set_attr "length" "4")]) -;; 64-bit MachO load/store support -(define_insn "movdi_low" - [(set (match_operand:DI 0 "gpc_reg_operand" "=r,*!d") - (mem:DI (lo_sum:DI (match_operand:DI 1 "gpc_reg_operand" "b,b") - (match_operand 2 "" ""))))] - "TARGET_MACHO && TARGET_64BIT" - "@ - ld %0,lo16(%2)(%1) - lfd %0,lo16(%2)(%1)" - [(set_attr "type" "load") - (set_attr "length" "4")]) - -(define_insn "movsi_low_st" - [(set (mem:SI (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b") - (match_operand 2 "" ""))) - (match_operand:SI 0 "gpc_reg_operand" "r"))] - "TARGET_MACHO && ! TARGET_64BIT" - "stw %0,lo16(%2)(%1)" - [(set_attr "type" "store") - (set_attr "length" "4")]) - -(define_insn "movdi_low_st" - [(set (mem:DI (lo_sum:DI (match_operand:DI 1 "gpc_reg_operand" "b,b") - (match_operand 2 "" ""))) - (match_operand:DI 0 "gpc_reg_operand" "r,*!d"))] - "TARGET_MACHO && TARGET_64BIT" - "@ - std %0,lo16(%2)(%1) - stfd %0,lo16(%2)(%1)" - [(set_attr "type" "store") - (set_attr "length" "4")]) - ;; Mach-O PIC trickery. (define_expand "macho_high" [(set (match_operand 0 "") diff --git a/gcc/config/rs6000/darwin32-biarch.h b/gcc/config/rs6000/darwin32-biarch.h new file mode 100644 index 00000000000..743aabfcea2 --- /dev/null +++ b/gcc/config/rs6000/darwin32-biarch.h @@ -0,0 +1,49 @@ +/* Target definitions for PowerPC running Darwin (Mac OS X) for a 32b host + with a 64b miultilib. + Copyright (C) 2019 Free Software Foundation, Inc. + + 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 + . */ + +#undef DARWIN_ARCH_SPEC +#define DARWIN_ARCH_SPEC "%{m64:ppc64;:ppc}" + +#undef DARWIN_SUBARCH_SPEC +#define DARWIN_SUBARCH_SPEC " \ + %{m64: ppc64} \ + %{!m64: \ + %{mcpu=601:ppc601; \ + mcpu=603:ppc603; \ + mcpu=603e:ppc603; \ + mcpu=604:ppc604; \ + mcpu=604e:ppc604e; \ + mcpu=740:ppc750; \ + mcpu=750:ppc750; \ + mcpu=G3:ppc750; \ + mcpu=7400:ppc7400; \ + mcpu=G4:ppc7400; \ + mcpu=7450:ppc7450; \ + mcpu=970:ppc970; \ + mcpu=power4:ppc970; \ + mcpu=G5:ppc970; \ + :ppc}}" + +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS \ + DARWIN_EXTRA_SPECS \ + { "darwin_arch", DARWIN_ARCH_SPEC }, \ + { "darwin_crt2", DARWIN_CRT2_SPEC }, \ + { "darwin_subarch", DARWIN_SUBARCH_SPEC }, diff --git a/gcc/config/rs6000/darwin64.h b/gcc/config/rs6000/darwin64-biarch.h similarity index 67% rename from gcc/config/rs6000/darwin64.h rename to gcc/config/rs6000/darwin64-biarch.h index 11c77b8dfee..4f789544b9e 100644 --- a/gcc/config/rs6000/darwin64.h +++ b/gcc/config/rs6000/darwin64-biarch.h @@ -1,5 +1,6 @@ -/* Target definitions for PowerPC running Darwin (Mac OS X). - Copyright (C) 2006-2018 Free Software Foundation, Inc. +/* Target definitions for PowerPC64 running Darwin (Mac OS X) for a 64b host + supporting a 32b multilib. + Copyright (C) 2006-2019 Free Software Foundation, Inc. Contributed by Apple Computer Inc. This file is part of GCC. @@ -25,8 +26,13 @@ #undef DARWIN_ARCH_SPEC #define DARWIN_ARCH_SPEC "%{m32:ppc;:ppc64}" +/* Actually, there's really only 970 as an active option. */ #undef DARWIN_SUBARCH_SPEC #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC -#undef DARWIN_CRT2_SPEC -#define DARWIN_CRT2_SPEC "" +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS \ + DARWIN_EXTRA_SPECS \ + { "darwin_arch", DARWIN_ARCH_SPEC }, \ + { "darwin_crt2", "" }, \ + { "darwin_subarch", DARWIN_SUBARCH_SPEC }, diff --git a/gcc/config/rs6000/darwin7.h b/gcc/config/rs6000/darwin7.h index d35b65d699e..85ea18e53e0 100644 --- a/gcc/config/rs6000/darwin7.h +++ b/gcc/config/rs6000/darwin7.h @@ -28,5 +28,10 @@ along with GCC; see the file COPYING3. If not see %:version-compare(!< 10.3 mmacosx-version-min= -lmx)\ -lSystem}" +/* This generation of tools (specifically the archive tool) did not + export weak symbols from the TOC. */ +#undef TARGET_WEAK_NOT_IN_ARCHIVE_TOC +#define TARGET_WEAK_NOT_IN_ARCHIVE_TOC 1 + #undef DEF_MIN_OSX_VERSION #define DEF_MIN_OSX_VERSION "10.3.9" diff --git a/gcc/config/rs6000/emmintrin.h b/gcc/config/rs6000/emmintrin.h index 412ece7355b..aed1625871d 100644 --- a/gcc/config/rs6000/emmintrin.h +++ b/gcc/config/rs6000/emmintrin.h @@ -85,6 +85,9 @@ typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__)); typedef long long __m128i_u __attribute__ ((__vector_size__ (16), __may_alias__, __aligned__ (1))); typedef double __m128d_u __attribute__ ((__vector_size__ (16), __may_alias__, __aligned__ (1))); +/* Define two value permute mask */ +#define _MM_SHUFFLE2(x,y) (((x) << 1) | (y)) + /* Create a vector with element 0 as F and the rest zero. */ extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_set_sd (double __F) diff --git a/gcc/config/rs6000/mmintrin.h b/gcc/config/rs6000/mmintrin.h index b15dd9bf242..497ecdf7895 100644 --- a/gcc/config/rs6000/mmintrin.h +++ b/gcc/config/rs6000/mmintrin.h @@ -581,7 +581,7 @@ _mm_sub_pi32 (__m64 __m1, __m64 __m2) extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _m_psubd (__m64 __m1, __m64 __m2) { - return _mm_add_pi32 (__m1, __m2); + return _mm_sub_pi32 (__m1, __m2); } extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) diff --git a/gcc/config/rs6000/power9.md b/gcc/config/rs6000/power9.md index 79ebbe47e08..cc4a329c6aa 100644 --- a/gcc/config/rs6000/power9.md +++ b/gcc/config/rs6000/power9.md @@ -236,6 +236,9 @@ (eq_attr "cpu" "power9")) "DU_super_power9,LSU_pair_power9") +; Store forwarding latency is 6 +(define_bypass 6 "power9-*store*" "power9-*load*") + (define_insn_reservation "power9-larx" 4 (and (eq_attr "type" "load_l") (eq_attr "cpu" "power9")) diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index f526b652bc9..002e394b252 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -1085,8 +1085,7 @@ return 1; /* Allow any integer constant. */ - if (GET_MODE_CLASS (mode) == MODE_INT - && CONST_SCALAR_INT_P (op)) + if (SCALAR_INT_MODE_P (mode) && CONST_SCALAR_INT_P (op)) return 1; /* Allow easy vector constants. */ diff --git a/gcc/config/rs6000/rs6000-builtin.def b/gcc/config/rs6000/rs6000-builtin.def index 5abbd3e791b..fa0f3f1e8a5 100644 --- a/gcc/config/rs6000/rs6000-builtin.def +++ b/gcc/config/rs6000/rs6000-builtin.def @@ -1048,12 +1048,12 @@ BU_ALTIVEC_2 (VADDUWS, "vadduws", CONST, altivec_vadduws) BU_ALTIVEC_2 (VADDSWS, "vaddsws", CONST, altivec_vaddsws) BU_ALTIVEC_2 (VAND, "vand", CONST, andv4si3) BU_ALTIVEC_2 (VANDC, "vandc", CONST, andcv4si3) -BU_ALTIVEC_2 (VAVGUB, "vavgub", CONST, altivec_vavgub) -BU_ALTIVEC_2 (VAVGSB, "vavgsb", CONST, altivec_vavgsb) -BU_ALTIVEC_2 (VAVGUH, "vavguh", CONST, altivec_vavguh) -BU_ALTIVEC_2 (VAVGSH, "vavgsh", CONST, altivec_vavgsh) -BU_ALTIVEC_2 (VAVGUW, "vavguw", CONST, altivec_vavguw) -BU_ALTIVEC_2 (VAVGSW, "vavgsw", CONST, altivec_vavgsw) +BU_ALTIVEC_2 (VAVGUB, "vavgub", CONST, uavgv16qi3_ceil) +BU_ALTIVEC_2 (VAVGSB, "vavgsb", CONST, avgv16qi3_ceil) +BU_ALTIVEC_2 (VAVGUH, "vavguh", CONST, uavgv8hi3_ceil) +BU_ALTIVEC_2 (VAVGSH, "vavgsh", CONST, avgv8hi3_ceil) +BU_ALTIVEC_2 (VAVGUW, "vavguw", CONST, uavgv4si3_ceil) +BU_ALTIVEC_2 (VAVGSW, "vavgsw", CONST, avgv4si3_ceil) BU_ALTIVEC_2 (VCFUX, "vcfux", CONST, altivec_vcfux) BU_ALTIVEC_2 (VCFSX, "vcfsx", CONST, altivec_vcfsx) BU_ALTIVEC_2 (VCMPBFP, "vcmpbfp", CONST, altivec_vcmpbfp) @@ -1223,26 +1223,26 @@ BU_ALTIVEC_X (MTVSCR, "mtvscr", MISC) BU_ALTIVEC_X (MFVSCR, "mfvscr", MISC) BU_ALTIVEC_X (DSSALL, "dssall", MISC) BU_ALTIVEC_X (DSS, "dss", MISC) -BU_ALTIVEC_X (LVSL, "lvsl", MEM) -BU_ALTIVEC_X (LVSR, "lvsr", MEM) -BU_ALTIVEC_X (LVEBX, "lvebx", MEM) -BU_ALTIVEC_X (LVEHX, "lvehx", MEM) -BU_ALTIVEC_X (LVEWX, "lvewx", MEM) -BU_ALTIVEC_X (LVXL, "lvxl", MEM) -BU_ALTIVEC_X (LVXL_V2DF, "lvxl_v2df", MEM) -BU_ALTIVEC_X (LVXL_V2DI, "lvxl_v2di", MEM) -BU_ALTIVEC_X (LVXL_V4SF, "lvxl_v4sf", MEM) -BU_ALTIVEC_X (LVXL_V4SI, "lvxl_v4si", MEM) -BU_ALTIVEC_X (LVXL_V8HI, "lvxl_v8hi", MEM) -BU_ALTIVEC_X (LVXL_V16QI, "lvxl_v16qi", MEM) -BU_ALTIVEC_X (LVX, "lvx", MEM) -BU_ALTIVEC_X (LVX_V1TI, "lvx_v1ti", MEM) -BU_ALTIVEC_X (LVX_V2DF, "lvx_v2df", MEM) -BU_ALTIVEC_X (LVX_V2DI, "lvx_v2di", MEM) -BU_ALTIVEC_X (LVX_V4SF, "lvx_v4sf", MEM) -BU_ALTIVEC_X (LVX_V4SI, "lvx_v4si", MEM) -BU_ALTIVEC_X (LVX_V8HI, "lvx_v8hi", MEM) -BU_ALTIVEC_X (LVX_V16QI, "lvx_v16qi", MEM) +BU_ALTIVEC_X (LVSL, "lvsl", PURE) +BU_ALTIVEC_X (LVSR, "lvsr", PURE) +BU_ALTIVEC_X (LVEBX, "lvebx", PURE) +BU_ALTIVEC_X (LVEHX, "lvehx", PURE) +BU_ALTIVEC_X (LVEWX, "lvewx", PURE) +BU_ALTIVEC_X (LVXL, "lvxl", PURE) +BU_ALTIVEC_X (LVXL_V2DF, "lvxl_v2df", PURE) +BU_ALTIVEC_X (LVXL_V2DI, "lvxl_v2di", PURE) +BU_ALTIVEC_X (LVXL_V4SF, "lvxl_v4sf", PURE) +BU_ALTIVEC_X (LVXL_V4SI, "lvxl_v4si", PURE) +BU_ALTIVEC_X (LVXL_V8HI, "lvxl_v8hi", PURE) +BU_ALTIVEC_X (LVXL_V16QI, "lvxl_v16qi", PURE) +BU_ALTIVEC_X (LVX, "lvx", PURE) +BU_ALTIVEC_X (LVX_V1TI, "lvx_v1ti", PURE) +BU_ALTIVEC_X (LVX_V2DF, "lvx_v2df", PURE) +BU_ALTIVEC_X (LVX_V2DI, "lvx_v2di", PURE) +BU_ALTIVEC_X (LVX_V4SF, "lvx_v4sf", PURE) +BU_ALTIVEC_X (LVX_V4SI, "lvx_v4si", PURE) +BU_ALTIVEC_X (LVX_V8HI, "lvx_v8hi", PURE) +BU_ALTIVEC_X (LVX_V16QI, "lvx_v16qi", PURE) BU_ALTIVEC_X (STVX, "stvx", MEM) BU_ALTIVEC_X (STVX_V2DF, "stvx_v2df", MEM) BU_ALTIVEC_X (STVX_V2DI, "stvx_v2di", MEM) @@ -1250,10 +1250,10 @@ BU_ALTIVEC_X (STVX_V4SF, "stvx_v4sf", MEM) BU_ALTIVEC_X (STVX_V4SI, "stvx_v4si", MEM) BU_ALTIVEC_X (STVX_V8HI, "stvx_v8hi", MEM) BU_ALTIVEC_X (STVX_V16QI, "stvx_v16qi", MEM) -BU_ALTIVEC_C (LVLX, "lvlx", MEM) -BU_ALTIVEC_C (LVLXL, "lvlxl", MEM) -BU_ALTIVEC_C (LVRX, "lvrx", MEM) -BU_ALTIVEC_C (LVRXL, "lvrxl", MEM) +BU_ALTIVEC_C (LVLX, "lvlx", PURE) +BU_ALTIVEC_C (LVLXL, "lvlxl", PURE) +BU_ALTIVEC_C (LVRX, "lvrx", PURE) +BU_ALTIVEC_C (LVRXL, "lvrxl", PURE) BU_ALTIVEC_X (STVEBX, "stvebx", MEM) BU_ALTIVEC_X (STVEHX, "stvehx", MEM) BU_ALTIVEC_X (STVEWX, "stvewx", MEM) @@ -1764,15 +1764,15 @@ BU_VSX_P (XVCMPGEDP_P, "xvcmpgedp_p", CONST, vector_ge_v2df_p) BU_VSX_P (XVCMPGTDP_P, "xvcmpgtdp_p", CONST, vector_gt_v2df_p) /* VSX builtins that are handled as special cases. */ -BU_VSX_X (LXSDX, "lxsdx", MEM) -BU_VSX_X (LXVD2X_V1TI, "lxvd2x_v1ti", MEM) -BU_VSX_X (LXVD2X_V2DF, "lxvd2x_v2df", MEM) -BU_VSX_X (LXVD2X_V2DI, "lxvd2x_v2di", MEM) -BU_VSX_X (LXVDSX, "lxvdsx", MEM) -BU_VSX_X (LXVW4X_V4SF, "lxvw4x_v4sf", MEM) -BU_VSX_X (LXVW4X_V4SI, "lxvw4x_v4si", MEM) -BU_VSX_X (LXVW4X_V8HI, "lxvw4x_v8hi", MEM) -BU_VSX_X (LXVW4X_V16QI, "lxvw4x_v16qi", MEM) +BU_VSX_X (LXSDX, "lxsdx", PURE) +BU_VSX_X (LXVD2X_V1TI, "lxvd2x_v1ti", PURE) +BU_VSX_X (LXVD2X_V2DF, "lxvd2x_v2df", PURE) +BU_VSX_X (LXVD2X_V2DI, "lxvd2x_v2di", PURE) +BU_VSX_X (LXVDSX, "lxvdsx", PURE) +BU_VSX_X (LXVW4X_V4SF, "lxvw4x_v4sf", PURE) +BU_VSX_X (LXVW4X_V4SI, "lxvw4x_v4si", PURE) +BU_VSX_X (LXVW4X_V8HI, "lxvw4x_v8hi", PURE) +BU_VSX_X (LXVW4X_V16QI, "lxvw4x_v16qi", PURE) BU_VSX_X (STXSDX, "stxsdx", MEM) BU_VSX_X (STXVD2X_V1TI, "stxvd2x_v1ti", MEM) BU_VSX_X (STXVD2X_V2DF, "stxvd2x_v2df", MEM) @@ -1781,13 +1781,13 @@ BU_VSX_X (STXVW4X_V4SF, "stxvw4x_v4sf", MEM) BU_VSX_X (STXVW4X_V4SI, "stxvw4x_v4si", MEM) BU_VSX_X (STXVW4X_V8HI, "stxvw4x_v8hi", MEM) BU_VSX_X (STXVW4X_V16QI, "stxvw4x_v16qi", MEM) -BU_VSX_X (LD_ELEMREV_V1TI, "ld_elemrev_v1ti", MEM) -BU_VSX_X (LD_ELEMREV_V2DF, "ld_elemrev_v2df", MEM) -BU_VSX_X (LD_ELEMREV_V2DI, "ld_elemrev_v2di", MEM) -BU_VSX_X (LD_ELEMREV_V4SF, "ld_elemrev_v4sf", MEM) -BU_VSX_X (LD_ELEMREV_V4SI, "ld_elemrev_v4si", MEM) -BU_VSX_X (LD_ELEMREV_V8HI, "ld_elemrev_v8hi", MEM) -BU_VSX_X (LD_ELEMREV_V16QI, "ld_elemrev_v16qi", MEM) +BU_VSX_X (LD_ELEMREV_V1TI, "ld_elemrev_v1ti", PURE) +BU_VSX_X (LD_ELEMREV_V2DF, "ld_elemrev_v2df", PURE) +BU_VSX_X (LD_ELEMREV_V2DI, "ld_elemrev_v2di", PURE) +BU_VSX_X (LD_ELEMREV_V4SF, "ld_elemrev_v4sf", PURE) +BU_VSX_X (LD_ELEMREV_V4SI, "ld_elemrev_v4si", PURE) +BU_VSX_X (LD_ELEMREV_V8HI, "ld_elemrev_v8hi", PURE) +BU_VSX_X (LD_ELEMREV_V16QI, "ld_elemrev_v16qi", PURE) BU_VSX_X (ST_ELEMREV_V1TI, "st_elemrev_v1ti", MEM) BU_VSX_X (ST_ELEMREV_V2DF, "st_elemrev_v2df", MEM) BU_VSX_X (ST_ELEMREV_V2DI, "st_elemrev_v2di", MEM) @@ -2442,13 +2442,22 @@ BU_P9_OVERLOAD_2 (CMPRB2, "byte_in_either_range") BU_P9_OVERLOAD_2 (CMPEQB, "byte_in_set") /* 1 argument crypto functions. */ -BU_CRYPTO_1 (VSBOX, "vsbox", CONST, crypto_vsbox) +BU_CRYPTO_1 (VSBOX, "vsbox", CONST, crypto_vsbox_v2di) +BU_CRYPTO_1 (VSBOX_BE, "vsbox_be", CONST, crypto_vsbox_v16qi) /* 2 argument crypto functions. */ -BU_CRYPTO_2 (VCIPHER, "vcipher", CONST, crypto_vcipher) -BU_CRYPTO_2 (VCIPHERLAST, "vcipherlast", CONST, crypto_vcipherlast) -BU_CRYPTO_2 (VNCIPHER, "vncipher", CONST, crypto_vncipher) -BU_CRYPTO_2 (VNCIPHERLAST, "vncipherlast", CONST, crypto_vncipherlast) +BU_CRYPTO_2 (VCIPHER, "vcipher", CONST, crypto_vcipher_v2di) +BU_CRYPTO_2 (VCIPHER_BE, "vcipher_be", CONST, crypto_vcipher_v16qi) +BU_CRYPTO_2 (VCIPHERLAST, "vcipherlast", + CONST, crypto_vcipherlast_v2di) +BU_CRYPTO_2 (VCIPHERLAST_BE, "vcipherlast_be", + CONST, crypto_vcipherlast_v16qi) +BU_CRYPTO_2 (VNCIPHER, "vncipher", CONST, crypto_vncipher_v2di) +BU_CRYPTO_2 (VNCIPHER_BE, "vncipher_be", CONST, crypto_vncipher_v16qi) +BU_CRYPTO_2 (VNCIPHERLAST, "vncipherlast", + CONST, crypto_vncipherlast_v2di) +BU_CRYPTO_2 (VNCIPHERLAST_BE, "vncipherlast_be", + CONST, crypto_vncipherlast_v16qi) BU_CRYPTO_2A (VPMSUMB, "vpmsumb", CONST, crypto_vpmsumb) BU_CRYPTO_2A (VPMSUMH, "vpmsumh", CONST, crypto_vpmsumh) BU_CRYPTO_2A (VPMSUMW, "vpmsumw", CONST, crypto_vpmsumw) diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c index 7cbbf7af154..eb19c75bfa4 100644 --- a/gcc/config/rs6000/rs6000-c.c +++ b/gcc/config/rs6000/rs6000-c.c @@ -1570,11 +1570,18 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { { ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX_V2DF, RS6000_BTI_V2DF, RS6000_BTI_INTSI, ~RS6000_BTI_V2DF, 0 }, + { ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX_V2DF, + RS6000_BTI_V2DF, RS6000_BTI_INTSI, ~RS6000_BTI_double, 0 }, { ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX_V2DI, RS6000_BTI_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_V2DI, 0 }, + { ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX_V2DI, + RS6000_BTI_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_long_long, 0 }, { ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX_V2DI, RS6000_BTI_unsigned_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_unsigned_V2DI, 0 }, + { ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX_V2DI, + RS6000_BTI_unsigned_V2DI, RS6000_BTI_INTSI, + ~RS6000_BTI_unsigned_long_long, 0 }, { ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX_V2DI, RS6000_BTI_bool_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_bool_V2DI, 0 }, { ALTIVEC_BUILTIN_VEC_LD, ALTIVEC_BUILTIN_LVX_V4SF, @@ -3776,14 +3783,27 @@ const struct altivec_builtin_types altivec_overloaded_builtins[] = { { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DF, RS6000_BTI_void, RS6000_BTI_V2DF, RS6000_BTI_INTSI, ~RS6000_BTI_V2DF }, + { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DF, + RS6000_BTI_void, RS6000_BTI_V2DF, RS6000_BTI_INTSI, ~RS6000_BTI_double }, { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DI, RS6000_BTI_void, RS6000_BTI_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_V2DI }, + { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DI, + RS6000_BTI_void, RS6000_BTI_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_long_long }, { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DI, RS6000_BTI_void, RS6000_BTI_unsigned_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_unsigned_V2DI }, + { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DI, + RS6000_BTI_void, RS6000_BTI_unsigned_V2DI, RS6000_BTI_INTSI, + ~RS6000_BTI_unsigned_long_long }, { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DI, RS6000_BTI_void, RS6000_BTI_bool_V2DI, RS6000_BTI_INTSI, ~RS6000_BTI_bool_V2DI }, + { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DI, + RS6000_BTI_void, RS6000_BTI_bool_V2DI, RS6000_BTI_INTSI, + ~RS6000_BTI_long_long }, + { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V2DI, + RS6000_BTI_void, RS6000_BTI_bool_V2DI, RS6000_BTI_INTSI, + ~RS6000_BTI_unsigned_long_long }, { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V4SF, RS6000_BTI_void, RS6000_BTI_V4SF, RS6000_BTI_INTSI, ~RS6000_BTI_V4SF }, { ALTIVEC_BUILTIN_VEC_ST, ALTIVEC_BUILTIN_STVX_V4SF, @@ -6585,12 +6605,14 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, arg2 = fold_for_warn (arg2); - /* If the second argument is an integer constant, if the value is in - the expected range, generate the built-in code if we can. We need - 64-bit and direct move to extract the small integer vectors. */ - if (TREE_CODE (arg2) == INTEGER_CST - && wi::ltu_p (wi::to_wide (arg2), nunits)) + /* If the second argument is an integer constant, generate + the built-in code if we can. We need 64-bit and direct + move to extract the small integer vectors. */ + if (TREE_CODE (arg2) == INTEGER_CST) { + wide_int selector = wi::to_wide (arg2); + selector = wi::umod_trunc (selector, nunits); + arg2 = wide_int_to_tree (TREE_TYPE (arg2), selector); switch (mode) { default: @@ -6665,7 +6687,13 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, } if (call) - return build_call_expr (call, 2, arg1, arg2); + { + tree result = build_call_expr (call, 2, arg1, arg2); + /* Coerce the result to vector element type. May be no-op. */ + arg1_inner_type = TREE_TYPE (arg1_type); + result = fold_convert (arg1_inner_type, result); + return result; + } } /* Build *(((arg1_inner_type*)&(vector type){arg1})+arg2). */ @@ -6759,11 +6787,13 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, /* If we can use the VSX xxpermdi instruction, use that for insert. */ mode = TYPE_MODE (arg1_type); if ((mode == V2DFmode || mode == V2DImode) && VECTOR_UNIT_VSX_P (mode) - && TREE_CODE (arg2) == INTEGER_CST - && wi::ltu_p (wi::to_wide (arg2), 2)) + && TREE_CODE (arg2) == INTEGER_CST) { + wide_int selector = wi::to_wide (arg2); + selector = wi::umod_trunc (selector, 2); tree call = NULL_TREE; + arg2 = wide_int_to_tree (TREE_TYPE (arg2), selector); if (mode == V2DFmode) call = rs6000_builtin_decls[VSX_BUILTIN_VEC_SET_V2DF]; else if (mode == V2DImode) @@ -6775,11 +6805,12 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, return build_call_expr (call, 3, arg1, arg0, arg2); } else if (mode == V1TImode && VECTOR_UNIT_VSX_P (mode) - && TREE_CODE (arg2) == INTEGER_CST - && wi::eq_p (wi::to_wide (arg2), 0)) + && TREE_CODE (arg2) == INTEGER_CST) { tree call = rs6000_builtin_decls[VSX_BUILTIN_VEC_SET_V1TI]; + wide_int selector = wi::zero(32); + arg2 = wide_int_to_tree (TREE_TYPE (arg2), selector); /* Note, __builtin_vec_insert_ has vector and scalar types reversed. */ return build_call_expr (call, 3, arg1, arg0, arg2); @@ -6787,10 +6818,13 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl, /* Build *(((arg1_inner_type*)&(vector type){arg1})+arg2) = arg0. */ arg1_inner_type = TREE_TYPE (arg1_type); - arg2 = build_binary_op (loc, BIT_AND_EXPR, arg2, - build_int_cst (TREE_TYPE (arg2), - TYPE_VECTOR_SUBPARTS (arg1_type) - - 1), 0); + if (TYPE_VECTOR_SUBPARTS (arg1_type) == 1) + arg2 = build_int_cst (TREE_TYPE (arg2), 0); + else + arg2 = build_binary_op (loc, BIT_AND_EXPR, arg2, + build_int_cst (TREE_TYPE (arg2), + TYPE_VECTOR_SUBPARTS (arg1_type) + - 1), 0); decl = build_decl (loc, VAR_DECL, NULL_TREE, arg1_type); DECL_EXTERNAL (decl) = 0; TREE_PUBLIC (decl) = 0; diff --git a/gcc/config/rs6000/rs6000-p8swap.c b/gcc/config/rs6000/rs6000-p8swap.c index 071bc0c187d..c73120d4e55 100644 --- a/gcc/config/rs6000/rs6000-p8swap.c +++ b/gcc/config/rs6000/rs6000-p8swap.c @@ -792,6 +792,11 @@ rtx_is_swappable_p (rtx op, unsigned int *special) case UNSPEC_REDUC_PLUS: case UNSPEC_REDUC: return 1; + case UNSPEC_VPMSUM: + /* vpmsumd is not swappable, but vpmsum[bhw] are. */ + if (GET_MODE (op) == V2DImode) + return 0; + break; } } @@ -2317,7 +2322,14 @@ rs6000_analyze_swaps (function *fun) /* Pre-pass to recombine lvx and stvx patterns so we don't lose info. */ recombine_lvx_stvx_patterns (fun); + + /* Rebuild ud- and du-chains. */ + df_remove_problem (df_chain); df_process_deferred_rescans (); + df_set_flags (DF_RD_PRUNE_DEAD_DEFS); + df_chain_add_problem (DF_DU_CHAIN | DF_UD_CHAIN); + df_analyze (); + df_set_flags (DF_DEFER_INSN_RESCAN); /* Allocate structure to represent webs of insns. */ insn_entry = XCNEWVEC (swap_web_entry, get_max_uid ()); diff --git a/gcc/config/rs6000/rs6000-string.c b/gcc/config/rs6000/rs6000-string.c index 632d3359711..595f4fe87e9 100644 --- a/gcc/config/rs6000/rs6000-string.c +++ b/gcc/config/rs6000/rs6000-string.c @@ -35,6 +35,8 @@ #include "expr.h" #include "output.h" #include "target.h" +#include "profile-count.h" +#include "predict.h" /* Expand a block clear operation, and return 1 if successful. Return 0 if we should let the compiler generate normal code. @@ -85,14 +87,15 @@ expand_block_clear (rtx operands[]) if (! optimize_size && bytes > 8 * clear_step) return 0; + bool unaligned_vsx_ok = (bytes >= 32 && TARGET_EFFICIENT_UNALIGNED_VSX); + for (offset = 0; bytes > 0; offset += clear_bytes, bytes -= clear_bytes) { machine_mode mode = BLKmode; rtx dest; if (TARGET_ALTIVEC - && ((bytes >= 16 && align >= 128) - || (bytes >= 32 && TARGET_EFFICIENT_UNALIGNED_VSX))) + && (bytes >= 16 && (align >= 128 || unaligned_vsx_ok))) { clear_bytes = 16; mode = V4SImode; @@ -330,6 +333,7 @@ do_load_for_compare_from_addr (machine_mode mode, rtx dest, rtx addr, B is the second thing to be compared. CR is the condition code reg input, or NULL_RTX. TRUE_LABEL is the label to branch to if the condition is true. + P is the estimated branch probability for the branch. The return value is the CR used for the comparison. If CR is null_rtx, then a new register of CMPMODE is generated. @@ -338,7 +342,7 @@ do_load_for_compare_from_addr (machine_mode mode, rtx dest, rtx addr, static void do_ifelse (machine_mode cmpmode, rtx_code comparison, - rtx a, rtx b, rtx cr, rtx true_label) + rtx a, rtx b, rtx cr, rtx true_label, profile_probability br_prob) { gcc_assert ((a == NULL_RTX && b == NULL_RTX && cr != NULL_RTX) || (a != NULL_RTX && b != NULL_RTX)); @@ -356,7 +360,8 @@ do_ifelse (machine_mode cmpmode, rtx_code comparison, rtx cmp_rtx = gen_rtx_fmt_ee (comparison, VOIDmode, cr, const0_rtx); rtx ifelse = gen_rtx_IF_THEN_ELSE (VOIDmode, cmp_rtx, label_ref, pc_rtx); - rtx j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + rtx_insn *j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + add_reg_br_prob_note (j, br_prob); JUMP_LABEL (j) = true_label; LABEL_NUSES (true_label) += 1; } @@ -408,6 +413,54 @@ do_add3 (rtx dest, rtx src1, rtx src2) emit_insn (gen_addsi3 (dest, src1, src2)); } +/* Emit an and of the proper mode for DEST. + + DEST is the destination register for the and. + SRC1 is the first and input. + SRC2 is the second and input. + + Computes DEST = SRC1&SRC2. */ +static void +do_and3 (rtx dest, rtx src1, rtx src2) +{ + if (GET_MODE (dest) == DImode) + emit_insn (gen_anddi3 (dest, src1, src2)); + else + emit_insn (gen_andsi3 (dest, src1, src2)); +} + +/* Emit an cmpb of the proper mode for DEST. + + DEST is the destination register for the cmpb. + SRC1 is the first input. + SRC2 is the second input. + + Computes cmpb of SRC1, SRC2. */ +static void +do_cmpb3 (rtx dest, rtx src1, rtx src2) +{ + if (GET_MODE (dest) == DImode) + emit_insn (gen_cmpbdi3 (dest, src1, src2)); + else + emit_insn (gen_cmpbsi3 (dest, src1, src2)); +} + +/* Emit a rotl of the proper mode for DEST. + + DEST is the destination register for the and. + SRC1 is the first and input. + SRC2 is the second and input. + + Computes DEST = SRC1 rotated left by SRC2. */ +static void +do_rotl3 (rtx dest, rtx src1, rtx src2) +{ + if (GET_MODE (dest) == DImode) + emit_insn (gen_rotldi3 (dest, src1, src2)); + else + emit_insn (gen_rotlsi3 (dest, src1, src2)); +} + /* Generate rtl for a load, shift, and compare of less than a full word. LOAD_MODE is the machine mode for the loads. @@ -640,7 +693,7 @@ expand_compare_loop (rtx operands[]) { if (GET_MODE_SIZE (GET_MODE (bytes_rtx)) > GET_MODE_SIZE (word_mode)) /* Do not expect length longer than word_mode. */ - return false; + return false; else if (GET_MODE_SIZE (GET_MODE (bytes_rtx)) < GET_MODE_SIZE (word_mode)) { bytes_rtx = force_reg (GET_MODE (bytes_rtx), bytes_rtx); @@ -681,10 +734,10 @@ expand_compare_loop (rtx operands[]) /* Difference found is stored here before jump to diff_label. */ rtx diff = gen_reg_rtx (word_mode); - rtx j; + rtx_insn *j; /* Example of generated code for 35 bytes aligned 1 byte. - + mtctr 8 li 6,0 li 5,8 @@ -712,7 +765,7 @@ expand_compare_loop (rtx operands[]) popcntd 9,9 subfe 10,10,10 or 9,9,10 - + Compiled with -fno-reorder-blocks for clarity. */ /* Structure of what we're going to do: @@ -765,11 +818,11 @@ expand_compare_loop (rtx operands[]) /* Check for > max_bytes bytes. We want to bail out as quickly as possible if we have to go over to memcmp. */ do_ifelse (CCmode, GT, bytes_rtx, GEN_INT (max_bytes), - NULL_RTX, library_call_label); + NULL_RTX, library_call_label, profile_probability::even ()); /* Check for < loop_bytes bytes. */ do_ifelse (CCmode, LT, bytes_rtx, GEN_INT (loop_bytes), - NULL_RTX, cleanup_label); + NULL_RTX, cleanup_label, profile_probability::even ()); /* Loop compare bytes and iterations if bytes>max_bytes. */ rtx mb_reg = gen_reg_rtx (word_mode); @@ -810,7 +863,7 @@ expand_compare_loop (rtx operands[]) { rtx lab_after = gen_label_rtx (); do_ifelse (CCmode, LE, bytes_rtx, GEN_INT (max_bytes), - NULL_RTX, lab_after); + NULL_RTX, lab_after, profile_probability::even ()); emit_move_insn (loop_cmp, mb_reg); emit_move_insn (iter, mi_reg); emit_label (lab_after); @@ -881,7 +934,7 @@ expand_compare_loop (rtx operands[]) } do_ifelse (GET_MODE (dcond), NE, NULL_RTX, NULL_RTX, - dcond, diff_label); + dcond, diff_label, profile_probability::unlikely ()); if (TARGET_P9_MISC) { @@ -905,6 +958,7 @@ expand_compare_loop (rtx operands[]) else j = emit_jump_insn (gen_bdnztf_si (loop_top_label, ctr, ctr, eqrtx, dcond)); + add_reg_br_prob_note (j, profile_probability::likely ()); JUMP_LABEL (j) = loop_top_label; LABEL_NUSES (loop_top_label) += 1; } @@ -917,9 +971,11 @@ expand_compare_loop (rtx operands[]) code. If we exit here with a nonzero diff, it is because the second word differed. */ if (TARGET_P9_MISC) - do_ifelse (CCUNSmode, NE, NULL_RTX, NULL_RTX, dcond, diff_label); + do_ifelse (CCUNSmode, NE, NULL_RTX, NULL_RTX, dcond, + diff_label, profile_probability::unlikely ()); else - do_ifelse (CCmode, NE, diff, const0_rtx, NULL_RTX, diff_label); + do_ifelse (CCmode, NE, diff, const0_rtx, NULL_RTX, + diff_label, profile_probability::unlikely ()); if (library_call_label != NULL && bytes_is_const && bytes > max_bytes) { @@ -955,14 +1011,14 @@ expand_compare_loop (rtx operands[]) if (!bytes_is_const) { /* If we're dealing with runtime length, we have to check if - it's zero after the loop. When length is known at compile + it's zero after the loop. When length is known at compile time the no-remainder condition is dealt with above. By doing this after cleanup_label, we also deal with the case where length is 0 at the start and we bypass the loop with a branch to cleanup_label. */ emit_move_insn (target, const0_rtx); do_ifelse (CCmode, EQ, cmp_rem, const0_rtx, - NULL_RTX, final_label); + NULL_RTX, final_label, profile_probability::unlikely ()); } rtx final_cleanup = gen_label_rtx (); @@ -972,9 +1028,12 @@ expand_compare_loop (rtx operands[]) { /* If remainder length < word length, branch to final cleanup compare. */ + if (!bytes_is_const) - do_ifelse (CCmode, LT, cmp_rem, GEN_INT (load_mode_size), - NULL_RTX, final_cleanup); + { + do_ifelse (CCmode, LT, cmp_rem, GEN_INT (load_mode_size), + NULL_RTX, final_cleanup, profile_probability::even ()); + } /* load and compare 8B */ do_load_for_compare_from_addr (load_mode, d1_1, @@ -999,7 +1058,7 @@ expand_compare_loop (rtx operands[]) } do_ifelse (GET_MODE (dcond), NE, NULL_RTX, NULL_RTX, - dcond, diff_label); + dcond, diff_label, profile_probability::even ()); do_add3 (src1_addr, src1_addr, GEN_INT (load_mode_size)); do_add3 (src2_addr, src2_addr, GEN_INT (load_mode_size)); @@ -1010,9 +1069,8 @@ expand_compare_loop (rtx operands[]) else /* See if remaining length is now zero. We previously set target to 0 so we can just jump to the end. */ - do_ifelse (CCmode, EQ, cmp_rem, const0_rtx, - NULL_RTX, final_label); - + do_ifelse (CCmode, EQ, cmp_rem, const0_rtx, NULL_RTX, + final_label, profile_probability::unlikely ()); } /* Cases: @@ -1095,7 +1153,7 @@ expand_compare_loop (rtx operands[]) than one loop iteration, in which case go do the overlap load compare path. */ do_ifelse (CCmode, GT, bytes_rtx, GEN_INT (loop_bytes), - NULL_RTX, nonconst_overlap); + NULL_RTX, nonconst_overlap, profile_probability::even ()); rtx rem4k = gen_reg_rtx (word_mode); rtx dist1 = gen_reg_rtx (word_mode); @@ -1105,12 +1163,14 @@ expand_compare_loop (rtx operands[]) emit_insn (gen_andsi3 (dist1, src1_addr, GEN_INT (0xfff))); else emit_insn (gen_anddi3 (dist1, src1_addr, GEN_INT (0xfff))); - do_ifelse (CCmode, LE, dist1, rem4k, NULL_RTX, handle4k_label); + do_ifelse (CCmode, LE, dist1, rem4k, NULL_RTX, + handle4k_label, profile_probability::very_unlikely ()); if (word_mode == SImode) emit_insn (gen_andsi3 (dist2, src2_addr, GEN_INT (0xfff))); else emit_insn (gen_anddi3 (dist2, src2_addr, GEN_INT (0xfff))); - do_ifelse (CCmode, LE, dist2, rem4k, NULL_RTX, handle4k_label); + do_ifelse (CCmode, LE, dist2, rem4k, NULL_RTX, + handle4k_label, profile_probability::very_unlikely ()); /* We don't have a 4k boundary to deal with, so do a load/shift/compare and jump to diff. */ @@ -1158,6 +1218,7 @@ expand_compare_loop (rtx operands[]) else j = emit_jump_insn (gen_bdnztf_si (fc_loop, ctr, ctr, eqrtx, cond)); + add_reg_br_prob_note (j, profile_probability::likely ()); JUMP_LABEL (j) = fc_loop; LABEL_NUSES (fc_loop) += 1; @@ -1325,7 +1386,7 @@ expand_block_compare (rtx operands[]) rtx tmp_reg_src1 = gen_reg_rtx (word_mode); rtx tmp_reg_src2 = gen_reg_rtx (word_mode); /* P7/P8 code uses cond for subfc. but P9 uses - it for cmpld which needs CCUNSmode. */ + it for cmpld which needs CCUNSmode. */ rtx cond; if (TARGET_P9_MISC) cond = gen_reg_rtx (CCUNSmode); @@ -1485,7 +1546,8 @@ expand_block_compare (rtx operands[]) rtx ne_rtx = gen_rtx_NE (VOIDmode, cr, const0_rtx); rtx ifelse = gen_rtx_IF_THEN_ELSE (VOIDmode, ne_rtx, fin_ref, pc_rtx); - rtx j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + rtx_insn *j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + add_reg_br_prob_note (j, profile_probability::unlikely ()); JUMP_LABEL (j) = final_label; LABEL_NUSES (final_label) += 1; } @@ -1544,7 +1606,8 @@ expand_block_compare (rtx operands[]) rtx ne_rtx = gen_rtx_NE (VOIDmode, cond, const0_rtx); rtx ifelse = gen_rtx_IF_THEN_ELSE (VOIDmode, ne_rtx, cvt_ref, pc_rtx); - rtx j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + rtx_insn *j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + add_reg_br_prob_note (j, profile_probability::likely ()); JUMP_LABEL (j) = convert_label; LABEL_NUSES (convert_label) += 1; } @@ -1578,7 +1641,7 @@ expand_block_compare (rtx operands[]) emit_label (convert_label); /* We need to produce DI result from sub, then convert to target SI - while maintaining <0 / ==0 / >0 properties. This sequence works: + while maintaining <0 / ==0 / >0 properties. This sequence works: subfc L,A,B subfe H,H,H popcntd L,L @@ -1649,7 +1712,8 @@ expand_strncmp_align_check (rtx strncmp_label, rtx src, HOST_WIDE_INT bytes) rtx ifelse = gen_rtx_IF_THEN_ELSE (VOIDmode, cmp_rtx, lab_ref, pc_rtx); - rtx j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + rtx_insn *j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + add_reg_br_prob_note (j, profile_probability::unlikely ()); JUMP_LABEL (j) = strncmp_label; LABEL_NUSES (strncmp_label) += 1; } @@ -1847,18 +1911,18 @@ expand_strn_compare (rtx operands[], int no_length) rtx tmp_reg_src1 = gen_reg_rtx (word_mode); rtx tmp_reg_src2 = gen_reg_rtx (word_mode); + rtx src1_addr = force_reg (Pmode, XEXP (orig_src1, 0)); + rtx src2_addr = force_reg (Pmode, XEXP (orig_src2, 0)); + /* Generate sequence of ld/ldbrx, cmpb to compare out to the length specified. */ unsigned HOST_WIDE_INT bytes_to_compare = compare_length; while (bytes_to_compare > 0) { /* Compare sequence: - check each 8B with: ld/ld cmpd bne - If equal, use rldicr/cmpb to check for zero byte. + check each 8B with: ld/ld/cmpb/cmpb/orc./bne + cleanup code at end: - cmpb get byte that differs - cmpb look for zero byte - orc combine cntlzd get bit of first zero/diff byte subfic convert for rldcl use rldcl rldcl extract diff/zero byte @@ -1895,64 +1959,54 @@ expand_strn_compare (rtx operands[], int no_length) rid of the extra bytes. */ cmp_bytes = bytes_to_compare; - src1 = adjust_address (orig_src1, load_mode, offset); - src2 = adjust_address (orig_src2, load_mode, offset); - - if (!REG_P (XEXP (src1, 0))) - { - rtx src1_reg = copy_addr_to_reg (XEXP (src1, 0)); - src1 = replace_equiv_address (src1, src1_reg); - } - set_mem_size (src1, load_mode_size); - - if (!REG_P (XEXP (src2, 0))) - { - rtx src2_reg = copy_addr_to_reg (XEXP (src2, 0)); - src2 = replace_equiv_address (src2, src2_reg); - } - set_mem_size (src2, load_mode_size); - - do_load_for_compare (tmp_reg_src1, src1, load_mode); - do_load_for_compare (tmp_reg_src2, src2, load_mode); + rtx offset_rtx; + if (BYTES_BIG_ENDIAN || TARGET_AVOID_XFORM) + offset_rtx = GEN_INT (offset); + else + { + offset_rtx = gen_reg_rtx (Pmode); + emit_move_insn (offset_rtx, GEN_INT (offset)); + } + rtx addr1 = gen_rtx_PLUS (Pmode, src1_addr, offset_rtx); + rtx addr2 = gen_rtx_PLUS (Pmode, src2_addr, offset_rtx); + do_load_for_compare_from_addr (load_mode, tmp_reg_src1, addr1, orig_src1); + do_load_for_compare_from_addr (load_mode, tmp_reg_src2, addr2, orig_src2); /* We must always left-align the data we read, and clear any bytes to the right that are beyond the string. Otherwise the cmpb sequence won't produce the correct - results. The beginning of the compare will be done - with word_mode so will not have any extra shifts or - clear rights. */ + results. However if there is only one byte left, we + can just subtract to get the final result so the shifts + and clears are not needed. */ - if (load_mode_size < word_mode_size) - { - /* Rotate left first. */ - rtx sh = GEN_INT (BITS_PER_UNIT * (word_mode_size - load_mode_size)); - if (word_mode == DImode) - { - emit_insn (gen_rotldi3 (tmp_reg_src1, tmp_reg_src1, sh)); - emit_insn (gen_rotldi3 (tmp_reg_src2, tmp_reg_src2, sh)); - } - else - { - emit_insn (gen_rotlsi3 (tmp_reg_src1, tmp_reg_src1, sh)); - emit_insn (gen_rotlsi3 (tmp_reg_src2, tmp_reg_src2, sh)); - } - } + unsigned HOST_WIDE_INT remain = bytes_to_compare - cmp_bytes; + + /* Loading just a single byte is a special case. If we are + loading more than that, we have to check whether we are + looking at the entire chunk of data. If not, rotate left and + clear right so that bytes we aren't supposed to look at are + zeroed, and the first byte we are supposed to compare is + leftmost. */ - if (cmp_bytes < word_mode_size) + if (load_mode_size != 1) { - /* Now clear right. This plus the rotate can be - turned into a rldicr instruction. */ - HOST_WIDE_INT mb = BITS_PER_UNIT * (word_mode_size - cmp_bytes); - rtx mask = GEN_INT (HOST_WIDE_INT_M1U << mb); - if (word_mode == DImode) + if (load_mode_size < word_mode_size) { - emit_insn (gen_anddi3_mask (tmp_reg_src1, tmp_reg_src1, mask)); - emit_insn (gen_anddi3_mask (tmp_reg_src2, tmp_reg_src2, mask)); + /* Rotate left first. */ + rtx sh = GEN_INT (BITS_PER_UNIT + * (word_mode_size - load_mode_size)); + do_rotl3 (tmp_reg_src1, tmp_reg_src1, sh); + do_rotl3 (tmp_reg_src2, tmp_reg_src2, sh); } - else + + if (cmp_bytes < word_mode_size) { - emit_insn (gen_andsi3_mask (tmp_reg_src1, tmp_reg_src1, mask)); - emit_insn (gen_andsi3_mask (tmp_reg_src2, tmp_reg_src2, mask)); + /* Now clear right. This plus the rotate can be + turned into a rldicr instruction. */ + HOST_WIDE_INT mb = BITS_PER_UNIT * (word_mode_size - cmp_bytes); + rtx mask = GEN_INT (HOST_WIDE_INT_M1U << mb); + do_and3 (tmp_reg_src1, tmp_reg_src1, mask); + do_and3 (tmp_reg_src2, tmp_reg_src2, mask); } } @@ -1967,8 +2021,6 @@ expand_strn_compare (rtx operands[], int no_length) A == B: branch to result 0. A != B: cleanup code to compute result. */ - unsigned HOST_WIDE_INT remain = bytes_to_compare - cmp_bytes; - rtx dst_label; if (remain > 0 || equality_compare_rest) { @@ -1982,69 +2034,92 @@ expand_strn_compare (rtx operands[], int no_length) /* Branch to end and produce result of 0. */ dst_label = final_move_label; - rtx lab_ref = gen_rtx_LABEL_REF (VOIDmode, dst_label); - rtx cond = gen_reg_rtx (CCmode); - - /* Always produce the 0 result, it is needed if - cmpb finds a 0 byte in this chunk. */ - rtx tmp = gen_rtx_MINUS (word_mode, tmp_reg_src1, tmp_reg_src2); - rs6000_emit_dot_insn (result_reg, tmp, 1, cond); - - rtx cmp_rtx; - if (remain == 0 && !equality_compare_rest) - cmp_rtx = gen_rtx_EQ (VOIDmode, cond, const0_rtx); - else - cmp_rtx = gen_rtx_NE (VOIDmode, cond, const0_rtx); - - rtx ifelse = gen_rtx_IF_THEN_ELSE (VOIDmode, cmp_rtx, - lab_ref, pc_rtx); - rtx j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); - JUMP_LABEL (j) = dst_label; - LABEL_NUSES (dst_label) += 1; - - if (remain > 0 || equality_compare_rest) + if (load_mode_size == 1) { - /* Generate a cmpb to test for a 0 byte and branch - to final result if found. */ - rtx cmpb_zero = gen_reg_rtx (word_mode); - rtx lab_ref_fin = gen_rtx_LABEL_REF (VOIDmode, final_move_label); - rtx condz = gen_reg_rtx (CCmode); - rtx zero_reg = gen_reg_rtx (word_mode); - if (word_mode == SImode) + /* Special case for comparing just single byte. */ + if (equality_compare_rest) { - emit_insn (gen_movsi (zero_reg, GEN_INT (0))); - emit_insn (gen_cmpbsi3 (cmpb_zero, tmp_reg_src1, zero_reg)); - if (cmp_bytes < word_mode_size) - { - /* Don't want to look at zero bytes past end. */ - HOST_WIDE_INT mb = - BITS_PER_UNIT * (word_mode_size - cmp_bytes); - rtx mask = GEN_INT (HOST_WIDE_INT_M1U << mb); - emit_insn (gen_andsi3_mask (cmpb_zero, cmpb_zero, mask)); - } + /* Use subf./bne to branch to final_move_label if the + byte differs, otherwise fall through to the strncmp + call. We must also check for a zero byte here as we + must not make the library call if this is the end of + the string. */ + + rtx lab_ref = gen_rtx_LABEL_REF (VOIDmode, final_move_label); + rtx cond = gen_reg_rtx (CCmode); + rtx diff_rtx = gen_rtx_MINUS (word_mode, + tmp_reg_src1, tmp_reg_src2); + rs6000_emit_dot_insn (result_reg, diff_rtx, 2, cond); + rtx cmp_rtx = gen_rtx_NE (VOIDmode, cond, const0_rtx); + + rtx ifelse = gen_rtx_IF_THEN_ELSE (VOIDmode, cmp_rtx, + lab_ref, pc_rtx); + rtx_insn *j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + add_reg_br_prob_note (j, profile_probability::unlikely ()); + JUMP_LABEL (j) = final_move_label; + LABEL_NUSES (final_move_label) += 1; + + /* Check for zero byte here before fall through to + library call. This catches the case where the + strings are equal and end in a zero byte at this + position. */ + + rtx cond0 = gen_reg_rtx (CCmode); + emit_move_insn (cond0, gen_rtx_COMPARE (CCmode, tmp_reg_src1, + const0_rtx)); + + rtx cmp0eq_rtx = gen_rtx_EQ (VOIDmode, cond0, const0_rtx); + + rtx ifelse0 = gen_rtx_IF_THEN_ELSE (VOIDmode, cmp0eq_rtx, + lab_ref, pc_rtx); + rtx_insn *j0 = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse0)); + add_reg_br_prob_note (j0, profile_probability::unlikely ()); + JUMP_LABEL (j0) = final_move_label; + LABEL_NUSES (final_move_label) += 1; } else { - emit_insn (gen_movdi (zero_reg, GEN_INT (0))); - emit_insn (gen_cmpbdi3 (cmpb_zero, tmp_reg_src1, zero_reg)); - if (cmp_bytes < word_mode_size) - { - /* Don't want to look at zero bytes past end. */ - HOST_WIDE_INT mb = - BITS_PER_UNIT * (word_mode_size - cmp_bytes); - rtx mask = GEN_INT (HOST_WIDE_INT_M1U << mb); - emit_insn (gen_anddi3_mask (cmpb_zero, cmpb_zero, mask)); - } + /* This is the last byte to be compared so we can use + subf to compute the final result and branch + unconditionally to final_move_label. */ + + do_sub3 (result_reg, tmp_reg_src1, tmp_reg_src2); + + rtx fin_ref = gen_rtx_LABEL_REF (VOIDmode, final_move_label); + rtx j = emit_jump_insn (gen_rtx_SET (pc_rtx, fin_ref)); + JUMP_LABEL (j) = final_move_label; + LABEL_NUSES (final_move_label) += 1; + emit_barrier (); } + } + else + { + rtx cmpb_zero = gen_reg_rtx (word_mode); + rtx cmpb_diff = gen_reg_rtx (word_mode); + rtx zero_reg = gen_reg_rtx (word_mode); + rtx lab_ref = gen_rtx_LABEL_REF (VOIDmode, dst_label); + rtx cond = gen_reg_rtx (CCmode); - emit_move_insn (condz, gen_rtx_COMPARE (CCmode, cmpb_zero, zero_reg)); - rtx cmpnz_rtx = gen_rtx_NE (VOIDmode, condz, const0_rtx); - rtx ifelse = gen_rtx_IF_THEN_ELSE (VOIDmode, cmpnz_rtx, - lab_ref_fin, pc_rtx); - rtx j2 = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); - JUMP_LABEL (j2) = final_move_label; - LABEL_NUSES (final_move_label) += 1; + emit_move_insn (zero_reg, GEN_INT (0)); + do_cmpb3 (cmpb_diff, tmp_reg_src1, tmp_reg_src2); + do_cmpb3 (cmpb_zero, tmp_reg_src1, zero_reg); + rtx not_diff = gen_rtx_NOT (word_mode, cmpb_diff); + rtx orc_rtx = gen_rtx_IOR (word_mode, not_diff, cmpb_zero); + rs6000_emit_dot_insn (result_reg, orc_rtx, 2, cond); + + rtx cmp_rtx; + if (remain == 0 && !equality_compare_rest) + cmp_rtx = gen_rtx_EQ (VOIDmode, cond, const0_rtx); + else + cmp_rtx = gen_rtx_NE (VOIDmode, cond, const0_rtx); + + rtx ifelse = gen_rtx_IF_THEN_ELSE (VOIDmode, cmp_rtx, + lab_ref, pc_rtx); + rtx_insn *j = emit_jump_insn (gen_rtx_SET (pc_rtx, ifelse)); + add_reg_br_prob_note (j, profile_probability::unlikely ()); + JUMP_LABEL (j) = dst_label; + LABEL_NUSES (dst_label) += 1; } offset += cmp_bytes; @@ -2106,19 +2181,13 @@ expand_strn_compare (rtx operands[], int no_length) byte and generates the final result, taking into account zero bytes: - cmpb cmpb_result1, src1, src2 - cmpb cmpb_result2, src1, zero - orc cmpb_result1, cmp_result1, cmpb_result2 cntlzd get bit of first zero/diff byte addi convert for rldcl use rldcl rldcl extract diff/zero byte subf subtract for final result */ - rtx cmpb_diff = gen_reg_rtx (word_mode); - rtx cmpb_zero = gen_reg_rtx (word_mode); rtx rot_amt = gen_reg_rtx (word_mode); - rtx zero_reg = gen_reg_rtx (word_mode); rtx rot1_1 = gen_reg_rtx (word_mode); rtx rot1_2 = gen_reg_rtx (word_mode); @@ -2127,12 +2196,7 @@ expand_strn_compare (rtx operands[], int no_length) if (word_mode == SImode) { - emit_insn (gen_cmpbsi3 (cmpb_diff, tmp_reg_src1, tmp_reg_src2)); - emit_insn (gen_movsi (zero_reg, GEN_INT (0))); - emit_insn (gen_cmpbsi3 (cmpb_zero, tmp_reg_src1, zero_reg)); - emit_insn (gen_one_cmplsi2 (cmpb_diff,cmpb_diff)); - emit_insn (gen_iorsi3 (cmpb_diff, cmpb_diff, cmpb_zero)); - emit_insn (gen_clzsi2 (rot_amt, cmpb_diff)); + emit_insn (gen_clzsi2 (rot_amt, result_reg)); emit_insn (gen_addsi3 (rot_amt, rot_amt, GEN_INT (8))); emit_insn (gen_rotlsi3 (rot1_1, tmp_reg_src1, gen_lowpart (SImode, rot_amt))); @@ -2144,12 +2208,7 @@ expand_strn_compare (rtx operands[], int no_length) } else { - emit_insn (gen_cmpbdi3 (cmpb_diff, tmp_reg_src1, tmp_reg_src2)); - emit_insn (gen_movdi (zero_reg, GEN_INT (0))); - emit_insn (gen_cmpbdi3 (cmpb_zero, tmp_reg_src1, zero_reg)); - emit_insn (gen_one_cmpldi2 (cmpb_diff,cmpb_diff)); - emit_insn (gen_iordi3 (cmpb_diff, cmpb_diff, cmpb_zero)); - emit_insn (gen_clzdi2 (rot_amt, cmpb_diff)); + emit_insn (gen_clzdi2 (rot_amt, result_reg)); emit_insn (gen_adddi3 (rot_amt, rot_amt, GEN_INT (8))); emit_insn (gen_rotldi3 (rot1_1, tmp_reg_src1, gen_lowpart (SImode, rot_amt))); @@ -2167,6 +2226,25 @@ expand_strn_compare (rtx operands[], int no_length) return true; } +/* Generate loads and stores for a move of v4si mode using lvx/stvx. + This uses altivec_{l,st}vx__internal which use unspecs to + keep combine from changing what instruction gets used. + + DEST is the destination for the data. + SRC is the source of the data for the move. */ + +static rtx +gen_lvx_v4si_move (rtx dest, rtx src) +{ + gcc_assert (MEM_P (dest) ^ MEM_P (src)); + gcc_assert (GET_MODE (dest) == V4SImode && GET_MODE (src) == V4SImode); + + if (MEM_P (dest)) + return gen_altivec_stvx_v4si_internal (dest, src); + else + return gen_altivec_lvx_v4si_internal (dest, src); +} + /* Expand a block move operation, and return 1 if successful. Return 0 if we should let the compiler generate normal code. @@ -2219,11 +2297,11 @@ expand_block_move (rtx operands[]) /* Altivec first, since it will be faster than a string move when it applies, and usually not significantly larger. */ - if (TARGET_ALTIVEC && bytes >= 16 && (TARGET_EFFICIENT_UNALIGNED_VSX || align >= 128)) + if (TARGET_ALTIVEC && bytes >= 16 && align >= 128) { move_bytes = 16; mode = V4SImode; - gen_func.mov = gen_movv4si; + gen_func.mov = gen_lvx_v4si_move; } else if (bytes >= 8 && TARGET_POWERPC64 && (align >= 64 || !STRICT_ALIGNMENT)) diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index b0176588538..ea43713ce01 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -81,6 +81,8 @@ #include "case-cfn-macros.h" #include "ppc-auxv.h" #include "tree-ssa-propagate.h" +#include "tree-vrp.h" +#include "tree-ssanames.h" /* This file should be included last. */ #include "target-def.h" @@ -3878,10 +3880,22 @@ darwin_rs6000_override_options (void) rs6000_isa_flags |= OPTION_MASK_POWERPC64; warning (0, "%qs requires PowerPC64 architecture, enabling", "-m64"); } + + /* The linkers [ld64] that support 64Bit do not need the JBSR longcall + optimisation, and will not work with the most generic case (where the + symbol is undefined external, but there is no symbl stub). */ + if (TARGET_64BIT) + rs6000_default_long_calls = 0; + + /* ld_classic is (so far) still used for kernel (static) code, and supports + the JBSR longcall / branch islands. */ if (flag_mkernel) { rs6000_default_long_calls = 1; - rs6000_isa_flags |= OPTION_MASK_SOFT_FLOAT; + + /* Allow a kext author to do -mkernel -mhard-float. */ + if (! (rs6000_isa_flags_explicit & OPTION_MASK_SOFT_FLOAT)) + rs6000_isa_flags |= OPTION_MASK_SOFT_FLOAT; } /* Make -m64 imply -maltivec. Darwin's 64-bit ABI includes @@ -4631,6 +4645,13 @@ rs6000_option_override_internal (bool global_init_p) } else if (rs6000_long_double_type_size == 128) rs6000_long_double_type_size = FLOAT_PRECISION_TFmode; + else if (global_options_set.x_rs6000_ieeequad) + { + if (global_options.x_rs6000_ieeequad) + error ("%qs requires %qs", "-mabi=ieeelongdouble", "-mlong-double-128"); + else + error ("%qs requires %qs", "-mabi=ibmlongdouble", "-mlong-double-128"); + } /* Set -mabi=ieeelongdouble on some old targets. In the future, power server systems will also set long double to be IEEE 128-bit. AIX and Darwin @@ -4640,16 +4661,23 @@ rs6000_option_override_internal (bool global_init_p) if (!global_options_set.x_rs6000_ieeequad) rs6000_ieeequad = TARGET_IEEEQUAD_DEFAULT; - else if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT && TARGET_LONG_DOUBLE_128) + else { - static bool warned_change_long_double; - if (!warned_change_long_double) + if (global_options.x_rs6000_ieeequad + && (!TARGET_POPCNTD || !TARGET_VSX)) + error ("%qs requires full ISA 2.06 support", "-mabi=ieeelongdouble"); + + if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT && TARGET_LONG_DOUBLE_128) { - warned_change_long_double = true; - if (TARGET_IEEEQUAD) - warning (OPT_Wpsabi, "Using IEEE extended precision long double"); - else - warning (OPT_Wpsabi, "Using IBM extended precision long double"); + static bool warned_change_long_double; + if (!warned_change_long_double) + { + warned_change_long_double = true; + if (TARGET_IEEEQUAD) + warning (OPT_Wpsabi, "Using IEEE extended precision long double"); + else + warning (OPT_Wpsabi, "Using IBM extended precision long double"); + } } } @@ -7358,7 +7386,6 @@ rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt) default: break; case E_V1TImode: - gcc_assert (INTVAL (elt) == 0 && inner_mode == TImode); emit_move_insn (target, gen_lowpart (TImode, vec)); break; case E_V2DFmode: @@ -7409,6 +7436,10 @@ rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt) switch (mode) { + case E_V1TImode: + emit_move_insn (target, gen_lowpart (TImode, vec)); + return; + case E_V2DFmode: emit_insn (gen_vsx_extract_v2df_var (target, vec, elt)); return; @@ -7438,18 +7469,32 @@ rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt) } } - gcc_assert (CONST_INT_P (elt)); - /* Allocate mode-sized buffer. */ mem = assign_stack_temp (mode, GET_MODE_SIZE (mode)); emit_move_insn (mem, vec); + if (CONST_INT_P (elt)) + { + int modulo_elt = INTVAL (elt) % GET_MODE_NUNITS (mode); - /* Add offset to field within buffer matching vector element. */ - mem = adjust_address_nv (mem, inner_mode, - INTVAL (elt) * GET_MODE_SIZE (inner_mode)); + /* Add offset to field within buffer matching vector element. */ + mem = adjust_address_nv (mem, inner_mode, + modulo_elt * GET_MODE_SIZE (inner_mode)); + emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0)); + } + else + { + unsigned int ele_size = GET_MODE_SIZE (inner_mode); + rtx num_ele_m1 = GEN_INT (GET_MODE_NUNITS (mode) - 1); + rtx new_addr = gen_reg_rtx (Pmode); - emit_move_insn (target, adjust_address_nv (mem, inner_mode, 0)); + elt = gen_rtx_AND (Pmode, elt, num_ele_m1); + if (ele_size > 1) + elt = gen_rtx_MULT (Pmode, elt, GEN_INT (ele_size)); + new_addr = gen_rtx_PLUS (Pmode, XEXP (mem, 0), elt); + new_addr = change_address (mem, inner_mode, new_addr); + emit_move_insn (target, new_addr); + } } /* Helper function to return the register number of a RTX. */ @@ -7630,7 +7675,7 @@ rs6000_split_vec_extract_var (rtx dest, rtx src, rtx element, rtx tmp_gpr, rtx tmp_altivec) { machine_mode mode = GET_MODE (src); - machine_mode scalar_mode = GET_MODE (dest); + machine_mode scalar_mode = GET_MODE_INNER (GET_MODE (src)); unsigned scalar_size = GET_MODE_SIZE (scalar_mode); int byte_shift = exact_log2 (scalar_size); @@ -7641,6 +7686,10 @@ rs6000_split_vec_extract_var (rtx dest, rtx src, rtx element, rtx tmp_gpr, systems. */ if (MEM_P (src)) { + int num_elements = GET_MODE_NUNITS (mode); + rtx num_ele_m1 = GEN_INT (num_elements - 1); + + emit_insn (gen_anddi3 (element, element, num_ele_m1)); gcc_assert (REG_P (tmp_gpr)); emit_move_insn (dest, rs6000_adjust_vec_address (dest, src, element, tmp_gpr, scalar_mode)); @@ -7649,7 +7698,9 @@ rs6000_split_vec_extract_var (rtx dest, rtx src, rtx element, rtx tmp_gpr, else if (REG_P (src) || SUBREG_P (src)) { - int bit_shift = byte_shift + 3; + int num_elements = GET_MODE_NUNITS (mode); + int bits_in_element = mode_to_bits (GET_MODE_INNER (mode)); + int bit_shift = 7 - exact_log2 (num_elements); rtx element2; int dest_regno = regno_or_subregno (dest); int src_regno = regno_or_subregno (src); @@ -7725,7 +7776,7 @@ rs6000_split_vec_extract_var (rtx dest, rtx src, rtx element, rtx tmp_gpr, { if (!VECTOR_ELT_ORDER_BIG) { - rtx num_ele_m1 = GEN_INT (GET_MODE_NUNITS (mode) - 1); + rtx num_ele_m1 = GEN_INT (num_elements - 1); emit_insn (gen_anddi3 (tmp_gpr, element, num_ele_m1)); emit_insn (gen_subdi3 (tmp_gpr, num_ele_m1, tmp_gpr)); @@ -7783,8 +7834,8 @@ rs6000_split_vec_extract_var (rtx dest, rtx src, rtx element, rtx tmp_gpr, emit_insn (gen_vsx_vslo_v2di (tmp_altivec_di, src_v2di, tmp_altivec)); emit_move_insn (tmp_gpr_di, tmp_altivec_di); - emit_insn (gen_ashrdi3 (tmp_gpr_di, tmp_gpr_di, - GEN_INT (64 - (8 * scalar_size)))); + emit_insn (gen_lshrdi3 (tmp_gpr_di, tmp_gpr_di, + GEN_INT (64 - bits_in_element))); return; } @@ -8207,6 +8258,101 @@ address_offset (rtx op) return NULL_RTX; } +/* This tests that a lo_sum {constant, symbol, symbol+offset} is valid for + the mode. If we can't find (or don't know) the alignment of the symbol + we assume (optimistically) that it's sufficiently aligned [??? maybe we + should be pessimistic]. Offsets are validated in the same way as for + reg + offset. */ +static bool +darwin_rs6000_legitimate_lo_sum_const_p (rtx x, machine_mode mode) +{ + if (GET_CODE (x) == CONST) + x = XEXP (x, 0); + + if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_MACHOPIC_OFFSET) + x = XVECEXP (x, 0, 0); + + rtx sym = NULL_RTX; + unsigned HOST_WIDE_INT offset = 0; + + if (GET_CODE (x) == PLUS) + { + sym = XEXP (x, 0); + if (! SYMBOL_REF_P (sym)) + return false; + if (!CONST_INT_P (XEXP (x, 1))) + return false; + offset = INTVAL (XEXP (x, 1)); + } + else if (SYMBOL_REF_P (x)) + sym = x; + else if (CONST_INT_P (x)) + offset = INTVAL (x); + else if (GET_CODE (x) == LABEL_REF) + offset = 0; // We assume code labels are Pmode aligned + else + return false; // not sure what we have here. + + /* If we don't know the alignment of the thing to which the symbol refers, + we assume optimistically it is "enough". + ??? maybe we should be pessimistic instead. */ + unsigned align = 0; + + if (sym) + { + tree decl = SYMBOL_REF_DECL (sym); +#if TARGET_MACHO + if (MACHO_SYMBOL_INDIRECTION_P (sym)) + /* The decl in an indirection symbol is the original one, which might + be less aligned than the indirection. Our indirections are always + pointer-aligned. */ + ; + else +#endif + if (decl && DECL_ALIGN (decl)) + align = DECL_ALIGN_UNIT (decl); + } + + unsigned int extra = 0; + switch (mode) + { + case E_DFmode: + case E_DDmode: + case E_DImode: + /* If we are using VSX scalar loads, restrict ourselves to reg+reg + addressing. */ + if (VECTOR_MEM_VSX_P (mode)) + return false; + + if (!TARGET_POWERPC64) + extra = 4; + else if ((offset & 3) || (align & 3)) + return false; + break; + + case E_TFmode: + case E_IFmode: + case E_KFmode: + case E_TDmode: + case E_TImode: + case E_PTImode: + extra = 8; + if (!TARGET_POWERPC64) + extra = 12; + else if ((offset & 3) || (align & 3)) + return false; + break; + + default: + break; + } + + /* We only care if the access(es) would cause a change to the high part. */ + offset = ((offset & 0xffff) ^ 0x8000) - 0x8000; + return IN_RANGE (offset, -(HOST_WIDE_INT_1 << 15), + (HOST_WIDE_INT_1 << 15) - 1 - extra); +} + /* Return true if the MEM operand is a memory operand suitable for use with a (full width, possibly multiple) gpr load/store. On powerpc64 this means the offset must be divisible by 4. @@ -8241,7 +8387,13 @@ mem_operand_gpr (rtx op, machine_mode mode) && legitimate_indirect_address_p (XEXP (addr, 0), false)) return true; - /* Don't allow non-offsettable addresses. See PRs 83969 and 84279. */ + /* We need to look through Mach-O PIC unspecs to determine if a lo_sum is + really OK. Doing this early avoids teaching all the other machinery + about them. */ + if (TARGET_MACHO && GET_CODE (addr) == LO_SUM) + return darwin_rs6000_legitimate_lo_sum_const_p (XEXP (addr, 1), mode); + + /* Only allow offsettable addresses. See PRs 83969 and 84279. */ if (!rs6000_offsettable_memref_p (op, mode, false)) return false; @@ -8519,7 +8671,9 @@ toc_relative_expr_p (const_rtx op, bool strict, const_rtx *tocrel_base_ret, *tocrel_offset_ret = tocrel_offset; return (GET_CODE (tocrel_base) == UNSPEC - && XINT (tocrel_base, 1) == UNSPEC_TOCREL); + && XINT (tocrel_base, 1) == UNSPEC_TOCREL + && REG_P (XVECEXP (tocrel_base, 0, 1)) + && REGNO (XVECEXP (tocrel_base, 0, 1)) == TOC_REGISTER); } /* Return true if X is a constant pool address, and also for cmodel=medium @@ -12574,7 +12728,9 @@ rs6000_function_arg (cumulative_args_t cum_v, machine_mode mode, if (elt_mode == TDmode && (cum->fregno % 2) == 1) cum->fregno++; - if (USE_FP_FOR_ARG_P (cum, elt_mode)) + if (USE_FP_FOR_ARG_P (cum, elt_mode) + && !(TARGET_AIX && !TARGET_ELF + && type != NULL && AGGREGATE_TYPE_P (type))) { rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1]; rtx r, off; @@ -12710,7 +12866,9 @@ rs6000_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode, align_words = rs6000_parm_start (mode, type, cum->words); - if (USE_FP_FOR_ARG_P (cum, elt_mode)) + if (USE_FP_FOR_ARG_P (cum, elt_mode) + && !(TARGET_AIX && !TARGET_ELF + && type != NULL && AGGREGATE_TYPE_P (type))) { unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3; @@ -15399,9 +15557,17 @@ altivec_expand_vec_ext_builtin (tree exp, rtx target) op0 = expand_normal (arg0); op1 = expand_normal (arg1); - /* Call get_element_number to validate arg1 if it is a constant. */ if (TREE_CODE (arg1) == INTEGER_CST) - (void) get_element_number (TREE_TYPE (arg0), arg1); + { + unsigned HOST_WIDE_INT elt; + unsigned HOST_WIDE_INT size = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)); + unsigned int truncated_selector; + /* Even if !tree_fits_uhwi_p (arg1)), TREE_INT_CST_LOW (arg0) + returns low-order bits of INTEGER_CST for modulo indexing. */ + elt = TREE_INT_CST_LOW (arg1); + truncated_selector = elt % size; + op1 = GEN_INT (truncated_selector); + } tmode = TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0))); mode0 = TYPE_MODE (TREE_TYPE (arg0)); @@ -16143,6 +16309,7 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) enum rs6000_builtins fn_code = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl); tree arg0, arg1, lhs, temp; + enum tree_code bcode; gimple *g; size_t uns_fncode = (size_t) fn_code; @@ -16181,10 +16348,32 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) case P8V_BUILTIN_VADDUDM: case ALTIVEC_BUILTIN_VADDFP: case VSX_BUILTIN_XVADDDP: + bcode = PLUS_EXPR; + do_binary: arg0 = gimple_call_arg (stmt, 0); arg1 = gimple_call_arg (stmt, 1); lhs = gimple_call_lhs (stmt); - g = gimple_build_assign (lhs, PLUS_EXPR, arg0, arg1); + if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (lhs))) + && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (TREE_TYPE (lhs)))) + { + /* Ensure the binary operation is performed in a type + that wraps if it is integral type. */ + gimple_seq stmts = NULL; + tree type = unsigned_type_for (TREE_TYPE (lhs)); + tree uarg0 = gimple_build (&stmts, VIEW_CONVERT_EXPR, + type, arg0); + tree uarg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR, + type, arg1); + tree res = gimple_build (&stmts, gimple_location (stmt), bcode, + type, uarg0, uarg1); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + g = gimple_build_assign (lhs, VIEW_CONVERT_EXPR, + build1 (VIEW_CONVERT_EXPR, + TREE_TYPE (lhs), res)); + gsi_replace (gsi, g, true); + return true; + } + g = gimple_build_assign (lhs, bcode, arg0, arg1); gimple_set_location (g, gimple_location (stmt)); gsi_replace (gsi, g, true); return true; @@ -16196,13 +16385,8 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) case P8V_BUILTIN_VSUBUDM: case ALTIVEC_BUILTIN_VSUBFP: case VSX_BUILTIN_XVSUBDP: - arg0 = gimple_call_arg (stmt, 0); - arg1 = gimple_call_arg (stmt, 1); - lhs = gimple_call_lhs (stmt); - g = gimple_build_assign (lhs, MINUS_EXPR, arg0, arg1); - gimple_set_location (g, gimple_location (stmt)); - gsi_replace (gsi, g, true); - return true; + bcode = MINUS_EXPR; + goto do_binary; case VSX_BUILTIN_XVMULSP: case VSX_BUILTIN_XVMULDP: arg0 = gimple_call_arg (stmt, 0); @@ -16440,29 +16624,81 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) case ALTIVEC_BUILTIN_VSRAH: case ALTIVEC_BUILTIN_VSRAW: case P8V_BUILTIN_VSRAD: - arg0 = gimple_call_arg (stmt, 0); - arg1 = gimple_call_arg (stmt, 1); - lhs = gimple_call_lhs (stmt); - g = gimple_build_assign (lhs, RSHIFT_EXPR, arg0, arg1); - gimple_set_location (g, gimple_location (stmt)); - gsi_replace (gsi, g, true); - return true; + { + arg0 = gimple_call_arg (stmt, 0); + arg1 = gimple_call_arg (stmt, 1); + lhs = gimple_call_lhs (stmt); + tree arg1_type = TREE_TYPE (arg1); + tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1)); + tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type)); + location_t loc = gimple_location (stmt); + /* Force arg1 into the range valid matching the arg0 type. */ + /* Build a vector consisting of the max valid bit-size values. */ + int n_elts = VECTOR_CST_NELTS (arg1); + tree element_size = build_int_cst (unsigned_element_type, + 128 / n_elts); + tree_vector_builder elts (unsigned_arg1_type, n_elts, 1); + for (int i = 0; i < n_elts; i++) + elts.safe_push (element_size); + tree modulo_tree = elts.build (); + /* Modulo the provided shift value against that vector. */ + gimple_seq stmts = NULL; + tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR, + unsigned_arg1_type, arg1); + tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR, + unsigned_arg1_type, unsigned_arg1, + modulo_tree); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + /* And finally, do the shift. */ + g = gimple_build_assign (lhs, RSHIFT_EXPR, arg0, new_arg1); + gimple_set_location (g, loc); + gsi_replace (gsi, g, true); + return true; + } /* Flavors of vector shift left. builtin_altivec_vsl{b,h,w} -> vsl{b,h,w}. */ case ALTIVEC_BUILTIN_VSLB: case ALTIVEC_BUILTIN_VSLH: case ALTIVEC_BUILTIN_VSLW: case P8V_BUILTIN_VSLD: - arg0 = gimple_call_arg (stmt, 0); - if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (arg0))) - && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (TREE_TYPE (arg0)))) - return false; - arg1 = gimple_call_arg (stmt, 1); - lhs = gimple_call_lhs (stmt); - g = gimple_build_assign (lhs, LSHIFT_EXPR, arg0, arg1); - gimple_set_location (g, gimple_location (stmt)); - gsi_replace (gsi, g, true); - return true; + { + location_t loc; + gimple_seq stmts = NULL; + arg0 = gimple_call_arg (stmt, 0); + tree arg0_type = TREE_TYPE (arg0); + if (INTEGRAL_TYPE_P (TREE_TYPE (arg0_type)) + && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0_type))) + return false; + arg1 = gimple_call_arg (stmt, 1); + tree arg1_type = TREE_TYPE (arg1); + tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1)); + tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type)); + loc = gimple_location (stmt); + lhs = gimple_call_lhs (stmt); + /* Force arg1 into the range valid matching the arg0 type. */ + /* Build a vector consisting of the max valid bit-size values. */ + int n_elts = VECTOR_CST_NELTS (arg1); + int tree_size_in_bits = TREE_INT_CST_LOW (size_in_bytes (arg1_type)) + * BITS_PER_UNIT; + tree element_size = build_int_cst (unsigned_element_type, + tree_size_in_bits / n_elts); + tree_vector_builder elts (unsigned_type_for (arg1_type), n_elts, 1); + for (int i = 0; i < n_elts; i++) + elts.safe_push (element_size); + tree modulo_tree = elts.build (); + /* Modulo the provided shift value against that vector. */ + tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR, + unsigned_arg1_type, arg1); + tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR, + unsigned_arg1_type, unsigned_arg1, + modulo_tree); + gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + /* And finally, do the shift. */ + g = gimple_build_assign (lhs, LSHIFT_EXPR, arg0, new_arg1); + gimple_set_location (g, gimple_location (stmt)); + gsi_replace (gsi, g, true); + return true; + } /* Flavors of vector shift right. */ case ALTIVEC_BUILTIN_VSRB: case ALTIVEC_BUILTIN_VSRH: @@ -16472,14 +16708,34 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) arg0 = gimple_call_arg (stmt, 0); arg1 = gimple_call_arg (stmt, 1); lhs = gimple_call_lhs (stmt); + tree arg1_type = TREE_TYPE (arg1); + tree unsigned_arg1_type = unsigned_type_for (TREE_TYPE (arg1)); + tree unsigned_element_type = unsigned_type_for (TREE_TYPE (arg1_type)); + location_t loc = gimple_location (stmt); gimple_seq stmts = NULL; /* Convert arg0 to unsigned. */ tree arg0_unsigned = gimple_build (&stmts, VIEW_CONVERT_EXPR, unsigned_type_for (TREE_TYPE (arg0)), arg0); + /* Force arg1 into the range valid matching the arg0 type. */ + /* Build a vector consisting of the max valid bit-size values. */ + int n_elts = VECTOR_CST_NELTS (arg1); + tree element_size = build_int_cst (unsigned_element_type, + 128 / n_elts); + tree_vector_builder elts (unsigned_arg1_type, n_elts, 1); + for (int i = 0; i < n_elts; i++) + elts.safe_push (element_size); + tree modulo_tree = elts.build (); + /* Modulo the provided shift value against that vector. */ + tree unsigned_arg1 = gimple_build (&stmts, VIEW_CONVERT_EXPR, + unsigned_arg1_type, arg1); + tree new_arg1 = gimple_build (&stmts, loc, TRUNC_MOD_EXPR, + unsigned_arg1_type, unsigned_arg1, + modulo_tree); + /* Do the shift. */ tree res = gimple_build (&stmts, RSHIFT_EXPR, - TREE_TYPE (arg0_unsigned), arg0_unsigned, arg1); + TREE_TYPE (arg0_unsigned), arg0_unsigned, new_arg1); /* 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); @@ -16518,6 +16774,13 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) arg1_type, temp_addr, build_int_cst (arg1_type, -16)); gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + if (!is_gimple_mem_ref_addr (aligned_addr)) + { + tree t = make_ssa_name (TREE_TYPE (aligned_addr)); + gimple *g = gimple_build_assign (t, aligned_addr); + gsi_insert_before (gsi, g, GSI_SAME_STMT); + aligned_addr = t; + } /* Use the build2 helper to set up the mem_ref. The MEM_REF could also take an offset, but since we've already incorporated the offset above, here we just pass in a zero. */ @@ -16566,6 +16829,13 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) arg2_type, temp_addr, build_int_cst (arg2_type, -16)); gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT); + if (!is_gimple_mem_ref_addr (aligned_addr)) + { + tree t = make_ssa_name (TREE_TYPE (aligned_addr)); + gimple *g = gimple_build_assign (t, aligned_addr); + gsi_insert_before (gsi, g, GSI_SAME_STMT); + aligned_addr = t; + } /* The desired gimple result should be similar to: MEM[(__vector floatD.1407 *)_1] = vf1D.2697; */ gimple *g @@ -16643,23 +16913,13 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi) case ALTIVEC_BUILTIN_VSPLTISH: case ALTIVEC_BUILTIN_VSPLTISW: { - int size; - - if (fn_code == ALTIVEC_BUILTIN_VSPLTISB) - size = 8; - else if (fn_code == ALTIVEC_BUILTIN_VSPLTISH) - size = 16; - else - size = 32; - arg0 = gimple_call_arg (stmt, 0); lhs = gimple_call_lhs (stmt); /* Only fold the vec_splat_*() if the lower bits of arg 0 is a 5-bit signed constant in range -16 to +15. */ if (TREE_CODE (arg0) != INTEGER_CST - || !IN_RANGE (sext_hwi(TREE_INT_CST_LOW (arg0), size), - -16, 15)) + || !IN_RANGE (TREE_INT_CST_LOW (arg0), -16, 15)) return false; gimple_seq stmts = NULL; location_t loc = gimple_location (stmt); @@ -18139,6 +18399,7 @@ builtin_function_type (machine_mode mode_ret, machine_mode mode_arg0, { /* unsigned 1 argument functions. */ case CRYPTO_BUILTIN_VSBOX: + case CRYPTO_BUILTIN_VSBOX_BE: case P8V_BUILTIN_VGBBD: case MISC_BUILTIN_CDTBCD: case MISC_BUILTIN_CBCDTD: @@ -18154,9 +18415,13 @@ builtin_function_type (machine_mode mode_ret, machine_mode mode_arg0, case ALTIVEC_BUILTIN_VMULOUH: case P8V_BUILTIN_VMULOUW: case CRYPTO_BUILTIN_VCIPHER: + case CRYPTO_BUILTIN_VCIPHER_BE: case CRYPTO_BUILTIN_VCIPHERLAST: + case CRYPTO_BUILTIN_VCIPHERLAST_BE: case CRYPTO_BUILTIN_VNCIPHER: + case CRYPTO_BUILTIN_VNCIPHER_BE: case CRYPTO_BUILTIN_VNCIPHERLAST: + case CRYPTO_BUILTIN_VNCIPHERLAST_BE: case CRYPTO_BUILTIN_VPMSUMB: case CRYPTO_BUILTIN_VPMSUMH: case CRYPTO_BUILTIN_VPMSUMW: @@ -21761,7 +22026,7 @@ print_operand (FILE *file, rtx x, int code) { const char *name = XSTR (x, 0); #if TARGET_MACHO - if (darwin_emit_branch_islands + if (darwin_symbol_stubs && MACHOPIC_INDIRECT && machopic_classify_symbol (x) == MACHOPIC_UNDEFINED_FUNCTION) name = machopic_indirection_name (x, /*stub_p=*/true); @@ -24242,22 +24507,31 @@ rs6000_split_multireg_move (rtx dst, rtx src) static bool save_reg_p (int reg) { - /* We need to mark the PIC offset register live for the same conditions - as it is set up, or otherwise it won't be saved before we clobber it. */ - if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE) { /* When calling eh_return, we must return true for all the cases where conditional_register_usage marks the PIC offset reg - call used. */ + call used or fixed. */ + if (crtl->calls_eh_return + && ((DEFAULT_ABI == ABI_V4 && flag_pic) + || (DEFAULT_ABI == ABI_DARWIN && flag_pic) + || (TARGET_TOC && TARGET_MINIMAL_TOC))) + return true; + + /* We need to mark the PIC offset register live for the same + conditions as it is set up in rs6000_emit_prologue, or + otherwise it won't be saved before we clobber it. */ if (TARGET_TOC && TARGET_MINIMAL_TOC - && (crtl->calls_eh_return - || df_regs_ever_live_p (reg) - || !constant_pool_empty_p ())) + && !constant_pool_empty_p ()) return true; - if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) - && flag_pic) + if (DEFAULT_ABI == ABI_V4 + && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT)) + && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)) + return true; + + if (DEFAULT_ABI == ABI_DARWIN + && flag_pic && crtl->uses_pic_offset_table) return true; } @@ -25226,6 +25500,12 @@ rs6000_function_ok_for_sibcall (tree decl, tree exp) { tree fntype; + /* The sibcall epilogue may clobber the static chain register. + ??? We could work harder and avoid that, but it's probably + not worth the hassle in practice. */ + if (CALL_EXPR_STATIC_CHAIN (exp)) + return false; + if (decl) fntype = TREE_TYPE (decl); else @@ -25859,10 +26139,14 @@ rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg, int copy_off) stack_limit_rtx, GEN_INT (size))); - emit_insn (gen_elf_high (tmp_reg, toload)); - emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload)); - emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg, - const0_rtx)); + /* We cannot use r0 with elf_low. Lamely solve this problem by + moving registers around. */ + rtx r11_reg = gen_rtx_REG (Pmode, 11); + emit_move_insn (tmp_reg, r11_reg); + emit_insn (gen_elf_high (r11_reg, toload)); + emit_insn (gen_elf_low (r11_reg, r11_reg, toload)); + emit_insn (gen_cond_trap (LTU, stack_reg, r11_reg, const0_rtx)); + emit_move_insn (r11_reg, tmp_reg); } else warning (0, "stack limit expression is not supported"); @@ -33495,7 +33779,7 @@ output_call (rtx_insn *insn, rtx *operands, int dest_operand_number, int cookie_operand_number) { static char buf[256]; - if (darwin_emit_branch_islands + if (darwin_symbol_stubs && GET_CODE (operands[dest_operand_number]) == SYMBOL_REF && (INTVAL (operands[cookie_operand_number]) & CALL_LONG)) { @@ -34055,6 +34339,10 @@ rs6000_xcoff_asm_init_sections (void) rs6000_xcoff_output_readwrite_section_asm_op, &xcoff_private_data_section_name); + read_only_private_data_section + = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op, + &xcoff_private_rodata_section_name); + tls_data_section = get_unnamed_section (SECTION_TLS, rs6000_xcoff_output_tls_section_asm_op, @@ -34065,10 +34353,6 @@ rs6000_xcoff_asm_init_sections (void) rs6000_xcoff_output_tls_section_asm_op, &xcoff_private_data_section_name); - read_only_private_data_section - = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op, - &xcoff_private_data_section_name); - toc_section = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL); @@ -34249,6 +34533,8 @@ rs6000_xcoff_file_start (void) main_input_filename, ".bss_"); rs6000_gen_section_name (&xcoff_private_data_section_name, main_input_filename, ".rw_"); + rs6000_gen_section_name (&xcoff_private_rodata_section_name, + main_input_filename, ".rop_"); rs6000_gen_section_name (&xcoff_read_only_section_name, main_input_filename, ".ro_"); rs6000_gen_section_name (&xcoff_tls_data_section_name, @@ -36468,10 +36754,20 @@ rs6000_init_dwarf_reg_sizes_extra (tree address) unsigned int rs6000_dbx_register_number (unsigned int regno, unsigned int format) { - /* Except for the above, we use the internal number for non-DWARF - debug information, and also for .eh_frame. */ + /* We use the GCC 7 (and before) internal number for non-DWARF debug + information, and also for .eh_frame. */ if ((format == 0 && write_symbols != DWARF2_DEBUG) || format == 2) - return regno; + { + /* Translate the regnos to their numbers in GCC 7 (and before). */ + if (regno == TFHAR_REGNO) + regno = 114; + else if (regno == TFIAR_REGNO) + regno = 115; + else if (regno == TEXASR_REGNO) + regno = 116; + + return regno; + } /* On some platforms, we use the standard DWARF register numbering for .debug_info and .debug_frame. */ @@ -36498,6 +36794,12 @@ rs6000_dbx_register_number (unsigned int regno, unsigned int format) return 356; if (regno == VSCR_REGNO) return 67; + if (regno == TFHAR_REGNO) + return 228; + if (regno == TFIAR_REGNO) + return 229; + if (regno == TEXASR_REGNO) + return 230; #endif return regno; } @@ -37703,6 +38005,7 @@ make_resolver_func (const tree default_decl, /* Build result decl and add to function_decl. */ tree t = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, ptr_type_node); + DECL_CONTEXT (t) = decl; DECL_ARTIFICIAL (t) = 1; DECL_IGNORED_P (t) = 1; DECL_RESULT (decl) = t; @@ -37924,25 +38227,31 @@ rs6000_can_inline_p (tree caller, tree callee) tree caller_tree = DECL_FUNCTION_SPECIFIC_TARGET (caller); tree callee_tree = DECL_FUNCTION_SPECIFIC_TARGET (callee); - /* If callee has no option attributes, then it is ok to inline. */ + /* If the callee has no option attributes, then it is ok to inline. */ if (!callee_tree) ret = true; - /* If caller has no option attributes, but callee does then it is not ok to - inline. */ - else if (!caller_tree) - ret = false; - else { - struct cl_target_option *caller_opts = TREE_TARGET_OPTION (caller_tree); + HOST_WIDE_INT caller_isa; struct cl_target_option *callee_opts = TREE_TARGET_OPTION (callee_tree); + HOST_WIDE_INT callee_isa = callee_opts->x_rs6000_isa_flags; + HOST_WIDE_INT explicit_isa = callee_opts->x_rs6000_isa_flags_explicit; - /* Callee's options should a subset of the caller's, i.e. a vsx function - can inline an altivec function but a non-vsx function can't inline a - vsx function. */ - if ((caller_opts->x_rs6000_isa_flags & callee_opts->x_rs6000_isa_flags) - == callee_opts->x_rs6000_isa_flags) + /* If the caller has option attributes, then use them. + Otherwise, use the command line options. */ + if (caller_tree) + caller_isa = TREE_TARGET_OPTION (caller_tree)->x_rs6000_isa_flags; + else + caller_isa = rs6000_isa_flags; + + /* The callee's options must be a subset of the caller's options, i.e. + a vsx function may inline an altivec function, but a no-vsx function + must not inline a vsx function. However, for those options that the + callee has explicitly enabled or disabled, then we must enforce that + the callee's and caller's options match exactly; see PR70010. */ + if (((caller_isa & callee_isa) == callee_isa) + && (caller_isa & explicit_isa) == (callee_isa & explicit_isa)) ret = true; } diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 60058814b8a..4dbe8e5d133 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -136,6 +136,9 @@ UNSPEC_LSQ UNSPEC_FUSION_GPR UNSPEC_STACK_CHECK + UNSPEC_CMPRB + UNSPEC_CMPRB2 + UNSPEC_CMPEQB UNSPEC_FUSION_P9 UNSPEC_FUSION_ADDIS UNSPEC_ADD_ROUND_TO_ODD @@ -162,6 +165,9 @@ UNSPECV_EH_RR ; eh_reg_restore UNSPECV_ISYNC ; isync instruction UNSPECV_MFTB ; move from time base + UNSPECV_DARN ; darn 1 (deliver a random number) + UNSPECV_DARN_32 ; darn 2 + UNSPECV_DARN_RAW ; darn 0 UNSPECV_NLGR ; non-local goto receiver UNSPECV_MFFS ; Move from FPSCR UNSPECV_MTFSF ; Move to FPSCR Fields @@ -1008,7 +1014,7 @@ "=r, r, wl, wu, wj, wK, wH, wr") (sign_extend:EXTSI (match_operand:SI 1 "lwa_operand" - "Y, r, Z, Z, r, wK, wH, ?wIwH")))] + "YZ, r, Z, Z, r, wK, wH, ?wIwH")))] "" "@ lwa%U1%X1 %0,%1 @@ -5983,7 +5989,7 @@ (set (match_operand:DI 0 "gpc_reg_operand") (unspec:DI [(match_dup 2)] UNSPEC_FCTID))] - "TARGET__FPR && TARGET_VSX" + "TARGET__FPR && TARGET_VSX && TARGET_FPRND" { operands[2] = gen_reg_rtx (mode); }) @@ -6692,14 +6698,6 @@ ;; do the load 16-bits at a time. We could do this by loading from memory, ;; and this is even supposed to be faster, but it is simpler not to get ;; integers in the TOC. -(define_insn "movsi_low" - [(set (match_operand:SI 0 "gpc_reg_operand" "=r") - (mem:SI (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b") - (match_operand 2 "" ""))))] - "TARGET_MACHO && ! TARGET_64BIT" - "lwz %0,lo16(%2)(%1)" - [(set_attr "type" "load") - (set_attr "length" "4")]) ;; MR LA LWZ LFIWZX LXSIWZX ;; STW STFIWX STXSIWX LI LIS @@ -6914,24 +6912,19 @@ 8, 4")]) ;; Like movsi_from_sf, but combine a convert from DFmode to SFmode before -;; moving it to SImode. We can do a SFmode store without having to do the -;; conversion explicitly. If we are doing a register->register conversion, use -;; XSCVDPSP instead of XSCVDPSPN, since the former handles cases where the -;; input will not fit in a SFmode, and the later assumes the value has already -;; been rounded. +;; moving it to SImode. We cannot do a SFmode store without having to do the +;; conversion explicitly since that doesn't work in most cases if the input +;; isn't representable as SF. Use XSCVDPSP instead of XSCVDPSPN, since the +;; former handles cases where the input will not fit in a SFmode, and the +;; latter assumes the value has already been rounded. (define_insn "*movsi_from_df" - [(set (match_operand:SI 0 "nonimmediate_operand" "=wa,m,wY,Z") + [(set (match_operand:SI 0 "gpc_reg_operand" "=wa") (unspec:SI [(float_truncate:SF - (match_operand:DF 1 "gpc_reg_operand" "wa, f,wb,wa"))] + (match_operand:DF 1 "gpc_reg_operand" "wa"))] UNSPEC_SI_FROM_SF))] - "TARGET_NO_SF_SUBREG" - "@ - xscvdpsp %x0,%x1 - stfs%U0%X0 %1,%0 - stxssp %1,%0 - stxsspx %x1,%y0" - [(set_attr "type" "fp,fpstore,fpstore,fpstore")]) + "xscvdpsp %x0,%x1" + [(set_attr "type" "fp")]) ;; Split a load of a large constant into the appropriate two-insn ;; sequence. @@ -7433,8 +7426,8 @@ ; ld/std require word-aligned displacements -> 'Y' constraint. ; List Y->r and r->Y before r->r for reload. (define_insn "*mov_hardfloat64" - [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=m,d,d,,wY,,Z,,,!r,Y,r,!r,*c*l,!r,*h,r,wg,r,") - (match_operand:FMOVE64 1 "input_operand" "d,m,d,wY,,Z,,,,,r,Y,r,r,h,0,wg,r,,r"))] + [(set (match_operand:FMOVE64 0 "nonimmediate_operand" "=m,d,d,,wY,,Z,,,!r,YZ,r,!r,*c*l,!r,*h,r,wg,r,") + (match_operand:FMOVE64 1 "input_operand" "d,m,d,wY,,Z,,,,,r,YZ,r,r,h,0,wg,r,,r"))] "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && (gpc_reg_operand (operands[0], mode) || gpc_reg_operand (operands[1], mode))" @@ -12599,15 +12592,18 @@ [(unspec [(const_int 0)] UNSPEC_GRP_END_NOP)] "" { - if (rs6000_tune == PROCESSOR_POWER6) - return "ori 1,1,0"; - return "ori 2,2,0"; + operands[0] = gen_rtx_REG (Pmode, + rs6000_tune == PROCESSOR_POWER6 ? 1 : 2); + return "ori %0,%0,0"; }) (define_insn "rs6000_speculation_barrier" [(unspec_volatile:BLK [(const_int 0)] UNSPECV_SPEC_BARRIER)] "" - "ori 31,31,0") +{ + operands[0] = gen_rtx_REG (Pmode, 31); + return "ori %0,%0,0"; +}) ;; Define the subtract-one-and-jump insns, starting with the template ;; so loop.c knows what to generate. @@ -12704,7 +12700,7 @@ const0_rtx); emit_insn (gen_rtx_SET (operands[3], gen_rtx_COMPARE (CCmode, operands[1], const1_rtx))); - if (gpc_reg_operand (operands[0], mode)) + if (int_reg_operand (operands[0], mode)) emit_insn (gen_add3 (operands[0], operands[1], constm1_rtx)); else { @@ -12752,8 +12748,8 @@ else { static char seq[96]; - char *bcs = output_cbranch (operands[3], "$+8", 1, insn); - sprintf(seq, " $+12\;%s;b %%l0", bcs); + char *bcs = output_cbranch (operands[3], ".Lshort%=", 1, insn); + sprintf(seq, " .Lshort%%=\;%s\;b %%l0\;.Lshort%%=:", bcs); return seq; } } @@ -12773,7 +12769,7 @@ (const_int 0)])) (match_operand 4) (match_operand 5))) - (set (match_operand:P 6 "int_reg_operand") + (set (match_operand:P 6 "nonimmediate_operand") (plus:P (match_dup 0) (const_int -1))) (clobber (match_scratch:P 7)) @@ -12806,7 +12802,7 @@ else emit_insn (gen_cceq_ior_compare_complement (operands[9], andexpr, ctrcmpcc, operands[8], cccmp, ccin)); - if (gpc_reg_operand (operands[0], mode)) + if (int_reg_operand (ctrout, mode)) emit_insn (gen_add3 (ctrout, ctr, constm1_rtx)); else { @@ -14602,7 +14598,225 @@ "xscmpuqp %0,%1,%2" [(set_attr "type" "veccmp") (set_attr "size" "128")]) + +;; Miscellaneous ISA 3.0 (power9) instructions + +(define_insn "darn_32" + [(set (match_operand:SI 0 "register_operand" "=r") + (unspec_volatile:SI [(const_int 0)] UNSPECV_DARN_32))] + "TARGET_P9_MISC" + "darn %0,0" + [(set_attr "type" "integer")]) + +(define_insn "darn_raw" + [(set (match_operand:DI 0 "register_operand" "=r") + (unspec_volatile:DI [(const_int 0)] UNSPECV_DARN_RAW))] + "TARGET_P9_MISC && TARGET_64BIT" + "darn %0,2" + [(set_attr "type" "integer")]) + +(define_insn "darn" + [(set (match_operand:DI 0 "register_operand" "=r") + (unspec_volatile:DI [(const_int 0)] UNSPECV_DARN))] + "TARGET_P9_MISC && TARGET_64BIT" + "darn %0,1" + [(set_attr "type" "integer")]) + +;; Test byte within range. +;; +;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx +;; represents a byte whose value is ignored in this context and +;; vv, the least significant byte, holds the byte value that is to +;; be tested for membership within the range specified by operand 2. +;; The bytes of operand 2 are organized as xx:xx:hi:lo. +;; +;; Return in target register operand 0 a value of 1 if lo <= vv and +;; vv <= hi. Otherwise, set register operand 0 to 0. +;; +;; Though the instructions to which this expansion maps operate on +;; 64-bit registers, the current implementation only operates on +;; SI-mode operands as the high-order bits provide no information +;; that is not already available in the low-order bits. To avoid the +;; costs of data widening operations, future enhancements might allow +;; DI mode for operand 0 and/or might allow operand 1 to be QI mode. +(define_expand "cmprb" + [(set (match_dup 3) + (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") + (match_operand:SI 2 "gpc_reg_operand" "r")] + UNSPEC_CMPRB)) + (set (match_operand:SI 0 "gpc_reg_operand" "=r") + (if_then_else:SI (lt (match_dup 3) + (const_int 0)) + (const_int -1) + (if_then_else (gt (match_dup 3) + (const_int 0)) + (const_int 1) + (const_int 0))))] + "TARGET_P9_MISC" +{ + operands[3] = gen_reg_rtx (CCmode); +}) + +;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx +;; represents a byte whose value is ignored in this context and +;; vv, the least significant byte, holds the byte value that is to +;; be tested for membership within the range specified by operand 2. +;; The bytes of operand 2 are organized as xx:xx:hi:lo. +;; +;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if +;; lo <= vv and vv <= hi. Otherwise, set the GT bit to 0. The other +;; 3 bits of the target CR register are all set to 0. +(define_insn "*cmprb_internal" + [(set (match_operand:CC 0 "cc_reg_operand" "=y") + (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") + (match_operand:SI 2 "gpc_reg_operand" "r")] + UNSPEC_CMPRB))] + "TARGET_P9_MISC" + "cmprb %0,0,%1,%2" + [(set_attr "type" "logical")]) +;; Set operand 0 register to -1 if the LT bit (0x8) of condition +;; register operand 1 is on. Otherwise, set operand 0 register to 1 +;; if the GT bit (0x4) of condition register operand 1 is on. +;; Otherwise, set operand 0 to 0. Note that the result stored into +;; register operand 0 is non-zero iff either the LT or GT bits are on +;; within condition register operand 1. +(define_insn "setb_signed" + [(set (match_operand:SI 0 "gpc_reg_operand" "=r") + (if_then_else:SI (lt (match_operand:CC 1 "cc_reg_operand" "y") + (const_int 0)) + (const_int -1) + (if_then_else (gt (match_dup 1) + (const_int 0)) + (const_int 1) + (const_int 0))))] + "TARGET_P9_MISC" + "setb %0,%1" + [(set_attr "type" "logical")]) + +(define_insn "setb_unsigned" + [(set (match_operand:SI 0 "gpc_reg_operand" "=r") + (if_then_else:SI (ltu (match_operand:CCUNS 1 "cc_reg_operand" "y") + (const_int 0)) + (const_int -1) + (if_then_else (gtu (match_dup 1) + (const_int 0)) + (const_int 1) + (const_int 0))))] + "TARGET_P9_MISC" + "setb %0,%1" + [(set_attr "type" "logical")]) + +;; Test byte within two ranges. +;; +;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx +;; represents a byte whose value is ignored in this context and +;; vv, the least significant byte, holds the byte value that is to +;; be tested for membership within the range specified by operand 2. +;; The bytes of operand 2 are organized as hi_1:lo_1:hi_2:lo_2. +;; +;; Return in target register operand 0 a value of 1 if (lo_1 <= vv and +;; vv <= hi_1) or if (lo_2 <= vv and vv <= hi_2). Otherwise, set register +;; operand 0 to 0. +;; +;; Though the instructions to which this expansion maps operate on +;; 64-bit registers, the current implementation only operates on +;; SI-mode operands as the high-order bits provide no information +;; that is not already available in the low-order bits. To avoid the +;; costs of data widening operations, future enhancements might allow +;; DI mode for operand 0 and/or might allow operand 1 to be QI mode. +(define_expand "cmprb2" + [(set (match_dup 3) + (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") + (match_operand:SI 2 "gpc_reg_operand" "r")] + UNSPEC_CMPRB2)) + (set (match_operand:SI 0 "gpc_reg_operand" "=r") + (if_then_else:SI (lt (match_dup 3) + (const_int 0)) + (const_int -1) + (if_then_else (gt (match_dup 3) + (const_int 0)) + (const_int 1) + (const_int 0))))] + "TARGET_P9_MISC" +{ + operands[3] = gen_reg_rtx (CCmode); +}) + +;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx +;; represents a byte whose value is ignored in this context and +;; vv, the least significant byte, holds the byte value that is to +;; be tested for membership within the ranges specified by operand 2. +;; The bytes of operand 2 are organized as hi_1:lo_1:hi_2:lo_2. +;; +;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if +;; (lo_1 <= vv and vv <= hi_1) or if (lo_2 <= vv and vv <= hi_2). +;; Otherwise, set the GT bit to 0. The other 3 bits of the target +;; CR register are all set to 0. +(define_insn "*cmprb2_internal" + [(set (match_operand:CC 0 "cc_reg_operand" "=y") + (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") + (match_operand:SI 2 "gpc_reg_operand" "r")] + UNSPEC_CMPRB2))] + "TARGET_P9_MISC" + "cmprb %0,1,%1,%2" + [(set_attr "type" "logical")]) + +;; Test byte membership within set of 8 bytes. +;; +;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx +;; represents a byte whose value is ignored in this context and +;; vv, the least significant byte, holds the byte value that is to +;; be tested for membership within the set specified by operand 2. +;; The bytes of operand 2 are organized as e0:e1:e2:e3:e4:e5:e6:e7. +;; +;; Return in target register operand 0 a value of 1 if vv equals one +;; of the values e0, e1, e2, e3, e4, e5, e6, or e7. Otherwise, set +;; register operand 0 to 0. Note that the 8 byte values held within +;; operand 2 need not be unique. +;; +;; Though the instructions to which this expansion maps operate on +;; 64-bit registers, the current implementation requires that operands +;; 0 and 1 have mode SI as the high-order bits provide no information +;; that is not already available in the low-order bits. To avoid the +;; costs of data widening operations, future enhancements might allow +;; DI mode for operand 0 and/or might allow operand 1 to be QI mode. +(define_expand "cmpeqb" + [(set (match_dup 3) + (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") + (match_operand:DI 2 "gpc_reg_operand" "r")] + UNSPEC_CMPEQB)) + (set (match_operand:SI 0 "gpc_reg_operand" "=r") + (if_then_else:SI (lt (match_dup 3) + (const_int 0)) + (const_int -1) + (if_then_else (gt (match_dup 3) + (const_int 0)) + (const_int 1) + (const_int 0))))] + "TARGET_P9_MISC && TARGET_64BIT" +{ + operands[3] = gen_reg_rtx (CCmode); +}) + +;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx +;; represents a byte whose value is ignored in this context and +;; vv, the least significant byte, holds the byte value that is to +;; be tested for membership within the set specified by operand 2. +;; The bytes of operand 2 are organized as e0:e1:e2:e3:e4:e5:e6:e7. +;; +;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if vv +;; equals one of the values e0, e1, e2, e3, e4, e5, e6, or e7. Otherwise, +;; set the GT bit to zero. The other 3 bits of the target CR register +;; are all set to 0. +(define_insn "*cmpeqb_internal" + [(set (match_operand:CC 0 "cc_reg_operand" "=y") + (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r") + (match_operand:DI 2 "gpc_reg_operand" "r")] + UNSPEC_CMPEQB))] + "TARGET_P9_MISC && TARGET_64BIT" + "cmpeqb %0,%1,%2" + [(set_attr "type" "logical")]) (include "sync.md") diff --git a/gcc/config/rs6000/t-darwin8 b/gcc/config/rs6000/t-darwin32-biarch similarity index 100% rename from gcc/config/rs6000/t-darwin8 rename to gcc/config/rs6000/t-darwin32-biarch diff --git a/gcc/config/rs6000/t-darwin64 b/gcc/config/rs6000/t-darwin64-biarch similarity index 100% rename from gcc/config/rs6000/t-darwin64 rename to gcc/config/rs6000/t-darwin64-biarch diff --git a/gcc/config/rs6000/t-linux b/gcc/config/rs6000/t-linux index acfde1f48ae..aeb7440c492 100644 --- a/gcc/config/rs6000/t-linux +++ b/gcc/config/rs6000/t-linux @@ -4,7 +4,7 @@ ifeq (,$(filter $(with_cpu),$(SOFT_FLOAT_CPUS))$(findstring soft,$(with_float))) ifneq (,$(findstring powerpc64,$(target))) MULTILIB_OSDIRNAMES := .=../lib64$(call if_multiarch,:powerpc64-linux-gnu) else -MULTIARCH_DIRNAME := powerpc-linux-gnu +MULTIARCH_DIRNAME := $(call if_multiarch,powerpc-linux-gnu) endif ifneq (,$(findstring powerpcle,$(target))) MULTIARCH_DIRNAME := $(subst -linux,le-linux,$(MULTIARCH_DIRNAME)) diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index 0fc77aa18b0..17c24551306 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -3273,7 +3273,7 @@ (match_operand:VSX_D 1 "memory_operand" "m,m") (parallel [(match_operand:QI 2 "const_0_to_1_operand" "n,n")]))) (clobber (match_scratch:P 3 "=&b,&b"))] - "VECTOR_MEM_VSX_P (mode)" + "TARGET_POWERPC64 && VECTOR_MEM_VSX_P (mode)" "#" "&& reload_completed" [(set (match_dup 0) (match_dup 4))] @@ -3756,9 +3756,9 @@ DONE; }) -(define_insn_and_split "*vsx_extract___var" - [(set (match_operand:SDI 0 "gpc_reg_operand" "=r,r,r") - (zero_extend:SDI +(define_insn_and_split "*vsx_extract__mode_var" + [(set (match_operand: 0 "gpc_reg_operand" "=r,r,r") + (zero_extend: (unspec: [(match_operand:VSX_EXTRACT_I 1 "input_operand" "wK,v,m") (match_operand:DI 2 "gpc_reg_operand" "r,r,r")] @@ -3770,7 +3770,7 @@ "&& reload_completed" [(const_int 0)] { - machine_mode smode = mode; + machine_mode smode = mode; rs6000_split_vec_extract_var (gen_rtx_REG (smode, REGNO (operands[0])), operands[1], operands[2], operands[3], operands[4]); @@ -4394,7 +4394,7 @@ (match_dup 1)) (parallel [(const_int 1)]))) (clobber (match_scratch:DF 2 "=0,0,&wd,&wa"))] - "VECTOR_UNIT_VSX_P (V2DFmode)" + "BYTES_BIG_ENDIAN && VECTOR_UNIT_VSX_P (V2DFmode)" "#" "" [(const_int 0)] @@ -4421,7 +4421,7 @@ (clobber (match_scratch:V4SF 2 "=&wf,&wa")) (clobber (match_scratch:V4SF 3 "=&wf,&wa")) (clobber (match_scratch:V4SF 4 "=0,0"))] - "VECTOR_UNIT_VSX_P (V4SFmode)" + "BYTES_BIG_ENDIAN && VECTOR_UNIT_VSX_P (V4SFmode)" "#" "" [(const_int 0)] diff --git a/gcc/config/rs6000/vxworks.h b/gcc/config/rs6000/vxworks.h index b10955f071d..42602f6e4ee 100644 --- a/gcc/config/rs6000/vxworks.h +++ b/gcc/config/rs6000/vxworks.h @@ -109,7 +109,7 @@ VXWORKS_ADDITIONAL_CPP_SPEC #undef SDATA_DEFAULT_SIZE #define SDATA_DEFAULT_SIZE (TARGET_VXWORKS_RTP ? 8 : 0) -/* Enforce 16bytes alignment for the stack pointer, to permit general +/* Enforce 16-byte alignment for the stack pointer, to permit general compliance with e.g. Altivec instructions requirements. Make sure this isn't overruled by the EABI constraints. */ @@ -121,6 +121,17 @@ VXWORKS_ADDITIONAL_CPP_SPEC #undef ABI_STACK_BOUNDARY +#undef RS6000_STARTING_FRAME_OFFSET +#define RS6000_STARTING_FRAME_OFFSET \ + (cfun->calls_alloca \ + ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16) \ + : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA)) + +#undef STACK_DYNAMIC_OFFSET +#define STACK_DYNAMIC_OFFSET(FUNDECL) \ + RS6000_ALIGN (crtl->outgoing_args_size.to_constant () \ + + STACK_POINTER_OFFSET, 16) + #undef SUBSUBTARGET_OVERRIDE_OPTIONS #define SUBSUBTARGET_OVERRIDE_OPTIONS \ do { \ diff --git a/gcc/config/rs6000/xmmintrin.h b/gcc/config/rs6000/xmmintrin.h index 43d03ea0591..5e910aebada 100644 --- a/gcc/config/rs6000/xmmintrin.h +++ b/gcc/config/rs6000/xmmintrin.h @@ -57,6 +57,9 @@ #ifndef _XMMINTRIN_H_INCLUDED #define _XMMINTRIN_H_INCLUDED +/* Define four value permute mask */ +#define _MM_SHUFFLE(w,x,y,z) (((w) << 6) | ((x) << 4) | ((y) << 2) | (z)) + #include /* Avoid collisions between altivec.h and strict adherence to C++ and @@ -1375,9 +1378,12 @@ _mm_load_ps1 (float const *__P) extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_extract_pi16 (__m64 const __A, int const __N) { - const int shiftr = (__N & 3) * 16; + unsigned int shiftr = __N & 3; +#ifdef __BIG_ENDIAN__ + shiftr = 3 - shiftr; +#endif - return ((__A >> shiftr) & 0xffff); + return ((__A >> (shiftr * 16)) & 0xffff); } extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) diff --git a/gcc/config/s390/s390-builtin-types.def b/gcc/config/s390/s390-builtin-types.def index 2acc55fe0af..6f257c6de77 100644 --- a/gcc/config/s390/s390-builtin-types.def +++ b/gcc/config/s390/s390-builtin-types.def @@ -260,6 +260,7 @@ DEF_FN_TYPE_2 (BT_FN_V4SF_FLT_INT, BT_V4SF, BT_FLT, BT_INT) DEF_FN_TYPE_2 (BT_FN_V4SF_V4SF_UCHAR, BT_V4SF, BT_V4SF, BT_UCHAR) DEF_FN_TYPE_2 (BT_FN_V4SF_V4SF_V4SF, BT_V4SF, BT_V4SF, BT_V4SF) DEF_FN_TYPE_2 (BT_FN_V4SI_BV4SI_V4SI, BT_V4SI, BT_BV4SI, BT_V4SI) +DEF_FN_TYPE_2 (BT_FN_V4SI_INT_VOIDCONSTPTR, BT_V4SI, BT_INT, BT_VOIDCONSTPTR) DEF_FN_TYPE_2 (BT_FN_V4SI_INT_VOIDPTR, BT_V4SI, BT_INT, BT_VOIDPTR) DEF_FN_TYPE_2 (BT_FN_V4SI_UV4SI_UV4SI, BT_V4SI, BT_UV4SI, BT_UV4SI) DEF_FN_TYPE_2 (BT_FN_V4SI_V2DI_V2DI, BT_V4SI, BT_V2DI, BT_V2DI) @@ -492,6 +493,7 @@ DEF_OV_TYPE (BT_OV_USHORT_UV8HI_INT, BT_USHORT, BT_UV8HI, BT_INT) DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_BV16QI, BT_UV16QI, BT_BV16QI, BT_BV16QI) DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_BV16QI_INTPTR, BT_UV16QI, BT_BV16QI, BT_BV16QI, BT_INTPTR) DEF_OV_TYPE (BT_OV_UV16QI_BV16QI_UV16QI, BT_UV16QI, BT_BV16QI, BT_UV16QI) +DEF_OV_TYPE (BT_OV_UV16QI_LONG_UCHARCONSTPTR, BT_UV16QI, BT_LONG, BT_UCHARCONSTPTR) DEF_OV_TYPE (BT_OV_UV16QI_LONG_UCHARPTR, BT_UV16QI, BT_LONG, BT_UCHARPTR) DEF_OV_TYPE (BT_OV_UV16QI_UCHAR, BT_UV16QI, BT_UCHAR) DEF_OV_TYPE (BT_OV_UV16QI_UCHARCONSTPTR, BT_UV16QI, BT_UCHARCONSTPTR) @@ -523,6 +525,7 @@ DEF_OV_TYPE (BT_OV_UV16QI_UV8HI_UV8HI_INTPTR, BT_UV16QI, BT_UV8HI, BT_UV8HI, BT_ DEF_OV_TYPE (BT_OV_UV16QI_V16QI, BT_UV16QI, BT_V16QI) DEF_OV_TYPE (BT_OV_UV16QI_V8HI_V8HI, BT_UV16QI, BT_V8HI, BT_V8HI) DEF_OV_TYPE (BT_OV_UV2DI_BV2DI_UV2DI, BT_UV2DI, BT_BV2DI, BT_UV2DI) +DEF_OV_TYPE (BT_OV_UV2DI_LONG_ULONGLONGCONSTPTR, BT_UV2DI, BT_LONG, BT_ULONGLONGCONSTPTR) DEF_OV_TYPE (BT_OV_UV2DI_LONG_ULONGLONGPTR, BT_UV2DI, BT_LONG, BT_ULONGLONGPTR) DEF_OV_TYPE (BT_OV_UV2DI_ULONGLONG, BT_UV2DI, BT_ULONGLONG) DEF_OV_TYPE (BT_OV_UV2DI_ULONGLONGCONSTPTR, BT_UV2DI, BT_ULONGLONGCONSTPTR) @@ -556,6 +559,8 @@ DEF_OV_TYPE (BT_OV_UV2DI_V2DI, BT_UV2DI, BT_V2DI) DEF_OV_TYPE (BT_OV_UV4SI_BV4SI_BV4SI, BT_UV4SI, BT_BV4SI, BT_BV4SI) DEF_OV_TYPE (BT_OV_UV4SI_BV4SI_BV4SI_INTPTR, BT_UV4SI, BT_BV4SI, BT_BV4SI, BT_INTPTR) DEF_OV_TYPE (BT_OV_UV4SI_BV4SI_UV4SI, BT_UV4SI, BT_BV4SI, BT_UV4SI) +DEF_OV_TYPE (BT_OV_UV4SI_LONG_FLTPTR, BT_UV4SI, BT_LONG, BT_FLTPTR) +DEF_OV_TYPE (BT_OV_UV4SI_LONG_UINTCONSTPTR, BT_UV4SI, BT_LONG, BT_UINTCONSTPTR) DEF_OV_TYPE (BT_OV_UV4SI_LONG_UINTPTR, BT_UV4SI, BT_LONG, BT_UINTPTR) DEF_OV_TYPE (BT_OV_UV4SI_UINT, BT_UV4SI, BT_UINT) DEF_OV_TYPE (BT_OV_UV4SI_UINTCONSTPTR, BT_UV4SI, BT_UINTCONSTPTR) @@ -593,6 +598,7 @@ DEF_OV_TYPE (BT_OV_UV4SI_V4SI, BT_UV4SI, BT_V4SI) DEF_OV_TYPE (BT_OV_UV8HI_BV8HI_BV8HI, BT_UV8HI, BT_BV8HI, BT_BV8HI) DEF_OV_TYPE (BT_OV_UV8HI_BV8HI_BV8HI_INTPTR, BT_UV8HI, BT_BV8HI, BT_BV8HI, BT_INTPTR) DEF_OV_TYPE (BT_OV_UV8HI_BV8HI_UV8HI, BT_UV8HI, BT_BV8HI, BT_UV8HI) +DEF_OV_TYPE (BT_OV_UV8HI_LONG_USHORTCONSTPTR, BT_UV8HI, BT_LONG, BT_USHORTCONSTPTR) DEF_OV_TYPE (BT_OV_UV8HI_LONG_USHORTPTR, BT_UV8HI, BT_LONG, BT_USHORTPTR) DEF_OV_TYPE (BT_OV_UV8HI_USHORT, BT_UV8HI, BT_USHORT) DEF_OV_TYPE (BT_OV_UV8HI_USHORTCONSTPTR, BT_UV8HI, BT_USHORTCONSTPTR) @@ -626,6 +632,7 @@ DEF_OV_TYPE (BT_OV_UV8HI_UV8HI_V8HI, BT_UV8HI, BT_UV8HI, BT_V8HI) DEF_OV_TYPE (BT_OV_UV8HI_V4SI_V4SI, BT_UV8HI, BT_V4SI, BT_V4SI) DEF_OV_TYPE (BT_OV_UV8HI_V8HI, BT_UV8HI, BT_V8HI) DEF_OV_TYPE (BT_OV_V16QI_BV16QI_V16QI, BT_V16QI, BT_BV16QI, BT_V16QI) +DEF_OV_TYPE (BT_OV_V16QI_LONG_SCHARCONSTPTR, BT_V16QI, BT_LONG, BT_SCHARCONSTPTR) DEF_OV_TYPE (BT_OV_V16QI_LONG_SCHARPTR, BT_V16QI, BT_LONG, BT_SCHARPTR) DEF_OV_TYPE (BT_OV_V16QI_SCHAR, BT_V16QI, BT_SCHAR) DEF_OV_TYPE (BT_OV_V16QI_SCHARCONSTPTR, BT_V16QI, BT_SCHARCONSTPTR) @@ -660,6 +667,7 @@ DEF_OV_TYPE (BT_OV_V2DF_DBLCONSTPTR_UINT, BT_V2DF, BT_DBLCONSTPTR, BT_UINT) DEF_OV_TYPE (BT_OV_V2DF_DBLCONSTPTR_USHORT, BT_V2DF, BT_DBLCONSTPTR, BT_USHORT) DEF_OV_TYPE (BT_OV_V2DF_DBL_INT, BT_V2DF, BT_DBL, BT_INT) DEF_OV_TYPE (BT_OV_V2DF_DBL_V2DF_INT, BT_V2DF, BT_DBL, BT_V2DF, BT_INT) +DEF_OV_TYPE (BT_OV_V2DF_LONG_DBLCONSTPTR, BT_V2DF, BT_LONG, BT_DBLCONSTPTR) DEF_OV_TYPE (BT_OV_V2DF_LONG_DBLPTR, BT_V2DF, BT_LONG, BT_DBLPTR) DEF_OV_TYPE (BT_OV_V2DF_UV2DI, BT_V2DF, BT_UV2DI) DEF_OV_TYPE (BT_OV_V2DF_UV2DI_INT, BT_V2DF, BT_UV2DI, BT_INT) @@ -687,6 +695,7 @@ DEF_OV_TYPE (BT_OV_V2DI_LONGLONGCONSTPTR_USHORT, BT_V2DI, BT_LONGLONGCONSTPTR, B DEF_OV_TYPE (BT_OV_V2DI_LONGLONG_INT, BT_V2DI, BT_LONGLONG, BT_INT) DEF_OV_TYPE (BT_OV_V2DI_LONGLONG_LONGLONG, BT_V2DI, BT_LONGLONG, BT_LONGLONG) DEF_OV_TYPE (BT_OV_V2DI_LONGLONG_V2DI_INT, BT_V2DI, BT_LONGLONG, BT_V2DI, BT_INT) +DEF_OV_TYPE (BT_OV_V2DI_LONG_LONGLONGCONSTPTR, BT_V2DI, BT_LONG, BT_LONGLONGCONSTPTR) DEF_OV_TYPE (BT_OV_V2DI_LONG_LONGLONGPTR, BT_V2DI, BT_LONG, BT_LONGLONGPTR) DEF_OV_TYPE (BT_OV_V2DI_V16QI, BT_V2DI, BT_V16QI) DEF_OV_TYPE (BT_OV_V2DI_V2DI, BT_V2DI, BT_V2DI) @@ -716,7 +725,7 @@ DEF_OV_TYPE (BT_OV_V4SF_FLTCONSTPTR_UINT, BT_V4SF, BT_FLTCONSTPTR, BT_UINT) DEF_OV_TYPE (BT_OV_V4SF_FLTCONSTPTR_USHORT, BT_V4SF, BT_FLTCONSTPTR, BT_USHORT) DEF_OV_TYPE (BT_OV_V4SF_FLT_INT, BT_V4SF, BT_FLT, BT_INT) DEF_OV_TYPE (BT_OV_V4SF_FLT_V4SF_INT, BT_V4SF, BT_FLT, BT_V4SF, BT_INT) -DEF_OV_TYPE (BT_OV_V4SF_LONG_FLTPTR, BT_V4SF, BT_LONG, BT_FLTPTR) +DEF_OV_TYPE (BT_OV_V4SF_LONG_FLTCONSTPTR, BT_V4SF, BT_LONG, BT_FLTCONSTPTR) DEF_OV_TYPE (BT_OV_V4SF_V4SF, BT_V4SF, BT_V4SF) DEF_OV_TYPE (BT_OV_V4SF_V4SF_BV4SI, BT_V4SF, BT_V4SF, BT_BV4SI) DEF_OV_TYPE (BT_OV_V4SF_V4SF_UCHAR, BT_V4SF, BT_V4SF, BT_UCHAR) @@ -737,6 +746,7 @@ DEF_OV_TYPE (BT_OV_V4SI_INTCONSTPTR_UINT, BT_V4SI, BT_INTCONSTPTR, BT_UINT) DEF_OV_TYPE (BT_OV_V4SI_INTCONSTPTR_USHORT, BT_V4SI, BT_INTCONSTPTR, BT_USHORT) DEF_OV_TYPE (BT_OV_V4SI_INT_INT, BT_V4SI, BT_INT, BT_INT) DEF_OV_TYPE (BT_OV_V4SI_INT_V4SI_INT, BT_V4SI, BT_INT, BT_V4SI, BT_INT) +DEF_OV_TYPE (BT_OV_V4SI_LONG_INTCONSTPTR, BT_V4SI, BT_LONG, BT_INTCONSTPTR) DEF_OV_TYPE (BT_OV_V4SI_LONG_INTPTR, BT_V4SI, BT_LONG, BT_INTPTR) DEF_OV_TYPE (BT_OV_V4SI_UV4SI_V4SI_V4SI, BT_V4SI, BT_UV4SI, BT_V4SI, BT_V4SI) DEF_OV_TYPE (BT_OV_V4SI_V2DI_V2DI, BT_V4SI, BT_V2DI, BT_V2DI) @@ -764,6 +774,7 @@ DEF_OV_TYPE (BT_OV_V4SI_V8HI, BT_V4SI, BT_V8HI) DEF_OV_TYPE (BT_OV_V4SI_V8HI_V8HI, BT_V4SI, BT_V8HI, BT_V8HI) DEF_OV_TYPE (BT_OV_V4SI_V8HI_V8HI_V4SI, BT_V4SI, BT_V8HI, BT_V8HI, BT_V4SI) DEF_OV_TYPE (BT_OV_V8HI_BV8HI_V8HI, BT_V8HI, BT_BV8HI, BT_V8HI) +DEF_OV_TYPE (BT_OV_V8HI_LONG_SHORTCONSTPTR, BT_V8HI, BT_LONG, BT_SHORTCONSTPTR) DEF_OV_TYPE (BT_OV_V8HI_LONG_SHORTPTR, BT_V8HI, BT_LONG, BT_SHORTPTR) DEF_OV_TYPE (BT_OV_V8HI_SHORT, BT_V8HI, BT_SHORT) DEF_OV_TYPE (BT_OV_V8HI_SHORTCONSTPTR, BT_V8HI, BT_SHORTCONSTPTR) @@ -802,6 +813,7 @@ DEF_OV_TYPE (BT_OV_VOID_UV16QI_UCHARPTR_UINT, BT_VOID, BT_UV16QI, BT_UCHARPTR, B DEF_OV_TYPE (BT_OV_VOID_UV2DI_LONG_ULONGLONGPTR, BT_VOID, BT_UV2DI, BT_LONG, BT_ULONGLONGPTR) DEF_OV_TYPE (BT_OV_VOID_UV2DI_ULONGLONGPTR_UINT, BT_VOID, BT_UV2DI, BT_ULONGLONGPTR, BT_UINT) DEF_OV_TYPE (BT_OV_VOID_UV2DI_UV2DI_ULONGLONGPTR_ULONGLONG, BT_VOID, BT_UV2DI, BT_UV2DI, BT_ULONGLONGPTR, BT_ULONGLONG) +DEF_OV_TYPE (BT_OV_VOID_UV4SI_LONG_FLTPTR, BT_VOID, BT_UV4SI, BT_LONG, BT_FLTPTR) DEF_OV_TYPE (BT_OV_VOID_UV4SI_LONG_UINTPTR, BT_VOID, BT_UV4SI, BT_LONG, BT_UINTPTR) DEF_OV_TYPE (BT_OV_VOID_UV4SI_UINTPTR_UINT, BT_VOID, BT_UV4SI, BT_UINTPTR, BT_UINT) DEF_OV_TYPE (BT_OV_VOID_UV4SI_UV4SI_UINTPTR_ULONGLONG, BT_VOID, BT_UV4SI, BT_UV4SI, BT_UINTPTR, BT_ULONGLONG) diff --git a/gcc/config/s390/s390-builtins.def b/gcc/config/s390/s390-builtins.def index 49caa01245d..365e794316a 100644 --- a/gcc/config/s390/s390-builtins.def +++ b/gcc/config/s390/s390-builtins.def @@ -328,36 +328,38 @@ B_DEF (s390_vgmh, vec_genmaskv8hi, 0, B_DEF (s390_vgmf, vec_genmaskv4si, 0, B_VX, O1_U8 | O2_U8, BT_FN_UV4SI_UCHAR_UCHAR) B_DEF (s390_vgmg, vec_genmaskv2di, 0, B_VX, O1_U8 | O2_U8, BT_FN_UV2DI_UCHAR_UCHAR) -OB_DEF (s390_vec_xl, s390_vec_xl_s8, s390_vec_xl_dbl, B_VX, BT_FN_V4SI_INT_VOIDPTR) -OB_DEF_VAR (s390_vec_xl_s8, MAX, 0, O1_LIT, BT_OV_V16QI_LONG_SCHARPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_u8, MAX, 0, O1_LIT, BT_OV_UV16QI_LONG_UCHARPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_s16, MAX, 0, O1_LIT, BT_OV_V8HI_LONG_SHORTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_u16, MAX, 0, O1_LIT, BT_OV_UV8HI_LONG_USHORTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_s32, MAX, 0, O1_LIT, BT_OV_V4SI_LONG_INTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_u32, MAX, 0, O1_LIT, BT_OV_UV4SI_LONG_UINTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_s64, MAX, 0, O1_LIT, BT_OV_V2DI_LONG_LONGLONGPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_u64, MAX, 0, O1_LIT, BT_OV_UV2DI_LONG_ULONGLONGPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_flt, MAX, 0, O1_LIT, BT_OV_V4SF_LONG_FLTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xl_dbl, MAX, 0, O1_LIT, BT_OV_V2DF_LONG_DBLPTR) /* vl */ - -OB_DEF (s390_vec_xld2, s390_vec_xld2_s8, s390_vec_xld2_dbl, B_DEP | B_VX, BT_FN_V4SI_INT_VOIDPTR) -OB_DEF_VAR (s390_vec_xld2_s8, MAX, 0, O1_LIT, BT_OV_V16QI_LONG_SCHARPTR) /* vl */ -OB_DEF_VAR (s390_vec_xld2_u8, MAX, 0, O1_LIT, BT_OV_UV16QI_LONG_UCHARPTR) /* vl */ -OB_DEF_VAR (s390_vec_xld2_s16, MAX, 0, O1_LIT, BT_OV_V8HI_LONG_SHORTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xld2_u16, MAX, 0, O1_LIT, BT_OV_UV8HI_LONG_USHORTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xld2_s32, MAX, 0, O1_LIT, BT_OV_V4SI_LONG_INTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xld2_u32, MAX, 0, O1_LIT, BT_OV_UV4SI_LONG_UINTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xld2_s64, MAX, 0, O1_LIT, BT_OV_V2DI_LONG_LONGLONGPTR) /* vl */ -OB_DEF_VAR (s390_vec_xld2_u64, MAX, 0, O1_LIT, BT_OV_UV2DI_LONG_ULONGLONGPTR) /* vl */ -OB_DEF_VAR (s390_vec_xld2_dbl, MAX, 0, O1_LIT, BT_OV_V2DF_LONG_DBLPTR) /* vl */ - -OB_DEF (s390_vec_xlw4, s390_vec_xlw4_s8, s390_vec_xlw4_u32, B_DEP | B_VX, BT_FN_V4SI_INT_VOIDPTR) -OB_DEF_VAR (s390_vec_xlw4_s8, MAX, 0, O1_LIT, BT_OV_V16QI_LONG_SCHARPTR) /* vl */ -OB_DEF_VAR (s390_vec_xlw4_u8, MAX, 0, O1_LIT, BT_OV_UV16QI_LONG_UCHARPTR) /* vl */ -OB_DEF_VAR (s390_vec_xlw4_s16, MAX, 0, O1_LIT, BT_OV_V8HI_LONG_SHORTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xlw4_u16, MAX, 0, O1_LIT, BT_OV_UV8HI_LONG_USHORTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xlw4_s32, MAX, 0, O1_LIT, BT_OV_V4SI_LONG_INTPTR) /* vl */ -OB_DEF_VAR (s390_vec_xlw4_u32, MAX, 0, O1_LIT, BT_OV_UV4SI_LONG_UINTPTR) /* vl */ +OB_DEF (s390_vec_xl, s390_vec_xl_s8, s390_vec_xl_dbl, B_VX, BT_FN_V4SI_INT_VOIDCONSTPTR) +OB_DEF_VAR (s390_vec_xl_s8, MAX, 0, O1_LIT, BT_OV_V16QI_LONG_SCHARCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_u8, MAX, 0, O1_LIT, BT_OV_UV16QI_LONG_UCHARCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_s16, MAX, 0, O1_LIT, BT_OV_V8HI_LONG_SHORTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_u16, MAX, 0, O1_LIT, BT_OV_UV8HI_LONG_USHORTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_s32, MAX, 0, O1_LIT, BT_OV_V4SI_LONG_INTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_u32, MAX, 0, O1_LIT, BT_OV_UV4SI_LONG_UINTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_s64, MAX, 0, O1_LIT, BT_OV_V2DI_LONG_LONGLONGCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_u64, MAX, 0, O1_LIT, BT_OV_UV2DI_LONG_ULONGLONGCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_flt, MAX, 0, O1_LIT, BT_OV_V4SF_LONG_FLTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xl_dbl, MAX, 0, O1_LIT, BT_OV_V2DF_LONG_DBLCONSTPTR) /* vl */ + +OB_DEF (s390_vec_xld2, s390_vec_xld2_s8, s390_vec_xld2_dbl, B_DEP | B_VX, BT_FN_V4SI_INT_VOIDCONSTPTR) +OB_DEF_VAR (s390_vec_xld2_s8, MAX, 0, O1_LIT, BT_OV_V16QI_LONG_SCHARCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_u8, MAX, 0, O1_LIT, BT_OV_UV16QI_LONG_UCHARCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_s16, MAX, 0, O1_LIT, BT_OV_V8HI_LONG_SHORTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_u16, MAX, 0, O1_LIT, BT_OV_UV8HI_LONG_USHORTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_s32, MAX, 0, O1_LIT, BT_OV_V4SI_LONG_INTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_u32, MAX, 0, O1_LIT, BT_OV_UV4SI_LONG_UINTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_s64, MAX, 0, O1_LIT, BT_OV_V2DI_LONG_LONGLONGCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_u64, MAX, 0, O1_LIT, BT_OV_UV2DI_LONG_ULONGLONGCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_flt, MAX, B_VXE, O1_LIT, BT_OV_V4SF_LONG_FLTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xld2_dbl, MAX, 0, O1_LIT, BT_OV_V2DF_LONG_DBLCONSTPTR) /* vl */ + +OB_DEF (s390_vec_xlw4, s390_vec_xlw4_s8, s390_vec_xlw4_flt, B_DEP | B_VX, BT_FN_V4SI_INT_VOIDCONSTPTR) +OB_DEF_VAR (s390_vec_xlw4_s8, MAX, 0, O1_LIT, BT_OV_V16QI_LONG_SCHARCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xlw4_u8, MAX, 0, O1_LIT, BT_OV_UV16QI_LONG_UCHARCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xlw4_s16, MAX, 0, O1_LIT, BT_OV_V8HI_LONG_SHORTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xlw4_u16, MAX, 0, O1_LIT, BT_OV_UV8HI_LONG_USHORTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xlw4_s32, MAX, 0, O1_LIT, BT_OV_V4SI_LONG_INTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xlw4_u32, MAX, 0, O1_LIT, BT_OV_UV4SI_LONG_UINTCONSTPTR) /* vl */ +OB_DEF_VAR (s390_vec_xlw4_flt, MAX, B_VXE, O1_LIT, BT_OV_V4SF_LONG_FLTCONSTPTR) /* vl */ OB_DEF (s390_vec_splats, s390_vec_splats_s8, s390_vec_splats_dbl,B_VX, BT_FN_OV4SI_INT) OB_DEF_VAR (s390_vec_splats_s8, s390_vlrepb, 0, 0, BT_OV_V16QI_SCHAR) @@ -746,13 +748,14 @@ OB_DEF_VAR (s390_vec_xstd2_s64, MAX, 0, OB_DEF_VAR (s390_vec_xstd2_u64, MAX, 0, O2_LIT, BT_OV_VOID_UV2DI_LONG_ULONGLONGPTR) /* vst */ OB_DEF_VAR (s390_vec_xstd2_dbl, MAX, 0, O2_LIT, BT_OV_VOID_V2DF_LONG_DBLPTR) /* vst */ -OB_DEF (s390_vec_xstw4, s390_vec_xstw4_s8, s390_vec_xstw4_u32, B_DEP | B_VX, BT_FN_VOID_OV4SI_INT_VOIDPTR) +OB_DEF (s390_vec_xstw4, s390_vec_xstw4_s8, s390_vec_xstw4_flt, B_DEP | B_VX, BT_FN_VOID_OV4SI_INT_VOIDPTR) OB_DEF_VAR (s390_vec_xstw4_s8, MAX, 0, O2_LIT, BT_OV_VOID_V16QI_LONG_SCHARPTR) /* vst */ OB_DEF_VAR (s390_vec_xstw4_u8, MAX, 0, O2_LIT, BT_OV_VOID_UV16QI_LONG_UCHARPTR) /* vst */ OB_DEF_VAR (s390_vec_xstw4_s16, MAX, 0, O2_LIT, BT_OV_VOID_V8HI_LONG_SHORTPTR) /* vst */ OB_DEF_VAR (s390_vec_xstw4_u16, MAX, 0, O2_LIT, BT_OV_VOID_UV8HI_LONG_USHORTPTR) /* vst */ OB_DEF_VAR (s390_vec_xstw4_s32, MAX, 0, O2_LIT, BT_OV_VOID_V4SI_LONG_INTPTR) /* vst */ OB_DEF_VAR (s390_vec_xstw4_u32, MAX, 0, O2_LIT, BT_OV_VOID_UV4SI_LONG_UINTPTR) /* vst */ +OB_DEF_VAR (s390_vec_xstw4_flt, MAX, B_VXE, O2_LIT, BT_OV_VOID_V4SF_LONG_FLTPTR) /* vst */ OB_DEF (s390_vec_store_len, s390_vec_store_len_s8,s390_vec_store_len_dbl,B_VX, BT_FN_VOID_OV4SI_VOIDPTR_UINT) OB_DEF_VAR (s390_vec_store_len_s8, s390_vstl, 0, 0, BT_OV_VOID_V16QI_SCHARPTR_UINT) @@ -2811,8 +2814,8 @@ B_DEF (s390_vfsqsb, sqrtv4sf2, 0, B_DEF (s390_vfsqdb, sqrtv2df2, 0, B_VX, 0, BT_FN_V2DF_V2DF) OB_DEF (s390_vec_double, s390_vec_double_s64,s390_vec_double_u64,B_VX, BT_FN_OV4SI_OV4SI) -OB_DEF_VAR (s390_vec_double_s64, s390_vcdgb, 0, 0, BT_OV_V2DF_V2DI) -OB_DEF_VAR (s390_vec_double_u64, s390_vcdlgb, 0, 0, BT_OV_V2DF_UV2DI) +OB_DEF_VAR (s390_vec_double_s64, s390_vec_double_s64,0, 0, BT_OV_V2DF_V2DI) +OB_DEF_VAR (s390_vec_double_u64, s390_vec_double_u64,0, 0, BT_OV_V2DF_UV2DI) B_DEF (s390_vec_double_s64, vec_double_s64, 0, B_INT | B_VX, 0, BT_FN_V2DF_V2DI) /* vcdgb */ B_DEF (s390_vec_double_u64, vec_double_u64, 0, B_INT | B_VX, 0, BT_FN_V2DF_UV2DI) /* vcdlgb */ diff --git a/gcc/config/s390/s390-c.c b/gcc/config/s390/s390-c.c index 4a72d499cee..8fb46b03af3 100644 --- a/gcc/config/s390/s390-c.c +++ b/gcc/config/s390/s390-c.c @@ -477,16 +477,30 @@ s390_expand_overloaded_builtin (location_t loc, case S390_OVERLOADED_BUILTIN_s390_vec_xl: case S390_OVERLOADED_BUILTIN_s390_vec_xld2: case S390_OVERLOADED_BUILTIN_s390_vec_xlw4: - return build2 (MEM_REF, return_type, - fold_build_pointer_plus ((*arglist)[1], (*arglist)[0]), - build_int_cst (TREE_TYPE ((*arglist)[1]), 0)); + { + /* Build a vector type with the alignment of the source + location in order to enable correct alignment hints to be + generated for vl. */ + tree mem_type = build_aligned_type (return_type, + TYPE_ALIGN (TREE_TYPE (TREE_TYPE ((*arglist)[1])))); + return build2 (MEM_REF, mem_type, + fold_build_pointer_plus ((*arglist)[1], (*arglist)[0]), + build_int_cst (TREE_TYPE ((*arglist)[1]), 0)); + } case S390_OVERLOADED_BUILTIN_s390_vec_xst: case S390_OVERLOADED_BUILTIN_s390_vec_xstd2: case S390_OVERLOADED_BUILTIN_s390_vec_xstw4: - return build2 (MODIFY_EXPR, TREE_TYPE((*arglist)[0]), - build1 (INDIRECT_REF, TREE_TYPE((*arglist)[0]), - fold_build_pointer_plus ((*arglist)[2], (*arglist)[1])), - (*arglist)[0]); + { + /* Build a vector type with the alignment of the target + location in order to enable correct alignment hints to be + generated for vst. */ + tree mem_type = build_aligned_type (TREE_TYPE((*arglist)[0]), + TYPE_ALIGN (TREE_TYPE (TREE_TYPE ((*arglist)[2])))); + return build2 (MODIFY_EXPR, mem_type, + build1 (INDIRECT_REF, mem_type, + fold_build_pointer_plus ((*arglist)[2], (*arglist)[1])), + (*arglist)[0]); + } case S390_OVERLOADED_BUILTIN_s390_vec_load_pair: return build_constructor_va (return_type, 2, NULL_TREE, (*arglist)[0], diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 2ef825a5537..92bfa3e10c6 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -951,6 +951,8 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, continue; } + /* A memory operand is rejected by the memory_operand predicate. + Try making the address legal by copying it into a register. */ if (MEM_P (op[arity]) && insn_op->predicate == memory_operand && (GET_MODE (XEXP (op[arity], 0)) == Pmode @@ -974,10 +976,14 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, { op[arity] = tmp_rtx; } - else if (GET_MODE (op[arity]) == insn_op->mode - || GET_MODE (op[arity]) == VOIDmode - || (insn_op->predicate == address_operand - && GET_MODE (op[arity]) == Pmode)) + + /* The predicate rejects the operand although the mode is fine. + Copy the operand to register. */ + if (!insn_op->predicate (op[arity], insn_op->mode) + && (GET_MODE (op[arity]) == insn_op->mode + || GET_MODE (op[arity]) == VOIDmode + || (insn_op->predicate == address_operand + && GET_MODE (op[arity]) == Pmode))) { /* An address_operand usually has VOIDmode in the expander so we cannot use this. */ @@ -6865,11 +6871,16 @@ s390_expand_vec_init (rtx target, rtx vals) return; } + /* Use vector replicate instructions. vlrep/vrepi/vrep */ if (all_same) { - emit_insn (gen_rtx_SET (target, - gen_rtx_VEC_DUPLICATE (mode, - XVECEXP (vals, 0, 0)))); + rtx elem = XVECEXP (vals, 0, 0); + + /* vec_splats accepts general_operand as source. */ + if (!general_operand (elem, GET_MODE (elem))) + elem = force_reg (inner_mode, elem); + + emit_insn (gen_rtx_SET (target, gen_rtx_VEC_DUPLICATE (mode, elem))); return; } @@ -10290,6 +10301,8 @@ s390_register_info () s390_register_info_stdarg_gpr (); } +static inline bool global_not_special_regno_p (int regno); + /* This function is called by s390_optimize_prologue in order to get rid of unnecessary GPR save/restore instructions. The register info for the GPRs is re-computed and the ranges are re-calculated. */ @@ -10305,8 +10318,10 @@ s390_optimize_register_info () s390_regs_ever_clobbered (clobbered_regs); + /* Global registers do not need to be saved and restored unless it + is one of our special regs. (r12, r13, r14, or r15). */ for (i = 0; i < 32; i++) - clobbered_regs[i] = clobbered_regs[i] && !global_regs[i]; + clobbered_regs[i] = clobbered_regs[i] && !global_not_special_regno_p (i); /* There is still special treatment needed for cases invisible to s390_regs_ever_clobbered. */ @@ -17030,6 +17045,7 @@ s390_can_inline_p (tree caller, tree callee) return ret; } +#endif /* Set VAL to correct enum value according to the indirect-branch or function-return attribute in ATTR. */ @@ -17103,6 +17119,7 @@ s390_indirect_branch_settings (tree fndecl) s390_indirect_branch_attrvalue (attr, &cfun->machine->function_return_mem); } +#if S390_USE_TARGET_ATTRIBUTE /* Restore targets globals from NEW_TREE and invalidate s390_previous_fndecl cache. */ @@ -17118,6 +17135,7 @@ s390_activate_target_options (tree new_tree) TREE_TARGET_GLOBALS (new_tree) = save_target_globals_default_opts (); s390_previous_fndecl = NULL_TREE; } +#endif /* Establish appropriate back-end context for processing the function FNDECL. The argument might be NULL to indicate processing at top @@ -17125,6 +17143,7 @@ s390_activate_target_options (tree new_tree) static void s390_set_current_function (tree fndecl) { +#if S390_USE_TARGET_ATTRIBUTE /* Only change the context if the function changes. This hook is called several times in the course of compiling a function, and we don't want to slow things down too much or call target_reinit when it isn't safe. */ @@ -17156,10 +17175,9 @@ s390_set_current_function (tree fndecl) if (old_tree != new_tree) s390_activate_target_options (new_tree); s390_previous_fndecl = fndecl; - +#endif s390_indirect_branch_settings (fndecl); } -#endif /* Implement TARGET_USE_BY_PIECES_INFRASTRUCTURE_P. */ @@ -17912,10 +17930,10 @@ s390_internal_arg_pointer (void) #undef TARGET_ASM_FILE_END #define TARGET_ASM_FILE_END s390_asm_file_end -#if S390_USE_TARGET_ATTRIBUTE #undef TARGET_SET_CURRENT_FUNCTION #define TARGET_SET_CURRENT_FUNCTION s390_set_current_function +#if S390_USE_TARGET_ATTRIBUTE #undef TARGET_OPTION_VALID_ATTRIBUTE_P #define TARGET_OPTION_VALID_ATTRIBUTE_P s390_valid_target_attribute_p diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 190f9859e85..8ff3ff09449 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -405,6 +405,10 @@ ; Bitposition of operand types (PFPO_OP0_TYPE_SHIFT 16) (PFPO_OP1_TYPE_SHIFT 8) + ; Decide whether current DFP or BFD rounding mode should be used + ; for the conversion. + (PFPO_RND_MODE_DFP 0) + (PFPO_RND_MODE_BFP 1) ]) ; Immediate operands for tbegin and tbeginc @@ -1332,10 +1336,11 @@ ; (TF|DF|SF|TD|DD|SD) instructions -; load and test instructions turn SNaN into QNaN what is not +; FIXME: load and test instructions turn SNaN into QNaN what is not ; acceptable if the target will be used afterwards. On the other hand ; they are quite convenient for implementing comparisons with 0.0. So -; try to enable them via splitter if the value isn't needed anymore. +; try to enable them via splitter/peephole if the value isn't needed anymore. +; See testcases: load-and-test-fp-1.c and load-and-test-fp-2.c ; ltxbr, ltdbr, ltebr, ltxtr, ltdtr (define_insn "*cmp_ccs_0" @@ -1348,22 +1353,6 @@ [(set_attr "op_type" "RRE") (set_attr "type" "fsimp")]) -(define_split - [(set (match_operand 0 "cc_reg_operand") - (compare (match_operand:FP 1 "register_operand") - (match_operand:FP 2 "const0_operand")))] - "TARGET_HARD_FLOAT && REG_P (operands[1]) && dead_or_set_p (insn, operands[1])" - [(parallel - [(set (match_dup 0) (match_dup 3)) - (clobber (match_dup 1))])] - { - /* s390_match_ccmode requires the compare to have the same CC mode - as the CC destination register. */ - operands[3] = gen_rtx_COMPARE (GET_MODE (operands[0]), - operands[1], operands[2]); - }) - - ; VX: TFmode in FPR pairs: use cxbr instead of wfcxb ; cxtr, cdtr, cxbr, cdbr, cebr, cdb, ceb, wfcsb, wfcdb (define_insn "*cmp_ccs" @@ -5378,9 +5367,13 @@ { HOST_WIDE_INT flags; + /* According to IEEE 754 2008 4.3 'Rounding-direction attributes' the + rounding mode of the target format needs to be used. */ + flags = (PFPO_CONVERT | PFPO_OP_TYPE_ << PFPO_OP0_TYPE_SHIFT | - PFPO_OP_TYPE_ << PFPO_OP1_TYPE_SHIFT); + PFPO_OP_TYPE_ << PFPO_OP1_TYPE_SHIFT | + PFPO_RND_MODE_DFP); operands[2] = GEN_INT (flags); }) @@ -5400,9 +5393,13 @@ { HOST_WIDE_INT flags; + /* According to IEEE 754 2008 4.3 'Rounding-direction attributes' the + rounding mode of the target format needs to be used. */ + flags = (PFPO_CONVERT | PFPO_OP_TYPE_ << PFPO_OP0_TYPE_SHIFT | - PFPO_OP_TYPE_ << PFPO_OP1_TYPE_SHIFT); + PFPO_OP_TYPE_ << PFPO_OP1_TYPE_SHIFT | + PFPO_RND_MODE_BFP); operands[2] = GEN_INT (flags); }) @@ -5443,9 +5440,13 @@ { HOST_WIDE_INT flags; + /* According to IEEE 754 2008 4.3 'Rounding-direction attributes' the + rounding mode of the target format needs to be used. */ + flags = (PFPO_CONVERT | PFPO_OP_TYPE_ << PFPO_OP0_TYPE_SHIFT | - PFPO_OP_TYPE_ << PFPO_OP1_TYPE_SHIFT); + PFPO_OP_TYPE_ << PFPO_OP1_TYPE_SHIFT | + PFPO_RND_MODE_DFP); operands[2] = GEN_INT (flags); }) @@ -5465,9 +5466,13 @@ { HOST_WIDE_INT flags; + /* According to IEEE 754 2008 4.3 'Rounding-direction attributes' the + rounding mode of the target format needs to be used. */ + flags = (PFPO_CONVERT | PFPO_OP_TYPE_ << PFPO_OP0_TYPE_SHIFT | - PFPO_OP_TYPE_ << PFPO_OP1_TYPE_SHIFT); + PFPO_OP_TYPE_ << PFPO_OP1_TYPE_SHIFT | + PFPO_RND_MODE_BFP); operands[2] = GEN_INT (flags); }) @@ -8861,17 +8866,17 @@ DONE; }) +; CLZ result is in hard reg op0 - this is the high part of the target operand +; The source with the left-most one bit cleared is in hard reg op0 + 1 - the low part (define_insn "clztidi2" [(set (match_operand:TI 0 "register_operand" "=d") (ior:TI - (ashift:TI - (zero_extend:TI - (xor:DI (match_operand:DI 1 "register_operand" "d") - (lshiftrt (match_operand:DI 2 "const_int_operand" "") - (subreg:SI (clz:DI (match_dup 1)) 4)))) - - (const_int 64)) - (zero_extend:TI (clz:DI (match_dup 1))))) + (ashift:TI (zero_extend:TI (clz:DI (match_operand:DI 1 "register_operand" "d"))) + (const_int 64)) + (zero_extend:TI + (xor:DI (match_dup 1) + (lshiftrt (match_operand:DI 2 "const_int_operand" "") + (subreg:SI (clz:DI (match_dup 1)) 4)))))) (clobber (reg:CC CC_REGNUM))] "UINTVAL (operands[2]) == HOST_WIDE_INT_1U << 63 && TARGET_EXTIMM && TARGET_ZARCH" diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md index 102313f04a0..f11ca85ad97 100644 --- a/gcc/config/s390/vector.md +++ b/gcc/config/s390/vector.md @@ -289,9 +289,9 @@ ; However, this would probably be slower. (define_insn "mov" - [(set (match_operand:V_8 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, S, Q, S, d, d,d,d,d,R,T") - (match_operand:V_8 1 "general_operand" " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,j00,jm1,jm1,j00,jm1,R,T,b,d,d"))] - "" + [(set (match_operand:V_8 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, S, Q, S, d, d,d,R,T") + (match_operand:V_8 1 "general_operand" " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,j00,jm1,jm1,j00,jm1,T,d,d"))] + "TARGET_VX" "@ vlr\t%v0,%v1 vlvgb\t%v0,%1,0 @@ -309,12 +309,10 @@ mviy\t%0,-1 lhi\t%0,0 lhi\t%0,-1 - lh\t%0,%1 - lhy\t%0,%1 - lhrl\t%0,%1 + llc\t%0,%1 stc\t%1,%0 stcy\t%1,%0" - [(set_attr "op_type" "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SI,SIY,SI,SIY,RI,RI,RX,RXY,RIL,RX,RXY")]) + [(set_attr "op_type" "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SI,SIY,SI,SIY,RI,RI,RXY,RX,RXY")]) (define_insn "mov" [(set (match_operand:V_16 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, Q, d, d,d,d,d,R,T,b") @@ -944,7 +942,7 @@ (VEC_SHIFTS:VI (match_operand:VI 1 "register_operand" "v") (match_operand:SI 2 "nonmemory_operand" "an")))] "TARGET_VX" - "\t%v0,%v1,%Y2" + "\t%v0,%v1," [(set_attr "op_type" "VRS")]) ; Shift each element by corresponding vector element diff --git a/gcc/config/s390/vx-builtins.md b/gcc/config/s390/vx-builtins.md index 1fa5a392d91..37a64ab58f9 100644 --- a/gcc/config/s390/vx-builtins.md +++ b/gcc/config/s390/vx-builtins.md @@ -1606,7 +1606,7 @@ (define_expand "vec_ctd_s64" [(set (match_operand:V2DF 0 "register_operand" "") (unspec:V2DF [(match_operand:V2DI 1 "register_operand" "") - (const_int 4) ; inexact suppressed + (const_int VEC_NOINEXACT) (const_int VEC_RND_CURRENT)] UNSPEC_VEC_VCDGB)) (use (match_operand:QI 2 "const_int_operand" "")) @@ -1637,7 +1637,7 @@ (define_expand "vec_ctd_u64" [(set (match_operand:V2DF 0 "register_operand" "") (unspec:V2DF [(match_operand:V2DI 1 "register_operand" "") - (const_int 4) ; inexact suppressed + (const_int VEC_NOINEXACT) (const_int VEC_RND_CURRENT)] UNSPEC_VEC_VCDLGB)) (use (match_operand:QI 2 "const_int_operand" "")) @@ -1671,7 +1671,7 @@ (match_dup 3))) (set (match_operand:V2DI 0 "register_operand" "") (unspec:V2DI [(match_dup 4) - (const_int 4) ; inexact suppressed + (const_int VEC_NOINEXACT) (const_int VEC_RND_CURRENT)] UNSPEC_VEC_VCGDB))] "TARGET_VX" @@ -1704,7 +1704,7 @@ (match_dup 3))) (set (match_operand:V2DI 0 "register_operand" "") (unspec:V2DI [(match_dup 4) - (const_int 4) ; inexact suppressed + (const_int VEC_NOINEXACT) (const_int VEC_RND_CURRENT)] UNSPEC_VEC_VCLGDB))] "TARGET_VX" @@ -2025,7 +2025,7 @@ (define_expand "vec_double_s64" [(set (match_operand:V2DF 0 "register_operand") (unspec:V2DF [(match_operand:V2DI 1 "register_operand") - (const_int 0) ; inexact suppression disabled + (const_int VEC_INEXACT) (const_int VEC_RND_CURRENT)] UNSPEC_VEC_VCDGB))] "TARGET_VX") @@ -2033,7 +2033,7 @@ (define_expand "vec_double_u64" [(set (match_operand:V2DF 0 "register_operand") (unspec:V2DF [(match_operand:V2DI 1 "register_operand") - (const_int 0) ; inexact suppression disabled + (const_int VEC_INEXACT) (const_int VEC_RND_CURRENT)] UNSPEC_VEC_VCDLGB))] "TARGET_VX") diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index ced66408265..041c792cc50 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -736,7 +736,7 @@ got_mode_name:; { if (tokens[i] == "strict") ret.strict = true; - else if (tokens[i].find ("gbr-offset=") == 0) + else if (!tokens[i].compare (0, strlen ("gbr-offset="), "gbr-offset=")) { std::string offset_str = tokens[i].substr (strlen ("gbr-offset=")); ret.tcb_gbr_offset = integral_argument (offset_str.c_str ()); @@ -957,11 +957,13 @@ sh_option_override (void) if (flag_unsafe_math_optimizations) { /* Enable fsca insn for SH4A if not otherwise specified by the user. */ - if (global_options_set.x_TARGET_FSCA == 0 && TARGET_SH4A_FP) + if (global_options_set.x_TARGET_FSCA == 0 + && (TARGET_SH4A_FP || TARGET_FPU_SH4_300)) TARGET_FSCA = 1; /* Enable fsrra insn for SH4A if not otherwise specified by the user. */ - if (global_options_set.x_TARGET_FSRRA == 0 && TARGET_SH4A_FP) + if (global_options_set.x_TARGET_FSRRA == 0 + && (TARGET_SH4A_FP || TARGET_FPU_SH4_300)) TARGET_FSRRA = 1; } @@ -10875,12 +10877,6 @@ sh_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, emit_insn (gen_add2_insn (scratch0, GEN_INT (vcall_offset))); offset_addr = scratch0; } - else if (scratch0 != scratch1) - { - emit_move_insn (scratch1, GEN_INT (vcall_offset)); - emit_insn (gen_add2_insn (scratch0, scratch1)); - offset_addr = scratch0; - } else gcc_unreachable (); /* FIXME */ emit_load_ptr (scratch0, offset_addr); @@ -12077,9 +12073,11 @@ sh_extending_set_of_reg::use_as_extended_reg (rtx_insn* use_at_insn) const rtx r = gen_reg_rtx (SImode); rtx_insn* i0; if (from_mode == QImode) - i0 = emit_insn_after (gen_extendqisi2 (r, set_src), insn); + i0 = sh_check_add_incdec_notes ( + emit_insn_after (gen_extendqisi2 (r, set_src), insn)); else if (from_mode == HImode) - i0 = emit_insn_after (gen_extendhisi2 (r, set_src), insn); + i0 = sh_check_add_incdec_notes ( + emit_insn_after (gen_extendhisi2 (r, set_src), insn)); else gcc_unreachable (); @@ -12497,7 +12495,7 @@ static void sh_emit_mode_set (int entity ATTRIBUTE_UNUSED, int mode, int prev_mode, HARD_REG_SET regs_live ATTRIBUTE_UNUSED) { - if ((TARGET_SH4A_FP || TARGET_SH4_300) + if ((TARGET_SH4A_FP || TARGET_FPU_SH4_300) && prev_mode != FP_MODE_NONE && prev_mode != mode) { emit_insn (gen_toggle_pr ()); diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index 2f5930bbebd..190853ab105 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -69,6 +69,8 @@ extern int code_for_indirect_jump_scratch; FPU is disabled (which makes it compatible with SH4al-dsp). */ #define TARGET_SH4A_FP (TARGET_SH4A && TARGET_FPU_ANY) +/* True if the FPU is a SH4-300 variant. */ +#define TARGET_FPU_SH4_300 (TARGET_FPU_ANY && TARGET_SH4_300) /* This is not used by the SH2E calling convention */ #define TARGET_VARARGS_PRETEND_ARGS(FUN_DECL) \ diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 57dd7869419..5912679ee3c 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -9163,7 +9163,7 @@ (xor:SI (reg:SI FPSCR_REG) (const_int FPSCR_PR))) (set (reg:SI FPSCR_MODES_REG) (unspec_volatile:SI [(const_int 0)] UNSPECV_FPSCR_MODES))] - "TARGET_SH4A_FP" + "TARGET_SH4A_FP || TARGET_FPU_SH4_300" "fpchg" [(set_attr "type" "fpscr_toggle")]) @@ -9391,15 +9391,31 @@ (define_expand "negsf2" [(set (match_operand:SF 0 "fp_arith_reg_operand") (neg:SF (match_operand:SF 1 "fp_arith_reg_operand")))] - "TARGET_SH2E") + "TARGET_FPU_ANY" +{ + if (TARGET_FPU_SH4_300) + emit_insn (gen_negsf2_fpscr (operands[0], operands[1])); + else + emit_insn (gen_negsf2_no_fpscr (operands[0], operands[1])); + DONE; +}) -(define_insn "*negsf2_i" +(define_insn "negsf2_no_fpscr" [(set (match_operand:SF 0 "fp_arith_reg_operand" "=f") (neg:SF (match_operand:SF 1 "fp_arith_reg_operand" "0")))] - "TARGET_SH2E" + "TARGET_FPU_ANY && !TARGET_FPU_SH4_300" "fneg %0" [(set_attr "type" "fmove")]) +(define_insn "negsf2_fpscr" + [(set (match_operand:SF 0 "fp_arith_reg_operand" "=f") + (neg:SF (match_operand:SF 1 "fp_arith_reg_operand" "0"))) + (use (reg:SI FPSCR_MODES_REG))] + "TARGET_FPU_SH4_300" + "fneg %0" + [(set_attr "type" "fmove") + (set_attr "fp_mode" "single")]) + (define_expand "sqrtsf2" [(set (match_operand:SF 0 "fp_arith_reg_operand" "") (sqrt:SF (match_operand:SF 1 "fp_arith_reg_operand" "")))] @@ -9489,15 +9505,31 @@ (define_expand "abssf2" [(set (match_operand:SF 0 "fp_arith_reg_operand") (abs:SF (match_operand:SF 1 "fp_arith_reg_operand")))] - "TARGET_SH2E") + "TARGET_FPU_ANY" +{ + if (TARGET_FPU_SH4_300) + emit_insn (gen_abssf2_fpscr (operands[0], operands[1])); + else + emit_insn (gen_abssf2_no_fpscr (operands[0], operands[1])); + DONE; +}) -(define_insn "*abssf2_i" +(define_insn "abssf2_no_fpscr" [(set (match_operand:SF 0 "fp_arith_reg_operand" "=f") (abs:SF (match_operand:SF 1 "fp_arith_reg_operand" "0")))] - "TARGET_SH2E" + "TARGET_FPU_ANY && !TARGET_FPU_SH4_300" "fabs %0" [(set_attr "type" "fmove")]) +(define_insn "abssf2_fpscr" + [(set (match_operand:SF 0 "fp_arith_reg_operand" "=f") + (abs:SF (match_operand:SF 1 "fp_arith_reg_operand" "0"))) + (use (reg:SI FPSCR_MODES_REG))] + "TARGET_FPU_SH4_300" + "fabs %0" + [(set_attr "type" "fmove") + (set_attr "fp_mode" "single")]) + (define_expand "adddf3" [(set (match_operand:DF 0 "fp_arith_reg_operand" "") (plus:DF (match_operand:DF 1 "fp_arith_reg_operand" "") @@ -9673,12 +9705,28 @@ (define_expand "negdf2" [(set (match_operand:DF 0 "fp_arith_reg_operand") (neg:DF (match_operand:DF 1 "fp_arith_reg_operand")))] - "TARGET_FPU_DOUBLE") + "TARGET_FPU_DOUBLE" +{ + if (TARGET_FPU_SH4_300) + emit_insn (gen_negdf2_fpscr (operands[0], operands[1])); + else + emit_insn (gen_negdf2_no_fpscr (operands[0], operands[1])); + DONE; +}) -(define_insn "*negdf2_i" +(define_insn "negdf2_fpscr" + [(set (match_operand:DF 0 "fp_arith_reg_operand" "=f") + (neg:DF (match_operand:DF 1 "fp_arith_reg_operand" "0"))) + (use (reg:SI FPSCR_MODES_REG))] + "TARGET_FPU_SH4_300" + "fneg %0" + [(set_attr "type" "fmove") + (set_attr "fp_mode" "double")]) + +(define_insn "negdf2_no_fpscr" [(set (match_operand:DF 0 "fp_arith_reg_operand" "=f") (neg:DF (match_operand:DF 1 "fp_arith_reg_operand" "0")))] - "TARGET_FPU_DOUBLE" + "TARGET_FPU_DOUBLE && !TARGET_FPU_SH4_300" "fneg %0" [(set_attr "type" "fmove")]) @@ -9704,15 +9752,31 @@ (define_expand "absdf2" [(set (match_operand:DF 0 "fp_arith_reg_operand") (abs:DF (match_operand:DF 1 "fp_arith_reg_operand")))] - "TARGET_FPU_DOUBLE") + "TARGET_FPU_DOUBLE" +{ + if (TARGET_FPU_SH4_300) + emit_insn (gen_absdf2_fpscr (operands[0], operands[1])); + else + emit_insn (gen_absdf2_no_fpscr (operands[0], operands[1])); + DONE; +}) -(define_insn "*absdf2_i" +(define_insn "absdf2_no_fpscr" [(set (match_operand:DF 0 "fp_arith_reg_operand" "=f") (abs:DF (match_operand:DF 1 "fp_arith_reg_operand" "0")))] - "TARGET_FPU_DOUBLE" + "TARGET_FPU_DOUBLE && !TARGET_FPU_SH4_300" "fabs %0" [(set_attr "type" "fmove")]) +(define_insn "absdf2_fpscr" + [(set (match_operand:DF 0 "fp_arith_reg_operand" "=f") + (abs:DF (match_operand:DF 1 "fp_arith_reg_operand" "0"))) + (use (reg:SI FPSCR_MODES_REG))] + "TARGET_FPU_SH4_300" + "fabs %0" + [(set_attr "type" "fmove") + (set_attr "fp_mode" "double")]) + (define_expand "extendsfdf2" [(set (match_operand:DF 0 "fp_arith_reg_operand" "") (float_extend:DF (match_operand:SF 1 "fpul_operand" "")))] diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h index 71a067e871c..b3f73c2f2bf 100644 --- a/gcc/config/sparc/sparc-protos.h +++ b/gcc/config/sparc/sparc-protos.h @@ -69,6 +69,7 @@ extern void sparc_split_reg_mem (rtx, rtx, machine_mode); extern void sparc_split_mem_reg (rtx, rtx, machine_mode); extern int sparc_split_reg_reg_legitimate (rtx, rtx); extern void sparc_split_reg_reg (rtx, rtx, machine_mode); +extern const char *output_load_pcrel_sym (rtx *); extern const char *output_ubranch (rtx, rtx_insn *); extern const char *output_cbranch (rtx, rtx, int, int, int, rtx_insn *); extern const char *output_return (rtx_insn *); diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 4026d4933d8..e435021f914 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -4238,20 +4238,114 @@ sparc_cannot_force_const_mem (machine_mode mode, rtx x) } /* Global Offset Table support. */ +static GTY(()) rtx got_symbol_rtx = NULL_RTX; +static GTY(()) rtx got_register_rtx = NULL_RTX; static GTY(()) rtx got_helper_rtx = NULL_RTX; -static GTY(()) rtx global_offset_table_rtx = NULL_RTX; -/* Return the SYMBOL_REF for the Global Offset Table. */ +static GTY(()) bool got_helper_needed = false; -static GTY(()) rtx sparc_got_symbol = NULL_RTX; +/* Return the SYMBOL_REF for the Global Offset Table. */ static rtx sparc_got (void) { - if (!sparc_got_symbol) - sparc_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_"); + if (!got_symbol_rtx) + got_symbol_rtx = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_"); + + return got_symbol_rtx; +} + +/* Wrapper around the load_pcrel_sym{si,di} patterns. */ + +static rtx +gen_load_pcrel_sym (rtx op0, rtx op1, rtx op2) +{ + int orig_flag_pic = flag_pic; + rtx insn; + + /* The load_pcrel_sym{si,di} patterns require absolute addressing. */ + flag_pic = 0; + if (TARGET_ARCH64) + insn = gen_load_pcrel_symdi (op0, op1, op2, GEN_INT (REGNO (op0))); + else + insn = gen_load_pcrel_symsi (op0, op1, op2, GEN_INT (REGNO (op0))); + flag_pic = orig_flag_pic; + + return insn; +} + +/* Output the load_pcrel_sym{si,di} patterns. */ + +const char * +output_load_pcrel_sym (rtx *operands) +{ + if (flag_delayed_branch) + { + output_asm_insn ("sethi\t%%hi(%a1-4), %0", operands); + output_asm_insn ("call\t%a2", operands); + output_asm_insn (" add\t%0, %%lo(%a1+4), %0", operands); + } + else + { + output_asm_insn ("sethi\t%%hi(%a1-8), %0", operands); + output_asm_insn ("add\t%0, %%lo(%a1-4), %0", operands); + output_asm_insn ("call\t%a2", operands); + output_asm_insn (" nop", NULL); + } + + if (operands[2] == got_helper_rtx) + got_helper_needed = true; - return sparc_got_symbol; + return ""; +} + +#ifdef HAVE_GAS_HIDDEN +# define USE_HIDDEN_LINKONCE 1 +#else +# define USE_HIDDEN_LINKONCE 0 +#endif + +/* Emit code to load the GOT register. */ + +void +load_got_register (void) +{ + rtx insn; + + if (TARGET_VXWORKS_RTP) + { + if (!got_register_rtx) + got_register_rtx = pic_offset_table_rtx; + + insn = gen_vxworks_load_got (); + } + else + { + if (!got_register_rtx) + got_register_rtx = gen_rtx_REG (Pmode, GLOBAL_OFFSET_TABLE_REGNUM); + + /* The GOT symbol is subject to a PC-relative relocation so we need a + helper function to add the PC value and thus get the final value. */ + if (!got_helper_rtx) + { + char name[32]; + + /* Skip the leading '%' as that cannot be used in a symbol name. */ + if (USE_HIDDEN_LINKONCE) + sprintf (name, "__sparc_get_pc_thunk.%s", + reg_names[REGNO (got_register_rtx)] + 1); + else + ASM_GENERATE_INTERNAL_LABEL (name, "LADDPC", + REGNO (got_register_rtx)); + + got_helper_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name)); + } + + insn + = gen_load_pcrel_sym (got_register_rtx, sparc_got (), got_helper_rtx); + } + + emit_insn (insn); } /* Ensure that we are not using patterns that are not OK with PIC. */ @@ -4387,7 +4481,7 @@ sparc_pic_register_p (rtx x) return true; if (!HARD_REGISTER_P (pic_offset_table_rtx) - && (HARD_REGISTER_P (x) || lra_in_progress) + && (HARD_REGISTER_P (x) || lra_in_progress || reload_in_progress) && ORIGINAL_REGNO (x) == REGNO (pic_offset_table_rtx)) return true; @@ -4577,7 +4671,7 @@ sparc_tls_got (void) if (TARGET_SUN_TLS && TARGET_ARCH32) { load_got_register (); - return global_offset_table_rtx; + return got_register_rtx; } /* In all other cases, we load a new pseudo with the GOT symbol. */ @@ -4614,30 +4708,38 @@ sparc_legitimize_tls_address (rtx addr) gcc_assert (can_create_pseudo_p ()); if (GET_CODE (addr) == SYMBOL_REF) + /* Although the various sethi/or sequences generate SImode values, many of + them can be transformed by the linker when relaxing and, if relaxing to + local-exec, will become a sethi/xor pair, which is signed and therefore + a full DImode value in 64-bit mode. Thus we must use Pmode, lest these + values be spilled onto the stack in 64-bit mode. */ switch (SYMBOL_REF_TLS_MODEL (addr)) { case TLS_MODEL_GLOBAL_DYNAMIC: start_sequence (); - temp1 = gen_reg_rtx (SImode); - temp2 = gen_reg_rtx (SImode); + temp1 = gen_reg_rtx (Pmode); + temp2 = gen_reg_rtx (Pmode); ret = gen_reg_rtx (Pmode); o0 = gen_rtx_REG (Pmode, 8); got = sparc_tls_got (); - emit_insn (gen_tgd_hi22 (temp1, addr)); - emit_insn (gen_tgd_lo10 (temp2, temp1, addr)); if (TARGET_ARCH32) { - emit_insn (gen_tgd_add32 (o0, got, temp2, addr)); - insn = emit_call_insn (gen_tgd_call32 (o0, sparc_tls_get_addr (), + emit_insn (gen_tgd_hi22si (temp1, addr)); + emit_insn (gen_tgd_lo10si (temp2, temp1, addr)); + emit_insn (gen_tgd_addsi (o0, got, temp2, addr)); + insn = emit_call_insn (gen_tgd_callsi (o0, sparc_tls_get_addr (), addr, const1_rtx)); } else { - emit_insn (gen_tgd_add64 (o0, got, temp2, addr)); - insn = emit_call_insn (gen_tgd_call64 (o0, sparc_tls_get_addr (), + emit_insn (gen_tgd_hi22di (temp1, addr)); + emit_insn (gen_tgd_lo10di (temp2, temp1, addr)); + emit_insn (gen_tgd_adddi (o0, got, temp2, addr)); + insn = emit_call_insn (gen_tgd_calldi (o0, sparc_tls_get_addr (), addr, const1_rtx)); } use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0); + RTL_CONST_CALL_P (insn) = 1; insn = get_insns (); end_sequence (); emit_libcall_block (insn, ret, o0, addr); @@ -4645,61 +4747,78 @@ sparc_legitimize_tls_address (rtx addr) case TLS_MODEL_LOCAL_DYNAMIC: start_sequence (); - temp1 = gen_reg_rtx (SImode); - temp2 = gen_reg_rtx (SImode); + temp1 = gen_reg_rtx (Pmode); + temp2 = gen_reg_rtx (Pmode); temp3 = gen_reg_rtx (Pmode); ret = gen_reg_rtx (Pmode); o0 = gen_rtx_REG (Pmode, 8); got = sparc_tls_got (); - emit_insn (gen_tldm_hi22 (temp1)); - emit_insn (gen_tldm_lo10 (temp2, temp1)); if (TARGET_ARCH32) { - emit_insn (gen_tldm_add32 (o0, got, temp2)); - insn = emit_call_insn (gen_tldm_call32 (o0, sparc_tls_get_addr (), + emit_insn (gen_tldm_hi22si (temp1)); + emit_insn (gen_tldm_lo10si (temp2, temp1)); + emit_insn (gen_tldm_addsi (o0, got, temp2)); + insn = emit_call_insn (gen_tldm_callsi (o0, sparc_tls_get_addr (), const1_rtx)); } else { - emit_insn (gen_tldm_add64 (o0, got, temp2)); - insn = emit_call_insn (gen_tldm_call64 (o0, sparc_tls_get_addr (), + emit_insn (gen_tldm_hi22di (temp1)); + emit_insn (gen_tldm_lo10di (temp2, temp1)); + emit_insn (gen_tldm_adddi (o0, got, temp2)); + insn = emit_call_insn (gen_tldm_calldi (o0, sparc_tls_get_addr (), const1_rtx)); } use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0); + RTL_CONST_CALL_P (insn) = 1; insn = get_insns (); end_sequence (); + /* Attach a unique REG_EQUAL, to allow the RTL optimizers to + share the LD_BASE result with other LD model accesses. */ emit_libcall_block (insn, temp3, o0, gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TLSLD_BASE)); - temp1 = gen_reg_rtx (SImode); - temp2 = gen_reg_rtx (SImode); - emit_insn (gen_tldo_hix22 (temp1, addr)); - emit_insn (gen_tldo_lox10 (temp2, temp1, addr)); + temp1 = gen_reg_rtx (Pmode); + temp2 = gen_reg_rtx (Pmode); if (TARGET_ARCH32) - emit_insn (gen_tldo_add32 (ret, temp3, temp2, addr)); + { + emit_insn (gen_tldo_hix22si (temp1, addr)); + emit_insn (gen_tldo_lox10si (temp2, temp1, addr)); + emit_insn (gen_tldo_addsi (ret, temp3, temp2, addr)); + } else - emit_insn (gen_tldo_add64 (ret, temp3, temp2, addr)); + { + emit_insn (gen_tldo_hix22di (temp1, addr)); + emit_insn (gen_tldo_lox10di (temp2, temp1, addr)); + emit_insn (gen_tldo_adddi (ret, temp3, temp2, addr)); + } break; case TLS_MODEL_INITIAL_EXEC: - temp1 = gen_reg_rtx (SImode); - temp2 = gen_reg_rtx (SImode); + temp1 = gen_reg_rtx (Pmode); + temp2 = gen_reg_rtx (Pmode); temp3 = gen_reg_rtx (Pmode); got = sparc_tls_got (); - emit_insn (gen_tie_hi22 (temp1, addr)); - emit_insn (gen_tie_lo10 (temp2, temp1, addr)); if (TARGET_ARCH32) - emit_insn (gen_tie_ld32 (temp3, got, temp2, addr)); + { + emit_insn (gen_tie_hi22si (temp1, addr)); + emit_insn (gen_tie_lo10si (temp2, temp1, addr)); + emit_insn (gen_tie_ld32 (temp3, got, temp2, addr)); + } else - emit_insn (gen_tie_ld64 (temp3, got, temp2, addr)); + { + emit_insn (gen_tie_hi22di (temp1, addr)); + emit_insn (gen_tie_lo10di (temp2, temp1, addr)); + emit_insn (gen_tie_ld64 (temp3, got, temp2, addr)); + } if (TARGET_SUN_TLS) { ret = gen_reg_rtx (Pmode); if (TARGET_ARCH32) - emit_insn (gen_tie_add32 (ret, gen_rtx_REG (Pmode, 7), + emit_insn (gen_tie_addsi (ret, gen_rtx_REG (Pmode, 7), temp3, addr)); else - emit_insn (gen_tie_add64 (ret, gen_rtx_REG (Pmode, 7), + emit_insn (gen_tie_adddi (ret, gen_rtx_REG (Pmode, 7), temp3, addr)); } else @@ -4711,13 +4830,13 @@ sparc_legitimize_tls_address (rtx addr) temp2 = gen_reg_rtx (Pmode); if (TARGET_ARCH32) { - emit_insn (gen_tle_hix22_sp32 (temp1, addr)); - emit_insn (gen_tle_lox10_sp32 (temp2, temp1, addr)); + emit_insn (gen_tle_hix22si (temp1, addr)); + emit_insn (gen_tle_lox10si (temp2, temp1, addr)); } else { - emit_insn (gen_tle_hix22_sp64 (temp1, addr)); - emit_insn (gen_tle_lox10_sp64 (temp2, temp1, addr)); + emit_insn (gen_tle_hix22di (temp1, addr)); + emit_insn (gen_tle_lox10di (temp2, temp1, addr)); } ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp2); break; @@ -5024,72 +5143,6 @@ sparc_mode_dependent_address_p (const_rtx addr, return false; } -#ifdef HAVE_GAS_HIDDEN -# define USE_HIDDEN_LINKONCE 1 -#else -# define USE_HIDDEN_LINKONCE 0 -#endif - -static void -get_pc_thunk_name (char name[32], unsigned int regno) -{ - const char *reg_name = reg_names[regno]; - - /* Skip the leading '%' as that cannot be used in a - symbol name. */ - reg_name += 1; - - if (USE_HIDDEN_LINKONCE) - sprintf (name, "__sparc_get_pc_thunk.%s", reg_name); - else - ASM_GENERATE_INTERNAL_LABEL (name, "LADDPC", regno); -} - -/* Wrapper around the load_pcrel_sym{si,di} patterns. */ - -static rtx -gen_load_pcrel_sym (rtx op0, rtx op1, rtx op2) -{ - int orig_flag_pic = flag_pic; - rtx insn; - - /* The load_pcrel_sym{si,di} patterns require absolute addressing. */ - flag_pic = 0; - if (TARGET_ARCH64) - insn = gen_load_pcrel_symdi (op0, op1, op2, GEN_INT (REGNO (op0))); - else - insn = gen_load_pcrel_symsi (op0, op1, op2, GEN_INT (REGNO (op0))); - flag_pic = orig_flag_pic; - - return insn; -} - -/* Emit code to load the GOT register. */ - -void -load_got_register (void) -{ - if (!global_offset_table_rtx) - global_offset_table_rtx = gen_rtx_REG (Pmode, GLOBAL_OFFSET_TABLE_REGNUM); - - if (TARGET_VXWORKS_RTP) - emit_insn (gen_vxworks_load_got ()); - else - { - /* The GOT symbol is subject to a PC-relative relocation so we need a - helper function to add the PC value and thus get the final value. */ - if (!got_helper_rtx) - { - char name[32]; - get_pc_thunk_name (name, GLOBAL_OFFSET_TABLE_REGNUM); - got_helper_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name)); - } - - emit_insn (gen_load_pcrel_sym (global_offset_table_rtx, sparc_got (), - got_helper_rtx)); - } -} - /* Emit a call instruction with the pattern given by PAT. ADDR is the address of the call target. */ @@ -5444,7 +5497,7 @@ save_local_or_in_reg_p (unsigned int regno, int leaf_function) return true; /* GOT register (%l7) if needed. */ - if (regno == PIC_OFFSET_TABLE_REGNUM && crtl->uses_pic_offset_table) + if (got_register_rtx && regno == REGNO (got_register_rtx)) return true; /* If the function accesses prior frames, the frame pointer and the return @@ -12319,7 +12372,7 @@ sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, start_sequence (); load_got_register (); /* clobbers %o7 */ if (!TARGET_VXWORKS_RTP) - pic_offset_table_rtx = global_offset_table_rtx; + pic_offset_table_rtx = got_register_rtx; scratch = sparc_legitimize_pic_address (funexp, scratch); seq = get_insns (); end_sequence (); @@ -12425,10 +12478,9 @@ static void sparc_file_end (void) { /* If we need to emit the special GOT helper function, do so now. */ - if (got_helper_rtx) + if (got_helper_needed) { const char *name = XSTR (got_helper_rtx, 0); - const char *reg_name = reg_names[GLOBAL_OFFSET_TABLE_REGNUM]; #ifdef DWARF2_UNWIND_INFO bool do_cfi; #endif @@ -12465,17 +12517,22 @@ sparc_file_end (void) #ifdef DWARF2_UNWIND_INFO do_cfi = dwarf2out_do_cfi_asm (); if (do_cfi) - fprintf (asm_out_file, "\t.cfi_startproc\n"); + output_asm_insn (".cfi_startproc", NULL); #endif if (flag_delayed_branch) - fprintf (asm_out_file, "\tjmp\t%%o7+8\n\t add\t%%o7, %s, %s\n", - reg_name, reg_name); + { + output_asm_insn ("jmp\t%%o7+8", NULL); + output_asm_insn (" add\t%%o7, %0, %0", &got_register_rtx); + } else - fprintf (asm_out_file, "\tadd\t%%o7, %s, %s\n\tjmp\t%%o7+8\n\t nop\n", - reg_name, reg_name); + { + output_asm_insn ("add\t%%o7, %0, %0", &got_register_rtx); + output_asm_insn ("jmp\t%%o7+8", NULL); + output_asm_insn (" nop", NULL); + } #ifdef DWARF2_UNWIND_INFO if (do_cfi) - fprintf (asm_out_file, "\t.cfi_endproc\n"); + output_asm_insn (".cfi_endproc", NULL); #endif } @@ -12981,13 +13038,16 @@ sparc_init_pic_reg (void) edge entry_edge; rtx_insn *seq; - if (!crtl->uses_pic_offset_table) + /* In PIC mode, we need to always initialize the PIC register if optimization + is enabled, because we are called from IRA and LRA may later force things + to the constant pool for optimization purposes. */ + if (!flag_pic || (!crtl->uses_pic_offset_table && !optimize)) return; start_sequence (); load_got_register (); if (!TARGET_VXWORKS_RTP) - emit_move_insn (pic_offset_table_rtx, global_offset_table_rtx); + emit_move_insn (pic_offset_table_rtx, got_register_rtx); seq = get_insns (); end_sequence (); diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 419995431e2..a32b9f825d2 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -748,6 +748,13 @@ extern enum cmodel sparc_cmodel; register window instruction in the prologue. */ #define HARD_REGNO_RENAME_OK(FROM, TO) ((FROM) != 1) +/* Select a register mode required for caller save of hard regno REGNO. + Contrary to what is documented, the default is not the smallest suitable + mode but the largest suitable mode for the given (REGNO, NREGS) pair and + it quickly creates paradoxical subregs that can be problematic. */ +#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ + ((MODE) == VOIDmode ? choose_hard_reg_mode (REGNO, NREGS, false) : (MODE)) + /* Specify the registers used for certain standard purposes. The values of these macros are register numbers. */ @@ -805,7 +812,6 @@ extern enum cmodel sparc_cmodel; #define STATIC_CHAIN_REGNUM (TARGET_ARCH64 ? 5 : 2) /* Register which holds the global offset table, if any. */ - #define GLOBAL_OFFSET_TABLE_REGNUM 23 /* Register which holds offset table for position-independent data references. @@ -813,7 +819,6 @@ extern enum cmodel sparc_cmodel; so we use a pseudo-register to make sure it is properly saved and restored around calls to setjmp. Now the ABI of VxWorks RTP makes it live on entry to PLT entries so we use the canonical GOT register in this case. */ - #define PIC_OFFSET_TABLE_REGNUM \ (TARGET_VXWORKS_RTP && flag_pic ? GLOBAL_OFFSET_TABLE_REGNUM : INVALID_REGNUM) @@ -823,7 +828,6 @@ extern enum cmodel sparc_cmodel; Originally it was -1, but later on the container of options changed to unsigned byte, so we decided to pick 127 as default value, which does reflect an undefined default value in case of 0/1. */ - #define DEFAULT_PCC_STRUCT_RETURN 127 /* Functions which return large structures get the address diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index df769405190..468e2cc5d3b 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -1601,10 +1601,7 @@ (clobber (reg:P O7_REG))] "REGNO (operands[0]) == INTVAL (operands[3])" { - if (flag_delayed_branch) - return "sethi\t%%hi(%a1-4), %0\n\tcall\t%a2\n\t add\t%0, %%lo(%a1+4), %0"; - else - return "sethi\t%%hi(%a1-8), %0\n\tadd\t%0, %%lo(%a1-4), %0\n\tcall\t%a2\n\t nop"; + return output_load_pcrel_sym (operands); } [(set (attr "type") (const_string "multi")) (set (attr "length") @@ -6839,17 +6836,10 @@ visl") } }) -(define_insn "*tablejump_sp32" - [(set (pc) (match_operand:SI 0 "address_operand" "p")) - (use (label_ref (match_operand 1 "" "")))] - "TARGET_ARCH32" - "jmp\t%a0%#" - [(set_attr "type" "uncond_branch")]) - -(define_insn "*tablejump_sp64" - [(set (pc) (match_operand:DI 0 "address_operand" "p")) +(define_insn "*tablejump" + [(set (pc) (match_operand:P 0 "address_operand" "p")) (use (label_ref (match_operand 1 "" "")))] - "TARGET_ARCH64" + "" "jmp\t%a0%#" [(set_attr "type" "uncond_branch")]) @@ -6926,39 +6916,21 @@ visl") ;; We can't use the same pattern for these two insns, because then registers ;; in the address may not be properly reloaded. -(define_insn "*call_address_sp32" - [(call (mem:SI (match_operand:SI 0 "address_operand" "p")) +(define_insn "*call_address" + [(call (mem:P (match_operand:P 0 "address_operand" "p")) (match_operand 1 "" "")) - (clobber (reg:SI O7_REG))] - ;;- Do not use operand 1 for most machines. - "TARGET_ARCH32" - "call\t%a0, %1%#" - [(set_attr "type" "call")]) - -(define_insn "*call_symbolic_sp32" - [(call (mem:SI (match_operand:SI 0 "symbolic_operand" "s")) - (match_operand 1 "" "")) - (clobber (reg:SI O7_REG))] - ;;- Do not use operand 1 for most machines. - "TARGET_ARCH32" - "call\t%a0, %1%#" - [(set_attr "type" "call")]) - -(define_insn "*call_address_sp64" - [(call (mem:DI (match_operand:DI 0 "address_operand" "p")) - (match_operand 1 "" "")) - (clobber (reg:DI O7_REG))] + (clobber (reg:P O7_REG))] ;;- Do not use operand 1 for most machines. - "TARGET_ARCH64" + "" "call\t%a0, %1%#" [(set_attr "type" "call")]) -(define_insn "*call_symbolic_sp64" - [(call (mem:DI (match_operand:DI 0 "symbolic_operand" "s")) +(define_insn "*call_symbolic" + [(call (mem:P (match_operand:P 0 "symbolic_operand" "s")) (match_operand 1 "" "")) - (clobber (reg:DI O7_REG))] + (clobber (reg:P O7_REG))] ;;- Do not use operand 1 for most machines. - "TARGET_ARCH64" + "" "call\t%a0, %1%#" [(set_attr "type" "call")]) @@ -7023,8 +6995,8 @@ visl") (define_expand "call_value" ;; Note that this expression is not used for generating RTL. ;; All the RTL is generated explicitly below. - [(set (match_operand 0 "register_operand" "=rf") - (call (match_operand 1 "" "") + [(set (match_operand 0 "register_operand" "") + (call (match_operand 1 "call_operand" "") (match_operand 4 "" "")))] ;; operand 2 is stack_size_rtx ;; operand 3 is next_arg_register @@ -7047,43 +7019,23 @@ visl") DONE; }) -(define_insn "*call_value_address_sp32" - [(set (match_operand 0 "" "=rf") - (call (mem:SI (match_operand:SI 1 "address_operand" "p")) - (match_operand 2 "" ""))) - (clobber (reg:SI O7_REG))] - ;;- Do not use operand 2 for most machines. - "TARGET_ARCH32" - "call\t%a1, %2%#" - [(set_attr "type" "call")]) - -(define_insn "*call_value_symbolic_sp32" - [(set (match_operand 0 "" "=rf") - (call (mem:SI (match_operand:SI 1 "symbolic_operand" "s")) - (match_operand 2 "" ""))) - (clobber (reg:SI O7_REG))] - ;;- Do not use operand 2 for most machines. - "TARGET_ARCH32" - "call\t%a1, %2%#" - [(set_attr "type" "call")]) - -(define_insn "*call_value_address_sp64" +(define_insn "*call_value_address" [(set (match_operand 0 "" "") - (call (mem:DI (match_operand:DI 1 "address_operand" "p")) + (call (mem:P (match_operand:P 1 "address_operand" "p")) (match_operand 2 "" ""))) - (clobber (reg:DI O7_REG))] + (clobber (reg:P O7_REG))] ;;- Do not use operand 2 for most machines. - "TARGET_ARCH64" + "" "call\t%a1, %2%#" [(set_attr "type" "call")]) -(define_insn "*call_value_symbolic_sp64" +(define_insn "*call_value_symbolic" [(set (match_operand 0 "" "") - (call (mem:DI (match_operand:DI 1 "symbolic_operand" "s")) + (call (mem:P (match_operand:P 1 "symbolic_operand" "s")) (match_operand 2 "" ""))) - (clobber (reg:DI O7_REG))] + (clobber (reg:P O7_REG))] ;;- Do not use operand 2 for most machines. - "TARGET_ARCH64" + "" "call\t%a1, %2%#" [(set_attr "type" "call")]) @@ -7128,52 +7080,31 @@ visl") "" "") -(define_insn "*sibcall_symbolic_sp32" - [(call (mem:SI (match_operand:SI 0 "symbolic_operand" "s")) - (match_operand 1 "" "")) - (return)] - "TARGET_ARCH32" -{ - return output_sibcall(insn, operands[0]); -} - [(set_attr "type" "sibcall")]) - -(define_insn "*sibcall_symbolic_sp64" - [(call (mem:DI (match_operand:DI 0 "symbolic_operand" "s")) +(define_insn "*sibcall_symbolic" + [(call (mem:P (match_operand:P 0 "symbolic_operand" "s")) (match_operand 1 "" "")) (return)] - "TARGET_ARCH64" + "" { - return output_sibcall(insn, operands[0]); + return output_sibcall (insn, operands[0]); } [(set_attr "type" "sibcall")]) (define_expand "sibcall_value" - [(parallel [(set (match_operand 0 "register_operand" "=rf") - (call (match_operand 1 "" "") (const_int 0))) + [(parallel [(set (match_operand 0 "register_operand") + (call (match_operand 1 "call_operand" "") (const_int 0))) (return)])] "" "") -(define_insn "*sibcall_value_symbolic_sp32" - [(set (match_operand 0 "" "=rf") - (call (mem:SI (match_operand:SI 1 "symbolic_operand" "s")) - (match_operand 2 "" ""))) - (return)] - "TARGET_ARCH32" -{ - return output_sibcall(insn, operands[1]); -} - [(set_attr "type" "sibcall")]) - -(define_insn "*sibcall_value_symbolic_sp64" +(define_insn "*sibcall_value_symbolic" [(set (match_operand 0 "" "") - (call (mem:DI (match_operand:DI 1 "symbolic_operand" "s")) + (call (mem:P (match_operand:P 1 "symbolic_operand" "s")) (match_operand 2 "" ""))) (return)] - "TARGET_ARCH64" + "" { - return output_sibcall(insn, operands[1]); + return output_sibcall (insn, operands[1]); } [(set_attr "type" "sibcall")]) @@ -7195,9 +7126,7 @@ visl") ;; information is manually added in emit_window_save. (define_insn "window_save" - [(unspec_volatile - [(match_operand 0 "arith_operand" "rI")] - UNSPECV_SAVEW)] + [(unspec_volatile [(match_operand 0 "arith_operand" "rI")] UNSPECV_SAVEW)] "!TARGET_FLAT" "save\t%%sp, %0, %%sp" [(set_attr "type" "savew")]) @@ -7405,18 +7334,12 @@ visl") "" "") -(define_insn "*branch_sp32" - [(set (pc) (match_operand:SI 0 "address_operand" "p"))] - "TARGET_ARCH32" +(define_insn "*branch" + [(set (pc) (match_operand:P 0 "address_operand" "p"))] + "" "jmp\t%a0%#" [(set_attr "type" "uncond_branch")]) -(define_insn "*branch_sp64" - [(set (pc) (match_operand:DI 0 "address_operand" "p"))] - "TARGET_ARCH64" - "jmp\t%a0%#" - [(set_attr "type" "uncond_branch")]) - (define_expand "save_stack_nonlocal" [(set (match_operand 0 "memory_operand" "") (match_operand 1 "register_operand" "")) @@ -7960,158 +7883,112 @@ visl") ;; TLS support instructions. -(define_insn "tgd_hi22" - [(set (match_operand:SI 0 "register_operand" "=r") - (high:SI (unspec:SI [(match_operand 1 "tgd_symbolic_operand" "")] - UNSPEC_TLSGD)))] +(define_insn "tgd_hi22" + [(set (match_operand:P 0 "register_operand" "=r") + (high:P (unspec:P [(match_operand 1 "tgd_symbolic_operand" "")] + UNSPEC_TLSGD)))] "TARGET_TLS" "sethi\\t%%tgd_hi22(%a1), %0") -(define_insn "tgd_lo10" - [(set (match_operand:SI 0 "register_operand" "=r") - (lo_sum:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(match_operand 2 "tgd_symbolic_operand" "")] - UNSPEC_TLSGD)))] +(define_insn "tgd_lo10" + [(set (match_operand:P 0 "register_operand" "=r") + (lo_sum:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(match_operand 2 "tgd_symbolic_operand" "")] + UNSPEC_TLSGD)))] "TARGET_TLS" "add\\t%1, %%tgd_lo10(%a2), %0") -(define_insn "tgd_add32" - [(set (match_operand:SI 0 "register_operand" "=r") - (plus:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tgd_symbolic_operand" "")] - UNSPEC_TLSGD)))] - "TARGET_TLS && TARGET_ARCH32" - "add\\t%1, %2, %0, %%tgd_add(%a3)") - -(define_insn "tgd_add64" - [(set (match_operand:DI 0 "register_operand" "=r") - (plus:DI (match_operand:DI 1 "register_operand" "r") - (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tgd_symbolic_operand" "")] - UNSPEC_TLSGD)))] - "TARGET_TLS && TARGET_ARCH64" +(define_insn "tgd_add" + [(set (match_operand:P 0 "register_operand" "=r") + (plus:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tgd_symbolic_operand" "")] + UNSPEC_TLSGD)))] + "TARGET_TLS" "add\\t%1, %2, %0, %%tgd_add(%a3)") -(define_insn "tgd_call32" - [(set (match_operand 0 "register_operand" "=r") - (call (mem:SI (unspec:SI [(match_operand:SI 1 "symbolic_operand" "s") - (match_operand 2 "tgd_symbolic_operand" "")] - UNSPEC_TLSGD)) - (match_operand 3 "" ""))) - (clobber (reg:SI O7_REG))] - "TARGET_TLS && TARGET_ARCH32" - "call\t%a1, %%tgd_call(%a2)%#" - [(set_attr "type" "call")]) - -(define_insn "tgd_call64" +(define_insn "tgd_call" [(set (match_operand 0 "register_operand" "=r") - (call (mem:DI (unspec:DI [(match_operand:DI 1 "symbolic_operand" "s") - (match_operand 2 "tgd_symbolic_operand" "")] - UNSPEC_TLSGD)) + (call (mem:P (unspec:P [(match_operand:P 1 "symbolic_operand" "s") + (match_operand 2 "tgd_symbolic_operand" "")] + UNSPEC_TLSGD)) (match_operand 3 "" ""))) - (clobber (reg:DI O7_REG))] - "TARGET_TLS && TARGET_ARCH64" + (clobber (reg:P O7_REG))] + "TARGET_TLS" "call\t%a1, %%tgd_call(%a2)%#" [(set_attr "type" "call")]) -(define_insn "tldm_hi22" - [(set (match_operand:SI 0 "register_operand" "=r") - (high:SI (unspec:SI [(const_int 0)] UNSPEC_TLSLDM)))] +(define_insn "tldm_hi22" + [(set (match_operand:P 0 "register_operand" "=r") + (high:P (unspec:P [(const_int 0)] UNSPEC_TLSLDM)))] "TARGET_TLS" "sethi\\t%%tldm_hi22(%&), %0") -(define_insn "tldm_lo10" - [(set (match_operand:SI 0 "register_operand" "=r") - (lo_sum:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(const_int 0)] UNSPEC_TLSLDM)))] +(define_insn "tldm_lo10" + [(set (match_operand:P 0 "register_operand" "=r") + (lo_sum:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(const_int 0)] UNSPEC_TLSLDM)))] "TARGET_TLS" "add\\t%1, %%tldm_lo10(%&), %0") -(define_insn "tldm_add32" - [(set (match_operand:SI 0 "register_operand" "=r") - (plus:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(match_operand:SI 2 "register_operand" "r")] - UNSPEC_TLSLDM)))] - "TARGET_TLS && TARGET_ARCH32" - "add\\t%1, %2, %0, %%tldm_add(%&)") - -(define_insn "tldm_add64" - [(set (match_operand:DI 0 "register_operand" "=r") - (plus:DI (match_operand:DI 1 "register_operand" "r") - (unspec:DI [(match_operand:SI 2 "register_operand" "r")] - UNSPEC_TLSLDM)))] - "TARGET_TLS && TARGET_ARCH64" +(define_insn "tldm_add" + [(set (match_operand:P 0 "register_operand" "=r") + (plus:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(match_operand:P 2 "register_operand" "r")] + UNSPEC_TLSLDM)))] + "TARGET_TLS" "add\\t%1, %2, %0, %%tldm_add(%&)") -(define_insn "tldm_call32" - [(set (match_operand 0 "register_operand" "=r") - (call (mem:SI (unspec:SI [(match_operand:SI 1 "symbolic_operand" "s")] - UNSPEC_TLSLDM)) - (match_operand 2 "" ""))) - (clobber (reg:SI O7_REG))] - "TARGET_TLS && TARGET_ARCH32" - "call\t%a1, %%tldm_call(%&)%#" - [(set_attr "type" "call")]) - -(define_insn "tldm_call64" +(define_insn "tldm_call" [(set (match_operand 0 "register_operand" "=r") - (call (mem:DI (unspec:DI [(match_operand:DI 1 "symbolic_operand" "s")] - UNSPEC_TLSLDM)) + (call (mem:P (unspec:P [(match_operand:P 1 "symbolic_operand" "s")] + UNSPEC_TLSLDM)) (match_operand 2 "" ""))) - (clobber (reg:DI O7_REG))] - "TARGET_TLS && TARGET_ARCH64" + (clobber (reg:P O7_REG))] + "TARGET_TLS" "call\t%a1, %%tldm_call(%&)%#" [(set_attr "type" "call")]) -(define_insn "tldo_hix22" - [(set (match_operand:SI 0 "register_operand" "=r") - (high:SI (unspec:SI [(match_operand 1 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO)))] +(define_insn "tldo_hix22" + [(set (match_operand:P 0 "register_operand" "=r") + (high:P (unspec:P [(match_operand 1 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO)))] "TARGET_TLS" "sethi\\t%%tldo_hix22(%a1), %0") -(define_insn "tldo_lox10" - [(set (match_operand:SI 0 "register_operand" "=r") - (lo_sum:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(match_operand 2 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO)))] +(define_insn "tldo_lox10" + [(set (match_operand:P 0 "register_operand" "=r") + (lo_sum:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(match_operand 2 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO)))] "TARGET_TLS" "xor\\t%1, %%tldo_lox10(%a2), %0") -(define_insn "tldo_add32" - [(set (match_operand:SI 0 "register_operand" "=r") - (plus:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO)))] - "TARGET_TLS && TARGET_ARCH32" - "add\\t%1, %2, %0, %%tldo_add(%a3)") - -(define_insn "tldo_add64" - [(set (match_operand:DI 0 "register_operand" "=r") - (plus:DI (match_operand:DI 1 "register_operand" "r") - (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO)))] - "TARGET_TLS && TARGET_ARCH64" +(define_insn "tldo_add" + [(set (match_operand:P 0 "register_operand" "=r") + (plus:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO)))] + "TARGET_TLS" "add\\t%1, %2, %0, %%tldo_add(%a3)") -(define_insn "tie_hi22" - [(set (match_operand:SI 0 "register_operand" "=r") - (high:SI (unspec:SI [(match_operand 1 "tie_symbolic_operand" "")] - UNSPEC_TLSIE)))] +(define_insn "tie_hi22" + [(set (match_operand:P 0 "register_operand" "=r") + (high:P (unspec:P [(match_operand 1 "tie_symbolic_operand" "")] + UNSPEC_TLSIE)))] "TARGET_TLS" "sethi\\t%%tie_hi22(%a1), %0") -(define_insn "tie_lo10" - [(set (match_operand:SI 0 "register_operand" "=r") - (lo_sum:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(match_operand 2 "tie_symbolic_operand" "")] - UNSPEC_TLSIE)))] +(define_insn "tie_lo10" + [(set (match_operand:P 0 "register_operand" "=r") + (lo_sum:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(match_operand 2 "tie_symbolic_operand" "")] + UNSPEC_TLSIE)))] "TARGET_TLS" "add\\t%1, %%tie_lo10(%a2), %0") +; Note the %%tie_ld operator (define_insn "tie_ld32" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "r") @@ -8123,10 +8000,11 @@ visl") [(set_attr "type" "load") (set_attr "subtype" "regular")]) +; Note the %%tie_ldx operator (define_insn "tie_ld64" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand:DI 1 "register_operand" "r") - (match_operand:SI 2 "register_operand" "r") + (match_operand:DI 2 "register_operand" "r") (match_operand 3 "tie_symbolic_operand" "")] UNSPEC_TLSIE))] "TARGET_TLS && TARGET_ARCH64" @@ -8134,159 +8012,97 @@ visl") [(set_attr "type" "load") (set_attr "subtype" "regular")]) -(define_insn "tie_add32" - [(set (match_operand:SI 0 "register_operand" "=r") - (plus:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tie_symbolic_operand" "")] - UNSPEC_TLSIE)))] - "TARGET_SUN_TLS && TARGET_ARCH32" - "add\\t%1, %2, %0, %%tie_add(%a3)") - -(define_insn "tie_add64" - [(set (match_operand:DI 0 "register_operand" "=r") - (plus:DI (match_operand:DI 1 "register_operand" "r") - (unspec:DI [(match_operand:DI 2 "register_operand" "r") - (match_operand 3 "tie_symbolic_operand" "")] - UNSPEC_TLSIE)))] - "TARGET_SUN_TLS && TARGET_ARCH64" +(define_insn "tie_add" + [(set (match_operand:P 0 "register_operand" "=r") + (plus:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tie_symbolic_operand" "")] + UNSPEC_TLSIE)))] + "TARGET_SUN_TLS" "add\\t%1, %2, %0, %%tie_add(%a3)") -(define_insn "tle_hix22_sp32" - [(set (match_operand:SI 0 "register_operand" "=r") - (high:SI (unspec:SI [(match_operand 1 "tle_symbolic_operand" "")] - UNSPEC_TLSLE)))] - "TARGET_TLS && TARGET_ARCH32" +(define_insn "tle_hix22" + [(set (match_operand:P 0 "register_operand" "=r") + (high:P (unspec:P [(match_operand 1 "tle_symbolic_operand" "")] + UNSPEC_TLSLE)))] + "TARGET_TLS" "sethi\\t%%tle_hix22(%a1), %0") -(define_insn "tle_lox10_sp32" - [(set (match_operand:SI 0 "register_operand" "=r") - (lo_sum:SI (match_operand:SI 1 "register_operand" "r") - (unspec:SI [(match_operand 2 "tle_symbolic_operand" "")] - UNSPEC_TLSLE)))] - "TARGET_TLS && TARGET_ARCH32" - "xor\\t%1, %%tle_lox10(%a2), %0") - -(define_insn "tle_hix22_sp64" - [(set (match_operand:DI 0 "register_operand" "=r") - (high:DI (unspec:DI [(match_operand 1 "tle_symbolic_operand" "")] +(define_insn "tle_lox10" + [(set (match_operand:P 0 "register_operand" "=r") + (lo_sum:P (match_operand:P 1 "register_operand" "r") + (unspec:P [(match_operand 2 "tle_symbolic_operand" "")] UNSPEC_TLSLE)))] - "TARGET_TLS && TARGET_ARCH64" - "sethi\\t%%tle_hix22(%a1), %0") - -(define_insn "tle_lox10_sp64" - [(set (match_operand:DI 0 "register_operand" "=r") - (lo_sum:DI (match_operand:DI 1 "register_operand" "r") - (unspec:DI [(match_operand 2 "tle_symbolic_operand" "")] - UNSPEC_TLSLE)))] - "TARGET_TLS && TARGET_ARCH64" + "TARGET_TLS" "xor\\t%1, %%tle_lox10(%a2), %0") -;; Now patterns combining tldo_add{32,64} with some integer loads or stores -(define_insn "*tldo_ldub_sp32" +;; Now patterns combining tldo_add with some integer loads or stores +(define_insn "*tldo_ldub" [(set (match_operand:QI 0 "register_operand" "=r") - (mem:QI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r"))))] - "TARGET_TLS && TARGET_ARCH32" + (mem:QI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r"))))] + "TARGET_TLS" "ldub\t[%1 + %2], %0, %%tldo_add(%3)" [(set_attr "type" "load") (set_attr "subtype" "regular") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_ldub1_sp32" +(define_insn "*tldo_ldub1" [(set (match_operand:HI 0 "register_operand" "=r") (zero_extend:HI - (mem:QI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH32" + (mem:QI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r")))))] + "TARGET_TLS" "ldub\t[%1 + %2], %0, %%tldo_add(%3)" [(set_attr "type" "load") (set_attr "subtype" "regular") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_ldub2_sp32" +(define_insn "*tldo_ldub2" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI - (mem:QI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH32" + (mem:QI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r")))))] + "TARGET_TLS" "ldub\t[%1 + %2], %0, %%tldo_add(%3)" [(set_attr "type" "load") (set_attr "subtype" "regular") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_ldsb1_sp32" +(define_insn "*tldo_ldsb1" [(set (match_operand:HI 0 "register_operand" "=r") (sign_extend:HI - (mem:QI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH32" + (mem:QI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r")))))] + "TARGET_TLS" "ldsb\t[%1 + %2], %0, %%tldo_add(%3)" [(set_attr "type" "sload") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_ldsb2_sp32" +(define_insn "*tldo_ldsb2" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI - (mem:QI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH32" - "ldsb\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "sload") - (set_attr "us3load_type" "3cycle")]) - -(define_insn "*tldo_ldub_sp64" - [(set (match_operand:QI 0 "register_operand" "=r") - (mem:QI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + (mem:QI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r"))))] - "TARGET_TLS && TARGET_ARCH64" - "ldub\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "load") - (set_attr "subtype" "regular") - (set_attr "us3load_type" "3cycle")]) - -(define_insn "*tldo_ldub1_sp64" - [(set (match_operand:HI 0 "register_operand" "=r") - (zero_extend:HI - (mem:QI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH64" - "ldub\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "load") - (set_attr "subtype" "regular") - (set_attr "us3load_type" "3cycle")]) - -(define_insn "*tldo_ldub2_sp64" - [(set (match_operand:SI 0 "register_operand" "=r") - (zero_extend:SI - (mem:QI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH64" - "ldub\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "load") - (set_attr "subtype" "regular") + (match_operand:P 1 "register_operand" "r")))))] + "TARGET_TLS" + "ldsb\t[%1 + %2], %0, %%tldo_add(%3)" + [(set_attr "type" "sload") (set_attr "us3load_type" "3cycle")]) (define_insn "*tldo_ldub3_sp64" [(set (match_operand:DI 0 "register_operand" "=r") (zero_extend:DI - (mem:QI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + (mem:QI (plus:DI (unspec:DI [(match_operand:DI 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) (match_operand:DI 1 "register_operand" "r")))))] @@ -8296,34 +8112,10 @@ visl") (set_attr "subtype" "regular") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_ldsb1_sp64" - [(set (match_operand:HI 0 "register_operand" "=r") - (sign_extend:HI - (mem:QI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH64" - "ldsb\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "sload") - (set_attr "us3load_type" "3cycle")]) - -(define_insn "*tldo_ldsb2_sp64" - [(set (match_operand:SI 0 "register_operand" "=r") - (sign_extend:SI - (mem:QI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH64" - "ldsb\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "sload") - (set_attr "us3load_type" "3cycle")]) - (define_insn "*tldo_ldsb3_sp64" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI - (mem:QI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + (mem:QI (plus:DI (unspec:DI [(match_operand:DI 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) (match_operand:DI 1 "register_operand" "r")))))] @@ -8332,72 +8124,47 @@ visl") [(set_attr "type" "sload") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_lduh_sp32" +(define_insn "*tldo_lduh" [(set (match_operand:HI 0 "register_operand" "=r") - (mem:HI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r"))))] - "TARGET_TLS && TARGET_ARCH32" + (mem:HI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r"))))] + "TARGET_TLS" "lduh\t[%1 + %2], %0, %%tldo_add(%3)" [(set_attr "type" "load") (set_attr "subtype" "regular") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_lduh1_sp32" +(define_insn "*tldo_lduh1" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI - (mem:HI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH32" + (mem:HI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r")))))] + "TARGET_TLS" "lduh\t[%1 + %2], %0, %%tldo_add(%3)" [(set_attr "type" "load") (set_attr "subtype" "regular") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_ldsh1_sp32" +(define_insn "*tldo_ldsh1" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI - (mem:HI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH32" - "ldsh\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "sload") - (set_attr "us3load_type" "3cycle")]) - -(define_insn "*tldo_lduh_sp64" - [(set (match_operand:HI 0 "register_operand" "=r") - (mem:HI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + (mem:HI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r"))))] - "TARGET_TLS && TARGET_ARCH64" - "lduh\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "load") - (set_attr "subtype" "regular") - (set_attr "us3load_type" "3cycle")]) - -(define_insn "*tldo_lduh1_sp64" - [(set (match_operand:SI 0 "register_operand" "=r") - (zero_extend:SI - (mem:HI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH64" - "lduh\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "load") - (set_attr "subtype" "regular") + (match_operand:P 1 "register_operand" "r")))))] + "TARGET_TLS" + "ldsh\t[%1 + %2], %0, %%tldo_add(%3)" + [(set_attr "type" "sload") (set_attr "us3load_type" "3cycle")]) (define_insn "*tldo_lduh2_sp64" [(set (match_operand:DI 0 "register_operand" "=r") (zero_extend:DI - (mem:HI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + (mem:HI (plus:DI (unspec:DI [(match_operand:DI 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) (match_operand:DI 1 "register_operand" "r")))))] @@ -8407,22 +8174,10 @@ visl") (set_attr "subtype" "regular") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_ldsh1_sp64" - [(set (match_operand:SI 0 "register_operand" "=r") - (sign_extend:SI - (mem:HI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r")))))] - "TARGET_TLS && TARGET_ARCH64" - "ldsh\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "sload") - (set_attr "us3load_type" "3cycle")]) - (define_insn "*tldo_ldsh2_sp64" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI - (mem:HI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + (mem:HI (plus:DI (unspec:DI [(match_operand:DI 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) (match_operand:DI 1 "register_operand" "r")))))] @@ -8431,32 +8186,21 @@ visl") [(set_attr "type" "sload") (set_attr "us3load_type" "3cycle")]) -(define_insn "*tldo_lduw_sp32" +(define_insn "*tldo_lduw" [(set (match_operand:SI 0 "register_operand" "=r") - (mem:SI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r"))))] - "TARGET_TLS && TARGET_ARCH32" + (mem:SI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r"))))] + "TARGET_TLS" "ld\t[%1 + %2], %0, %%tldo_add(%3)" [(set_attr "type" "load") (set_attr "subtype" "regular")]) -(define_insn "*tldo_lduw_sp64" - [(set (match_operand:SI 0 "register_operand" "=r") - (mem:SI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r"))))] - "TARGET_TLS && TARGET_ARCH64" - "lduw\t[%1 + %2], %0, %%tldo_add(%3)" - [(set_attr "type" "load") - (set_attr "subtype" "regular")]) - (define_insn "*tldo_lduw1_sp64" [(set (match_operand:DI 0 "register_operand" "=r") (zero_extend:DI - (mem:SI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + (mem:SI (plus:DI (unspec:DI [(match_operand:DI 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) (match_operand:DI 1 "register_operand" "r")))))] @@ -8468,8 +8212,8 @@ visl") (define_insn "*tldo_ldsw1_sp64" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI - (mem:SI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] + (mem:SI (plus:DI (unspec:DI [(match_operand:DI 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) (match_operand:DI 1 "register_operand" "r")))))] "TARGET_TLS && TARGET_ARCH64" @@ -8479,7 +8223,7 @@ visl") (define_insn "*tldo_ldx_sp64" [(set (match_operand:DI 0 "register_operand" "=r") - (mem:DI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + (mem:DI (plus:DI (unspec:DI [(match_operand:DI 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) (match_operand:DI 1 "register_operand" "r"))))] @@ -8488,68 +8232,38 @@ visl") [(set_attr "type" "load") (set_attr "subtype" "regular")]) -(define_insn "*tldo_stb_sp32" - [(set (mem:QI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r"))) - (match_operand:QI 0 "register_operand" "r"))] - "TARGET_TLS && TARGET_ARCH32" - "stb\t%0, [%1 + %2], %%tldo_add(%3)" - [(set_attr "type" "store")]) - -(define_insn "*tldo_stb_sp64" - [(set (mem:QI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r"))) +(define_insn "*tldo_stb" + [(set (mem:QI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r"))) (match_operand:QI 0 "register_operand" "r"))] - "TARGET_TLS && TARGET_ARCH64" + "TARGET_TLS" "stb\t%0, [%1 + %2], %%tldo_add(%3)" [(set_attr "type" "store")]) -(define_insn "*tldo_sth_sp32" - [(set (mem:HI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r"))) - (match_operand:HI 0 "register_operand" "r"))] - "TARGET_TLS && TARGET_ARCH32" - "sth\t%0, [%1 + %2], %%tldo_add(%3)" - [(set_attr "type" "store")]) - -(define_insn "*tldo_sth_sp64" - [(set (mem:HI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r"))) +(define_insn "*tldo_sth" + [(set (mem:HI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r"))) (match_operand:HI 0 "register_operand" "r"))] - "TARGET_TLS && TARGET_ARCH64" + "TARGET_TLS" "sth\t%0, [%1 + %2], %%tldo_add(%3)" [(set_attr "type" "store")]) -(define_insn "*tldo_stw_sp32" - [(set (mem:SI (plus:SI (unspec:SI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:SI 1 "register_operand" "r"))) +(define_insn "*tldo_stw" + [(set (mem:SI (plus:P (unspec:P [(match_operand:P 2 "register_operand" "r") + (match_operand 3 "tld_symbolic_operand" "")] + UNSPEC_TLSLDO) + (match_operand:P 1 "register_operand" "r"))) (match_operand:SI 0 "register_operand" "r"))] - "TARGET_TLS && TARGET_ARCH32" + "TARGET_TLS" "st\t%0, [%1 + %2], %%tldo_add(%3)" [(set_attr "type" "store")]) -(define_insn "*tldo_stw_sp64" - [(set (mem:SI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") - (match_operand 3 "tld_symbolic_operand" "")] - UNSPEC_TLSLDO) - (match_operand:DI 1 "register_operand" "r"))) - (match_operand:SI 0 "register_operand" "r"))] - "TARGET_TLS && TARGET_ARCH64" - "stw\t%0, [%1 + %2], %%tldo_add(%3)" - [(set_attr "type" "store")]) - (define_insn "*tldo_stx_sp64" - [(set (mem:DI (plus:DI (unspec:DI [(match_operand:SI 2 "register_operand" "r") + [(set (mem:DI (plus:DI (unspec:DI [(match_operand:DI 2 "register_operand" "r") (match_operand 3 "tld_symbolic_operand" "")] UNSPEC_TLSLDO) (match_operand:DI 1 "register_operand" "r"))) diff --git a/gcc/config/xtensa/uclinux.h b/gcc/config/xtensa/uclinux.h index ba26187c8f7..c7743df9d97 100644 --- a/gcc/config/xtensa/uclinux.h +++ b/gcc/config/xtensa/uclinux.h @@ -59,8 +59,8 @@ along with GCC; see the file COPYING3. If not see #undef LOCAL_LABEL_PREFIX #define LOCAL_LABEL_PREFIX "." -/* Always enable "-fpic" for Xtensa Linux. */ -#define XTENSA_ALWAYS_PIC 1 +/* Don't enable "-fpic" for Xtensa uclinux. */ +#define XTENSA_ALWAYS_PIC 0 #undef TARGET_LIBC_HAS_FUNCTION #define TARGET_LIBC_HAS_FUNCTION no_c99_libc_has_function diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index 7cfe64d4289..08f9f7c7a8f 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -1614,9 +1614,9 @@ xtensa_expand_atomic (enum rtx_code code, rtx target, rtx mem, rtx val, break; case MULT: /* NAND */ - tmp = expand_simple_binop (SImode, XOR, old, ac.modemask, + tmp = expand_simple_binop (SImode, AND, old, val, NULL_RTX, 1, OPTAB_DIRECT); - tmp = expand_simple_binop (SImode, AND, tmp, val, + tmp = expand_simple_binop (SImode, XOR, tmp, ac.modemask, new_rtx, 1, OPTAB_DIRECT); break; @@ -2862,7 +2862,8 @@ xtensa_expand_prologue (void) gen_rtx_SET (mem, reg)); } } - if (total_size > 1024) + if (total_size > 1024 + || (!callee_save_size && total_size > 128)) { rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG); emit_move_insn (tmp_reg, GEN_INT (total_size - diff --git a/gcc/configure b/gcc/configure index dc3a31aa44f..694c3a96d38 100755 --- a/gcc/configure +++ b/gcc/configure @@ -666,6 +666,7 @@ build_exeext all_selected_languages all_languages all_lang_makefrags +all_lang_configurefrags all_gtfiles all_compilers srcdir @@ -18449,7 +18450,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18451 "configure" +#line 18452 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18555,7 +18556,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18557 "configure" +#line 18558 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -22800,17 +22801,13 @@ if test $in_tree_ld != yes ; then # # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10 # - # In Solaris 11.4, this was changed to - # - # ld: Solaris ELF Utilities: 11.4-1.3123 - # # ld and ld.so.1 are guaranteed to be updated in lockstep, so ld version # numbers can be used in ld.so.1 feature checks even if a different # linker is configured. ld_ver=`$gcc_cv_ld -V 2>&1` - if echo "$ld_ver" | $EGREP 'Solaris Link Editors|Solaris ELF Utilities' > /dev/null; then + if echo "$ld_ver" | grep 'Solaris Link Editors' > /dev/null; then ld_vers=`echo $ld_ver | sed -n \ - -e 's,^.*: \(5\|1[0-9]\)\.[0-9][0-9]*-\([0-9]\.[0-9][0-9]*\).*$,\2,p'` + -e 's,^.*: 5\.[0-9][0-9]*-\([0-9]\.[0-9][0-9]*\).*$,\1,p'` ld_vers_major=`expr "$ld_vers" : '\([0-9]*\)'` ld_vers_minor=`expr "$ld_vers" : '[0-9]*\.\([0-9]*\)'` fi @@ -29518,7 +29515,8 @@ lang_tree_files= all_languages= all_compilers= all_outputs='Makefile' -# List of language makefile fragments. +# List of language configure and makefile fragments. +all_lang_configurefrags= all_lang_makefrags= # Additional files for gengtype all_gtfiles="$target_gtfiles" @@ -29604,6 +29602,7 @@ do esac $ok || continue + all_lang_configurefrags="$all_lang_configurefrags \$(srcdir)/$gcc_subdir/config-lang.in" all_lang_makefrags="$all_lang_makefrags \$(srcdir)/$gcc_subdir/Make-lang.in" if test -f $srcdir/$gcc_subdir/lang.opt; then lang_opt_files="$lang_opt_files $srcdir/$gcc_subdir/lang.opt" @@ -29764,6 +29763,7 @@ fi + # Echo link setup. diff --git a/gcc/configure.ac b/gcc/configure.ac index a26a827cb7d..096618b6b2a 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -2595,17 +2595,13 @@ if test $in_tree_ld != yes ; then # # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10 # - # In Solaris 11.4, this was changed to - # - # ld: Solaris ELF Utilities: 11.4-1.3123 - # # ld and ld.so.1 are guaranteed to be updated in lockstep, so ld version # numbers can be used in ld.so.1 feature checks even if a different # linker is configured. ld_ver=`$gcc_cv_ld -V 2>&1` - if echo "$ld_ver" | $EGREP 'Solaris Link Editors|Solaris ELF Utilities' > /dev/null; then + if echo "$ld_ver" | grep 'Solaris Link Editors' > /dev/null; then ld_vers=`echo $ld_ver | sed -n \ - -e 's,^.*: \(5\|1[0-9]\)\.[0-9][0-9]*-\([0-9]\.[0-9][0-9]*\).*$,\2,p'` + -e 's,^.*: 5\.[0-9][0-9]*-\([0-9]\.[0-9][0-9]*\).*$,\1,p'` ld_vers_major=`expr "$ld_vers" : '\([0-9]*\)'` ld_vers_minor=`expr "$ld_vers" : '[0-9]*\.\([0-9]*\)'` fi @@ -6144,7 +6140,8 @@ lang_tree_files= all_languages= all_compilers= all_outputs='Makefile' -# List of language makefile fragments. +# List of language configure and makefile fragments. +all_lang_configurefrags= all_lang_makefrags= # Additional files for gengtype all_gtfiles="$target_gtfiles" @@ -6232,6 +6229,7 @@ changequote([,])dnl esac $ok || continue + all_lang_configurefrags="$all_lang_configurefrags \$(srcdir)/$gcc_subdir/config-lang.in" all_lang_makefrags="$all_lang_makefrags \$(srcdir)/$gcc_subdir/Make-lang.in" if test -f $srcdir/$gcc_subdir/lang.opt; then lang_opt_files="$lang_opt_files $srcdir/$gcc_subdir/lang.opt" @@ -6333,6 +6331,7 @@ AC_SUBST(subdirs) AC_SUBST(srcdir) AC_SUBST(all_compilers) AC_SUBST(all_gtfiles) +AC_SUBST(all_lang_configurefrags) AC_SUBST(all_lang_makefrags) AC_SUBST(all_languages) AC_SUBST(all_selected_languages) diff --git a/gcc/convert.c b/gcc/convert.c index 68705f3e9b0..83bcec26486 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -193,12 +193,15 @@ convert_to_real_1 (tree type, tree expr, bool fold_p) CASE_MATHFN (FABS) CASE_MATHFN (LOGB) #undef CASE_MATHFN + if (call_expr_nargs (expr) != 1 + || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (expr, 0)))) + break; { tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0)); tree newtype = type; - /* We have (outertype)sqrt((innertype)x). Choose the wider mode from - the both as the safe type for operation. */ + /* We have (outertype)sqrt((innertype)x). Choose the wider mode + from the both as the safe type for operation. */ if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type)) newtype = TREE_TYPE (arg0); @@ -592,7 +595,8 @@ convert_to_integer_1 (tree type, tree expr, bool dofold) CASE_FLT_FN (BUILT_IN_ROUND): CASE_FLT_FN_FLOATN_NX (BUILT_IN_ROUND): /* Only convert in ISO C99 mode and with -fno-math-errno. */ - if (!targetm.libc_has_function (function_c99_misc) || flag_errno_math) + if (!targetm.libc_has_function (function_c99_misc) + || flag_errno_math) break; if (outprec < TYPE_PRECISION (integer_type_node) || (outprec == TYPE_PRECISION (integer_type_node) @@ -615,7 +619,8 @@ convert_to_integer_1 (tree type, tree expr, bool dofold) CASE_FLT_FN (BUILT_IN_RINT): CASE_FLT_FN_FLOATN_NX (BUILT_IN_RINT): /* Only convert in ISO C99 mode and with -fno-math-errno. */ - if (!targetm.libc_has_function (function_c99_misc) || flag_errno_math) + if (!targetm.libc_has_function (function_c99_misc) + || flag_errno_math) break; if (outprec < TYPE_PRECISION (integer_type_node) || (outprec == TYPE_PRECISION (integer_type_node) @@ -631,14 +636,20 @@ convert_to_integer_1 (tree type, tree expr, bool dofold) CASE_FLT_FN (BUILT_IN_TRUNC): CASE_FLT_FN_FLOATN_NX (BUILT_IN_TRUNC): - return convert_to_integer_1 (type, CALL_EXPR_ARG (s_expr, 0), dofold); + if (call_expr_nargs (s_expr) != 1 + || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0)))) + break; + return convert_to_integer_1 (type, CALL_EXPR_ARG (s_expr, 0), + dofold); default: break; } - if (fn) - { + if (fn + && call_expr_nargs (s_expr) == 1 + && SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0)))) + { tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0)); return convert_to_integer_1 (type, newexpr, dofold); } @@ -668,7 +679,9 @@ convert_to_integer_1 (tree type, tree expr, bool dofold) break; } - if (fn) + if (fn + && call_expr_nargs (s_expr) == 1 + && SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0)))) { tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0)); return convert_to_integer_1 (type, newexpr, dofold); diff --git a/gcc/coverage.c b/gcc/coverage.c index 32ef298a11f..592d3dcef84 100644 --- a/gcc/coverage.c +++ b/gcc/coverage.c @@ -368,7 +368,7 @@ get_coverage_counts (unsigned counter, unsigned expected, else { gcc_assert (coverage_node_map_initialized_p ()); - elt.ident = cgraph_node::get (cfun->decl)->profile_id; + elt.ident = cgraph_node::get (current_function_decl)->profile_id; } elt.ctr = counter; entry = counts_hash->find (&elt); @@ -663,7 +663,8 @@ coverage_begin_function (unsigned lineno_checksum, unsigned cfg_checksum) gcov_write_unsigned (cfg_checksum); gcov_write_string (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl))); - gcov_write_unsigned (DECL_ARTIFICIAL (current_function_decl)); + gcov_write_unsigned (DECL_ARTIFICIAL (current_function_decl) + && !DECL_LAMBDA_FUNCTION (current_function_decl)); gcov_write_filename (xloc.file); gcov_write_unsigned (xloc.line); gcov_write_unsigned (xloc.column); @@ -671,7 +672,11 @@ coverage_begin_function (unsigned lineno_checksum, unsigned cfg_checksum) expanded_location endloc = expand_location (cfun->function_end_locus); /* Function can start in a single file and end in another one. */ - gcov_write_unsigned (endloc.file == xloc.file ? endloc.line : xloc.line); + /* Work-around for PR gcov-profile/88045. */ + int end_line = endloc.file == xloc.file ? endloc.line : xloc.line; + if (xloc.line > end_line) + end_line = xloc.line; + gcov_write_unsigned (end_line); gcov_write_length (offset); return !gcov_is_error (); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 98a77e0921c..c4247de7617 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,737 @@ +2019-12-11 Jason Merrill + + PR c++/92859 - ADL and bit-field. + * name-lookup.c: Use unlowered_expr_type. + +2019-11-21 Jakub Jelinek + + Backported from mainline + 2019-10-22 Jakub Jelinek + + PR tree-optimization/85887 + * decl.c (expand_static_init): Drop ECF_LEAF from __cxa_guard_acquire + and __cxa_guard_release. + + 2019-10-29 Jakub Jelinek + + PR c++/92201 + * cp-gimplify.c (cp_gimplify_expr): If gimplify_to_rvalue changes the + function pointer type, re-add cast to the original one. + + 2019-10-04 Jakub Jelinek + + PR c++/91974 + * cp-gimplify.c (cp_gimplify_expr) : For + -fstrong-eval-order ensure CALL_EXPR_FN side-effects are evaluated + before any arguments. Additionally, ensure CALL_EXPR_FN that isn't + invariant nor OBJ_TYPE_REF nor SSA_NAME is forced into a temporary. + + 2019-08-09 Jakub Jelinek + + PR c/91401 + * parser.c (cp_parser_omp_clause_dist_schedule): Comment out the + check_no_duplicate_clause call, instead emit a warning for duplicate + dist_schedule clauses. + +2019-11-05 Jason Merrill + + PR c++/88075 + * parser.c (cp_parser_decl_specifier_seq): Support C++20 + concept-definition syntax without 'bool'. + +2019-10-22 Marek Polacek + + Backported from mainline + 2019-10-21 Marek Polacek + + PR c++/92106 - ICE with structured bindings and -Wreturn-local-addr. + * typeck.c (maybe_warn_about_returning_address_of_local): Avoid + recursing on null initializer and return false instead. + +2019-09-03 Iain Sandoe + + Backported from mainline + 2019-08-23 Iain Sandoe + + PR pch/61250 + * parser.c (cp_parser_initial_pragma): Call c_common_no_more_pch () + after determining that the first token is not + PRAGMA_GCC_PCH_PREPROCESS. + +2019-08-30 Richard Biener + + Backport from mainline + 2019-02-21 Richard Biener + + PR middle-end/89392 + * vtable-class-hierarchy.c (vtv_generate_init_routine): Do not + make symtab process new functions here. + +2019-08-29 Jakub Jelinek + + Backported from mainline + 2019-06-21 Jakub Jelinek + + PR c++/90950 + * semantics.c (finish_omp_clauses): Don't reject references to + incomplete types if processing_template_decl. + + 2019-05-15 Jakub Jelinek + + PR debug/90197 + * cp-gimplify.c (genericize_cp_loop): Emit a DEBUG_BEGIN_STMT + before the condition (or if missing or constant non-zero at the end + of the loop. Emit a DEBUG_BEGIN_STMT before the increment expression + if any. Don't call protected_set_expr_location on incr if it already + has a location. + + 2019-05-10 Jakub Jelinek + + PR pch/90326 + * config-lang.in (gtfiles): Remove c-family/c-lex.c, add + c-family/c-cppbuiltin.c. + +2019-08-15 Jonathan Wakely + + Backport from mainline. + 2019-08-14 Jonathan Wakely + + PR c++/91436 + * name-lookup.c (get_std_name_hint): Fix min_dialect field for + complex_literals and make_unique entries. + +2019-08-01 Marek Polacek + + Backported from mainline + 2018-06-12 Jason Merrill + + PR c++/86098 - ICE with template placeholder for TTP. + * typeck.c (structural_comptypes) [TEMPLATE_TYPE_PARM]: Check + CLASS_PLACEHOLDER_TEMPLATE. + +2019-06-11 Jakub Jelinek + + PR c++/90810 + * init.c (constant_value_1): Handle VECTOR_CST DECL_INITIAL for + !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P decls like CONSTRUCTOR. + +2019-05-22 Eric Botcazou + + Backport from mainline + 2018-05-10 Eric Botcazou + + PR c++/85400 + * decl2.c (adjust_var_decl_tls_model): New static function. + (comdat_linkage): Call it on a variable. + (maybe_make_one_only): Likewise. + +2019-05-20 Jonathan Wakely + + Backported from mainline + 2019-05-20 Jonathan Wakely + + PR c++/90532 Ensure __is_constructible(T[]) is false + * method.c (is_xible_helper): Return error_mark_node for construction + of an array of unknown bound. + +2019-05-07 Marek Polacek + + Backported from mainline + 2019-02-27 Marek Polacek + + PR c++/88857 - ICE with value-initialization of argument in template. + * call.c (convert_like_real): Don't call build_value_init in template. + + 2019-03-25 Marek Polacek + + PR c++/89214 - ICE when initializing aggregates with bases. + * typeck2.c (digest_init_r): Warn about object slicing instead of + crashing. + + 2019-02-27 Marek Polacek + + PR c++/89511 - ICE with using-declaration and unscoped enumerator. + * parser.c (cp_parser_using_declaration): For an unscoped enum + only use its context if it's not a function declaration. + + 2019-03-25 Marek Polacek + + PR c++/89705 - ICE with reference binding with conversion function. + * call.c (reference_binding): If the result of the conversion function + is a prvalue of non-class type, use the cv-unqualified type. + + 2019-03-29 Marek Polacek + + PR c++/89876 - ICE with deprecated conversion. + * call.c (convert_like_real): Only give warnings with tf_warning. + +2019-04-30 Jakub Jelinek + + Backported from mainline + 2019-04-19 Jakub Jelinek + + PR c++/90108 + * decl.c (duplicate_decls): If remove is main variant and + DECL_ORIGINAL_TYPE is some other type, remove a DECL_ORIGINAL_TYPE + variant that has newdecl as TYPE_NAME if any. + + 2019-04-12 Jakub Jelinek + + PR c/89933 + * decl.c (duplicate_decls): When newdecl's type is its main variant, + don't try to remove it from the variant list, but instead assert + it has no variants. + + 2019-03-29 Jakub Jelinek + + PR sanitizer/89869 + * typeck.c: Include gimplify.h. + (cp_build_modify_expr) : Unshare rhs before using it + for second time. Formatting fixes. + + 2019-03-26 Jakub Jelinek + + PR c++/89796 + * semantics.c (finish_omp_atomic): Add warning_sentinel for + -Wunused-value around finish_expr_stmt call. + + 2019-03-22 Jakub Jelinek + + PR c++/60702 + * cp-tree.h (get_tls_wrapper_fn): Remove declaration. + (maybe_get_tls_wrapper_call): Declare. + * decl2.c (get_tls_wrapper_fn): Make static. + (maybe_get_tls_wrapper_call): New function. + * typeck.c (build_class_member_access_expr): Handle accesses to TLS + variables. + * semantics.c (finish_qualified_id_expr): Likewise. + (finish_id_expression_1): Use maybe_get_tls_wrapper_call. + * pt.c (tsubst_copy_and_build): Likewise. + + 2019-03-21 Jakub Jelinek + + PR c++/89767 + * parser.c (cp_parser_lambda_introducer): Add ids and first_capture_id + variables, check for duplicates in this function. + * lambda.c (add_capture): Don't check for duplicates nor use + IDENTIFIER_MARKED. + (register_capture_members): Don't clear IDENTIFIER_MARKED here. + + 2019-03-14 Jakub Jelinek + + PR c++/89512 + * semantics.c (finish_qualified_id_expr): Reject variable templates. + + 2019-03-06 Jakub Jelinek + + PR c++/87148 + * init.c (build_value_init_noctor): Ignore flexible array members. + + 2019-02-20 Jakub Jelinek + + PR c++/89403 + * decl2.c (c_parse_final_cleanups): Move TREE_ASM_WRITTEN setting + for flag_syntax_only from here... + * semantics.c (expand_or_defer_fn_1): ... here. + + PR c++/89405 + * decl.c (maybe_commonize_var): When clearing TREE_PUBLIC and + DECL_COMMON, set DECL_INTERFACE_KNOWN. + +2019-03-08 Jason Merrill + + PR c++/88820 - ICE with CTAD and member template used in DMI. + * pt.c (do_class_deduction): Handle parm used as its own arg. + + PR c++/88869 - C++17 ICE with CTAD and explicit specialization. + * pt.c (do_class_deduction): Don't include explicit specialization + args in outer_args. + + PR c++/88419 - C++17 ICE with class template arg deduction. + * pt.c (make_template_placeholder): Set TYPE_CANONICAL after + CLASS_PLACEHOLDER_TEMPLATE. + + PR c++/88690 - C++17 ICE with empty base in aggregate. + * typeck2.c (process_init_constructor_record): Skip trivial + initialization of an empty base. + + PR c++/87921 - wrong error with inline static data member. + * decl2.c (c_parse_final_cleanups): Don't force out uninstantiated + inline static data members. + + PR c++/89381 - implicit copy and using-declaration. + * class.c (classtype_has_move_assign_or_move_ctor_p): Don't consider + op= brought in by a using-declaration. + + PR c++/89576 - if constexpr of lambda capture. + * semantics.c (maybe_convert_cond): Do convert a non-dependent + condition in a template. + * typeck.c (condition_conversion): Handle being called in a + template. + + PR c++/89422 - ICE with -g and lambda in default arg in template. + * pt.c (tsubst_function_decl): SET_DECL_FRIEND_CONTEXT sooner. + + PR c++/87513 - 'sorry' mangling PMF template-id. + * mangle.c (write_expression): Handle SCOPE_REF to BASELINK. + + PR c++/88183 - ICE with .* fold-expression. + * pt.c (fold_expression) [DOTSTAR_EXPR]: Remove special handling. + +2019-03-07 Jakub Jelinek + + PR c++/89585 + * parser.c (cp_parser_asm_definition): Parse asm qualifiers even + at toplevel, but diagnose them. + +2019-02-26 Marek Polacek + + Backported from mainline + 2019-02-11 Marek Polacek + + PR c++/89212 - ICE converting nullptr to pointer-to-member-function. + * pt.c (tsubst_copy_and_build) : Return early for + null member pointer value. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + +2019-02-14 David Malcolm + + 2019-02-13 David Malcolm + Backport of r268847 from trunk. + + PR c++/89036 + * class.c (add_method): Drop destructor assertion. + +2019-02-14 David Malcolm + + Backport of r267957 from trunk. + 2019-01-15 David Malcolm + + PR c++/88795 + * pt.c (build_deduction_guide): Bail out if tsubst_arg_types + fails. + +2019-02-14 David Malcolm + + Backport of r262199 from trunk. + 2018-06-27 David Malcolm + + PR c++/86329 + * name-lookup.c (consider_binding_level): Filter out names that + match anon_aggrname_p. + +2019-02-14 David Malcolm + + Backport of r259720 from trunk. + 2018-04-27 David Malcolm + + PR c++/85515 + * name-lookup.c (consider_binding_level): Skip compiler-generated + variables. + * search.c (lookup_field_fuzzy_info::fuzzy_lookup_field): Flatten + nested if statements into a series of rejection tests. Reject + lambda-ignored entities as suggestions. + +2019-02-11 Jason Merrill + + Revert: + PR c++/88752 - ICE with lambda and constexpr if. + * cp-tree.h (LAMBDA_EXPR_INSTANTIATED): New. + * pt.c (tsubst_lambda_expr): Set it. + (instantiated_lambda_fn_p): Check it. + (enclosing_instantiation_of): Use it. + +2019-02-11 Jason Merrill + + PR c++/89267 - change of error location. + * pt.c (tsubst_copy_and_build): Do still clear expr location + for instantiated thunk calls. + +2019-02-08 Jason Merrill + + PR c++/88761 - ICE with reference capture of constant. + * lambda.c (mark_const_cap_r): Do walk subtrees of DECL_EXPR for + non-proxy decls. + + PR c++/88752 - ICE with lambda and constexpr if. + * cp-tree.h (LAMBDA_EXPR_INSTANTIATED): New. + * pt.c (tsubst_lambda_expr): Set it. + (instantiated_lambda_fn_p): Check it. + (enclosing_instantiation_of): Use it. + + PR c++/86943 - wrong code converting generic lambda to pointer. + * pt.c (tsubst_copy_and_build): Don't propagate CALL_FROM_THUNK_P. + +2019-02-07 Jakub Jelinek + + Backported from mainline + 2019-02-05 Jakub Jelinek + + PR c++/89187 + * optimize.c (maybe_thunk_body): Clear TREE_ADDRESSABLE on + PARM_DECLs of the thunk. + * lambda.c (maybe_add_lambda_conv_op): Likewise. + + 2019-01-30 Jakub Jelinek + + PR c++/88988 + * lambda.c (is_capture_proxy): Don't return true for + DECL_OMP_PRIVATIZED_MEMBER artificial vars. + + 2019-01-24 Jakub Jelinek + + PR c++/88976 + * semantics.c (finish_omp_cancel): Use maybe_convert_cond when not in + template or build_x_binary_op otherwise. + + 2019-01-21 Jakub Jelinek + + PR c++/88949 + * optimize.c (cxx_copy_decl): New function. + (clone_body): Use it instead of copy_decl_no_change. + + PR sanitizer/88901 + * typeck.c (cp_build_binary_op): Don't instrument + SANITIZE_POINTER_COMPARE if processing_template_decl. + (pointer_diff): Similarly for SANITIZE_POINTER_SUBTRACT. + +2019-02-06 Marek Polacek + + Backport from mainline + 2019-02-05 Marek Polacek + + PR c++/89158 - by-value capture of constexpr variable broken. + * call.c (convert_like_real) : Call mark_exp_read + instead of mark_rvalue_use. + + Backport from mainline + 2019-01-31 Marek Polacek + + PR c++/88983 - ICE with switch in constexpr function. + * constexpr.c (cxx_eval_switch_expr): Use SWITCH_COND and SWITCH_BODY. + (cxx_eval_constant_expression) : Don't look for the + label in the else branch if we found it in the then branch. + + Backport from mainline + 2019-01-30 Marek Polacek + + PR c++/89119 - ICE with value-initialization in template. + * pt.c (tsubst_copy_and_build): Handle RANGE_EXPR. + + Backport from mainline + 2019-01-27 Marek Polacek + + PR c++/89024 - ICE with incomplete enum type. + * call.c (standard_conversion): When converting an + ARITHMETIC_TYPE_P to an incomplete type, return NULL. + +2019-02-05 Marek Polacek + + Backported from mainline + 2019-01-31 Marek Polacek + + PR c++/89083, c++/80864 - ICE with list initialization in template. + * decl.c (reshape_init_r): Don't reshape a digested initializer. + Return the initializer for COMPOUND_LITERAL_P. + +2019-01-27 Jason Merrill + + PR c++/86740, ICE with constexpr if and nested generic lambdas. + * tree.c (cp_walk_subtrees): Handle LAMBDA_EXPR. + + PR c++/87075 - ICE with constexpr array initialization. + * constexpr.c (cxx_eval_vec_init_1): Handle trivial initialization. + + * pt.c (tsubst) [TEMPLATE_TYPE_PARM]: Use TEMPLATE_PARM_DESCENDANTS. + +2019-01-17 Nathan Sidwell + + PR c++/86610 + * semantics.c (process_outer_var_ref): Only skip dependent types + in templates. + +2019-01-08 Jakub Jelinek + + Backported from mainline + 2018-12-20 Jakub Jelinek + + PR c++/88180 + * parser.c (cp_parser_class_specifier_1): If + cp_parser_check_type_definition fails, skip default arguments, NSDMIs, + etc. like for erroneous template args. + + 2018-12-19 Jakub Jelinek + + PR c++/87934 + * constexpr.c (cxx_eval_constant_expression) : Do + re-process TREE_CONSTANT CONSTRUCTORs if they aren't reduced constant + expressions. + + 2018-12-17 Jakub Jelinek + + PR c++/88410 + * cp-gimplify.c (cp_fold) : For offsetof-like folding, + call maybe_constant_value on val to see if it is INTEGER_CST. + + 2018-12-14 Jakub Jelinek + + PR c++/82294 + PR c++/87436 + * init.c (build_vec_init): Change num_initialized_elts type from int + to HOST_WIDE_INT. Build a RANGE_EXPR if e needs to be repeated more + than once. + + 2018-12-07 Jakub Jelinek + + PR c++/86669 + * call.c (make_temporary_var_for_ref_to_temp): Call pushdecl even for + automatic vars. + + PR c++/87506 + * constexpr.c (adjust_temp_type): Handle EMPTY_CLASS_EXPR. + + 2018-12-04 Jakub Jelinek + + PR c++/88103 + * typeck.c (build_class_member_access_expr): If unary_complex_lvalue + turned xvalue_p into non-xvalue_p, call move on it. + + 2018-11-27 Jakub Jelinek + + PR c++/88181 + * class.c (fixup_attribute_variants): Also propagate TYPE_PACKED + to variants. + + 2018-11-21 Jakub Jelinek + + PR c++/88122 + * method.c (maybe_explain_implicit_delete): If + FUNCTION_FIRST_USER_PARMTYPE (decl) is NULL, set const_p to false + instead of ICEing. + +2018-01-02 Segher Boessenkool + + Backport from trunk + 2018-12-06 Segher Boessenkool + + PR inline-asm/55681 + * parser.c (cp_parser_asm_definition): Update grammar. Allow any + combination of volatile and goto, in any order, without repetitions. + + Backport from trunk + 2018-12-06 Segher Boessenkool + + * cp-tree.h (finish_asm_stmt): Update declaration. + * parser.c (cp_parser_asm_definition): Detect the inline keyword + after asm. Pass a flag for it to finish_asm_stmt. + * pt.c (tsubst_expr): Pass the ASM_INLINE_P flag to finish_asm_stmt. + * semantics.c (finish_asm_stmt): Add inline_p parameter. Use it to + set ASM_INLINE_P. + + Backport from trunk + 2018-12-19 Segher Boessenkool + + * parser.c (cp_parser_asm_definition): Rewrite the loop to work without + "done" boolean variable. + + Backport from trunk + 2018-12-19 Segher Boessenkool + + * parser.c (cp_parser_asm_definition): Rewrite the loop to work without + "done" boolean variable. + * parser.c (cp_parser_asm_definition): Keep track of the location each + asm qualifier is first seen; use that to give nicer "duplicate asm + qualifier" messages. + + Backport from trunk + 2018-12-19 Segher Boessenkool + + * parser.c (cp_parser_asm_definition) : Give + a more specific error message (instead of just falling through). + + Backport from trunk + 2018-12-10 Segher Boessenkool + + * parser.c (cp_parser_asm_definition): Do not allow any asm qualifiers + on top-level asm. + +2018-12-13 Nathan Sidwell + + PR c++/87531 + * class.c (finish_struct): Set DECL_CONTEXT of template assign op. + * name-lookup.c (get_class_binding_direct): Don't strip using-decl + of overload here. + * parser.c (cp_parser_postfix_expression): Cope with using decl in + overload set. + * semantics.c (finish_id_expr): Likewise. + +2018-12-04 Marek Polacek + + Backported from mainline + 2018-11-26 Marek Polacek + + PR c++/88120 - ICE when calling save_expr in a template. + * typeck.c (cp_build_binary_op): Call cp_save_expr instead of + save_expr. + +2018-11-29 Nathan Sidwell + + PR c++/87531 + * class.c (finish_struct): In a template, add artificial using + decl for operator=. + +2018-11-15 Nathan Sidwell + + PR c++/86246 + PR c++/87989 + * typeck.c (finish_class_member_access_expr): Conversion operator + to dependent type is dependent. + +2018-11-05 Jakub Jelinek + + Backported from mainline + 2018-10-24 Jakub Jelinek + + PR c++/86288 + * parser.c (cp_parser_std_attribute): Canonicalize attr_ns, and when + :: is not present and attr_ns non-NULL, canonicalize also attr_id. + (cp_parser_attribute_spec): Fix comment typo. + +2018-10-23 Tom de Vries + + backport from trunk: + 2018-07-31 Tom de Vries + + PR debug/86687 + * optimize.c (update_cloned_parm): Copy DECL_BY_REFERENCE. + +2018-10-11 Jakub Jelinek + + PR c++/87582 + * typeck.c (maybe_warn_about_returning_address_of_local): If + whats_returned is a structured binding identifier and the structured + binding is a reference, recurse on its initializer. + +2018-10-10 Paolo Carlini + + PR c++/84940 + * semantics.c (finish_unary_op_expr): Check return value of + build_x_unary_op for error_mark_node. + +2018-10-03 Martin Liska + + Backport from mainline + 2018-10-03 Martin Liska + + PR gcov-profile/86109 + * parser.c (cp_parser_lambda_declarator_opt): + Set DECL_LAMBDA_FUNCTION for lambdas. + +2018-09-24 Paolo Carlini + + PR c++/85070 + * method.c (lazily_declare_fn): During error-recovery add_method + may return false. + +2018-09-18 Nathan Sidwell + + PR c++/86881 + * name-lookup.c (check_local_shadow): Ignore auto types. + +2018-09-13 Ville Voutilainen + + Backport from mainline + 2018-09-13 Ville Voutilainen + gcc/cp + + PR c++/87093 + * method.c (constructible_expr): We're in an unevaluated context + in all cases, not just for class targets. + + testsuite/ + + PR c++/87093 + * g++.dg/ext/is_constructible2.C: New. + +2018-09-05 Pádraig Brady + + PR c++/87185 + * lambda.c (prune_lambda_captures): Protect against const_vars.get + returning NULL. + +2018-09-05 Jakub Jelinek + + Backported from mainline + 2018-08-29 Jakub Jelinek + + PR c++/87095 + * decl.c (begin_destructor_body): If current_class_type has + virtual bases and the primary base is nearly empty virtual base, + voidify clearing of vptr and make it conditional on in-charge + argument. + + 2018-08-08 Jakub Jelinek + + PR c++/86836 + * pt.c (tsubst_expr): For structured bindings, call tsubst_decomp_names + before tsubst_init, not after it. + + PR c++/86738 + * constexpr.c (cxx_eval_binary_expression): For arithmetics involving + NULL pointer set *non_constant_p to true. + (cxx_eval_component_reference): For dereferencing of a NULL pointer, + set *non_constant_p to true and return t. + + 2018-08-03 Jason Merrill + + PR c++/86706 + * class.c (build_base_path): Use currently_open_class. + +2018-08-31 Nathan Sidwell + + PR c++/87155 + PR c++/84707 + * name-lookup.c (name_lookup::search_namespace): Don't look at + inlines when searching for NULL names. + +2018-08-29 Jakub Jelinek + + PR c++/87122 + * pt.c (tsubst_expr) : If + processing_template_decl and decl is structured binding decl, call + cp_finish_decomp. + +2018-08-17 Richard Biener + + Backport from mainline + 2018-08-02 Richard Biener + + PR c++/86763 + * class.c (layout_class_type): Copy TYPE_TYPELESS_STORAGE + to the CLASSTYPE_AS_BASE. + +2018-08-10 Jason Merrill + + PR c++/86728 - C variadic generic lambda. + * parser.c (cp_parser_parameter_declaration): Don't turn 'auto' into + a pack if it's followed by a declarator-id. + +2018-08-08 Marek Polacek + + Backport from mainline + 2018-08-06 Marek Polacek + + PR c++/86767 + * constexpr.c (cxx_eval_statement_list): Handle continue. + +2018-08-01 Marek Polacek + + PR c++/86190 - bogus -Wsign-conversion warning + * typeck.c (cp_build_binary_op): Add a warning sentinel. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 10b885866d5..11bd5420fe7 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -1396,6 +1396,13 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p, || (fcode == REAL_TYPE && !(flags & LOOKUP_NO_NON_INTEGRAL))) || SCOPED_ENUM_P (from)) return NULL; + + /* If we're parsing an enum with no fixed underlying type, we're + dealing with an incomplete type, which renders the conversion + ill-formed. */ + if (!COMPLETE_TYPE_P (from)) + return NULL; + conv = build_conv (ck_std, to, conv); /* Give this a better rank if it's a promotion. */ @@ -1760,6 +1767,9 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags, && DECL_CONV_FN_P (t->cand->fn)) { tree ftype = TREE_TYPE (TREE_TYPE (t->cand->fn)); + /* A prvalue of non-class type is cv-unqualified. */ + if (TREE_CODE (ftype) != REFERENCE_TYPE && !CLASS_TYPE_P (ftype)) + ftype = cv_unqualified (ftype); int sflags = (flags|LOOKUP_NO_CONVERSION)&~LOOKUP_NO_TEMP_BIND; conversion *new_second = reference_binding (rto, ftype, NULL_TREE, c_cast_p, @@ -6768,7 +6778,8 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, /* If we're initializing from {}, it's value-initialization. */ if (BRACE_ENCLOSED_INITIALIZER_P (expr) && CONSTRUCTOR_NELTS (expr) == 0 - && TYPE_HAS_DEFAULT_CONSTRUCTOR (totype)) + && TYPE_HAS_DEFAULT_CONSTRUCTOR (totype) + && !processing_template_decl) { bool direct = CONSTRUCTOR_IS_DIRECT_INIT (expr); if (abstract_virtuals_error_sfinae (NULL_TREE, totype, complain)) @@ -6783,7 +6794,9 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, return expr; } - expr = mark_rvalue_use (expr); + /* We don't know here whether EXPR is being used as an lvalue or + rvalue, but we know it's read. */ + mark_exp_read (expr); /* Pass LOOKUP_NO_CONVERSION so rvalue/base handling knows not to allow any more UDCs. */ @@ -7101,7 +7114,8 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, case ck_qual: /* Warn about deprecated conversion if appropriate. */ - string_conv_p (totype, expr, 1); + if (complain & tf_warning) + string_conv_p (totype, expr, 1); break; case ck_ptr: @@ -10824,14 +10838,12 @@ make_temporary_var_for_ref_to_temp (tree decl, tree type) tree name = mangle_ref_init_variable (decl); DECL_NAME (var) = name; SET_DECL_ASSEMBLER_NAME (var, name); - - var = pushdecl (var); } else /* Create a new cleanup level if necessary. */ maybe_push_cleanup_level (type); - return var; + return pushdecl (var); } /* EXPR is the initializer for a variable DECL of reference or diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 6abae3e187e..0b789b17337 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -278,6 +278,9 @@ build_base_path (enum tree_code code, probe = TYPE_MAIN_VARIANT (TREE_TYPE (expr)); if (want_pointer) probe = TYPE_MAIN_VARIANT (TREE_TYPE (probe)); + if (dependent_type_p (probe)) + if (tree open = currently_open_class (probe)) + probe = open; if (code == PLUS_EXPR && !SAME_BINFO_TYPE_P (BINFO_TYPE (d_binfo), probe)) @@ -1138,9 +1141,6 @@ add_method (tree type, tree method, bool via_using) } } - /* A class should never have more than one destructor. */ - gcc_assert (!current_fns || !DECL_DESTRUCTOR_P (method)); - current_fns = ovl_insert (method, current_fns, via_using); if (!COMPLETE_TYPE_P (type) && !DECL_CONV_FN_P (method) @@ -1954,6 +1954,7 @@ fixup_attribute_variants (tree t) unsigned align = TYPE_ALIGN (t); bool user_align = TYPE_USER_ALIGN (t); bool may_alias = lookup_attribute ("may_alias", attrs); + bool packed = TYPE_PACKED (t); if (may_alias) fixup_may_alias (t); @@ -1971,6 +1972,7 @@ fixup_attribute_variants (tree t) else TYPE_USER_ALIGN (variants) = user_align; SET_TYPE_ALIGN (variants, valign); + TYPE_PACKED (variants) = packed; if (may_alias) fixup_may_alias (variants); } @@ -5169,7 +5171,9 @@ classtype_has_move_assign_or_move_ctor_p (tree t, bool user_p) for (ovl_iterator iter (get_class_binding_direct (t, assign_op_identifier)); iter; ++iter) - if ((!user_p || !DECL_ARTIFICIAL (*iter)) && move_fn_p (*iter)) + if ((!user_p || !DECL_ARTIFICIAL (*iter)) + && DECL_CONTEXT (*iter) == t + && move_fn_p (*iter)) return true; return false; @@ -6243,6 +6247,7 @@ layout_class_type (tree t, tree *virtuals_p) bitsize_int (BITS_PER_UNIT))); SET_TYPE_ALIGN (base_t, rli->record_align); TYPE_USER_ALIGN (base_t) = TYPE_USER_ALIGN (t); + TYPE_TYPELESS_STORAGE (base_t) = TYPE_TYPELESS_STORAGE (t); /* Copy the non-static data members of T. This will include its direct non-virtual bases & vtable. */ @@ -7031,6 +7036,20 @@ finish_struct (tree t, tree attributes) else if (DECL_DECLARES_FUNCTION_P (x)) DECL_IN_AGGR_P (x) = false; + /* Also add a USING_DECL for operator=. We know there'll be (at + least) one, but we don't know the signature(s). We want name + lookup not to fail or recurse into bases. This isn't added + to the template decl list so we drop this at instantiation + time. */ + tree ass_op = build_lang_decl (USING_DECL, assign_op_identifier, + NULL_TREE); + DECL_CONTEXT (ass_op) = t; + USING_DECL_SCOPE (ass_op) = t; + DECL_DEPENDENT_P (ass_op) = true; + DECL_ARTIFICIAL (ass_op) = true; + DECL_CHAIN (ass_op) = TYPE_FIELDS (t); + TYPE_FIELDS (t) = ass_op; + TYPE_SIZE (t) = bitsize_zero_node; TYPE_SIZE_UNIT (t) = size_zero_node; /* COMPLETE_TYPE_P is now true. */ diff --git a/gcc/cp/config-lang.in b/gcc/cp/config-lang.in index 546572693fd..8e33f138136 100644 --- a/gcc/cp/config-lang.in +++ b/gcc/cp/config-lang.in @@ -37,7 +37,7 @@ gtfiles="\ \$(srcdir)/c-family/c-pragma.h \$(srcdir)/cp/decl.h \ \$(srcdir)/cp/parser.h \ \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-format.c \ -\$(srcdir)/c-family/c-lex.c \$(srcdir)/c-family/c-pragma.c \ +\$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.c \ \$(srcdir)/cp/call.c \$(srcdir)/cp/class.c \$(srcdir)/cp/constexpr.c \ \$(srcdir)/cp/cp-gimplify.c \ \$(srcdir)/cp/cp-lang.c \$(srcdir)/cp/cp-objcp-common.c \ diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 178026512b4..f161984e204 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -1252,6 +1252,8 @@ adjust_temp_type (tree type, tree temp) /* Avoid wrapping an aggregate value in a NOP_EXPR. */ if (TREE_CODE (temp) == CONSTRUCTOR) return build_constructor (type, CONSTRUCTOR_ELTS (temp)); + if (TREE_CODE (temp) == EMPTY_CLASS_EXPR) + return build0 (EMPTY_CLASS_EXPR, type); gcc_assert (scalarish_type_p (type)); return cp_fold_convert (type, temp); } @@ -2066,6 +2068,7 @@ cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t, { if (!ctx->quiet) error ("arithmetic involving a null pointer in %qE", lhs); + *non_constant_p = true; return t; } else if (code == POINTER_PLUS_EXPR) @@ -2506,9 +2509,13 @@ cxx_eval_component_reference (const constexpr_ctx *ctx, tree t, lval, non_constant_p, overflow_p); if (INDIRECT_REF_P (whole) - && integer_zerop (TREE_OPERAND (whole, 0)) - && !ctx->quiet) - error ("dereferencing a null pointer in %qE", orig_whole); + && integer_zerop (TREE_OPERAND (whole, 0))) + { + if (!ctx->quiet) + error ("dereferencing a null pointer in %qE", orig_whole); + *non_constant_p = true; + return t; + } if (TREE_CODE (whole) == PTRMEM_CST) whole = cplus_expand_constant (whole); @@ -2989,6 +2996,9 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init, { /* Initializing an element using value or default initialization we just pre-built above. */ + if (init == void_node) + /* Trivial default-init, don't do anything to the CONSTRUCTOR. */ + return ctx->ctor; eltinit = cxx_eval_constant_expression (&new_ctx, init, lval, non_constant_p, overflow_p); reuse = i == 0; @@ -3926,6 +3936,16 @@ cxx_eval_statement_list (const constexpr_ctx *ctx, tree t, for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i)) { tree stmt = tsi_stmt (i); + /* We've found a continue, so skip everything until we reach + the label its jumping to. */ + if (continues (jump_target)) + { + if (label_matches (ctx, jump_target, stmt)) + /* Found it. */ + *jump_target = NULL_TREE; + else + continue; + } if (TREE_CODE (stmt) == DEBUG_BEGIN_STMT) continue; r = cxx_eval_constant_expression (ctx, stmt, false, @@ -3993,13 +4013,13 @@ cxx_eval_switch_expr (const constexpr_ctx *ctx, tree t, bool *non_constant_p, bool *overflow_p, tree *jump_target) { - tree cond = TREE_OPERAND (t, 0); + tree cond = SWITCH_COND (t); cond = cxx_eval_constant_expression (ctx, cond, false, non_constant_p, overflow_p); VERIFY_CONSTANT (cond); *jump_target = cond; - tree body = TREE_OPERAND (t, 1); + tree body = SWITCH_BODY (t); constexpr_ctx new_ctx = *ctx; constexpr_switch_state css = css_default_not_seen; new_ctx.css_state = &css; @@ -4528,6 +4548,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, case COND_EXPR: if (jump_target && *jump_target) { + tree orig_jump = *jump_target; /* When jumping to a label, the label might be either in the then or else blocks, so process then block first in skipping mode first, and if we are still in the skipping mode at its end, @@ -4535,7 +4556,19 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1), lval, non_constant_p, overflow_p, jump_target); - if (*jump_target) + /* It's possible that we found the label in the then block. But + it could have been followed by another jumping statement, e.g. + say we're looking for case 1: + if (cond) + { + // skipped statements + case 1:; // clears up *jump_target + return 1; // and sets it to a RETURN_EXPR + } + else { ... } + in which case we need not go looking to the else block. + (goto is not allowed in a constexpr function.) */ + if (*jump_target == orig_jump) r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 2), lval, non_constant_p, overflow_p, jump_target); @@ -4551,7 +4584,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, break; case CONSTRUCTOR: - if (TREE_CONSTANT (t)) + if (TREE_CONSTANT (t) && reduced_constant_expression_p (t)) { /* Don't re-process a constant CONSTRUCTOR, but do fold it to VECTOR_CST if applicable. */ diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 64dc625413b..dc946b9c682 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -202,17 +202,26 @@ genericize_cp_loop (tree *stmt_p, location_t start_locus, tree cond, tree body, tree blab, clab; tree exit = NULL; tree stmt_list = NULL; + tree debug_begin = NULL; blab = begin_bc_block (bc_break, start_locus); clab = begin_bc_block (bc_continue, start_locus); - protected_set_expr_location (incr, start_locus); + if (EXPR_LOCATION (incr) == UNKNOWN_LOCATION) + protected_set_expr_location (incr, start_locus); cp_walk_tree (&cond, cp_genericize_r, data, NULL); cp_walk_tree (&body, cp_genericize_r, data, NULL); cp_walk_tree (&incr, cp_genericize_r, data, NULL); *walk_subtrees = 0; + if (MAY_HAVE_DEBUG_MARKER_STMTS + && (!cond || !integer_zerop (cond))) + { + debug_begin = build0 (DEBUG_BEGIN_STMT, void_type_node); + SET_EXPR_LOCATION (debug_begin, EXPR_LOC_OR_LOC (cond, start_locus)); + } + if (cond && TREE_CODE (cond) != INTEGER_CST) { /* If COND is constant, don't bother building an exit. If it's false, @@ -225,10 +234,24 @@ genericize_cp_loop (tree *stmt_p, location_t start_locus, tree cond, tree body, } if (exit && cond_is_first) - append_to_statement_list (exit, &stmt_list); + { + append_to_statement_list (debug_begin, &stmt_list); + debug_begin = NULL_TREE; + append_to_statement_list (exit, &stmt_list); + } append_to_statement_list (body, &stmt_list); finish_bc_block (&stmt_list, bc_continue, clab); - append_to_statement_list (incr, &stmt_list); + if (incr) + { + if (MAY_HAVE_DEBUG_MARKER_STMTS) + { + tree d = build0 (DEBUG_BEGIN_STMT, void_type_node); + SET_EXPR_LOCATION (d, EXPR_LOC_OR_LOC (incr, start_locus)); + append_to_statement_list (d, &stmt_list); + } + append_to_statement_list (incr, &stmt_list); + } + append_to_statement_list (debug_begin, &stmt_list); if (exit && !cond_is_first) append_to_statement_list (exit, &stmt_list); @@ -752,6 +775,27 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) case CALL_EXPR: ret = GS_OK; + if (flag_strong_eval_order == 2 + && CALL_EXPR_FN (*expr_p) + && cp_get_callee_fndecl_nofold (*expr_p) == NULL_TREE) + { + tree fnptrtype = TREE_TYPE (CALL_EXPR_FN (*expr_p)); + enum gimplify_status t + = gimplify_expr (&CALL_EXPR_FN (*expr_p), pre_p, NULL, + is_gimple_call_addr, fb_rvalue); + if (t == GS_ERROR) + ret = GS_ERROR; + else if (is_gimple_variable (CALL_EXPR_FN (*expr_p)) + && TREE_CODE (CALL_EXPR_FN (*expr_p)) != SSA_NAME) + CALL_EXPR_FN (*expr_p) + = get_initialized_tmp_var (CALL_EXPR_FN (*expr_p), pre_p, + NULL); + /* GIMPLE considers most pointer conversion useless, but for + calls we actually care about the exact function pointer type. */ + if (t != GS_ERROR && TREE_TYPE (CALL_EXPR_FN (*expr_p)) != fnptrtype) + CALL_EXPR_FN (*expr_p) + = build1 (NOP_EXPR, fnptrtype, CALL_EXPR_FN (*expr_p)); + } if (!CALL_EXPR_FN (*expr_p)) /* Internal function call. */; else if (CALL_EXPR_REVERSE_ARGS (*expr_p)) @@ -2266,6 +2310,7 @@ cp_fold (tree x) { val = TREE_OPERAND (val, 0); STRIP_NOPS (val); + val = maybe_constant_value (val); if (TREE_CODE (val) == INTEGER_CST) return fold_offsetof (op0, TREE_TYPE (x)); } diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 85ba5b87e3b..c519c8ede2e 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6390,7 +6390,7 @@ extern tree cp_build_parm_decl (tree, tree, tree); extern tree get_guard (tree); extern tree get_guard_cond (tree, bool); extern tree set_guard (tree); -extern tree get_tls_wrapper_fn (tree); +extern tree maybe_get_tls_wrapper_call (tree); extern void mark_needed (tree); extern bool decl_needed_p (tree); extern void note_vague_linkage_fn (tree); @@ -6897,7 +6897,7 @@ extern tree begin_compound_stmt (unsigned int); extern void finish_compound_stmt (tree); extern tree finish_asm_stmt (int, tree, tree, tree, tree, - tree); + tree, bool); extern tree finish_label_stmt (tree); extern void finish_label_decl (tree); extern cp_expr finish_parenthesized_expr (cp_expr); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c0cc71f4eba..1d363d8a0be 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2163,13 +2163,33 @@ next_arg:; if (TYPE_NAME (TREE_TYPE (newdecl)) == newdecl) { tree remove = TREE_TYPE (newdecl); - for (tree t = TYPE_MAIN_VARIANT (remove); ; - t = TYPE_NEXT_VARIANT (t)) - if (TYPE_NEXT_VARIANT (t) == remove) - { - TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (remove); - break; - } + if (TYPE_MAIN_VARIANT (remove) == remove) + { + gcc_assert (TYPE_NEXT_VARIANT (remove) == NULL_TREE); + /* If remove is the main variant, no need to remove that + from the list. One of the DECL_ORIGINAL_TYPE + variants, e.g. created for aligned attribute, might still + refer to the newdecl TYPE_DECL though, so remove that one + in that case. */ + if (tree orig = DECL_ORIGINAL_TYPE (newdecl)) + if (orig != remove) + for (tree t = TYPE_MAIN_VARIANT (orig); t; + t = TYPE_MAIN_VARIANT (t)) + if (TYPE_NAME (TYPE_NEXT_VARIANT (t)) == newdecl) + { + TYPE_NEXT_VARIANT (t) + = TYPE_NEXT_VARIANT (TYPE_NEXT_VARIANT (t)); + break; + } + } + else + for (tree t = TYPE_MAIN_VARIANT (remove); ; + t = TYPE_NEXT_VARIANT (t)) + if (TYPE_NEXT_VARIANT (t) == remove) + { + TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (remove); + break; + } } } else if (merge_attr) @@ -5616,6 +5636,7 @@ maybe_commonize_var (tree decl) be merged. */ TREE_PUBLIC (decl) = 0; DECL_COMMON (decl) = 0; + DECL_INTERFACE_KNOWN (decl) = 1; const char *msg; if (DECL_INLINE_VAR_P (decl)) msg = G_("sorry: semantics of inline variable " @@ -6134,20 +6155,29 @@ reshape_init_r (tree type, reshape_iter *d, bool first_initializer_p, { if (TREE_CODE (init) == CONSTRUCTOR) { - if (TREE_TYPE (init) && TYPE_PTRMEMFUNC_P (TREE_TYPE (init))) - /* There is no need to reshape pointer-to-member function - initializers, as they are always constructed correctly - by the front end. */ - ; - else if (COMPOUND_LITERAL_P (init)) + tree init_type = TREE_TYPE (init); + if (init_type && TYPE_PTRMEMFUNC_P (init_type)) + /* There is no need to call reshape_init for pointer-to-member + function initializers, as they are always constructed correctly + by the front end. Here we have e.g. {.__pfn=0B, .__delta=0}, + which is missing outermost braces. We should warn below, and + one of the routines below will wrap it in additional { }. */; /* For a nested compound literal, there is no need to reshape since - brace elision is not allowed. Even if we decided to allow it, - we should add a call to reshape_init in finish_compound_literal, - before calling digest_init, so changing this code would still - not be necessary. */ - gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (init)); + we called reshape_init in finish_compound_literal, before calling + digest_init. */ + else if (COMPOUND_LITERAL_P (init) + /* Similarly, a CONSTRUCTOR of the target's type is a + previously digested initializer. */ + || same_type_ignoring_top_level_qualifiers_p (type, + init_type)) + { + ++d->cur; + gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (init)); + return init; + } else { + /* Something that hasn't been reshaped yet. */ ++d->cur; gcc_assert (BRACE_ENCLOSED_INITIALIZER_P (init)); return reshape_init (type, init, complain); @@ -8317,14 +8347,14 @@ expand_static_init (tree decl, tree init) (acquire_name, build_function_type_list (integer_type_node, TREE_TYPE (guard_addr), NULL_TREE), - NULL_TREE, ECF_NOTHROW | ECF_LEAF); + NULL_TREE, ECF_NOTHROW); if (!release_fn || !abort_fn) vfntype = build_function_type_list (void_type_node, TREE_TYPE (guard_addr), NULL_TREE); if (!release_fn) release_fn = push_library_fn (release_name, vfntype, NULL_TREE, - ECF_NOTHROW | ECF_LEAF); + ECF_NOTHROW); if (!abort_fn) abort_fn = push_library_fn (abort_name, vfntype, NULL_TREE, ECF_NOTHROW | ECF_LEAF); @@ -15557,6 +15587,18 @@ begin_destructor_body (void) tree stmt = cp_build_modify_expr (input_location, vtbl_ptr, NOP_EXPR, vtbl, tf_warning_or_error); + /* If the vptr is shared with some virtual nearly empty base, + don't clear it if not in charge, the dtor of the virtual + nearly empty base will do that later. */ + if (CLASSTYPE_VBASECLASSES (current_class_type) + && CLASSTYPE_PRIMARY_BINFO (current_class_type) + && BINFO_VIRTUAL_P + (CLASSTYPE_PRIMARY_BINFO (current_class_type))) + { + stmt = convert_to_void (stmt, ICV_STATEMENT, + tf_warning_or_error); + stmt = build_if_in_charge (stmt); + } finish_decl_cleanup (NULL_TREE, stmt); } else diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 6a67c4e5b33..6977e5c4c91 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1838,6 +1838,17 @@ mark_vtable_entries (tree decl) } } +/* Adjust the TLS model on variable DECL if need be, typically after + the linkage of DECL has been modified. */ + +static void +adjust_var_decl_tls_model (tree decl) +{ + if (CP_DECL_THREAD_LOCAL_P (decl) + && !lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl))) + set_decl_tls_model (decl, decl_default_tls_model (decl)); +} + /* Set DECL up to have the closest approximation of "initialized common" linkage available. */ @@ -1888,6 +1899,9 @@ comdat_linkage (tree decl) if (TREE_PUBLIC (decl)) DECL_COMDAT (decl) = 1; + + if (VAR_P (decl)) + adjust_var_decl_tls_model (decl); } /* For win32 we also want to put explicit instantiations in @@ -1926,6 +1940,8 @@ maybe_make_one_only (tree decl) /* Mark it needed so we don't forget to emit it. */ node->forced_by_abi = true; TREE_USED (decl) = 1; + + adjust_var_decl_tls_model (decl); } } } @@ -3357,7 +3373,7 @@ get_tls_init_fn (tree var) VAR and then returns a reference to VAR. The wrapper function is used in place of VAR everywhere VAR is mentioned. */ -tree +static tree get_tls_wrapper_fn (tree var) { /* Only C++11 TLS vars need this wrapper fn. */ @@ -3409,6 +3425,22 @@ get_tls_wrapper_fn (tree var) return fn; } +/* If EXPR is a thread_local variable that should be wrapped by init + wrapper function, return a call to that function, otherwise return + NULL. */ + +tree +maybe_get_tls_wrapper_call (tree expr) +{ + if (VAR_P (expr) + && !processing_template_decl + && !cp_unevaluated_operand + && CP_DECL_THREAD_LOCAL_P (expr)) + if (tree wrap = get_tls_wrapper_fn (expr)) + return build_cxx_call (wrap, 0, NULL, tf_warning_or_error); + return NULL; +} + /* At EOF, generate the definition for the TLS wrapper function FN: T& var_wrapper() { @@ -4888,11 +4920,6 @@ c_parse_final_cleanups (void) /* Generate RTL for this function now that we know we need it. */ expand_or_defer_fn (decl); - /* If we're compiling -fsyntax-only pretend that this - function has been written out so that we don't try to - expand it again. */ - if (flag_syntax_only) - TREE_ASM_WRITTEN (decl) = 1; reconsider = true; } } @@ -4905,7 +4932,10 @@ c_parse_final_cleanups (void) { if (var_finalized_p (decl) || DECL_REALLY_EXTERN (decl) /* Don't write it out if we haven't seen a definition. */ - || (DECL_IN_AGGR_P (decl) && !DECL_INLINE_VAR_P (decl))) + || (DECL_IN_AGGR_P (decl) && !DECL_INLINE_VAR_P (decl)) + /* Or haven't instantiated it. */ + || (DECL_TEMPLATE_INSTANTIATION (decl) + && !DECL_TEMPLATE_INSTANTIATED (decl))) continue; import_export_decl (decl); /* If this static data member is needed, provide it to the diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 95b8b84f34a..f7895dee64a 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -3286,8 +3286,13 @@ void cxx_print_error_function (diagnostic_context *context, const char *file, diagnostic_info *diagnostic) { + char *prefix; + if (file) + prefix = xstrdup (file); + else + prefix = NULL; lhd_print_error_function (context, file, diagnostic); - pp_set_prefix (context->printer, file); + pp_set_prefix (context->printer, prefix); maybe_print_instantiation_context (context); } @@ -3315,7 +3320,7 @@ cp_print_error_function (diagnostic_context *context, return; if (diagnostic_last_function_changed (context, diagnostic)) { - const char *old_prefix = context->printer->prefix; + char *old_prefix = pp_take_prefix (context->printer); const char *file = LOCATION_FILE (diagnostic_location (diagnostic)); tree abstract_origin = diagnostic_abstract_origin (diagnostic); char *new_prefix = (file && abstract_origin == NULL) diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 2f257247d5e..1a2a1f58819 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -419,6 +419,15 @@ build_value_init_noctor (tree type, tsubst_flags_t complain) if (ftype == error_mark_node) continue; + /* Ignore flexible array members for value initialization. */ + if (TREE_CODE (ftype) == ARRAY_TYPE + && !COMPLETE_TYPE_P (ftype) + && !TYPE_DOMAIN (ftype) + && COMPLETE_TYPE_P (TREE_TYPE (ftype)) + && (next_initializable_field (DECL_CHAIN (field)) + == NULL_TREE)) + continue; + /* We could skip vfields and fields of types with user-defined constructors, but I think that won't improve performance at all; it should be simpler in general just @@ -2269,8 +2278,11 @@ constant_value_1 (tree decl, bool strict_p, bool return_aggregate_cst_ok_p) || TREE_CODE (init) == STRING_CST))) break; /* Don't return a CONSTRUCTOR for a variable with partial run-time - initialization, since it doesn't represent the entire value. */ - if (TREE_CODE (init) == CONSTRUCTOR + initialization, since it doesn't represent the entire value. + Similarly for VECTOR_CSTs created by cp_folding those + CONSTRUCTORs. */ + if ((TREE_CODE (init) == CONSTRUCTOR + || TREE_CODE (init) == VECTOR_CST) && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)) break; /* If the variable has a dynamic initializer, don't use its @@ -4022,7 +4034,7 @@ build_vec_init (tree base, tree maxindex, tree init, tree compound_stmt; int destroy_temps; tree try_block = NULL_TREE; - int num_initialized_elts = 0; + HOST_WIDE_INT num_initialized_elts = 0; bool is_global; tree obase = base; bool xvalue = false; @@ -4457,10 +4469,13 @@ build_vec_init (tree base, tree maxindex, tree init, if (e) { - int max = tree_to_shwi (maxindex)+1; - for (; num_initialized_elts < max; ++num_initialized_elts) + HOST_WIDE_INT last = tree_to_shwi (maxindex); + if (num_initialized_elts <= last) { tree field = size_int (num_initialized_elts); + if (num_initialized_elts != last) + field = build2 (RANGE_EXPR, sizetype, field, + size_int (last)); CONSTRUCTOR_APPEND_ELT (const_vec, field, e); } } diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 4dbda5b5679..744880bd532 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -262,6 +262,9 @@ is_capture_proxy (tree decl) && DECL_HAS_VALUE_EXPR_P (decl) && !DECL_ANON_UNION_VAR_P (decl) && !DECL_DECOMPOSITION_P (decl) + && !(DECL_ARTIFICIAL (decl) + && DECL_LANG_SPECIFIC (decl) + && DECL_OMP_PRIVATIZED_MEMBER (decl)) && LAMBDA_FUNCTION_P (DECL_CONTEXT (decl))); } @@ -609,19 +612,6 @@ add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p, IDENTIFIER_LENGTH (id) + 1); name = get_identifier (buf); - /* If TREE_TYPE isn't set, we're still in the introducer, so check - for duplicates. */ - if (!LAMBDA_EXPR_CLOSURE (lambda)) - { - if (IDENTIFIER_MARKED (name)) - { - pedwarn (input_location, 0, - "already captured %qD in lambda expression", id); - return NULL_TREE; - } - IDENTIFIER_MARKED (name) = true; - } - if (variadic) type = make_pack_expansion (type); @@ -682,8 +672,6 @@ register_capture_members (tree captures) if (PACK_EXPANSION_P (field)) field = PACK_EXPANSION_PATTERN (field); - /* We set this in add_capture to avoid duplicates. */ - IDENTIFIER_MARKED (DECL_NAME (field)) = false; finish_member_declaration (field); } @@ -1115,6 +1103,9 @@ maybe_add_lambda_conv_op (tree type) { tree new_node = copy_node (src); + /* Clear TREE_ADDRESSABLE on thunk arguments. */ + TREE_ADDRESSABLE (new_node) = 0; + if (!fn_args) fn_args = tgt = new_node; else @@ -1471,8 +1462,10 @@ mark_const_cap_r (tree *t, int *walk_subtrees, void *data) { tree decl = DECL_EXPR_DECL (*t); if (is_constant_capture_proxy (decl)) - var = DECL_CAPTURED_VARIABLE (decl); - *walk_subtrees = 0; + { + var = DECL_CAPTURED_VARIABLE (decl); + *walk_subtrees = 0; + } } else if (is_constant_capture_proxy (*t)) var = DECL_CAPTURED_VARIABLE (*t); @@ -1511,8 +1504,8 @@ prune_lambda_captures (tree body) tree cap = *capp; if (tree var = var_to_maybe_prune (cap)) { - tree *use = *const_vars.get (var); - if (TREE_CODE (*use) == DECL_EXPR) + tree **use = const_vars.get (var); + if (use && TREE_CODE (**use) == DECL_EXPR) { /* All uses of this capture were folded away, leaving only the proxy declaration. */ @@ -1527,7 +1520,7 @@ prune_lambda_captures (tree body) *fieldp = DECL_CHAIN (*fieldp); /* And remove the capture proxy declaration. */ - *use = void_node; + **use = void_node; continue; } } diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 2f65709d7d8..5146162404f 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -3047,7 +3047,8 @@ write_expression (tree expr) { scope = TREE_OPERAND (expr, 0); member = TREE_OPERAND (expr, 1); - gcc_assert (!BASELINK_P (member)); + if (BASELINK_P (member)) + member = BASELINK_FUNCTIONS (member); } else { diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 3629aead55a..ad568bbe3af 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1144,11 +1144,11 @@ static tree constructible_expr (tree to, tree from) { tree expr; + cp_unevaluated cp_uneval_guard; if (CLASS_TYPE_P (to)) { tree ctype = to; vec *args = NULL; - cp_unevaluated cp_uneval_guard; if (TREE_CODE (to) != REFERENCE_TYPE) to = cp_build_reference_type (to, /*rval*/false); tree ob = build_stub_object (to); @@ -1201,6 +1201,8 @@ is_xible_helper (enum tree_code code, tree to, tree from, bool trivial) expr = assignable_expr (to, from); else if (trivial && from && TREE_CHAIN (from)) return error_mark_node; // only 0- and 1-argument ctors can be trivial + else if (TREE_CODE (to) == ARRAY_TYPE && !TYPE_DOMAIN (to)) + return error_mark_node; // can't construct an array of unknown bound else expr = constructible_expr (to, from); return expr; @@ -1843,8 +1845,12 @@ maybe_explain_implicit_delete (tree decl) if (!informed) { tree parms = FUNCTION_FIRST_USER_PARMTYPE (decl); - tree parm_type = TREE_VALUE (parms); - bool const_p = CP_TYPE_CONST_P (non_reference (parm_type)); + bool const_p = false; + if (parms) + { + tree parm_type = TREE_VALUE (parms); + const_p = CP_TYPE_CONST_P (non_reference (parm_type)); + } tree raises = NULL_TREE; bool deleted_p = false; tree scope = push_scope (ctype); @@ -2405,7 +2411,7 @@ lazily_declare_fn (special_function_kind sfk, tree type) /* Add it to the class */ bool added = add_method (type, fn, false); - gcc_assert (added); + gcc_assert (added || errorcount); /* Add it to TYPE_FIELDS. */ if (sfk == sfk_destructor diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index f32cd148f35..7b82f90c835 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -560,11 +560,14 @@ name_lookup::search_namespace (tree scope) /* Look in exactly namespace. */ bool found = search_namespace_only (scope); - - /* Recursively look in its inline children. */ - if (vec *inlinees = DECL_NAMESPACE_INLINEES (scope)) - for (unsigned ix = inlinees->length (); ix--;) - found |= search_namespace ((*inlinees)[ix]); + + /* Don't look into inline children, if we're looking for an + anonymous name -- it must be in the current scope, if anywhere. */ + if (name) + /* Recursively look in its inline children. */ + if (vec *inlinees = DECL_NAMESPACE_INLINEES (scope)) + for (unsigned ix = inlinees->length (); ix--;) + found |= search_namespace ((*inlinees)[ix]); if (found) mark_found (scope); @@ -904,7 +907,7 @@ name_lookup::adl_expr (tree expr) if (TREE_TYPE (expr) != unknown_type_node) { - adl_type (TREE_TYPE (expr)); + adl_type (unlowered_expr_type (expr)); return; } @@ -1237,17 +1240,6 @@ get_class_binding_direct (tree klass, tree name, int type_or_fns) } else if (STAT_HACK_P (val)) val = STAT_DECL (val); - - if (val && TREE_CODE (val) == OVERLOAD - && TREE_CODE (OVL_FUNCTION (val)) == USING_DECL) - { - /* An overload with a dependent USING_DECL. Does the caller - want the USING_DECL or the functions? */ - if (type_or_fns < 0) - val = OVL_CHAIN (val); - else - val = OVL_FUNCTION (val); - } } else { @@ -2737,6 +2729,13 @@ check_local_shadow (tree decl) && (same_type_p (TREE_TYPE (old), TREE_TYPE (decl)) || (!dependent_type_p (TREE_TYPE (decl)) && !dependent_type_p (TREE_TYPE (old)) + /* If the new decl uses auto, we don't yet know + its type (the old type cannot be using auto + at this point, without also being + dependent). This is an indication we're + (now) doing the shadow checking too + early. */ + && !type_uses_auto (TREE_TYPE (decl)) && can_convert (TREE_TYPE (old), TREE_TYPE (decl), tf_none)))) warning_code = OPT_Wshadow_compatible_local; @@ -5510,7 +5509,7 @@ get_std_name_hint (const char *name) {"bitset", "", cxx11}, /* . */ {"complex", "", cxx98}, - {"complex_literals", "", cxx98}, + {"complex_literals", "", cxx14}, /* . */ {"condition_variable", "", cxx11}, {"condition_variable_any", "", cxx11}, @@ -5572,7 +5571,7 @@ get_std_name_hint (const char *name) {"multimap", "", cxx98}, /* . */ {"make_shared", "", cxx11}, - {"make_unique", "", cxx11}, + {"make_unique", "", cxx14}, {"shared_ptr", "", cxx11}, {"unique_ptr", "", cxx11}, {"weak_ptr", "", cxx11}, @@ -5864,10 +5863,21 @@ consider_binding_level (tree name, best_match &bm, && DECL_ANTICIPATED (d)) continue; + /* Skip compiler-generated variables (e.g. __for_begin/__for_end + within range for). */ + if (TREE_CODE (d) == VAR_DECL + && DECL_ARTIFICIAL (d)) + continue; + tree suggestion = DECL_NAME (d); if (!suggestion) continue; + /* Don't suggest names that are for anonymous aggregate types, as + they are an implementation detail generated by the compiler. */ + if (anon_aggrname_p (suggestion)) + continue; + const char *suggestion_str = IDENTIFIER_POINTER (suggestion); /* Ignore internal names with spaces in them. */ diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index fdb1650939e..df6421f9196 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -46,6 +46,8 @@ update_cloned_parm (tree parm, tree cloned_parm, bool first) /* We may have taken its address. */ TREE_ADDRESSABLE (cloned_parm) = TREE_ADDRESSABLE (parm); + DECL_BY_REFERENCE (cloned_parm) = DECL_BY_REFERENCE (parm); + /* The definition might have different constness. */ TREE_READONLY (cloned_parm) = TREE_READONLY (parm); @@ -59,6 +61,25 @@ update_cloned_parm (tree parm, tree cloned_parm, bool first) DECL_GIMPLE_REG_P (cloned_parm) = DECL_GIMPLE_REG_P (parm); } +/* Like copy_decl_no_change, but handle DECL_OMP_PRIVATIZED_MEMBER + properly. */ + +static tree +cxx_copy_decl (tree decl, copy_body_data *id) +{ + tree copy = copy_decl_no_change (decl, id); + if (VAR_P (decl) + && DECL_HAS_VALUE_EXPR_P (decl) + && DECL_ARTIFICIAL (decl) + && DECL_LANG_SPECIFIC (decl) + && DECL_OMP_PRIVATIZED_MEMBER (decl)) + { + tree expr = DECL_VALUE_EXPR (copy); + walk_tree (&expr, copy_tree_body_r, id, NULL); + SET_DECL_VALUE_EXPR (copy, expr); + } + return copy; +} /* FN is a function in High GIMPLE form that has a complete body and no CFG. CLONE is a function whose body is to be set to a copy of FN, @@ -78,7 +99,7 @@ clone_body (tree clone, tree fn, void *arg_map) id.src_cfun = DECL_STRUCT_FUNCTION (fn); id.decl_map = static_cast *> (arg_map); - id.copy_decl = copy_decl_no_change; + id.copy_decl = cxx_copy_decl; id.transform_call_graph_edges = CB_CGE_DUPLICATE; id.transform_new_cfg = true; id.transform_return_to_modify = false; @@ -386,6 +407,8 @@ maybe_thunk_body (tree fn, bool force) gcc_assert (clone_parm); DECL_ABSTRACT_ORIGIN (clone_parm) = NULL; args[parmno] = clone_parm; + /* Clear TREE_ADDRESSABLE on thunk arguments. */ + TREE_ADDRESSABLE (clone_parm) = 0; clone_parm = TREE_CHAIN (clone_parm); } if (fn_parm_typelist) diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 715faea2b2a..d17a212a18f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7150,14 +7150,19 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, else if (!args->is_empty () && is_overloaded_fn (postfix_expression)) { + /* We only need to look at the first function, + because all the fns share the attribute we're + concerned with (all member fns or all local + fns). */ tree fn = get_first_fn (postfix_expression); fn = STRIP_TEMPLATE (fn); /* Do not do argument dependent lookup if regular lookup finds a member function or a block-scope function declaration. [basic.lookup.argdep]/3 */ - if (!DECL_FUNCTION_MEMBER_P (fn) - && !DECL_LOCAL_FUNCTION_P (fn)) + if (!((TREE_CODE (fn) == USING_DECL && DECL_DEPENDENT_P (fn)) + || DECL_FUNCTION_MEMBER_P (fn) + || DECL_LOCAL_FUNCTION_P (fn))) { koenig_p = true; if (!any_type_dependent_arguments_p (args)) @@ -10261,6 +10266,11 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr) first = false; } + hash_set *ids = NULL; +#if GCC_VERSION >= 8000 + char ids_buf[sizeof (hash_set) + __alignof__ (hash_set) - 1]; +#endif + tree first_capture_id = NULL_TREE; while (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_SQUARE)) { cp_token* capture_token; @@ -10296,11 +10306,14 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr) pedwarn (loc, 0, "explicit by-copy capture of % redundant " "with by-copy capture default"); cp_lexer_consume_token (parser->lexer); - add_capture (lambda_expr, - /*id=*/this_identifier, - /*initializer=*/finish_this_expr (), - /*by_reference_p=*/true, - explicit_init_p); + if (LAMBDA_EXPR_THIS_CAPTURE (lambda_expr)) + pedwarn (input_location, 0, + "already captured %qD in lambda expression", + this_identifier); + else + add_capture (lambda_expr, /*id=*/this_identifier, + /*initializer=*/finish_this_expr (), + /*by_reference_p=*/true, explicit_init_p); continue; } @@ -10314,11 +10327,14 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr) "-std=c++17 or -std=gnu++17"); cp_lexer_consume_token (parser->lexer); cp_lexer_consume_token (parser->lexer); - add_capture (lambda_expr, - /*id=*/this_identifier, - /*initializer=*/finish_this_expr (), - /*by_reference_p=*/false, - explicit_init_p); + if (LAMBDA_EXPR_THIS_CAPTURE (lambda_expr)) + pedwarn (input_location, 0, + "already captured %qD in lambda expression", + this_identifier); + else + add_capture (lambda_expr, /*id=*/this_identifier, + /*initializer=*/finish_this_expr (), + /*by_reference_p=*/false, explicit_init_p); continue; } @@ -10440,11 +10456,35 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr) "default", capture_id); } - add_capture (lambda_expr, - capture_id, - capture_init_expr, - /*by_reference_p=*/capture_kind == BY_REFERENCE, - explicit_init_p); + /* Check for duplicates. + Optimize for the zero or one explicit captures cases and only create + the hash_set after adding second capture. */ + bool found = false; + if (ids && ids->elements ()) + found = ids->add (capture_id); + else if (first_capture_id == NULL_TREE) + first_capture_id = capture_id; + else if (capture_id == first_capture_id) + found = true; + else + { +#if GCC_VERSION >= 8000 + ids = new (ids_buf + + (-(uintptr_t) ids_buf + & (__alignof__ (hash_set ) - 1))) hash_set ; +#else + ids = new hash_set ; +#endif + ids->add (first_capture_id); + ids->add (capture_id); + } + if (found) + pedwarn (input_location, 0, + "already captured %qD in lambda expression", capture_id); + else + add_capture (lambda_expr, capture_id, capture_init_expr, + /*by_reference_p=*/capture_kind == BY_REFERENCE, + explicit_init_p); /* If there is any qualification still in effect, clear it now; we will be starting fresh with the next capture. */ @@ -10453,6 +10493,13 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr) parser->object_scope = NULL_TREE; } + if (ids) +#if GCC_VERSION >= 8000 + ids->~hash_set (); +#else + delete ids; +#endif + cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE); } @@ -10620,6 +10667,7 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr) DECL_ARTIFICIAL (fco) = 1; /* Give the object parameter a different name. */ DECL_NAME (DECL_ARGUMENTS (fco)) = get_identifier ("__closure"); + DECL_LAMBDA_FUNCTION (fco) = 1; if (return_type) TYPE_HAS_LATE_RETURN_TYPE (TREE_TYPE (fco)) = 1; } @@ -13504,6 +13552,15 @@ cp_parser_decl_specifier_seq (cp_parser* parser, case RID_CONCEPT: ds = ds_concept; cp_lexer_consume_token (parser->lexer); + /* In C++20 a concept definition is just 'concept name = expr;' + Support that syntax by pretending we've seen 'bool'. */ + if (cp_lexer_next_token_is (parser->lexer, CPP_NAME) + && cp_lexer_nth_token_is (parser->lexer, 2, CPP_EQ)) + { + cp_parser_set_decl_spec_type (decl_specs, boolean_type_node, + token, /*type_definition*/false); + decl_specs->any_type_specifiers_p = true; + } break; /* function-specifier: @@ -18767,7 +18824,8 @@ cp_parser_using_declaration (cp_parser* parser, /*is_declaration=*/true); if (!qscope) qscope = global_namespace; - else if (UNSCOPED_ENUM_P (qscope)) + else if (UNSCOPED_ENUM_P (qscope) + && !TYPE_FUNCTION_SCOPE_P (qscope)) qscope = CP_TYPE_CONTEXT (qscope); if (access_declaration_p && cp_parser_error_occurred (parser)) @@ -19061,22 +19119,35 @@ cp_parser_using_directive (cp_parser* parser) /* Parse an asm-definition. + asm-qualifier: + volatile + inline + goto + + asm-qualifier-list: + asm-qualifier + asm-qualifier-list asm-qualifier + asm-definition: asm ( string-literal ) ; GNU Extension: asm-definition: - asm volatile [opt] ( string-literal ) ; - asm volatile [opt] ( string-literal : asm-operand-list [opt] ) ; - asm volatile [opt] ( string-literal : asm-operand-list [opt] - : asm-operand-list [opt] ) ; - asm volatile [opt] ( string-literal : asm-operand-list [opt] - : asm-operand-list [opt] + asm asm-qualifier-list [opt] ( string-literal ) ; + asm asm-qualifier-list [opt] ( string-literal : asm-operand-list [opt] ) ; + asm asm-qualifier-list [opt] ( string-literal : asm-operand-list [opt] + : asm-operand-list [opt] ) ; + asm asm-qualifier-list [opt] ( string-literal : asm-operand-list [opt] + : asm-operand-list [opt] : asm-clobber-list [opt] ) ; - asm volatile [opt] goto ( string-literal : : asm-operand-list [opt] - : asm-clobber-list [opt] - : asm-goto-list ) ; */ + asm asm-qualifier-list [opt] ( string-literal : : asm-operand-list [opt] + : asm-clobber-list [opt] + : asm-goto-list ) ; + + The form with asm-goto-list is valid if and only if the asm-qualifier-list + contains goto, and is the only allowed form in that case. No duplicates are + allowed in an asm-qualifier-list. */ static void cp_parser_asm_definition (cp_parser* parser) @@ -19087,11 +19158,9 @@ cp_parser_asm_definition (cp_parser* parser) tree clobbers = NULL_TREE; tree labels = NULL_TREE; tree asm_stmt; - bool volatile_p = false; bool extended_p = false; bool invalid_inputs_p = false; bool invalid_outputs_p = false; - bool goto_p = false; required_token missing = RT_NONE; /* Look for the `asm' keyword. */ @@ -19104,24 +19173,78 @@ cp_parser_asm_definition (cp_parser* parser) cp_function_chain->invalid_constexpr = true; } - /* See if the next token is `volatile'. */ - if (cp_parser_allow_gnu_extensions_p (parser) - && cp_lexer_next_token_is_keyword (parser->lexer, RID_VOLATILE)) - { - /* Remember that we saw the `volatile' keyword. */ - volatile_p = true; - /* Consume the token. */ - cp_lexer_consume_token (parser->lexer); - } - if (cp_parser_allow_gnu_extensions_p (parser) - && parser->in_function_body - && cp_lexer_next_token_is_keyword (parser->lexer, RID_GOTO)) + /* Handle the asm-qualifier-list. */ + location_t volatile_loc = UNKNOWN_LOCATION; + location_t inline_loc = UNKNOWN_LOCATION; + location_t goto_loc = UNKNOWN_LOCATION; + location_t first_loc = UNKNOWN_LOCATION; + + if (cp_parser_allow_gnu_extensions_p (parser)) + for (;;) + { + cp_token *token = cp_lexer_peek_token (parser->lexer); + location_t loc = token->location; + switch (cp_lexer_peek_token (parser->lexer)->keyword) + { + case RID_VOLATILE: + if (volatile_loc) + { + error_at (loc, "duplicate asm qualifier %qT", token->u.value); + inform (volatile_loc, "first seen here"); + } + else + volatile_loc = loc; + cp_lexer_consume_token (parser->lexer); + continue; + + case RID_INLINE: + if (inline_loc) + { + error_at (loc, "duplicate asm qualifier %qT", token->u.value); + inform (inline_loc, "first seen here"); + } + else + inline_loc = loc; + if (!first_loc) + first_loc = loc; + cp_lexer_consume_token (parser->lexer); + continue; + + case RID_GOTO: + if (goto_loc) + { + error_at (loc, "duplicate asm qualifier %qT", token->u.value); + inform (goto_loc, "first seen here"); + } + else + goto_loc = loc; + if (!first_loc) + first_loc = loc; + cp_lexer_consume_token (parser->lexer); + continue; + + case RID_CONST: + case RID_RESTRICT: + error_at (loc, "%qT is not an asm qualifier", token->u.value); + cp_lexer_consume_token (parser->lexer); + continue; + + default: + break; + } + break; + } + + bool volatile_p = (volatile_loc != UNKNOWN_LOCATION); + bool inline_p = (inline_loc != UNKNOWN_LOCATION); + bool goto_p = (goto_loc != UNKNOWN_LOCATION); + + if (!parser->in_function_body && (inline_p || goto_p)) { - /* Remember that we saw the `goto' keyword. */ - goto_p = true; - /* Consume the token. */ - cp_lexer_consume_token (parser->lexer); + error_at (first_loc, "asm qualifier outside of function body"); + inline_p = goto_p = false; } + /* Look for the opening `('. */ if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN)) return; @@ -19213,8 +19336,7 @@ cp_parser_asm_definition (cp_parser* parser) CPP_CLOSE_PAREN)) clobbers = cp_parser_asm_clobber_list (parser); } - else if (goto_p - && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE)) + else if (goto_p && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE)) /* The labels are coming next. */ labels_p = true; @@ -19248,7 +19370,7 @@ cp_parser_asm_definition (cp_parser* parser) if (parser->in_function_body) { asm_stmt = finish_asm_stmt (volatile_p, string, outputs, - inputs, clobbers, labels); + inputs, clobbers, labels, inline_p); /* If the extended syntax was not used, mark the ASM_EXPR. */ if (!extended_p) { @@ -21598,7 +21720,8 @@ cp_parser_parameter_declaration (cp_parser *parser, parameter was introduced during cp_parser_parameter_declaration, change any implicit parameters introduced into packs. */ if (parser->implicit_template_parms - && (token->type == CPP_ELLIPSIS + && ((token->type == CPP_ELLIPSIS + && declarator_can_be_parameter_pack (declarator)) || (declarator && declarator->parameter_pack_p))) { int latest_template_parm_idx = TREE_VEC_LENGTH @@ -22497,7 +22620,7 @@ cp_parser_class_specifier_1 (cp_parser* parser) cp_ensure_no_oacc_routine (parser); /* Issue an error message if type-definitions are forbidden here. */ - cp_parser_check_type_definition (parser); + bool type_definition_ok_p = cp_parser_check_type_definition (parser); /* Remember that we are defining one more class. */ ++parser->num_classes_being_defined; /* Inside the class, surrounding template-parameter-lists do not @@ -22692,7 +22815,7 @@ cp_parser_class_specifier_1 (cp_parser* parser) cp_default_arg_entry *e; tree save_ccp, save_ccr; - if (any_erroneous_template_args_p (type)) + if (!type_definition_ok_p || any_erroneous_template_args_p (type)) { /* Skip default arguments, NSDMIs, etc, in order to improve error recovery (c++/71169, c++/71832). */ @@ -25215,14 +25338,19 @@ cp_parser_std_attribute (cp_parser *parser, tree attr_ns) return error_mark_node; } + attr_ns = canonicalize_attr_name (attr_ns); attr_id = canonicalize_attr_name (attr_id); attribute = build_tree_list (build_tree_list (attr_ns, attr_id), NULL_TREE); token = cp_lexer_peek_token (parser->lexer); } else if (attr_ns) - attribute = build_tree_list (build_tree_list (attr_ns, attr_id), - NULL_TREE); + { + attr_ns = canonicalize_attr_name (attr_ns); + attr_id = canonicalize_attr_name (attr_id); + attribute = build_tree_list (build_tree_list (attr_ns, attr_id), + NULL_TREE); + } else { attr_id = canonicalize_attr_name (attr_id); @@ -25414,7 +25542,7 @@ cp_parser_std_attribute_spec (cp_parser *parser) || !cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE)) cp_parser_skip_to_end_of_statement (parser); else - /* Warn about parsing c++11 attribute in non-c++1 mode, only + /* Warn about parsing c++11 attribute in non-c++11 mode, only when we are sure that we have actually parsed them. */ maybe_warn_cpp0x (CPP0X_ATTRIBUTES); } @@ -33534,8 +33662,10 @@ cp_parser_omp_clause_dist_schedule (cp_parser *parser, tree list, else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN)) goto resync_fail; - check_no_duplicate_clause (list, OMP_CLAUSE_DIST_SCHEDULE, "dist_schedule", - location); + /* check_no_duplicate_clause (list, OMP_CLAUSE_DIST_SCHEDULE, + "dist_schedule", location); */ + if (omp_find_clause (list, OMP_CLAUSE_DIST_SCHEDULE)) + warning_at (location, 0, "too many %qs clauses", "dist_schedule"); OMP_CLAUSE_CHAIN (c) = list; return c; @@ -38615,7 +38745,10 @@ cp_parser_initial_pragma (cp_token *first_token) cp_lexer_get_preprocessor_token (NULL, first_token); if (cp_parser_pragma_kind (first_token) != PRAGMA_GCC_PCH_PREPROCESS) - return; + { + c_common_no_more_pch (); + return; + } cp_lexer_get_preprocessor_token (NULL, first_token); if (first_token->type == CPP_STRING) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d017c66966d..db27ad28f3b 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11732,8 +11732,6 @@ fold_expression (tree t, tree left, tree right, tsubst_flags_t complain) { case COMPOUND_EXPR: return build_x_compound_expr (input_location, left, right, complain); - case DOTSTAR_EXPR: - return build_m_component_ref (left, right, complain); default: return build_x_binary_op (input_location, code, left, TREE_CODE (left), @@ -13023,6 +13021,11 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain, set_constraints (r, ci); } + if (DECL_FRIEND_P (t) && DECL_FRIEND_CONTEXT (t)) + SET_DECL_FRIEND_CONTEXT (r, + tsubst (DECL_FRIEND_CONTEXT (t), + args, complain, in_decl)); + /* Set up the DECL_TEMPLATE_INFO for R. There's no need to do this in the special friend case mentioned above where GEN_TMPL is NULL. */ @@ -13084,11 +13087,6 @@ tsubst_function_decl (tree t, tree args, tsubst_flags_t complain, && !grok_op_properties (r, /*complain=*/true)) return error_mark_node; - if (DECL_FRIEND_P (t) && DECL_FRIEND_CONTEXT (t)) - SET_DECL_FRIEND_CONTEXT (r, - tsubst (DECL_FRIEND_CONTEXT (t), - args, complain, in_decl)); - /* Possibly limit visibility based on template args. */ DECL_VISIBILITY (r) = VISIBILITY_DEFAULT; if (DECL_VISIBILITY_SPECIFIED (t)) @@ -14506,6 +14504,15 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) && !PLACEHOLDER_TYPE_CONSTRAINTS (r)) /* Break infinite recursion when substituting the constraints of a constrained placeholder. */; + else if (TREE_CODE (t) == TEMPLATE_TYPE_PARM + && !PLACEHOLDER_TYPE_CONSTRAINTS (t) + && !CLASS_PLACEHOLDER_TEMPLATE (t) + && (arg = TEMPLATE_TYPE_PARM_INDEX (t), + r = TEMPLATE_PARM_DESCENDANTS (arg)) + && (TEMPLATE_PARM_LEVEL (r) + == TEMPLATE_PARM_LEVEL (arg) - levels)) + /* Cache the simple case of lowering a type parameter. */ + r = TREE_TYPE (r); else { r = copy_type (t); @@ -16734,7 +16741,17 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, else { int const_init = false; + unsigned int cnt = 0; + tree first = NULL_TREE, ndecl = error_mark_node; maybe_push_decl (decl); + + if (VAR_P (decl) + && DECL_DECOMPOSITION_P (decl) + && TREE_TYPE (pattern_decl) != error_mark_node) + ndecl = tsubst_decomp_names (decl, pattern_decl, args, + complain, in_decl, &first, + &cnt); + if (VAR_P (decl) && DECL_PRETTY_FUNCTION_P (decl)) { @@ -16750,23 +16767,14 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, if (VAR_P (decl)) const_init = (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (pattern_decl)); - if (VAR_P (decl) - && DECL_DECOMPOSITION_P (decl) - && TREE_TYPE (pattern_decl) != error_mark_node) - { - unsigned int cnt; - tree first; - tree ndecl - = tsubst_decomp_names (decl, pattern_decl, args, - complain, in_decl, &first, &cnt); - if (ndecl != error_mark_node) - cp_maybe_mangle_decomp (ndecl, first, cnt); - cp_finish_decl (decl, init, const_init, NULL_TREE, 0); - if (ndecl != error_mark_node) - cp_finish_decomp (ndecl, first, cnt); - } - else - cp_finish_decl (decl, init, const_init, NULL_TREE, 0); + + if (ndecl != error_mark_node) + cp_maybe_mangle_decomp (ndecl, first, cnt); + + cp_finish_decl (decl, init, const_init, NULL_TREE, 0); + + if (ndecl != error_mark_node) + cp_finish_decomp (ndecl, first, cnt); } } } @@ -16816,6 +16824,8 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, RANGE_FOR_IVDEP (stmt) = RANGE_FOR_IVDEP (t); RANGE_FOR_UNROLL (stmt) = RANGE_FOR_UNROLL (t); finish_range_for_decl (stmt, decl, expr); + if (decomp_first && decl != error_mark_node) + cp_finish_decomp (decl, decomp_first, decomp_cnt); } else { @@ -16987,7 +16997,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl, tree labels = tsubst_copy_asm_operands (ASM_LABELS (t), args, complain, in_decl); tmp = finish_asm_stmt (ASM_VOLATILE_P (t), string, outputs, inputs, - clobbers, labels); + clobbers, labels, ASM_INLINE_P (t)); tree asm_expr = tmp; if (TREE_CODE (asm_expr) == CLEANUP_POINT_EXPR) asm_expr = TREE_OPERAND (asm_expr, 0); @@ -18516,10 +18526,6 @@ tsubst_copy_and_build (tree t, CALL_EXPR_REVERSE_ARGS (function) = rev; if (thk) { - if (TREE_CODE (function) == CALL_EXPR) - CALL_FROM_THUNK_P (function) = true; - else - AGGR_INIT_FROM_THUNK_P (function) = true; /* The thunk location is not interesting. */ SET_EXPR_LOCATION (function, UNKNOWN_LOCATION); } @@ -18789,6 +18795,12 @@ tsubst_copy_and_build (tree t, looked up by digest_init. */ process_index_p = !(type && MAYBE_CLASS_TYPE_P (type)); + if (null_member_pointer_value_p (t)) + { + gcc_assert (same_type_p (type, TREE_TYPE (t))); + RETURN (t); + } + n = vec_safe_copy (CONSTRUCTOR_ELTS (t)); newlen = vec_safe_length (n); FOR_EACH_VEC_SAFE_ELT (n, idx, ce) @@ -18882,17 +18894,10 @@ tsubst_copy_and_build (tree t, { tree r = tsubst_copy (t, args, complain, in_decl); /* ??? We're doing a subset of finish_id_expression here. */ - if (VAR_P (r) - && !processing_template_decl - && !cp_unevaluated_operand - && (TREE_STATIC (r) || DECL_EXTERNAL (r)) - && CP_DECL_THREAD_LOCAL_P (r)) - { - if (tree wrap = get_tls_wrapper_fn (r)) - /* Replace an evaluated use of the thread_local variable with - a call to its wrapper. */ - r = build_cxx_call (wrap, 0, NULL, tf_warning_or_error); - } + if (tree wrap = maybe_get_tls_wrapper_call (r)) + /* Replace an evaluated use of the thread_local variable with + a call to its wrapper. */ + r = wrap; else if (outer_automatic_var_p (r)) r = process_outer_var_ref (r, complain); @@ -18993,6 +18998,11 @@ tsubst_copy_and_build (tree t, case REQUIRES_EXPR: RETURN (tsubst_requires_expr (t, args, complain, in_decl)); + case RANGE_EXPR: + /* No need to substitute further, a RANGE_EXPR will always be built + with constant operands. */ + RETURN (t); + case NON_LVALUE_EXPR: case VIEW_CONVERT_EXPR: /* We should only see these for location wrapper nodes, or within @@ -25985,8 +25995,10 @@ make_auto (void) tree make_template_placeholder (tree tmpl) { - tree t = make_auto_1 (DECL_NAME (tmpl), true); + tree t = make_auto_1 (DECL_NAME (tmpl), false); CLASS_PLACEHOLDER_TEMPLATE (t) = tmpl; + /* Our canonical type depends on the placeholder. */ + TYPE_CANONICAL (t) = canonical_type_parameter (t); return t; } @@ -26461,6 +26473,8 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain) targs = template_parms_to_args (tparms); fparms = tsubst_arg_types (fparms, tsubst_args, NULL_TREE, complain, ctor); + if (fparms == error_mark_node) + ok = false; fargs = tsubst (fargs, tsubst_args, complain, ctor); if (ci) ci = tsubst_constraint_info (ci, tsubst_args, complain, ctor); @@ -26519,6 +26533,9 @@ do_class_deduction (tree ptype, tree tmpl, tree init, int flags, error ("non-class template %qT used without template arguments", tmpl); return error_mark_node; } + if (init && TREE_TYPE (init) == ptype) + /* Using the template parm as its own argument. */ + return ptype; tree type = TREE_TYPE (tmpl); @@ -26586,7 +26603,7 @@ do_class_deduction (tree ptype, tree tmpl, tree init, int flags, tree outer_args = NULL_TREE; if (DECL_CLASS_SCOPE_P (tmpl) - && CLASSTYPE_TEMPLATE_INFO (DECL_CONTEXT (tmpl))) + && CLASSTYPE_TEMPLATE_INSTANTIATION (DECL_CONTEXT (tmpl))) { outer_args = CLASSTYPE_TI_ARGS (DECL_CONTEXT (tmpl)); type = TREE_TYPE (most_general_template (tmpl)); diff --git a/gcc/cp/search.c b/gcc/cp/search.c index ca04dca02fb..d4214d4198a 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1227,9 +1227,16 @@ lookup_field_fuzzy_info::fuzzy_lookup_field (tree type) for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) { - if (!m_want_type_p || DECL_DECLARES_TYPE_P (field)) - if (DECL_NAME (field)) - m_candidates.safe_push (DECL_NAME (field)); + if (m_want_type_p && !DECL_DECLARES_TYPE_P (field)) + continue; + + if (!DECL_NAME (field)) + continue; + + if (is_lambda_ignored_entity (field)) + continue; + + m_candidates.safe_push (DECL_NAME (field)); } } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 4abdc45dffc..797fb309902 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -645,10 +645,13 @@ maybe_convert_cond (tree cond) return NULL_TREE; /* Wait until we instantiate templates before doing conversion. */ - if (processing_template_decl) + if (processing_template_decl + && (type_dependent_expression_p (cond) + /* For GCC 8 only convert non-dependent condition in a lambda. */ + || !current_lambda_expr ())) return cond; - if (warn_sequence_point) + if (warn_sequence_point && !processing_template_decl) verify_sequence_points (cond); /* Do the conversion. */ @@ -1461,11 +1464,11 @@ finish_compound_stmt (tree stmt) /* Finish an asm-statement, whose components are a STRING, some OUTPUT_OPERANDS, some INPUT_OPERANDS, some CLOBBERS and some LABELS. Also note whether the asm-statement should be - considered volatile. */ + considered volatile, and whether it is asm inline. */ tree finish_asm_stmt (int volatile_p, tree string, tree output_operands, - tree input_operands, tree clobbers, tree labels) + tree input_operands, tree clobbers, tree labels, bool inline_p) { tree r; tree t; @@ -1619,6 +1622,7 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands, output_operands, input_operands, clobbers, labels); ASM_VOLATILE_P (r) = volatile_p || noutputs == 0; + ASM_INLINE_P (r) = inline_p; r = maybe_cleanup_point_expr_void (r); return add_stmt (r); } @@ -2098,6 +2102,14 @@ finish_qualified_id_expr (tree qualifying_class, expr = build_offset_ref (qualifying_class, expr, /*address_p=*/false, complain); } + else if (!template_p + && TREE_CODE (expr) == TEMPLATE_DECL + && !DECL_FUNCTION_TEMPLATE_P (expr)) + { + if (complain & tf_error) + error ("%qE missing template arguments", expr); + return error_mark_node; + } else { /* In a template, return a SCOPE_REF for most qualified-ids @@ -2113,6 +2125,8 @@ finish_qualified_id_expr (tree qualifying_class, expr = build_qualified_name (TREE_TYPE (expr), qualifying_class, expr, template_p); + else if (tree wrap = maybe_get_tls_wrapper_call (expr)) + expr = wrap; expr = convert_from_reference (expr); } @@ -2704,13 +2718,14 @@ finish_unary_op_expr (location_t op_loc, enum tree_code code, cp_expr expr, /* TODO: build_x_unary_op doesn't always honor the location. */ result.set_location (combined_loc); - tree result_ovl, expr_ovl; + if (result == error_mark_node) + return result; if (!(complain & tf_warning)) return result; - result_ovl = result; - expr_ovl = expr; + tree result_ovl = result; + tree expr_ovl = expr; if (!processing_template_decl) expr_ovl = cp_fully_fold (expr_ovl); @@ -3413,10 +3428,9 @@ process_outer_var_ref (tree decl, tsubst_flags_t complain, bool odr_use) } /* In a lambda within a template, wait until instantiation - time to implicitly capture. */ + time to implicitly capture a dependent type. */ if (context == containing_function - && DECL_TEMPLATE_INFO (containing_function) - && uses_template_parms (DECL_TI_ARGS (containing_function))) + && dependent_type_p (TREE_TYPE (decl))) return decl; if (lambda_expr && VAR_P (decl) @@ -3708,18 +3722,10 @@ finish_id_expression (tree id_expression, *non_integral_constant_expression_p = true; } - tree wrap; - if (VAR_P (decl) - && !cp_unevaluated_operand - && !processing_template_decl - && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) - && CP_DECL_THREAD_LOCAL_P (decl) - && (wrap = get_tls_wrapper_fn (decl))) - { - /* Replace an evaluated use of the thread_local variable with - a call to its wrapper. */ - decl = build_cxx_call (wrap, 0, NULL, tf_warning_or_error); - } + if (tree wrap = maybe_get_tls_wrapper_call (decl)) + /* Replace an evaluated use of the thread_local variable with + a call to its wrapper. */ + decl = wrap; else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR && !dependent_p && variable_template_p (TREE_OPERAND (decl, 0))) @@ -3783,9 +3789,10 @@ finish_id_expression (tree id_expression, return error_mark_node; if (!template_arg_p - && TREE_CODE (first_fn) == FUNCTION_DECL - && DECL_FUNCTION_MEMBER_P (first_fn) - && !shared_member_p (decl)) + && (TREE_CODE (first_fn) == USING_DECL + || (TREE_CODE (first_fn) == FUNCTION_DECL + && DECL_FUNCTION_MEMBER_P (first_fn) + && !shared_member_p (decl)))) { /* A set of member functions. */ decl = maybe_dummy_object (DECL_CONTEXT (first_fn), 0); @@ -4263,7 +4270,12 @@ expand_or_defer_fn_1 (tree fn) /* There's no reason to do any of the work here if we're only doing semantic analysis; this code just generates RTL. */ if (flag_syntax_only) - return false; + { + /* Pretend that this function has been written out so that we don't try + to expand it again. */ + TREE_ASM_WRITTEN (fn) = 1; + return false; + } return true; } @@ -7303,7 +7315,8 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) t = require_complete_type (t); if (t == error_mark_node) remove = true; - else if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE + else if (!processing_template_decl + && TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE && !complete_type_or_else (TREE_TYPE (TREE_TYPE (t)), t)) remove = true; } @@ -8450,6 +8463,11 @@ finish_omp_atomic (enum tree_code code, enum tree_code opcode, tree lhs, stmt = build2 (OMP_ATOMIC, void_type_node, integer_zero_node, stmt); OMP_ATOMIC_SEQ_CST (stmt) = seq_cst; } + + /* Avoid -Wunused-value warnings here, the whole construct has side-effects + and even if it might be wrapped from fold-const.c or c-omp.c wrapped + in some tree that appears to be unused, the value is not unused. */ + warning_sentinel w (warn_unused_value); finish_expr_stmt (stmt); } @@ -8516,10 +8534,13 @@ finish_omp_cancel (tree clauses) tree ifc = omp_find_clause (clauses, OMP_CLAUSE_IF); if (ifc != NULL_TREE) { - tree type = TREE_TYPE (OMP_CLAUSE_IF_EXPR (ifc)); - ifc = fold_build2_loc (OMP_CLAUSE_LOCATION (ifc), NE_EXPR, - boolean_type_node, OMP_CLAUSE_IF_EXPR (ifc), - build_zero_cst (type)); + if (!processing_template_decl) + ifc = maybe_convert_cond (OMP_CLAUSE_IF_EXPR (ifc)); + else + ifc = build_x_binary_op (OMP_CLAUSE_LOCATION (ifc), NE_EXPR, + OMP_CLAUSE_IF_EXPR (ifc), ERROR_MARK, + integer_zero_node, ERROR_MARK, + NULL, tf_warning_or_error); } else ifc = boolean_true_node; diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index f850640222d..76b20ce659e 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -4956,6 +4956,14 @@ cp_walk_subtrees (tree *tp, int *walk_subtrees_p, walk_tree_fn func, } break; + case LAMBDA_EXPR: + /* Don't walk into the body of the lambda, but the capture initializers + are part of the enclosing context. */ + for (tree cap = LAMBDA_EXPR_CAPTURE_LIST (*tp); cap; + cap = TREE_CHAIN (cap)) + WALK_SUBTREE (TREE_VALUE (cap)); + break; + default: return NULL_TREE; } diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index d881a95322c..5c064086e90 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see #include "stringpool.h" #include "attribs.h" #include "asan.h" +#include "gimplify.h" static tree cp_build_addr_expr_strict (tree, tsubst_flags_t); static tree cp_build_function_call (tree, tree, tsubst_flags_t); @@ -1383,6 +1384,11 @@ structural_comptypes (tree t1, tree t2, int strict) template parameters set, they can't be equal. */ if (!comp_template_parms_position (t1, t2)) return false; + /* If T1 and T2 don't represent the same class template deduction, + they aren't equal. */ + if (CLASS_PLACEHOLDER_TEMPLATE (t1) + != CLASS_PLACEHOLDER_TEMPLATE (t2)) + return false; /* Constrained 'auto's are distinct from parms that don't have the same constraints. */ if (!equivalent_placeholder_constraints (t1, t2)) @@ -2421,7 +2427,13 @@ build_class_member_access_expr (cp_expr object, tree member, { tree temp = unary_complex_lvalue (ADDR_EXPR, object); if (temp) - object = cp_build_fold_indirect_ref (temp); + { + temp = cp_build_fold_indirect_ref (temp); + if (xvalue_p (object) && !xvalue_p (temp)) + /* Preserve xvalue kind. */ + temp = move (temp); + object = temp; + } } /* In [expr.ref], there is an explicit list of the valid choices for @@ -2431,6 +2443,12 @@ build_class_member_access_expr (cp_expr object, tree member, /* A static data member. */ result = member; mark_exp_read (object); + + if (tree wrap = maybe_get_tls_wrapper_call (result)) + /* Replace an evaluated use of the thread_local variable with + a call to its wrapper. */ + result = wrap; + /* If OBJECT has side-effects, they are supposed to occur. */ if (TREE_SIDE_EFFECTS (object)) result = build2 (COMPOUND_EXPR, TREE_TYPE (result), object, result); @@ -2788,7 +2806,12 @@ finish_class_member_access_expr (cp_expr object, tree name, bool template_p, expression is dependent. */ || (TREE_CODE (name) == SCOPE_REF && TYPE_P (TREE_OPERAND (name, 0)) - && dependent_scope_p (TREE_OPERAND (name, 0)))) + && dependent_scope_p (TREE_OPERAND (name, 0))) + /* If NAME is operator T where "T" is dependent, we can't + lookup until we instantiate the T. */ + || (TREE_CODE (name) == IDENTIFIER_NODE + && IDENTIFIER_CONV_OP_P (name) + && dependent_type_p (TREE_TYPE (name)))) { dependent: return build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF, @@ -4826,7 +4849,7 @@ cp_build_binary_op (location_t location, tree pfn0, delta0, e1, e2; if (TREE_SIDE_EFFECTS (op0)) - op0 = save_expr (op0); + op0 = cp_save_expr (op0); pfn0 = pfn_from_ptrmemfunc (op0); delta0 = delta_from_ptrmemfunc (op0); @@ -5108,6 +5131,7 @@ cp_build_binary_op (location_t location, } if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE) + && !processing_template_decl && sanitize_flags_p (SANITIZE_POINTER_COMPARE)) { op0 = save_expr (op0); @@ -5353,6 +5377,7 @@ cp_build_binary_op (location_t location, otherwise, it will be given type RESULT_TYPE. */ if (! converted) { + warning_sentinel w (warn_sign_conversion, short_compare); if (TREE_TYPE (op0) != result_type) op0 = cp_convert_and_check (result_type, op0, complain); if (TREE_TYPE (op1) != result_type) @@ -5519,7 +5544,8 @@ pointer_diff (location_t loc, tree op0, tree op1, tree ptrtype, else inttype = restype; - if (sanitize_flags_p (SANITIZE_POINTER_SUBTRACT)) + if (!processing_template_decl + && sanitize_flags_p (SANITIZE_POINTER_SUBTRACT)) { op0 = save_expr (op0); op1 = save_expr (op1); @@ -5733,18 +5759,17 @@ cp_truthvalue_conversion (tree expr) return c_common_truthvalue_conversion (input_location, expr); } -/* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR. */ +/* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR. This + is a low-level function; most callers should use maybe_convert_cond. */ tree condition_conversion (tree expr) { tree t; - /* Anything that might happen in a template should go through - maybe_convert_cond. */ - gcc_assert (!processing_template_decl); t = perform_implicit_conversion_flags (boolean_type_node, expr, tf_warning_or_error, LOOKUP_NORMAL); - t = fold_build_cleanup_point_expr (boolean_type_node, t); + if (!processing_template_decl) + t = fold_build_cleanup_point_expr (boolean_type_node, t); return t; } @@ -7969,8 +7994,6 @@ cp_build_modify_expr (location_t loc, tree lhs, enum tree_code modifycode, /* Produce (a ? (b = rhs) : (c = rhs)) except that the RHS goes through a save-expr so the code to compute it is only emitted once. */ - tree cond; - if (VOID_TYPE_P (TREE_TYPE (rhs))) { if (complain & tf_error) @@ -7985,13 +8008,21 @@ cp_build_modify_expr (location_t loc, tree lhs, enum tree_code modifycode, if (!lvalue_or_else (lhs, lv_assign, complain)) return error_mark_node; - cond = build_conditional_expr - (input_location, TREE_OPERAND (lhs, 0), - cp_build_modify_expr (loc, TREE_OPERAND (lhs, 1), - modifycode, rhs, complain), - cp_build_modify_expr (loc, TREE_OPERAND (lhs, 2), - modifycode, rhs, complain), - complain); + tree op1 = cp_build_modify_expr (loc, TREE_OPERAND (lhs, 1), + modifycode, rhs, complain); + /* When sanitizing undefined behavior, even when rhs doesn't need + stabilization at this point, the sanitization might add extra + SAVE_EXPRs in there and so make sure there is no tree sharing + in the rhs, otherwise those SAVE_EXPRs will have initialization + only in one of the two branches. */ + if (sanitize_flags_p (SANITIZE_UNDEFINED + | SANITIZE_UNDEFINED_NONDEFAULT)) + rhs = unshare_expr (rhs); + tree op2 = cp_build_modify_expr (loc, TREE_OPERAND (lhs, 2), + modifycode, rhs, complain); + tree cond = build_conditional_expr (input_location, + TREE_OPERAND (lhs, 0), op1, op2, + complain); if (cond == error_mark_node) return cond; @@ -9066,6 +9097,24 @@ maybe_warn_about_returning_address_of_local (tree retval) && !(TREE_STATIC (whats_returned) || TREE_PUBLIC (whats_returned))) { + if (VAR_P (whats_returned) + && DECL_DECOMPOSITION_P (whats_returned) + && DECL_DECOMP_BASE (whats_returned) + && DECL_HAS_VALUE_EXPR_P (whats_returned)) + { + /* When returning address of a structured binding, if the structured + binding is not a reference, continue normally, if it is a + reference, recurse on the initializer of the structured + binding. */ + tree base = DECL_DECOMP_BASE (whats_returned); + if (TREE_CODE (TREE_TYPE (base)) == REFERENCE_TYPE) + { + if (tree init = DECL_INITIAL (base)) + return maybe_warn_about_returning_address_of_local (init); + else + return false; + } + } if (TREE_CODE (valtype) == REFERENCE_TYPE) warning_at (DECL_SOURCE_LOCATION (whats_returned), OPT_Wreturn_local_addr, diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index b91c98d594b..b28044c11dc 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1142,8 +1142,29 @@ digest_init_r (tree type, tree init, int nested, int flags, { tree elt = CONSTRUCTOR_ELT (init, 0)->value; if (reference_related_p (type, TREE_TYPE (elt))) - /* We should have fixed this in reshape_init. */ - gcc_unreachable (); + { + /* In C++17, aggregates can have bases, thus participate in + aggregate initialization. In the following case: + + struct B { int c; }; + struct D : B { }; + D d{{D{{42}}}}; + + there's an extra set of braces, so the D temporary initializes + the first element of d, which is the B base subobject. The base + of type B is copy-initialized from the D temporary, causing + object slicing. */ + tree field = next_initializable_field (TYPE_FIELDS (type)); + if (field && DECL_FIELD_IS_BASE (field)) + { + if (warning_at (loc, 0, "initializing a base class of type %qT " + "results in object slicing", TREE_TYPE (field))) + inform (loc, "remove %<{ }%> around initializer"); + } + else + /* We should have fixed this in reshape_init. */ + gcc_unreachable (); + } } if (BRACE_ENCLOSED_INITIALIZER_P (init) @@ -1538,6 +1559,13 @@ process_init_constructor_record (tree type, tree init, int nested, } } + if (DECL_SIZE (field) && integer_zerop (DECL_SIZE (field)) + && !TREE_SIDE_EFFECTS (next)) + /* Don't add trivial initialization of an empty base/field to the + constructor, as they might not be ordered the way the back-end + expects. */ + continue; + /* If this is a bitfield, now convert to the lowered type. */ if (type != TREE_TYPE (field)) next = cp_convert_and_check (TREE_TYPE (field), next, complain); diff --git a/gcc/cp/vtable-class-hierarchy.c b/gcc/cp/vtable-class-hierarchy.c index 7a9a5f2c595..7256bb4d448 100644 --- a/gcc/cp/vtable-class-hierarchy.c +++ b/gcc/cp/vtable-class-hierarchy.c @@ -1191,8 +1191,6 @@ vtv_generate_init_routine (void) gimplify_function_tree (vtv_fndecl); cgraph_node::add_new_function (vtv_fndecl, false); - symtab->process_new_functions (); - if (flag_vtable_verify == VTV_PREINIT_PRIORITY && !TARGET_PECOFF) assemble_vtv_preinit_initializer (vtv_fndecl); diff --git a/gcc/dce.c b/gcc/dce.c index e4d442c62b5..bea9a5d544b 100644 --- a/gcc/dce.c +++ b/gcc/dce.c @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see #include "valtrack.h" #include "tree-pass.h" #include "dbgcnt.h" +#include "rtl-iter.h" /* ------------------------------------------------------------------------- @@ -86,6 +87,32 @@ deletable_insn_p_1 (rtx body) } } +/* Don't delete calls that may throw if we cannot do so. */ + +static bool +can_delete_call (rtx_insn *insn) +{ + if (cfun->can_delete_dead_exceptions && can_alter_cfg) + return true; + if (!insn_nothrow_p (insn)) + return false; + if (can_alter_cfg) + return true; + /* If we can't alter cfg, even when the call can't throw exceptions, it + might have EDGE_ABNORMAL_CALL edges and so we shouldn't delete such + calls. */ + gcc_assert (CALL_P (insn)); + if (BLOCK_FOR_INSN (insn) && BB_END (BLOCK_FOR_INSN (insn)) == insn) + { + edge e; + edge_iterator ei; + + FOR_EACH_EDGE (e, ei, BLOCK_FOR_INSN (insn)->succs) + if ((e->flags & EDGE_ABNORMAL_CALL) != 0) + return false; + } + return true; +} /* Return true if INSN is a normal instruction that can be deleted by the DCE pass. */ @@ -108,7 +135,9 @@ deletable_insn_p (rtx_insn *insn, bool fast, bitmap arg_stores) /* We can delete dead const or pure calls as long as they do not infinite loop. */ && (RTL_CONST_OR_PURE_CALL_P (insn) - && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn))) + && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)) + /* Don't delete calls that may throw if we cannot do so. */ + && can_delete_call (insn)) return find_call_stack_args (as_a (insn), false, fast, arg_stores); @@ -200,7 +229,8 @@ mark_insn (rtx_insn *insn, bool fast) && !df_in_progress && !SIBLING_CALL_P (insn) && (RTL_CONST_OR_PURE_CALL_P (insn) - && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn))) + && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)) + && can_delete_call (insn)) find_call_stack_args (as_a (insn), true, fast, NULL); } } @@ -260,6 +290,100 @@ check_argument_store (HOST_WIDE_INT size, HOST_WIDE_INT off, return true; } +/* If MEM has sp address, return 0, if it has sp + const address, + return that const, if it has reg address where reg is set to sp + const + and FAST is false, return const, otherwise return + INTTYPE_MINUMUM (HOST_WIDE_INT). */ + +static HOST_WIDE_INT +sp_based_mem_offset (rtx_call_insn *call_insn, const_rtx mem, bool fast) +{ + HOST_WIDE_INT off = 0; + rtx addr = XEXP (mem, 0); + if (GET_CODE (addr) == PLUS + && REG_P (XEXP (addr, 0)) + && CONST_INT_P (XEXP (addr, 1))) + { + off = INTVAL (XEXP (addr, 1)); + addr = XEXP (addr, 0); + } + if (addr == stack_pointer_rtx) + return off; + + if (!REG_P (addr) || fast) + return INTTYPE_MINIMUM (HOST_WIDE_INT); + + /* If not fast, use chains to see if addr wasn't set to sp + offset. */ + df_ref use; + FOR_EACH_INSN_USE (use, call_insn) + if (rtx_equal_p (addr, DF_REF_REG (use))) + break; + + if (use == NULL) + return INTTYPE_MINIMUM (HOST_WIDE_INT); + + struct df_link *defs; + for (defs = DF_REF_CHAIN (use); defs; defs = defs->next) + if (! DF_REF_IS_ARTIFICIAL (defs->ref)) + break; + + if (defs == NULL) + return INTTYPE_MINIMUM (HOST_WIDE_INT); + + rtx set = single_set (DF_REF_INSN (defs->ref)); + if (!set) + return INTTYPE_MINIMUM (HOST_WIDE_INT); + + if (GET_CODE (SET_SRC (set)) != PLUS + || XEXP (SET_SRC (set), 0) != stack_pointer_rtx + || !CONST_INT_P (XEXP (SET_SRC (set), 1))) + return INTTYPE_MINIMUM (HOST_WIDE_INT); + + off += INTVAL (XEXP (SET_SRC (set), 1)); + return off; +} + +/* Data for check_argument_load called via note_uses. */ +struct check_argument_load_data { + bitmap sp_bytes; + HOST_WIDE_INT min_sp_off, max_sp_off; + rtx_call_insn *call_insn; + bool fast; + bool load_found; +}; + +/* Helper function for find_call_stack_args. Check if there are + any loads from the argument slots in between the const/pure call + and store to the argument slot, set LOAD_FOUND if any is found. */ + +static void +check_argument_load (rtx *loc, void *data) +{ + struct check_argument_load_data *d + = (struct check_argument_load_data *) data; + subrtx_iterator::array_type array; + FOR_EACH_SUBRTX (iter, array, *loc, NONCONST) + { + const_rtx mem = *iter; + HOST_WIDE_INT size; + if (MEM_P (mem) + && MEM_SIZE_KNOWN_P (mem) + && MEM_SIZE (mem).is_constant (&size)) + { + HOST_WIDE_INT off = sp_based_mem_offset (d->call_insn, mem, d->fast); + if (off != INTTYPE_MINIMUM (HOST_WIDE_INT) + && off < d->max_sp_off + && off + size > d->min_sp_off) + for (HOST_WIDE_INT byte = MAX (off, d->min_sp_off); + byte < MIN (off + size, d->max_sp_off); byte++) + if (bitmap_bit_p (d->sp_bytes, byte - d->min_sp_off)) + { + d->load_found = true; + return; + } + } + } +} /* Try to find all stack stores of CALL_INSN arguments if ACCUMULATE_OUTGOING_ARGS. If all stack stores have been found @@ -297,58 +421,13 @@ find_call_stack_args (rtx_call_insn *call_insn, bool do_mark, bool fast, if (GET_CODE (XEXP (p, 0)) == USE && MEM_P (XEXP (XEXP (p, 0), 0))) { - rtx mem = XEXP (XEXP (p, 0), 0), addr; - HOST_WIDE_INT off = 0, size; + rtx mem = XEXP (XEXP (p, 0), 0); + HOST_WIDE_INT size; if (!MEM_SIZE_KNOWN_P (mem) || !MEM_SIZE (mem).is_constant (&size)) return false; - addr = XEXP (mem, 0); - if (GET_CODE (addr) == PLUS - && REG_P (XEXP (addr, 0)) - && CONST_INT_P (XEXP (addr, 1))) - { - off = INTVAL (XEXP (addr, 1)); - addr = XEXP (addr, 0); - } - if (addr != stack_pointer_rtx) - { - if (!REG_P (addr)) - return false; - /* If not fast, use chains to see if addr wasn't set to - sp + offset. */ - if (!fast) - { - df_ref use; - struct df_link *defs; - rtx set; - - FOR_EACH_INSN_USE (use, call_insn) - if (rtx_equal_p (addr, DF_REF_REG (use))) - break; - - if (use == NULL) - return false; - - for (defs = DF_REF_CHAIN (use); defs; defs = defs->next) - if (! DF_REF_IS_ARTIFICIAL (defs->ref)) - break; - - if (defs == NULL) - return false; - - set = single_set (DF_REF_INSN (defs->ref)); - if (!set) - return false; - - if (GET_CODE (SET_SRC (set)) != PLUS - || XEXP (SET_SRC (set), 0) != stack_pointer_rtx - || !CONST_INT_P (XEXP (SET_SRC (set), 1))) - return false; - - off += INTVAL (XEXP (SET_SRC (set), 1)); - } - else - return false; - } + HOST_WIDE_INT off = sp_based_mem_offset (call_insn, mem, fast); + if (off == INTTYPE_MINIMUM (HOST_WIDE_INT)) + return false; min_sp_off = MIN (min_sp_off, off); max_sp_off = MAX (max_sp_off, off + size); } @@ -364,51 +443,24 @@ find_call_stack_args (rtx_call_insn *call_insn, bool do_mark, bool fast, if (GET_CODE (XEXP (p, 0)) == USE && MEM_P (XEXP (XEXP (p, 0), 0))) { - rtx mem = XEXP (XEXP (p, 0), 0), addr; - HOST_WIDE_INT off = 0, byte, size; + rtx mem = XEXP (XEXP (p, 0), 0); /* Checked in the previous iteration. */ - size = MEM_SIZE (mem).to_constant (); - addr = XEXP (mem, 0); - if (GET_CODE (addr) == PLUS - && REG_P (XEXP (addr, 0)) - && CONST_INT_P (XEXP (addr, 1))) - { - off = INTVAL (XEXP (addr, 1)); - addr = XEXP (addr, 0); - } - if (addr != stack_pointer_rtx) - { - df_ref use; - struct df_link *defs; - rtx set; - - FOR_EACH_INSN_USE (use, call_insn) - if (rtx_equal_p (addr, DF_REF_REG (use))) - break; - - for (defs = DF_REF_CHAIN (use); defs; defs = defs->next) - if (! DF_REF_IS_ARTIFICIAL (defs->ref)) - break; - - set = single_set (DF_REF_INSN (defs->ref)); - off += INTVAL (XEXP (SET_SRC (set), 1)); - } - for (byte = off; byte < off + size; byte++) - { - if (!bitmap_set_bit (sp_bytes, byte - min_sp_off)) - gcc_unreachable (); - } + HOST_WIDE_INT size = MEM_SIZE (mem).to_constant (); + HOST_WIDE_INT off = sp_based_mem_offset (call_insn, mem, fast); + gcc_checking_assert (off != INTTYPE_MINIMUM (HOST_WIDE_INT)); + for (HOST_WIDE_INT byte = off; byte < off + size; byte++) + if (!bitmap_set_bit (sp_bytes, byte - min_sp_off)) + gcc_unreachable (); } /* Walk backwards, looking for argument stores. The search stops - when seeing another call, sp adjustment or memory store other than - argument store. */ + when seeing another call, sp adjustment, memory store other than + argument store or a read from an argument stack slot. */ + struct check_argument_load_data data + = { sp_bytes, min_sp_off, max_sp_off, call_insn, fast, false }; ret = false; for (insn = PREV_INSN (call_insn); insn; insn = prev_insn) { - rtx set, mem, addr; - HOST_WIDE_INT off; - if (insn == BB_HEAD (BLOCK_FOR_INSN (call_insn))) prev_insn = NULL; else @@ -420,61 +472,21 @@ find_call_stack_args (rtx_call_insn *call_insn, bool do_mark, bool fast, if (!NONDEBUG_INSN_P (insn)) continue; - set = single_set (insn); + rtx set = single_set (insn); if (!set || SET_DEST (set) == stack_pointer_rtx) break; + note_uses (&PATTERN (insn), check_argument_load, &data); + if (data.load_found) + break; + if (!MEM_P (SET_DEST (set))) continue; - mem = SET_DEST (set); - addr = XEXP (mem, 0); - off = 0; - if (GET_CODE (addr) == PLUS - && REG_P (XEXP (addr, 0)) - && CONST_INT_P (XEXP (addr, 1))) - { - off = INTVAL (XEXP (addr, 1)); - addr = XEXP (addr, 0); - } - if (addr != stack_pointer_rtx) - { - if (!REG_P (addr)) - break; - if (!fast) - { - df_ref use; - struct df_link *defs; - rtx set; - - FOR_EACH_INSN_USE (use, insn) - if (rtx_equal_p (addr, DF_REF_REG (use))) - break; - - if (use == NULL) - break; - - for (defs = DF_REF_CHAIN (use); defs; defs = defs->next) - if (! DF_REF_IS_ARTIFICIAL (defs->ref)) - break; - - if (defs == NULL) - break; - - set = single_set (DF_REF_INSN (defs->ref)); - if (!set) - break; - - if (GET_CODE (SET_SRC (set)) != PLUS - || XEXP (SET_SRC (set), 0) != stack_pointer_rtx - || !CONST_INT_P (XEXP (SET_SRC (set), 1))) - break; - - off += INTVAL (XEXP (SET_SRC (set), 1)); - } - else - break; - } + rtx mem = SET_DEST (set); + HOST_WIDE_INT off = sp_based_mem_offset (call_insn, mem, fast); + if (off == INTTYPE_MINIMUM (HOST_WIDE_INT)) + break; HOST_WIDE_INT size; if (!MEM_SIZE_KNOWN_P (mem) @@ -572,7 +584,12 @@ delete_unmarked_insns (void) rtx turn_into_use = NULL_RTX; /* Always delete no-op moves. */ - if (noop_move_p (insn)) + if (noop_move_p (insn) + /* Unless the no-op move can throw and we are not allowed + to alter cfg. */ + && (!cfun->can_throw_non_call_exceptions + || (cfun->can_delete_dead_exceptions && can_alter_cfg) + || insn_nothrow_p (insn))) { if (RTX_FRAME_RELATED_P (insn)) turn_into_use @@ -615,12 +632,6 @@ delete_unmarked_insns (void) for the destination regs in order to avoid dangling notes. */ remove_reg_equal_equiv_notes_for_defs (insn); - /* If a pure or const call is deleted, this may make the cfg - have unreachable blocks. We rememeber this and call - delete_unreachable_blocks at the end. */ - if (CALL_P (insn)) - must_clean = true; - if (turn_into_use) { /* Don't remove frame related noop moves if they cary @@ -633,12 +644,15 @@ delete_unmarked_insns (void) } else /* Now delete the insn. */ - delete_insn_and_edges (insn); + must_clean |= delete_insn_and_edges (insn); } /* Deleted a pure or const call. */ if (must_clean) - delete_unreachable_blocks (); + { + delete_unreachable_blocks (); + free_dominance_info (CDI_DOMINATORS); + } } diff --git a/gcc/defaults.h b/gcc/defaults.h index 78a08a33f12..9035b333be8 100644 --- a/gcc/defaults.h +++ b/gcc/defaults.h @@ -1282,6 +1282,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define TARGET_PECOFF 0 #endif +#ifndef TARGET_COFF +#define TARGET_COFF 0 +#endif + #ifndef EH_RETURN_HANDLER_RTX #define EH_RETURN_HANDLER_RTX NULL #endif diff --git a/gcc/df-core.c b/gcc/df-core.c index 74ef0a14ac9..2fc7c05ede4 100644 --- a/gcc/df-core.c +++ b/gcc/df-core.c @@ -298,12 +298,12 @@ There are 4 ways to obtain access to refs: Artificial defs and uses occur both at the beginning and ends of blocks. - For blocks that area at the destination of eh edges, the + For blocks that are at the destination of eh edges, the artificial uses and defs occur at the beginning. The defs relate to the registers specified in EH_RETURN_DATA_REGNO and the uses - relate to the registers specified in ED_USES. Logically these + relate to the registers specified in EH_USES. Logically these defs and uses should really occur along the eh edge, but there is - no convenient way to do this. Artificial edges that occur at the + no convenient way to do this. Artificial defs that occur at the beginning of the block have the DF_REF_AT_TOP flag set. Artificial uses occur at the end of all blocks. These arise from diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c index bdf608a08bc..9c567bde68d 100644 --- a/gcc/diagnostic-show-locus.c +++ b/gcc/diagnostic-show-locus.c @@ -2000,7 +2000,7 @@ diagnostic_show_locus (diagnostic_context * context, context->last_location = loc; - const char *saved_prefix = pp_get_prefix (context->printer); + char *saved_prefix = pp_take_prefix (context->printer); pp_set_prefix (context->printer, NULL); layout layout (context, richloc, diagnostic_kind); diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index e22c17bc02c..c61e0c4572a 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -1063,7 +1063,6 @@ diagnostic_append_note (diagnostic_context *context, { diagnostic_info diagnostic; va_list ap; - const char *saved_prefix; rich_location richloc (line_table, location); va_start (ap, gmsgid); @@ -1073,7 +1072,7 @@ diagnostic_append_note (diagnostic_context *context, va_end (ap); return; } - saved_prefix = pp_get_prefix (context->printer); + char *saved_prefix = pp_take_prefix (context->printer); pp_set_prefix (context->printer, diagnostic_build_prefix (context, &diagnostic)); pp_format (context->printer, &diagnostic.message); diff --git a/gcc/doc/avr-mmcu.texi b/gcc/doc/avr-mmcu.texi index 569b24174e6..090c438e129 100644 --- a/gcc/doc/avr-mmcu.texi +++ b/gcc/doc/avr-mmcu.texi @@ -4,9 +4,9 @@ @c This file is generated automatically using @c gcc/config/avr/gen-avr-mmcu-texi.c from: -@c gcc/config/avr/avr-arch.h -@c gcc/config/avr/avr-devices.c -@c gcc/config/avr/avr-mcus.def +@c gcc/config/avr/avr-arch.h +@c gcc/config/avr/avr-devices.c +@c gcc/config/avr/avr-mcus.def @c Please do not edit manually. @@ -14,15 +14,15 @@ @item avr2 ``Classic'' devices with up to 8@tie{}KiB of program memory. -@*@var{mcu}@tie{}= @code{attiny22}, @code{attiny26}, @code{at90c8534}, @code{at90s2313}, @code{at90s2323}, @code{at90s2333}, @code{at90s2343}, @code{at90s4414}, @code{at90s4433}, @code{at90s4434}, @code{at90s8515}, @code{at90s8535}. +@*@var{mcu}@tie{}= @code{attiny22}, @code{attiny26}, @code{at90s2313}, @code{at90s2323}, @code{at90s2333}, @code{at90s2343}, @code{at90s4414}, @code{at90s4433}, @code{at90s4434}, @code{at90c8534}, @code{at90s8515}, @code{at90s8535}. @item avr25 ``Classic'' devices with up to 8@tie{}KiB of program memory and with the @code{MOVW} instruction. -@*@var{mcu}@tie{}= @code{ata5272}, @code{ata6616c}, @code{attiny13}, @code{attiny13a}, @code{attiny2313}, @code{attiny2313a}, @code{attiny24}, @code{attiny24a}, @code{attiny25}, @code{attiny261}, @code{attiny261a}, @code{attiny43u}, @code{attiny4313}, @code{attiny44}, @code{attiny44a}, @code{attiny441}, @code{attiny45}, @code{attiny461}, @code{attiny461a}, @code{attiny48}, @code{attiny828}, @code{attiny84}, @code{attiny84a}, @code{attiny841}, @code{attiny85}, @code{attiny861}, @code{attiny861a}, @code{attiny87}, @code{attiny88}, @code{at86rf401}. +@*@var{mcu}@tie{}= @code{attiny13}, @code{attiny13a}, @code{attiny24}, @code{attiny24a}, @code{attiny25}, @code{attiny261}, @code{attiny261a}, @code{attiny2313}, @code{attiny2313a}, @code{attiny43u}, @code{attiny44}, @code{attiny44a}, @code{attiny45}, @code{attiny48}, @code{attiny441}, @code{attiny461}, @code{attiny461a}, @code{attiny4313}, @code{attiny84}, @code{attiny84a}, @code{attiny85}, @code{attiny87}, @code{attiny88}, @code{attiny828}, @code{attiny841}, @code{attiny861}, @code{attiny861a}, @code{ata5272}, @code{ata6616c}, @code{at86rf401}. @item avr3 -``Classic'' devices with 16@tie{}KiB up to 64@tie{}KiB of program memory. -@*@var{mcu}@tie{}= @code{at43usb355}, @code{at76c711}. +``Classic'' devices with 16@tie{}KiB up to 64@tie{}KiB of program memory. +@*@var{mcu}@tie{}= @code{at76c711}, @code{at43usb355}. @item avr31 ``Classic'' devices with 128@tie{}KiB of program memory. @@ -30,15 +30,15 @@ @item avr35 ``Classic'' devices with 16@tie{}KiB up to 64@tie{}KiB of program memory and with the @code{MOVW} instruction. -@*@var{mcu}@tie{}= @code{ata5505}, @code{ata6617c}, @code{ata664251}, @code{atmega16u2}, @code{atmega32u2}, @code{atmega8u2}, @code{attiny1634}, @code{attiny167}, @code{at90usb162}, @code{at90usb82}. +@*@var{mcu}@tie{}= @code{attiny167}, @code{attiny1634}, @code{atmega8u2}, @code{atmega16u2}, @code{atmega32u2}, @code{ata5505}, @code{ata6617c}, @code{ata664251}, @code{at90usb82}, @code{at90usb162}. @item avr4 ``Enhanced'' devices with up to 8@tie{}KiB of program memory. -@*@var{mcu}@tie{}= @code{ata6285}, @code{ata6286}, @code{ata6289}, @code{ata6612c}, @code{atmega48}, @code{atmega48a}, @code{atmega48p}, @code{atmega48pa}, @code{atmega48pb}, @code{atmega8}, @code{atmega8a}, @code{atmega8hva}, @code{atmega8515}, @code{atmega8535}, @code{atmega88}, @code{atmega88a}, @code{atmega88p}, @code{atmega88pa}, @code{atmega88pb}, @code{at90pwm1}, @code{at90pwm2}, @code{at90pwm2b}, @code{at90pwm3}, @code{at90pwm3b}, @code{at90pwm81}. +@*@var{mcu}@tie{}= @code{atmega48}, @code{atmega48a}, @code{atmega48p}, @code{atmega48pa}, @code{atmega48pb}, @code{atmega8}, @code{atmega8a}, @code{atmega8hva}, @code{atmega88}, @code{atmega88a}, @code{atmega88p}, @code{atmega88pa}, @code{atmega88pb}, @code{atmega8515}, @code{atmega8535}, @code{ata6285}, @code{ata6286}, @code{ata6289}, @code{ata6612c}, @code{at90pwm1}, @code{at90pwm2}, @code{at90pwm2b}, @code{at90pwm3}, @code{at90pwm3b}, @code{at90pwm81}. @item avr5 ``Enhanced'' devices with 16@tie{}KiB up to 64@tie{}KiB of program memory. -@*@var{mcu}@tie{}= @code{ata5702m322}, @code{ata5782}, @code{ata5790}, @code{ata5790n}, @code{ata5791}, @code{ata5795}, @code{ata5831}, @code{ata6613c}, @code{ata6614q}, @code{ata8210}, @code{ata8510}, @code{atmega16}, @code{atmega16a}, @code{atmega16hva}, @code{atmega16hva2}, @code{atmega16hvb}, @code{atmega16hvbrevb}, @code{atmega16m1}, @code{atmega16u4}, @code{atmega161}, @code{atmega162}, @code{atmega163}, @code{atmega164a}, @code{atmega164p}, @code{atmega164pa}, @code{atmega165}, @code{atmega165a}, @code{atmega165p}, @code{atmega165pa}, @code{atmega168}, @code{atmega168a}, @code{atmega168p}, @code{atmega168pa}, @code{atmega168pb}, @code{atmega169}, @code{atmega169a}, @code{atmega169p}, @code{atmega169pa}, @code{atmega32}, @code{atmega32a}, @code{atmega32c1}, @code{atmega32hvb}, @code{atmega32hvbrevb}, @code{atmega32m1}, @code{atmega32u4}, @code{atmega32u6}, @code{atmega323}, @code{atmega324a}, @code{atmega324p}, @code{atmega324pa}, @code{atmega325}, @code{atmega325a}, @code{atmega325p}, @code{atmega325pa}, @code{atmega3250}, @code{atmega3250a}, @code{atmega3250p}, @code{atmega3250pa}, @code{atmega328}, @code{atmega328p}, @code{atmega328pb}, @code{atmega329}, @code{atmega329a}, @code{atmega329p}, @code{atmega329pa}, @code{atmega3290}, @code{atmega3290a}, @code{atmega3290p}, @code{atmega3290pa}, @code{atmega406}, @code{atmega64}, @code{atmega64a}, @code{atmega64c1}, @code{atmega64hve}, @code{atmega64hve2}, @code{atmega64m1}, @code{atmega64rfr2}, @code{atmega640}, @code{atmega644}, @code{atmega644a}, @code{atmega644p}, @code{atmega644pa}, @code{atmega644rfr2}, @code{atmega645}, @code{atmega645a}, @code{atmega645p}, @code{atmega6450}, @code{atmega6450a}, @code{atmega6450p}, @code{atmega649}, @code{atmega649a}, @code{atmega649p}, @code{atmega6490}, @code{atmega6490a}, @code{atmega6490p}, @code{at90can32}, @code{at90can64}, @code{at90pwm161}, @code{at90pwm216}, @code{at90pwm316}, @code{at90scr100}, @code{at90usb646}, @code{at90usb647}, @code{at94k}, @code{m3000}. +@*@var{mcu}@tie{}= @code{atmega16}, @code{atmega16a}, @code{atmega16hva}, @code{atmega16hva2}, @code{atmega16hvb}, @code{atmega16hvbrevb}, @code{atmega16m1}, @code{atmega16u4}, @code{atmega161}, @code{atmega162}, @code{atmega163}, @code{atmega164a}, @code{atmega164p}, @code{atmega164pa}, @code{atmega165}, @code{atmega165a}, @code{atmega165p}, @code{atmega165pa}, @code{atmega168}, @code{atmega168a}, @code{atmega168p}, @code{atmega168pa}, @code{atmega168pb}, @code{atmega169}, @code{atmega169a}, @code{atmega169p}, @code{atmega169pa}, @code{atmega32}, @code{atmega32a}, @code{atmega32c1}, @code{atmega32hvb}, @code{atmega32hvbrevb}, @code{atmega32m1}, @code{atmega32u4}, @code{atmega32u6}, @code{atmega323}, @code{atmega324a}, @code{atmega324p}, @code{atmega324pa}, @code{atmega325}, @code{atmega325a}, @code{atmega325p}, @code{atmega325pa}, @code{atmega328}, @code{atmega328p}, @code{atmega328pb}, @code{atmega329}, @code{atmega329a}, @code{atmega329p}, @code{atmega329pa}, @code{atmega3250}, @code{atmega3250a}, @code{atmega3250p}, @code{atmega3250pa}, @code{atmega3290}, @code{atmega3290a}, @code{atmega3290p}, @code{atmega3290pa}, @code{atmega406}, @code{atmega64}, @code{atmega64a}, @code{atmega64c1}, @code{atmega64hve}, @code{atmega64hve2}, @code{atmega64m1}, @code{atmega64rfr2}, @code{atmega640}, @code{atmega644}, @code{atmega644a}, @code{atmega644p}, @code{atmega644pa}, @code{atmega644rfr2}, @code{atmega645}, @code{atmega645a}, @code{atmega645p}, @code{atmega649}, @code{atmega649a}, @code{atmega649p}, @code{atmega6450}, @code{atmega6450a}, @code{atmega6450p}, @code{atmega6490}, @code{atmega6490a}, @code{atmega6490p}, @code{ata5795}, @code{ata5790}, @code{ata5790n}, @code{ata5791}, @code{ata6613c}, @code{ata6614q}, @code{ata5782}, @code{ata5831}, @code{ata8210}, @code{ata8510}, @code{ata5702m322}, @code{at90pwm161}, @code{at90pwm216}, @code{at90pwm316}, @code{at90can32}, @code{at90can64}, @code{at90scr100}, @code{at90usb646}, @code{at90usb647}, @code{at94k}, @code{m3000}. @item avr51 ``Enhanced'' devices with 128@tie{}KiB of program memory. @@ -50,11 +50,11 @@ @item avrxmega2 ``XMEGA'' devices with more than 8@tie{}KiB and up to 64@tie{}KiB of program memory. -@*@var{mcu}@tie{}= @code{atxmega16a4}, @code{atxmega16a4u}, @code{atxmega16c4}, @code{atxmega16d4}, @code{atxmega16e5}, @code{atxmega32a4}, @code{atxmega32a4u}, @code{atxmega32c3}, @code{atxmega32c4}, @code{atxmega32d3}, @code{atxmega32d4}, @code{atxmega32e5}, @code{atxmega8e5}. +@*@var{mcu}@tie{}= @code{atxmega8e5}, @code{atxmega16a4}, @code{atxmega16a4u}, @code{atxmega16c4}, @code{atxmega16d4}, @code{atxmega16e5}, @code{atxmega32a4}, @code{atxmega32a4u}, @code{atxmega32c3}, @code{atxmega32c4}, @code{atxmega32d3}, @code{atxmega32d4}, @code{atxmega32e5}. @item avrxmega3 ``XMEGA'' devices with up to 64@tie{}KiB of combined program memory and RAM, and with program memory visible in the RAM address space. -@*@var{mcu}@tie{}= @code{attiny1614}, @code{attiny1616}, @code{attiny1617}, @code{attiny212}, @code{attiny214}, @code{attiny3214}, @code{attiny3216}, @code{attiny3217}, @code{attiny412}, @code{attiny414}, @code{attiny416}, @code{attiny417}, @code{attiny814}, @code{attiny816}, @code{attiny817}. +@*@var{mcu}@tie{}= @code{attiny202}, @code{attiny204}, @code{attiny212}, @code{attiny214}, @code{attiny402}, @code{attiny404}, @code{attiny406}, @code{attiny412}, @code{attiny414}, @code{attiny416}, @code{attiny417}, @code{attiny804}, @code{attiny806}, @code{attiny807}, @code{attiny814}, @code{attiny816}, @code{attiny817}, @code{attiny1604}, @code{attiny1606}, @code{attiny1607}, @code{attiny1614}, @code{attiny1616}, @code{attiny1617}, @code{attiny3214}, @code{attiny3216}, @code{attiny3217}, @code{atmega808}, @code{atmega809}, @code{atmega1608}, @code{atmega1609}, @code{atmega3208}, @code{atmega3209}, @code{atmega4808}, @code{atmega4809}. @item avrxmega4 ``XMEGA'' devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory. @@ -74,7 +74,7 @@ @item avrtiny ``TINY'' Tiny core devices with 512@tie{}B up to 4@tie{}KiB of program memory. -@*@var{mcu}@tie{}= @code{attiny10}, @code{attiny20}, @code{attiny4}, @code{attiny40}, @code{attiny5}, @code{attiny9}. +@*@var{mcu}@tie{}= @code{attiny4}, @code{attiny5}, @code{attiny9}, @code{attiny10}, @code{attiny20}, @code{attiny40}. @item avr1 This ISA is implemented by the minimal AVR core and supported for assembler only. diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index bfd5ff2b713..297f7d5975b 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -5642,36 +5642,296 @@ allows specification of target-specific compilation options. On the x86, the following options are allowed: @table @samp +@item 3dnow +@itemx no-3dnow +@cindex @code{target("3dnow")} function attribute, x86 +Enable/disable the generation of the 3DNow!@: instructions. + +@item 3dnowa +@itemx no-3dnowa +@cindex @code{target("3dnowa")} function attribute, x86 +Enable/disable the generation of the enhanced 3DNow!@: instructions. + @item abm @itemx no-abm @cindex @code{target("abm")} function attribute, x86 Enable/disable the generation of the advanced bit instructions. +@item adx +@itemx no-adx +@cindex @code{target("adx")} function attribute, x86 +Enable/disable the generation of the ADX instructions. + @item aes @itemx no-aes @cindex @code{target("aes")} function attribute, x86 Enable/disable the generation of the AES instructions. +@item avx +@itemx no-avx +@cindex @code{target("avx")} function attribute, x86 +Enable/disable the generation of the AVX instructions. + +@item avx2 +@itemx no-avx2 +@cindex @code{target("avx2")} function attribute, x86 +Enable/disable the generation of the AVX2 instructions. + +@item avx5124fmaps +@itemx no-avx5124fmaps +@cindex @code{target("avx5124fmaps")} function attribute, x86 +Enable/disable the generation of the AVX5124FMAPS instructions. + +@item avx5124vnniw +@itemx no-avx5124vnniw +@cindex @code{target("avx5124vnniw")} function attribute, x86 +Enable/disable the generation of the AVX5124VNNIW instructions. + +@item avx512bitalg +@itemx no-avx512bitalg +@cindex @code{target("avx512bitalg")} function attribute, x86 +Enable/disable the generation of the AVX512BITALG instructions. + +@item avx512bw +@itemx no-avx512bw +@cindex @code{target("avx512bw")} function attribute, x86 +Enable/disable the generation of the AVX512BW instructions. + +@item avx512cd +@itemx no-avx512cd +@cindex @code{target("avx512cd")} function attribute, x86 +Enable/disable the generation of the AVX512CD instructions. + +@item avx512dq +@itemx no-avx512dq +@cindex @code{target("avx512dq")} function attribute, x86 +Enable/disable the generation of the AVX512DQ instructions. + +@item avx512er +@itemx no-avx512er +@cindex @code{target("avx512er")} function attribute, x86 +Enable/disable the generation of the AVX512ER instructions. + +@item avx512f +@itemx no-avx512f +@cindex @code{target("avx512f")} function attribute, x86 +Enable/disable the generation of the AVX512F instructions. + +@item avx512ifma +@itemx no-avx512ifma +@cindex @code{target("avx512ifma")} function attribute, x86 +Enable/disable the generation of the AVX512IFMA instructions. + +@item avx512pf +@itemx no-avx512pf +@cindex @code{target("avx512pf")} function attribute, x86 +Enable/disable the generation of the AVX512PF instructions. + +@item avx512vbmi +@itemx no-avx512vbmi +@cindex @code{target("avx512vbmi")} function attribute, x86 +Enable/disable the generation of the AVX512VBMI instructions. + +@item avx512vbmi2 +@itemx no-avx512vbmi2 +@cindex @code{target("avx512vbmi2")} function attribute, x86 +Enable/disable the generation of the AVX512VBMI2 instructions. + +@item avx512vl +@itemx no-avx512vl +@cindex @code{target("avx512vl")} function attribute, x86 +Enable/disable the generation of the AVX512VL instructions. + +@item avx512vnni +@itemx no-avx512vnni +@cindex @code{target("avx512vnni")} function attribute, x86 +Enable/disable the generation of the AVX512VNNI instructions. + +@item avx512vpopcntdq +@itemx no-avx512vpopcntdq +@cindex @code{target("avx512vpopcntdq")} function attribute, x86 +Enable/disable the generation of the AVX512VPOPCNTDQ instructions. + +@item bmi +@itemx no-bmi +@cindex @code{target("bmi")} function attribute, x86 +Enable/disable the generation of the BMI instructions. + +@item bmi2 +@itemx no-bmi2 +@cindex @code{target("bmi2")} function attribute, x86 +Enable/disable the generation of the BMI2 instructions. + +@item clflushopt +@itemx no-clflushopt +@cindex @code{target("clflushopt")} function attribute, x86 +Enable/disable the generation of the CLFLUSHOPT instructions. + +@item clwb +@itemx no-clwb +@cindex @code{target("clwb")} function attribute, x86 +Enable/disable the generation of the CLWB instructions. + +@item clzero +@itemx no-clzero +@cindex @code{target("clzero")} function attribute, x86 +Enable/disable the generation of the CLZERO instructions. + +@item crc32 +@itemx no-crc32 +@cindex @code{target("crc32")} function attribute, x86 +Enable/disable the generation of the CRC32 instructions. + +@item cx16 +@itemx no-cx16 +@cindex @code{target("cx16")} function attribute, x86 +Enable/disable the generation of the CMPXCHG16B instructions. + @item default @cindex @code{target("default")} function attribute, x86 @xref{Function Multiversioning}, where it is used to specify the default function version. +@item f16c +@itemx no-f16c +@cindex @code{target("f16c")} function attribute, x86 +Enable/disable the generation of the F16C instructions. + +@item fma +@itemx no-fma +@cindex @code{target("fma")} function attribute, x86 +Enable/disable the generation of the FMA instructions. + +@item fma4 +@itemx no-fma4 +@cindex @code{target("fma4")} function attribute, x86 +Enable/disable the generation of the FMA4 instructions. + +@item fsgsbase +@itemx no-fsgsbase +@cindex @code{target("fsgsbase")} function attribute, x86 +Enable/disable the generation of the FSGSBASE instructions. + +@item fxsr +@itemx no-fxsr +@cindex @code{target("fxsr")} function attribute, x86 +Enable/disable the generation of the FXSR instructions. + +@item gfni +@itemx no-gfni +@cindex @code{target("gfni")} function attribute, x86 +Enable/disable the generation of the GFNI instructions. + +@item hle +@itemx no-hle +@cindex @code{target("hle")} function attribute, x86 +Enable/disable the generation of the HLE instruction prefixes. + +@item lwp +@itemx no-lwp +@cindex @code{target("lwp")} function attribute, x86 +Enable/disable the generation of the LWP instructions. + +@item lzcnt +@itemx no-lzcnt +@cindex @code{target("lzcnt")} function attribute, x86 +Enable/disable the generation of the LZCNT instructions. + @item mmx @itemx no-mmx @cindex @code{target("mmx")} function attribute, x86 Enable/disable the generation of the MMX instructions. +@item movbe +@itemx no-movbe +@cindex @code{target("movbe")} function attribute, x86 +Enable/disable the generation of the MOVBE instructions. + +@item movdir64b +@itemx no-movdir64b +@cindex @code{target("movdir64b")} function attribute, x86 +Enable/disable the generation of the MOVDIR64B instructions. + +@item movdiri +@itemx no-movdiri +@cindex @code{target("movdiri")} function attribute, x86 +Enable/disable the generation of the MOVDIRI instructions. + +@item mwaitx +@itemx no-mwaitx +@cindex @code{target("mwaitx")} function attribute, x86 +Enable/disable the generation of the MWAITX instructions. + @item pclmul @itemx no-pclmul @cindex @code{target("pclmul")} function attribute, x86 Enable/disable the generation of the PCLMUL instructions. +@item pconfig +@itemx no-pconfig +@cindex @code{target("pconfig")} function attribute, x86 +Enable/disable the generation of the PCONFIG instructions. + +@item pku +@itemx no-pku +@cindex @code{target("pku")} function attribute, x86 +Enable/disable the generation of the PKU instructions. + @item popcnt @itemx no-popcnt @cindex @code{target("popcnt")} function attribute, x86 Enable/disable the generation of the POPCNT instruction. +@item prefetchwt1 +@itemx no-prefetchwt1 +@cindex @code{target("prefetchwt1")} function attribute, x86 +Enable/disable the generation of the PREFETCHWT1 instructions. + +@item prfchw +@itemx no-prfchw +@cindex @code{target("prfchw")} function attribute, x86 +Enable/disable the generation of the PREFETCHW instruction. + +@item rdpid +@itemx no-rdpid +@cindex @code{target("rdpid")} function attribute, x86 +Enable/disable the generation of the RDPID instructions. + +@item rdrnd +@itemx no-rdrnd +@cindex @code{target("rdrnd")} function attribute, x86 +Enable/disable the generation of the RDRND instructions. + +@item rdseed +@itemx no-rdseed +@cindex @code{target("rdseed")} function attribute, x86 +Enable/disable the generation of the RDSEED instructions. + +@item rtm +@itemx no-rtm +@cindex @code{target("rtm")} function attribute, x86 +Enable/disable the generation of the RTM instructions. + +@item sahf +@itemx no-sahf +@cindex @code{target("sahf")} function attribute, x86 +Enable/disable the generation of the SAHF instructions. + +@item sgx +@itemx no-sgx +@cindex @code{target("sgx")} function attribute, x86 +Enable/disable the generation of the SGX instructions. + +@item sha +@itemx no-sha +@cindex @code{target("sha")} function attribute, x86 +Enable/disable the generation of the SHA instructions. + +@item shstk +@itemx no-shstk +@cindex @code{target("shstk")} function attribute, x86 +Enable/disable the shadow stack built-in functions from CET. + @item sse @itemx no-sse @cindex @code{target("sse")} function attribute, x86 @@ -5708,25 +5968,55 @@ Enable/disable the generation of the sse4.2 instructions. @cindex @code{target("sse4a")} function attribute, x86 Enable/disable the generation of the SSE4A instructions. -@item fma4 -@itemx no-fma4 -@cindex @code{target("fma4")} function attribute, x86 -Enable/disable the generation of the FMA4 instructions. +@item ssse3 +@itemx no-ssse3 +@cindex @code{target("ssse3")} function attribute, x86 +Enable/disable the generation of the SSSE3 instructions. + +@item tbm +@itemx no-tbm +@cindex @code{target("tbm")} function attribute, x86 +Enable/disable the generation of the TBM instructions. + +@item vaes +@itemx no-vaes +@cindex @code{target("vaes")} function attribute, x86 +Enable/disable the generation of the VAES instructions. + +@item vpclmulqdq +@itemx no-vpclmulqdq +@cindex @code{target("vpclmulqdq")} function attribute, x86 +Enable/disable the generation of the VPCLMULQDQ instructions. + +@item wbnoinvd +@itemx no-wbnoinvd +@cindex @code{target("wbnoinvd")} function attribute, x86 +Enable/disable the generation of the WBNOINVD instructions. @item xop @itemx no-xop @cindex @code{target("xop")} function attribute, x86 Enable/disable the generation of the XOP instructions. -@item lwp -@itemx no-lwp -@cindex @code{target("lwp")} function attribute, x86 -Enable/disable the generation of the LWP instructions. +@item xsave +@itemx no-xsave +@cindex @code{target("xsave")} function attribute, x86 +Enable/disable the generation of the XSAVE instructions. -@item ssse3 -@itemx no-ssse3 -@cindex @code{target("ssse3")} function attribute, x86 -Enable/disable the generation of the SSSE3 instructions. +@item xsavec +@itemx no-xsavec +@cindex @code{target("xsavec")} function attribute, x86 +Enable/disable the generation of the XSAVEC instructions. + +@item xsaveopt +@itemx no-xsaveopt +@cindex @code{target("xsaveopt")} function attribute, x86 +Enable/disable the generation of the XSAVEOPT instructions. + +@item xsaves +@itemx no-xsaves +@cindex @code{target("xsaves")} function attribute, x86 +Enable/disable the generation of the XSAVES instructions. @item cld @itemx no-cld @@ -8147,7 +8437,7 @@ for a C symbol, or to place a C variable in a specific register. A basic @code{asm} statement has the following syntax: @example -asm @r{[} volatile @r{]} ( @var{AssemblerInstructions} ) +asm @var{asm-qualifiers} ( @var{AssemblerInstructions} ) @end example The @code{asm} keyword is a GNU extension. @@ -8160,6 +8450,10 @@ various @option{-std} options, use @code{__asm__} instead of @item volatile The optional @code{volatile} qualifier has no effect. All basic @code{asm} blocks are implicitly volatile. + +@item inline +If you use the @code{inline} qualifier, then for inlining purposes the size +of the asm is taken as the smallest size possible (@pxref{Size of an asm}). @end table @subsubheading Parameters @@ -8275,17 +8569,19 @@ Extended @code{asm} syntax uses colons (@samp{:}) to delimit the operand parameters after the assembler template: @example -asm @r{[}volatile@r{]} ( @var{AssemblerTemplate} +asm @var{asm-qualifiers} ( @var{AssemblerTemplate} : @var{OutputOperands} @r{[} : @var{InputOperands} @r{[} : @var{Clobbers} @r{]} @r{]}) -asm @r{[}volatile@r{]} goto ( @var{AssemblerTemplate} +asm @var{asm-qualifiers} ( @var{AssemblerTemplate} : : @var{InputOperands} : @var{Clobbers} : @var{GotoLabels}) @end example +where in the last form, @var{asm-qualifiers} contains @code{goto} (and in the +first form, not). The @code{asm} keyword is a GNU extension. When writing code that can be compiled with @option{-ansi} and the @@ -8301,6 +8597,10 @@ values to produce output values. However, your @code{asm} statements may also produce side effects. If so, you may need to use the @code{volatile} qualifier to disable certain optimizations. @xref{Volatile}. +@item inline +If you use the @code{inline} qualifier, then for inlining purposes the size +of the asm is taken as the smallest size possible (@pxref{Size of an asm}). + @item goto This qualifier informs the compiler that the @code{asm} statement may perform a jump to one of the labels listed in the @var{GotoLabels}. @@ -9712,7 +10012,7 @@ does this by counting the number of instructions in the pattern of the @code{asm} and multiplying that by the length of the longest instruction supported by that processor. (When working out the number of instructions, it assumes that any occurrence of a newline or of -whatever statement separator character is supported by the assembler -- +whatever statement separator character is supported by the assembler --- typically @samp{;} --- indicates the end of an instruction.) Normally, GCC's estimate is adequate to ensure that correct @@ -9723,6 +10023,11 @@ space in the object file than is needed for a single instruction. If this happens then the assembler may produce a diagnostic saying that a label is unreachable. +@cindex @code{asm inline} +This size is also used for inlining decisions. If you use @code{asm inline} +instead of just @code{asm}, then for inlining purposes the size of the asm +is taken as the minimum size, ignoring how many instructions GCC thinks it is. + @node Alternate Keywords @section Alternate Keywords @cindex alternate keywords @@ -16352,7 +16657,30 @@ disabled. To use them, you must include @code{} instead. @item GCC allows using a @code{typedef} name as the type specifier for a -vector type. +vector type, but only under the following circumstances: + +@itemize @bullet + +@item +When using @code{__vector} instead of @code{vector}; for example, + +@smallexample +typedef signed short int16; +__vector int16 data; +@end smallexample + +@item +When using @code{vector} in keyword-and-predefine mode; for example, + +@smallexample +typedef signed short int16; +vector int16 data; +@end smallexample + +Note that keyword-and-predefine mode is enabled by disabling GNU +extensions (e.g., by using @code{-std=c11}) and including +@code{}. +@end itemize @item For C, overloaded functions are implemented with macros so the following @@ -18426,6 +18754,10 @@ vector double vec_div (vector double, vector double); vector long vec_div (vector long, vector long); vector unsigned long vec_div (vector unsigned long, vector unsigned long); vector double vec_floor (vector double); +vector signed long long vec_ld (int, const vector signed long long *); +vector signed long long vec_ld (int, const signed long long *); +vector unsigned long long vec_ld (int, const vector unsigned long long *); +vector unsigned long long vec_ld (int, const unsigned long long *); vector __int128 vec_ld (int, const vector __int128 *); vector unsigned __int128 vec_ld (int, const vector unsigned __int128 *); vector __int128 vec_ld (int, const __int128 *); @@ -18508,6 +18840,13 @@ vector signed long vec_splats (signed long); vector unsigned long vec_splats (unsigned long); vector float vec_sqrt (vector float); vector double vec_sqrt (vector double); +void vec_st (vector signed long long, int, vector signed long long *); +void vec_st (vector signed long long, int, signed long long *); +void vec_st (vector unsigned long long, int, vector unsigned long long *); +void vec_st (vector unsigned long long, int, unsigned long long *); +void vec_st (vector bool long long, int, vector bool long long *); +void vec_st (vector bool long long, int, signed long long *); +void vec_st (vector bool long long, int, unsigned long long *); void vec_st (vector double, int, vector double *); void vec_st (vector double, int, double *); vector double vec_sub (vector double, vector double); @@ -19369,20 +19708,33 @@ If the cryptographic instructions are enabled (@option{-mcrypto} or @smallexample vector unsigned long long __builtin_crypto_vsbox (vector unsigned long long); +vector unsigned char vec_sbox_be (vector unsigned char); + vector unsigned long long __builtin_crypto_vcipher (vector unsigned long long, vector unsigned long long); +vector unsigned char vec_cipher_be (vector unsigned char, vector unsigned char); + vector unsigned long long __builtin_crypto_vcipherlast (vector unsigned long long, vector unsigned long long); +vector unsigned char vec_cipherlast_be (vector unsigned char, + vector unsigned char); + vector unsigned long long __builtin_crypto_vncipher (vector unsigned long long, vector unsigned long long); +vector unsigned char vec_ncipher_be (vector unsigned char, + vector unsigned char); + vector unsigned long long __builtin_crypto_vncipherlast (vector unsigned long long, vector unsigned long long); +vector unsigned char vec_ncipherlast_be (vector unsigned char, + vector unsigned char); + vector unsigned char __builtin_crypto_vpermxor (vector unsigned char, vector unsigned char, vector unsigned char); diff --git a/gcc/doc/gcov.texi b/gcc/doc/gcov.texi index 59235876aaa..cc1376fd07e 100644 --- a/gcc/doc/gcov.texi +++ b/gcc/doc/gcov.texi @@ -333,7 +333,7 @@ Print verbose informations related to basic blocks and arcs. @item -x @itemx --hash-filenames -By default, gcov uses the full pathname of the source files to to create +By default, gcov uses the full pathname of the source files to create an output filename. This can lead to long filenames that can overflow filesystem limits. This option creates names of the form @file{@var{source-file}##@var{md5}.gcov}, diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index ec20fd26685..1cc427249a4 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1072,10 +1072,19 @@ sysv, aix. @itemx --without-multilib-list Specify what multilibs to build. @var{list} is a comma separated list of values, possibly consisting of a single value. Currently only implemented -for arm*-*-*, sh*-*-* and x86-64-*-linux*. The accepted values and meaning -for each target is given below. +for aarch64*-*-*, arm*-*-*, sh*-*-* and x86-64-*-linux*. The accepted +alues and meaning for each target is given below. @table @code +@item aarch64*-*-* +@var{list} is a comma separated list of @code{ilp32}, and @code{lp64} +to enable ILP32 and LP64 run-time libraries, respectively. If +@var{list} is empty, then there will be no multilibs and only the +default run-time library will be built. If @var{list} is +@code{default} or --with-multilib-list= is not specified, then the +default set of libraries is selected based on the value of +@option{--target}. + @item arm*-*-* @var{list} is a comma separated list of @code{aprofile} and @code{rmprofile} to build multilibs for A or R and M architecture profiles respectively. Note diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index bde6b7cbaaf..57340cea31d 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -260,7 +260,7 @@ Objective-C and Objective-C++ Dialects}. @xref{Warning Options,,Options to Request or Suppress Warnings}. @gccoptlist{-fsyntax-only -fmax-errors=@var{n} -Wpedantic @gol -pedantic-errors @gol --w -Wextra -Wall -Waddress -Waggregate-return @gol +-w -Wextra -Wall -Waddress -Waggregate-return -Waligned-new @gol -Walloc-zero -Walloc-size-larger-than=@var{n} -Walloca -Walloca-larger-than=@var{n} @gol -Wno-aggressive-loop-optimizations -Warray-bounds -Warray-bounds=@var{n} @gol @@ -554,7 +554,6 @@ Objective-C and Objective-C++ Dialects}. -fdisable-tree-@var{pass_name} @gol -fdisable-tree-@var{pass-name}=@var{range-list} @gol -fdump-noaddr -fdump-unnumbered -fdump-unnumbered-links @gol --fdump-class-hierarchy@r{[}-@var{n}@r{]} @gol -fdump-final-insns@r{[}=@var{file}@r{]} @gol -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline @gol -fdump-lang-all @gol @@ -1257,12 +1256,14 @@ See RS/6000 and PowerPC Options. -mavx2 -mavx512f -mavx512pf -mavx512er -mavx512cd -mavx512vl @gol -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi -msha -maes @gol -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma -mpconfig -mwbnoinvd @gol --mprefetchwt1 -mclflushopt -mxsavec -mxsaves @gol +-mprefetchwt1 -mclflushopt -mclwb -mxsavec -mxsaves @gol -msse4a -m3dnow -m3dnowa -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop @gol --mlzcnt -mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mlwp -mmpx @gol +-madx -mlzcnt -mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mlwp -mmpx @gol -mmwaitx -mclzero -mpku -mthreads -mgfni -mvaes @gol -mshstk -mforce-indirect-call -mavx512vbmi2 @gol -mvpclmulqdq -mavx512bitalg -mmovdiri -mmovdir64b -mavx512vpopcntdq @gol +-mavx5124fmaps -mavx512vnni -mavx5124vnniw -mprfchw -mrdpid @gol +-mrdseed -msgx @gol -mms-bitfields -mno-align-stringops -minline-all-stringops @gol -minline-stringops-dynamically -mstringop-strategy=@var{alg} @gol -mmemcpy-strategy=@var{strategy} -mmemset-strategy=@var{strategy} @gol @@ -3018,7 +3019,7 @@ void h() @{ f(g); @} @end smallexample @noindent -In C++14, @code{f} calls calls @code{f}, but in +In C++14, @code{f} calls @code{f}, but in C++17 it calls @code{f}. @item -Wclass-memaccess @r{(C++ and Objective-C++ only)} @@ -4537,7 +4538,7 @@ The @option{-Wimplicit-fallthrough=3} warning is enabled by @option{-Wextra}. @opindex Wif-not-aligned @opindex Wno-if-not-aligned Control if warning triggered by the @code{warn_if_not_aligned} attribute -should be issued. This is is enabled by default. +should be issued. This is enabled by default. Use @option{-Wno-if-not-aligned} to disable it. @item -Wignored-qualifiers @r{(C and C++ only)} @@ -7372,7 +7373,7 @@ consumers are not expected to support this extended format, and they would be rendered unable to decode location lists using it. @item -ginternal-reset-location-views -@itemx -gnointernal-reset-location-views +@itemx -gno-internal-reset-location-views @opindex ginternal-reset-location-views @opindex gno-internal-reset-location-views Attempt to determine location views that can be omitted from location @@ -7675,13 +7676,15 @@ results. This is the default. @item -Os @opindex Os Optimize for size. @option{-Os} enables all @option{-O2} optimizations that -do not typically increase code size. It also performs further -optimizations designed to reduce code size. +do not typically increase code size. @option{-Os} disables the following optimization flags: @gccoptlist{-falign-functions -falign-jumps -falign-loops @gol --falign-labels -freorder-blocks -freorder-blocks-algorithm=stc @gol --freorder-blocks-and-partition -fprefetch-loop-arrays} +-falign-labels -fprefetch-loop-arrays} + +It also enables @option{-finline-functions}, causes the compiler to tune for +code size rather than execution speed, and performs further optimizations +designed to reduce code size. @item -Ofast @opindex Ofast @@ -7803,7 +7806,8 @@ time thanks to previous inlining. This option has any effect only when inlining itself is turned on by the @option{-finline-functions} or @option{-finline-small-functions} options. -Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}. +Enabled at levels @option{-O3}, @option{-Os}. Also enabled +by @option{-fprofile-use} and @option{-fauto-profile}. @item -finline-functions @opindex finline-functions @@ -9473,7 +9477,7 @@ for LTO, use @command{gcc-ar} and @command{gcc-ranlib} instead of @command{ar} and @command{ranlib}; to show the symbols of object files with GIMPLE bytecode, use @command{gcc-nm}. Those commands require that @command{ar}, @command{ranlib} -and @command{nm} have been compiled with plugin support. At link time, use the the +and @command{nm} have been compiled with plugin support. At link time, use the flag @option{-fuse-linker-plugin} to ensure that the library participates in the LTO optimization process: @@ -12418,9 +12422,9 @@ of these is when the application wishes to throw and catch exceptions across different shared libraries. In that case, each of the libraries as well as the application itself should use the shared @file{libgcc}. -Therefore, the G++ and driver automatically adds @option{-shared-libgcc} - whenever you build a shared library or a main executable, because C++ - programs typically use exceptions, so this is the right thing to do. +Therefore, the G++ driver automatically adds @option{-shared-libgcc} +whenever you build a shared library or a main executable, because C++ +programs typically use exceptions, so this is the right thing to do. If, instead, you use the GCC driver to create shared libraries, you may find that they are not always linked with the shared @file{libgcc}. @@ -12434,8 +12438,7 @@ propagate through such shared libraries, without incurring relocation costs at library load time. However, if a library or main executable is supposed to throw or catch -exceptions, you must link it using the G++ driver, as appropriate -for the languages used in the program, or using the option +exceptions, you must link it using the G++ driver, or using the option @option{-shared-libgcc}, such that it is linked with the shared @file{libgcc}. @@ -14744,6 +14747,7 @@ Specify the name of the target processor for which GCC should tune the performance of the code. Permissible values for this option are: @samp{generic}, @samp{cortex-a35}, @samp{cortex-a53}, @samp{cortex-a55}, @samp{cortex-a57}, @samp{cortex-a72}, @samp{cortex-a73}, @samp{cortex-a75}, +@samp{cortex-a76}, @samp{ares}, @samp{neoverse-n1} @samp{exynos-m1}, @samp{falkor}, @samp{qdf24xx}, @samp{saphira}, @samp{xgene1}, @samp{vulcan}, @samp{thunderx}, @samp{thunderxt88}, @samp{thunderxt88p1}, @samp{thunderxt81}, @@ -14824,16 +14828,19 @@ an effect when SVE is enabled. GCC supports two forms of SVE code generation: ``vector-length agnostic'' output that works with any size of vector register and -``vector-length specific'' output that only works when the vector -registers are a particular size. Replacing @var{bits} with -@samp{scalable} selects vector-length agnostic output while -replacing it with a number selects vector-length specific output. -The possible lengths in the latter case are: 128, 256, 512, 1024 -and 2048. @samp{scalable} is the default. - -At present, @samp{-msve-vector-bits=128} produces the same output -as @samp{-msve-vector-bits=scalable}. - +``vector-length specific'' output that allows GCC to make assumptions +about the vector length when it is useful for optimization reasons. +The possible values of @samp{bits} are: @samp{scalable}, @samp{128}, +@samp{256}, @samp{512}, @samp{1024} and @samp{2048}. +Specifying @samp{scalable} selects vector-length agnostic +output. At present @samp{-msve-vector-bits=128} also generates vector-length +agnostic output. All other values generate vector-length specific code. +The behavior of these values may change in future releases and no value except +@samp{scalable} should be relied on for producing code that is portable across +different hardware SVE vector lengths. + +The default is @samp{-msve-vector-bits=scalable}, which produces +vector-length agnostic code. @end table @subsubsection @option{-march} and @option{-mcpu} Feature Modifiers @@ -16009,6 +16016,12 @@ Disable the floating-point instructions. @item armv7-a @table @samp +@item +mp +The multiprocessing extension. + +@item +sec +The security extension. + @item +fp The VFPv3 floating-point instructions, with 16 double-precision registers. The extension @samp{+vfpv3-d16} can be used as an alias @@ -16196,6 +16209,14 @@ The single-precision VFPv3 floating-point instructions. The extension The VFPv3 floating-point instructions with 16 double-precision registers. The extension +vfpv3-d16 can be used as an alias for this extension. +@item +vfpv3xd-d16-fp16 +The single-precision VFPv3 floating-point instructions with 16 double-precision +registers and the half-precision floating-point conversion operations. + +@item +vfpv3-d16-fp16 +The VFPv3 floating-point instructions, with 16 double-precision +registers and the half-precision floating-point conversion operations. + @item +nofp Disable the floating-point extension. @@ -16383,7 +16404,8 @@ Disables the floating-point and SIMD instructions on @item +nofp.dp Disables the double-precision component of the floating-point instructions -on @samp{cortex-r5}, @samp{cortex-r52} and @samp{cortex-m7}. +on @samp{cortex-r5}, @samp{cortex-r7}, @samp{cortex-r8}, @samp{cortex-r52} and +@samp{cortex-m7}. @item +nosimd Disables the SIMD (but not floating-point) instructions on @@ -16401,11 +16423,11 @@ Enables the cryptographic instructions on @samp{cortex-a32}, Additionally the @samp{generic-armv7-a} pseudo target defaults to VFPv3 with 16 double-precision registers. It supports the following -extension options: @samp{vfpv3-d16}, @samp{vfpv3}, -@samp{vfpv3-d16-fp16}, @samp{vfpv3-fp16}, @samp{vfpv4-d16}, -@samp{vfpv4}, @samp{neon}, @samp{neon-vfpv3}, @samp{neon-fp16}, -@samp{neon-vfpv4}. The meanings are the same as for the extensions to -@option{-march=armv7-a}. +extension options: @samp{mp}, @samp{sec}, @samp{vfpv3-d16}, +@samp{vfpv3}, @samp{vfpv3-d16-fp16}, @samp{vfpv3-fp16}, +@samp{vfpv4-d16}, @samp{vfpv4}, @samp{neon}, @samp{neon-vfpv3}, +@samp{neon-fp16}, @samp{neon-vfpv4}. The meanings are the same as for +the extensions to @option{-march=armv7-a}. @option{-mcpu=generic-@var{arch}} is also permissible, and is equivalent to @option{-march=@var{arch} -mtune=generic-@var{arch}}. @@ -20061,7 +20083,7 @@ Use features of, and schedule code for, the given CPU. Supported values are in the format @samp{v@var{X}.@var{YY}.@var{Z}}, where @var{X} is a major version, @var{YY} is the minor version, and @var{Z} is compatibility code. Example values are @samp{v3.00.a}, -@samp{v4.00.b}, @samp{v5.00.a}, @samp{v5.00.b}, @samp{v5.00.b}, @samp{v6.00.a}. +@samp{v4.00.b}, @samp{v5.00.a}, @samp{v5.00.b}, @samp{v6.00.a}. @item -mxl-soft-mul @opindex mxl-soft-mul @@ -21723,7 +21745,7 @@ GP-relative addressing. It is most useful in conjunction with The @var{regexp} is a POSIX Extended Regular Expression. This option does not affect the behavior of the @option{-G} option, and -and the specified sections are in addition to the standard @code{.sdata} +the specified sections are in addition to the standard @code{.sdata} and @code{.sbss} small-data sections that are recognized by @option{-mgpopt}. @item -mr0rel-sec=@var{regexp} @@ -22690,7 +22712,8 @@ Change the current ABI to use IBM extended-precision long double. This is not likely to work if your system defaults to using IEEE extended-precision long double. If you change the long double type from IEEE extended-precision, the compiler will issue a warning unless -you use the @option{-Wno-psabi} option. +you use the @option{-Wno-psabi} option. Requires @option{-mlong-double-128} +to be enabled. @item -mabi=ieeelongdouble @opindex mabi=ieeelongdouble @@ -22698,7 +22721,8 @@ Change the current ABI to use IEEE extended-precision long double. This is not likely to work if your system defaults to using IBM extended-precision long double. If you change the long double type from IBM extended-precision, the compiler will issue a warning unless -you use the @option{-Wno-psabi} option. +you use the @option{-Wno-psabi} option. Requires @option{-mlong-double-128} +to be enabled. @item -mabi=elfv1 @opindex mabi=elfv1 @@ -23991,7 +24015,8 @@ Change the current ABI to use IBM extended-precision long double. This is not likely to work if your system defaults to using IEEE extended-precision long double. If you change the long double type from IEEE extended-precision, the compiler will issue a warning unless -you use the @option{-Wno-psabi} option. +you use the @option{-Wno-psabi} option. Requires @option{-mlong-double-128} +to be enabled. @item -mabi=ieeelongdouble @opindex mabi=ieeelongdouble @@ -23999,7 +24024,8 @@ Change the current ABI to use IEEE extended-precision long double. This is not likely to work if your system defaults to using IBM extended-precision long double. If you change the long double type from IBM extended-precision, the compiler will issue a warning unless -you use the @option{-Wno-psabi} option. +you use the @option{-Wno-psabi} option. Requires @option{-mlong-double-128} +to be enabled. @item -mabi=elfv1 @opindex mabi=elfv1 @@ -24787,8 +24813,8 @@ Generate code that runs on @var{cpu-type}, which is the name of a system representing a certain processor type. Possible values for @var{cpu-type} are @samp{z900}/@samp{arch5}, @samp{z990}/@samp{arch6}, @samp{z9-109}, @samp{z9-ec}/@samp{arch7}, @samp{z10}/@samp{arch8}, -@samp{z196}/@samp{arch9}, @samp{zEC12}, @samp{z13}/@samp{arch11}, and -@samp{native}. +@samp{z196}/@samp{arch9}, @samp{zEC12}, @samp{z13}/@samp{arch11}, +@samp{z14}/@samp{arch12}, and @samp{native}. The default is @option{-march=z900}. @samp{g5}/@samp{arch3} and @samp{g6} are deprecated and will be removed with future releases. @@ -27225,6 +27251,9 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}. @itemx -mclflushopt @opindex mclflushopt @need 200 +@itemx -mclwb +@opindex mclwb +@need 200 @itemx -mfsgsbase @opindex mfsgsbase @need 200 @@ -27246,9 +27275,21 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}. @itemx -mfma4 @opindex mfma4 @need 200 +@itemx -mprfchw +@opindex mprfchw +@need 200 +@itemx -mrdpid +@opindex mrdpid +@need 200 @itemx -mprefetchwt1 @opindex mprefetchwt1 @need 200 +@itemx -mrdseed +@opindex mrdseed +@need 200 +@itemx -msgx +@opindex msgx +@need 200 @itemx -mxop @opindex mxop @need 200 @@ -27267,10 +27308,14 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}. @itemx -mabm @opindex mabm @need 200 +@itemx -madx +@opindex madx +@need 200 @itemx -mbmi @opindex mbmi @need 200 @itemx -mbmi2 +@opindex mbmi2 @need 200 @itemx -mlzcnt @opindex mlzcnt @@ -27293,6 +27338,9 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}. @itemx -mrtm @opindex mrtm @need 200 +@itemx -mhle +@opindex mhle +@need 200 @itemx -mtbm @opindex mtbm @need 200 @@ -27331,15 +27379,26 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}. @need 200 @itemx -mavx512vpopcntdq @opindex mavx512vpopcntdq +@need 200 +@itemx -mavx5124fmaps +@opindex mavx5124fmaps +@need 200 +@itemx -mavx512vnni +@opindex mavx512vnni +@need 200 +@itemx -mavx5124vnniw +@opindex mavx5124vnniw These switches enable the use of instructions in the MMX, SSE, -SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD, -SHA, AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM, -AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, BMI, BMI2, VAES, -FXSR, XSAVE, XSAVEOPT, LZCNT, RTM, MPX, MWAITX, PKU, IBT, SHSTK, AVX512VBMI2, -GFNI, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B, -AVX512VPOPCNTDQ3DNow!@: or enhanced 3DNow!@: extended instruction sets. -Each has a corresponding @option{-mno-} option to disable use of these -instructions. +SSE2, SSE3, SSSE3, SSE4, SSE4A, SSE4.1, SSE4.2, AVX, AVX2, AVX512F, AVX512PF, +AVX512ER, AVX512CD, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, SHA, +AES, PCLMUL, CLFLUSHOPT, CLWB, FSGSBASE, RDRND, F16C, FMA, PCONFIG, +WBNOINVD, FMA4, PREFETCHW, RDPID, PREFETCHWT1, RDSEED, SGX, XOP, LWP, +3DNow!@:, enhanced 3DNow!@:, POPCNT, ABM, ADX, BMI, BMI2, LZCNT, FXSR, XSAVE, +XSAVEOPT, XSAVEC, XSAVES, RTM, HLE, TBM, MPX, MWAITX, CLZERO, PKU, AVX512VBMI2, +GFNI, VAES, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B, +AVX512VPOPCNTDQ, AVX5124FMAPS, AVX512VNNI, or AVX5124VNNIW +extended instruction sets. Each has a corresponding @option{-mno-} option to +disable use of these instructions. These extensions are also available as built-in functions: see @ref{x86 Built-in Functions}, for details of the functions enabled and @@ -27528,11 +27587,11 @@ To use this option, both @option{-ftree-vectorize} and ABI-compatible library must be specified at link time. GCC currently emits calls to @code{vmldExp2}, -@code{vmldLn2}, @code{vmldLog102}, @code{vmldLog102}, @code{vmldPow2}, +@code{vmldLn2}, @code{vmldLog102}, @code{vmldPow2}, @code{vmldTanh2}, @code{vmldTan2}, @code{vmldAtan2}, @code{vmldAtanh2}, @code{vmldCbrt2}, @code{vmldSinh2}, @code{vmldSin2}, @code{vmldAsinh2}, @code{vmldAsin2}, @code{vmldCosh2}, @code{vmldCos2}, @code{vmldAcosh2}, -@code{vmldAcos2}, @code{vmlsExp4}, @code{vmlsLn4}, @code{vmlsLog104}, +@code{vmldAcos2}, @code{vmlsExp4}, @code{vmlsLn4}, @code{vmlsLog104}, @code{vmlsPow4}, @code{vmlsTanh4}, @code{vmlsTan4}, @code{vmlsAtan4}, @code{vmlsAtanh4}, @code{vmlsCbrt4}, @code{vmlsSinh4}, @code{vmlsSin4}, @code{vmlsAsinh4}, @code{vmlsAsin4}, @code{vmlsCosh4}, diff --git a/gcc/dojump.c b/gcc/dojump.c index 9da8a0e3091..3a57a21bdfe 100644 --- a/gcc/dojump.c +++ b/gcc/dojump.c @@ -1214,15 +1214,15 @@ do_compare_and_jump (tree treeop0, tree treeop1, enum rtx_code signed_code, code = unsignedp ? unsigned_code : signed_code; /* If function pointers need to be "canonicalized" before they can - be reliably compared, then canonicalize them. - Only do this if *both* sides of the comparison are function pointers. - If one side isn't, we want a noncanonicalized comparison. See PR - middle-end/17564. */ + be reliably compared, then canonicalize them. Canonicalize the + expression when one of the operands is a function pointer. This + handles the case where the other operand is a void pointer. See + PR middle-end/17564. */ if (targetm.have_canonicalize_funcptr_for_compare () - && POINTER_TYPE_P (TREE_TYPE (treeop0)) - && POINTER_TYPE_P (TREE_TYPE (treeop1)) - && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (treeop0))) - && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (treeop1)))) + && ((POINTER_TYPE_P (TREE_TYPE (treeop0)) + && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (treeop0)))) + || (POINTER_TYPE_P (TREE_TYPE (treeop1)) + && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (treeop1)))))) { rtx new_op0 = gen_reg_rtx (mode); rtx new_op1 = gen_reg_rtx (mode); diff --git a/gcc/dse.c b/gcc/dse.c index 26c6007b9ed..1938e745bf3 100644 --- a/gcc/dse.c +++ b/gcc/dse.c @@ -2515,10 +2515,13 @@ scan_insn (bb_info_t bb_info, rtx_insn *insn) clear_rhs_from_active_local_stores (); } } - else if (SIBLING_CALL_P (insn) && reload_completed) + else if (SIBLING_CALL_P (insn) + && (reload_completed || HARD_FRAME_POINTER_IS_ARG_POINTER)) /* Arguments for a sibling call that are pushed to memory are passed using the incoming argument pointer of the current function. After - reload that might be (and likely is) frame pointer based. */ + reload that might be (and likely is) frame pointer based. And, if + it is a frame pointer on the target, even before reload we need to + kill frame pointer based stores. */ add_wild_read (bb_info); else /* Every other call, including pure functions, may read any memory diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index dcd040901fe..88e5406694e 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -1762,7 +1762,7 @@ dwarf2out_frame_debug_expr (rtx expr) /* Rule 6 */ case CONST_INT: - case POLY_INT_CST: + case CONST_POLY_INT: cur_trace->cfa_temp.reg = dwf_regno (dest); cur_trace->cfa_temp.offset = rtx_to_poly_int64 (src); break; diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index d94cf7dc928..0d67d303eb7 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -304,6 +304,10 @@ static unsigned int rnglist_idx; #define FUNC_BEGIN_LABEL "LFB" #endif +#ifndef FUNC_SECOND_SECT_LABEL +#define FUNC_SECOND_SECT_LABEL "LFSB" +#endif + #ifndef FUNC_END_LABEL #define FUNC_END_LABEL "LFE" #endif @@ -1219,21 +1223,24 @@ static void set_cur_line_info_table (section *); void dwarf2out_switch_text_section (void) { + char label[MAX_ARTIFICIAL_LABEL_BYTES]; section *sect; dw_fde_ref fde = cfun->fde; gcc_assert (cfun && fde && fde->dw_fde_second_begin == NULL); + ASM_GENERATE_INTERNAL_LABEL (label, FUNC_SECOND_SECT_LABEL, + current_function_funcdef_no); + + fde->dw_fde_second_begin = ggc_strdup (label); if (!in_cold_section_p) { fde->dw_fde_end = crtl->subsections.cold_section_end_label; - fde->dw_fde_second_begin = crtl->subsections.hot_section_label; fde->dw_fde_second_end = crtl->subsections.hot_section_end_label; } else { fde->dw_fde_end = crtl->subsections.hot_section_end_label; - fde->dw_fde_second_begin = crtl->subsections.cold_section_label; fde->dw_fde_second_end = crtl->subsections.cold_section_end_label; } have_multiple_function_sections = true; @@ -2868,9 +2875,13 @@ const struct gcc_debug_hooks dwarf2_lineno_debug_hooks = separate comdat sections since the linker will then be able to remove duplicates. But not all tools support .debug_types sections yet. For Dwarf V5 or higher .debug_types doesn't exist any more, - it is DW_UT_type unit type in .debug_info section. */ + it is DW_UT_type unit type in .debug_info section. For late LTO + debug there should be almost no types emitted so avoid enabling + -fdebug-types-section there. */ -#define use_debug_types (dwarf_version >= 4 && flag_debug_types_section) +#define use_debug_types (dwarf_version >= 4 \ + && flag_debug_types_section \ + && !in_lto_p) /* Various DIE's use offsets relative to the beginning of the .debug_info section to refer to each other. */ @@ -3706,7 +3717,7 @@ static void output_die_abbrevs (unsigned long, dw_die_ref); static void output_die (dw_die_ref); static void output_compilation_unit_header (enum dwarf_unit_type); static void output_comp_unit (dw_die_ref, int, const unsigned char *); -static void output_comdat_type_unit (comdat_type_node *); +static void output_comdat_type_unit (comdat_type_node *, bool); static const char *dwarf2_name (tree, int); static void add_pubname (tree, dw_die_ref); static void add_enumerator_pubname (const char *, dw_die_ref); @@ -8156,6 +8167,11 @@ copy_ancestor_tree (dw_die_ref unit, dw_die_ref die, decl_table_entry **slot = NULL; struct decl_table_entry *entry = NULL; + /* If DIE refers to a stub unfold that so we get the appropriate + DIE registered as orig in decl_table. */ + if (dw_die_ref c = get_AT_ref (die, DW_AT_signature)) + die = c; + if (decl_table) { /* Check if the entry has already been copied to UNIT. */ @@ -8709,6 +8725,33 @@ copy_decls_walk (dw_die_ref unit, dw_die_ref die, decl_hash_type *decl_table) FOR_EACH_CHILD (die, c, copy_decls_walk (unit, c, decl_table)); } +/* Collect skeleton dies in DIE created by break_out_comdat_types already + and record them in DECL_TABLE. */ + +static void +collect_skeleton_dies (dw_die_ref die, decl_hash_type *decl_table) +{ + dw_die_ref c; + + if (dw_attr_node *a = get_AT (die, DW_AT_signature)) + { + dw_die_ref targ = AT_ref (a); + gcc_assert (targ->die_mark == 0 && targ->comdat_type_p); + decl_table_entry **slot + = decl_table->find_slot_with_hash (targ, + htab_hash_pointer (targ), + INSERT); + gcc_assert (*slot == HTAB_EMPTY_ENTRY); + /* Record in DECL_TABLE that TARG has been already copied + by remove_child_or_replace_with_skeleton. */ + decl_table_entry *entry = XCNEW (struct decl_table_entry); + entry->orig = targ; + entry->copy = die; + *slot = entry; + } + FOR_EACH_CHILD (die, c, collect_skeleton_dies (c, decl_table)); +} + /* Copy declarations for "unworthy" types into the new comdat section. Incomplete types, modified types, and certain other types aren't broken out into comdat sections of their own, so they don't have a signature, @@ -8720,6 +8763,7 @@ copy_decls_for_unworthy_types (dw_die_ref unit) { mark_dies (unit); decl_hash_type decl_table (10); + collect_skeleton_dies (unit, &decl_table); copy_decls_walk (unit, unit, &decl_table); unmark_dies (unit); } @@ -9013,8 +9057,10 @@ build_abbrev_table (dw_die_ref die, external_ref_hash_type *extern_map) struct external_ref *ref_p; gcc_assert (AT_ref (a)->comdat_type_p || AT_ref (a)->die_id.die_symbol); - ref_p = lookup_external_ref (extern_map, c); - if (ref_p->stub && ref_p->stub != die) + if (is_type_die (c) + && (ref_p = lookup_external_ref (extern_map, c)) + && ref_p->stub && ref_p->stub != die + && a->dw_attr != DW_AT_signature) change_AT_die_ref (a, ref_p->stub); else /* We aren't changing this reference, so mark it external. */ @@ -9297,7 +9343,6 @@ size_of_die (dw_die_ref die) } break; case dw_val_class_loc_list: - case dw_val_class_view_list: if (dwarf_split_debug_info && dwarf_version >= 5) { gcc_assert (AT_loc_list (a)->num_assigned); @@ -9306,6 +9351,9 @@ size_of_die (dw_die_ref die) else size += DWARF_OFFSET_SIZE; break; + case dw_val_class_view_list: + size += DWARF_OFFSET_SIZE; + break; case dw_val_class_range_list: if (value_format (a) == DW_FORM_rnglistx) { @@ -9383,7 +9431,7 @@ size_of_die (dw_die_ref die) we use DW_FORM_ref_addr. In DWARF2, DW_FORM_ref_addr is sized by target address length, whereas in DWARF3 it's always sized as an offset. */ - if (use_debug_types) + if (AT_ref (a)->comdat_type_p) size += DWARF_TYPE_SIGNATURE_SIZE; else if (dwarf_version == 2) size += DWARF2_ADDR_SIZE; @@ -9679,12 +9727,12 @@ value_format (dw_attr_node *a) gcc_unreachable (); } case dw_val_class_loc_list: - case dw_val_class_view_list: if (dwarf_split_debug_info && dwarf_version >= 5 && AT_loc_list (a)->num_assigned) return DW_FORM_loclistx; /* FALLTHRU */ + case dw_val_class_view_list: case dw_val_class_range_list: /* For range lists in DWARF 5, use DW_FORM_rnglistx from .debug_info.dwo but in .debug_info use DW_FORM_sec_offset, which is shorter if we @@ -9827,7 +9875,12 @@ value_format (dw_attr_node *a) return DW_FORM_flag; case dw_val_class_die_ref: if (AT_ref_external (a)) - return use_debug_types ? DW_FORM_ref_sig8 : DW_FORM_ref_addr; + { + if (AT_ref (a)->comdat_type_p) + return DW_FORM_ref_sig8; + else + return DW_FORM_ref_addr; + } else return DW_FORM_ref; case dw_val_class_fde_ref: @@ -11060,7 +11113,9 @@ output_comp_unit (dw_die_ref die, int output_if_empty, static inline bool want_pubnames (void) { - if (debug_info_level <= DINFO_LEVEL_TERSE) + if (debug_info_level <= DINFO_LEVEL_TERSE + /* Names and types go to the early debug part only. */ + || in_lto_p) return false; if (debug_generate_pub_sections != -1) return debug_generate_pub_sections; @@ -11173,7 +11228,8 @@ output_skeleton_debug_sections (dw_die_ref comp_unit, /* Output a comdat type unit DIE and its children. */ static void -output_comdat_type_unit (comdat_type_node *node) +output_comdat_type_unit (comdat_type_node *node, + bool early_lto_debug ATTRIBUTE_UNUSED) { const char *secname; char *tmp; @@ -11200,14 +11256,16 @@ output_comdat_type_unit (comdat_type_node *node) if (dwarf_version >= 5) { if (!dwarf_split_debug_info) - secname = ".debug_info"; + secname = early_lto_debug ? DEBUG_LTO_INFO_SECTION : DEBUG_INFO_SECTION; else - secname = ".debug_info.dwo"; + secname = (early_lto_debug + ? DEBUG_LTO_DWO_INFO_SECTION : DEBUG_DWO_INFO_SECTION); } else if (!dwarf_split_debug_info) - secname = ".debug_types"; + secname = early_lto_debug ? ".gnu.debuglto_.debug_types" : ".debug_types"; else - secname = ".debug_types.dwo"; + secname = (early_lto_debug + ? ".gnu.debuglto_.debug_types.dwo" : ".debug_types.dwo"); tmp = XALLOCAVEC (char, 4 + DWARF_TYPE_SIGNATURE_SIZE * 2); sprintf (tmp, dwarf_version >= 5 ? "wi." : "wt."); @@ -13136,6 +13194,8 @@ modified_type_die (tree type, int cv_quals, bool reverse, && TYPE_PRECISION (sizetype) == TYPE_PRECISION (size_type_node) && TYPE_UNSIGNED (sizetype) == TYPE_UNSIGNED (size_type_node)) qualified_type = size_type_node; + if (type == sizetype) + type = qualified_type; } /* If we do, then we can just use its DIE, if it exists. */ @@ -14391,6 +14451,10 @@ expansion_failed (tree expr, rtx rtl, char const *reason) } } +/* True if handling a former CONST by mem_loc_descriptor piecewise. */ + +static bool in_const_p; + /* Helper function for const_ok_for_output. */ static bool @@ -14413,6 +14477,7 @@ const_ok_for_output_1 (rtx rtl) one in a constant pool entry, so testing SYMBOL_REF_TLS_MODEL rather than DECL_THREAD_LOCAL_P is not just an optimization. */ if (flag_checking + && !in_const_p && (XVECLEN (rtl, 0) == 0 || GET_CODE (XVECEXP (rtl, 0, 0)) != SYMBOL_REF || SYMBOL_REF_TLS_MODEL (XVECEXP (rtl, 0, 0)) == TLS_MODEL_NONE)) @@ -14436,13 +14501,6 @@ const_ok_for_output_1 (rtx rtl) if (CONST_POLY_INT_P (rtl)) return false; - if (targetm.const_not_ok_for_debug_p (rtl)) - { - expansion_failed (NULL_TREE, rtl, - "Expression rejected for debug by the backend.\n"); - return false; - } - /* FIXME: Refer to PR60655. It is possible for simplification of rtl expressions in var tracking to produce such expressions. We should really identify / validate expressions @@ -14455,6 +14513,41 @@ const_ok_for_output_1 (rtx rtl) case NOT: case NEG: return false; + case PLUS: + { + /* Make sure SYMBOL_REFs/UNSPECs are at most in one of the + operands. */ + subrtx_var_iterator::array_type array; + bool first = false; + FOR_EACH_SUBRTX_VAR (iter, array, XEXP (rtl, 0), ALL) + if (SYMBOL_REF_P (*iter) + || LABEL_P (*iter) + || GET_CODE (*iter) == UNSPEC) + { + first = true; + break; + } + if (!first) + return true; + FOR_EACH_SUBRTX_VAR (iter, array, XEXP (rtl, 1), ALL) + if (SYMBOL_REF_P (*iter) + || LABEL_P (*iter) + || GET_CODE (*iter) == UNSPEC) + return false; + return true; + } + case MINUS: + { + /* Disallow negation of SYMBOL_REFs or UNSPECs when they + appear in the second operand of MINUS. */ + subrtx_var_iterator::array_type array; + FOR_EACH_SUBRTX_VAR (iter, array, XEXP (rtl, 1), ALL) + if (SYMBOL_REF_P (*iter) + || LABEL_P (*iter) + || GET_CODE (*iter) == UNSPEC) + return false; + return true; + } default: return true; } @@ -15598,6 +15691,7 @@ mem_loc_descriptor (rtx rtl, machine_mode mode, pool. */ case CONST: case SYMBOL_REF: + case UNSPEC: if (!is_a (mode, &int_mode) || (GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE #ifdef POINTERS_EXTEND_UNSIGNED @@ -15605,6 +15699,43 @@ mem_loc_descriptor (rtx rtl, machine_mode mode, #endif )) break; + + if (GET_CODE (rtl) == UNSPEC) + { + /* If delegitimize_address couldn't do anything with the UNSPEC, we + can't express it in the debug info. This can happen e.g. with some + TLS UNSPECs. Allow UNSPECs formerly from CONST that the backend + approves. */ + bool not_ok = false; + + if (!in_const_p) + break; + + subrtx_var_iterator::array_type array; + FOR_EACH_SUBRTX_VAR (iter, array, rtl, ALL) + if (*iter != rtl && !CONSTANT_P (*iter)) + { + not_ok = true; + break; + } + + if (not_ok) + break; + + FOR_EACH_SUBRTX_VAR (iter, array, rtl, ALL) + if (!const_ok_for_output_1 (*iter)) + { + not_ok = true; + break; + } + + if (not_ok) + break; + + rtl = gen_rtx_CONST (GET_MODE (rtl), rtl); + goto symref; + } + if (GET_CODE (rtl) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rtl) != TLS_MODEL_NONE) { @@ -15652,8 +15783,13 @@ mem_loc_descriptor (rtx rtl, machine_mode mode, } break; default: - mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), int_mode, - mem_mode, initialized); + { + bool save_in_const_p = in_const_p; + in_const_p = true; + mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), int_mode, + mem_mode, initialized); + in_const_p = save_in_const_p; + } break; } break; @@ -16273,7 +16409,6 @@ mem_loc_descriptor (rtx rtl, machine_mode mode, case VEC_CONCAT: case VEC_DUPLICATE: case VEC_SERIES: - case UNSPEC: case HIGH: case FMA: case STRICT_LOW_PART: @@ -16281,9 +16416,6 @@ mem_loc_descriptor (rtx rtl, machine_mode mode, case CONST_FIXED: case CLRSB: case CLOBBER: - /* If delegitimize_address couldn't do anything with the UNSPEC, we - can't express it in the debug info. This can happen e.g. with some - TLS UNSPECs. */ break; case CONST_STRING: @@ -16737,7 +16869,15 @@ secname_for_decl (const_tree decl) && DECL_SECTION_NAME (decl)) secname = DECL_SECTION_NAME (decl); else if (current_function_decl && DECL_SECTION_NAME (current_function_decl)) - secname = DECL_SECTION_NAME (current_function_decl); + { + if (in_cold_section_p) + { + section *sec = current_function_section (); + if (sec->common.flags & SECTION_NAMED) + return sec->named.name; + } + secname = DECL_SECTION_NAME (current_function_decl); + } else if (cfun && in_cold_section_p) secname = crtl->subsections.cold_section_label; else @@ -17753,6 +17893,8 @@ resolve_args_picking_1 (dw_loc_descr_ref loc, unsigned initial_frame_offset, case DW_OP_push_object_address: case DW_OP_call_frame_cfa: case DW_OP_GNU_variable_value: + case DW_OP_GNU_addr_index: + case DW_OP_GNU_const_index: ++frame_offset_; break; @@ -19535,6 +19677,9 @@ add_const_value_attribute (dw_die_ref die, rtx rtl) case HIGH: case CONST_FIXED: + case MINUS: + case SIGN_EXTEND: + case ZERO_EXTEND: return false; case MEM: @@ -22076,19 +22221,18 @@ gen_formal_parameter_die (tree node, tree origin, bool emit_name_p, /* If the contexts differ, we may not be talking about the same thing. ??? When in LTO the DIE parent is the "abstract" copy and the - context_die is the specification "copy". But this whole block - should eventually be no longer needed. */ - if (parm_die && parm_die->die_parent != context_die && !in_lto_p) + context_die is the specification "copy". */ + if (parm_die + && parm_die->die_parent != context_die + && (parm_die->die_parent->die_tag != DW_TAG_GNU_formal_parameter_pack + || parm_die->die_parent->die_parent != context_die) + && !in_lto_p) { - if (!DECL_ABSTRACT_P (node)) - { - /* This can happen when creating an inlined instance, in - which case we need to create a new DIE that will get - annotated with DW_AT_abstract_origin. */ - parm_die = NULL; - } - else - gcc_unreachable (); + gcc_assert (!DECL_ABSTRACT_P (node)); + /* This can happen when creating a concrete instance, in + which case we need to create a new DIE that will get + annotated with DW_AT_abstract_origin. */ + parm_die = NULL; } if (parm_die && parm_die->die_parent == NULL) @@ -23872,6 +24016,10 @@ gen_label_die (tree decl, dw_die_ref context_die) static inline void add_call_src_coords_attributes (tree stmt, dw_die_ref die) { + /* We can end up with BUILTINS_LOCATION here. */ + if (RESERVED_LOCATION_P (BLOCK_SOURCE_LOCATION (stmt))) + return; + expanded_location s = expand_location (BLOCK_SOURCE_LOCATION (stmt)); if (dwarf_version >= 3 || !dwarf_strict) @@ -24922,7 +25070,7 @@ gen_member_die (tree type, dw_die_ref context_die) the TREE node representing the appropriate (containing) type. */ /* First output info about the base classes. */ - if (binfo) + if (binfo && early_dwarf) { vec *accesses = BINFO_BASE_ACCESSES (binfo); int i; @@ -26378,7 +26526,7 @@ dwarf2out_early_global_decl (tree decl) enough so that it lands in its own context. This avoids type pruning issues later on. */ if (context_die == NULL || is_declaration_die (context_die)) - dwarf2out_decl (context); + dwarf2out_early_global_decl (context); } /* Emit an abstract origin of a function first. This happens @@ -26443,16 +26591,12 @@ dwarf2out_late_global_decl (tree decl) { dw_die_ref die = lookup_decl_die (decl); - /* We may have to generate early debug late for LTO in case debug + /* We may have to generate full debug late for LTO in case debug was not enabled at compile-time or the target doesn't support the LTO early debug scheme. */ if (! die && in_lto_p) - { - dwarf2out_decl (decl); - die = lookup_decl_die (decl); - } - - if (die) + dwarf2out_decl (decl); + else if (die) { /* We get called via the symtab code invoking late_global_decl for symbols that are optimized out. @@ -28472,7 +28616,7 @@ init_sections_and_labels (bool early_lto_debug) debug_str_section = get_section (DEBUG_LTO_STR_SECTION, DEBUG_STR_SECTION_FLAGS | SECTION_EXCLUDE, NULL); - if (!dwarf_split_debug_info && !output_asm_line_debug_info ()) + if (!dwarf_split_debug_info) debug_line_str_section = get_section (DEBUG_LTO_LINE_STR_SECTION, DEBUG_STR_SECTION_FLAGS | SECTION_EXCLUDE, NULL); @@ -31074,6 +31218,11 @@ dwarf2out_finish (const char *) /* Remove indirect string decisions. */ debug_str_hash->traverse (NULL); + if (debug_line_str_hash) + { + debug_line_str_hash->traverse (NULL); + debug_line_str_hash = NULL; + } } #if ENABLE_ASSERT_CHECKING @@ -31082,6 +31231,8 @@ dwarf2out_finish (const char *) FOR_EACH_CHILD (die, c, gcc_assert (! c->die_mark)); } #endif + for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) + resolve_addr (ctnode->root_die); resolve_addr (comp_unit_die ()); move_marked_base_types (); @@ -31261,7 +31412,7 @@ dwarf2out_finish (const char *) ? dl_section_ref : debug_skeleton_line_section_label)); - output_comdat_type_unit (ctnode); + output_comdat_type_unit (ctnode, false); *slot = ctnode; } @@ -31330,8 +31481,8 @@ dwarf2out_finish (const char *) switch_to_section (debug_loc_section); if (dwarf_version >= 5) { - ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_LOC_SECTION_LABEL, 1); - ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_LOC_SECTION_LABEL, 2); + ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_LOC_SECTION_LABEL, 2); + ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_LOC_SECTION_LABEL, 3); if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) dw2_asm_output_data (4, 0xffffffff, "Initial length escape value indicating " @@ -31832,10 +31983,10 @@ dwarf2out_early_finish (const char *filename) /* Do not generate DWARF assembler now when not producing LTO bytecode. */ if ((!flag_generate_lto && !flag_generate_offload) - /* FIXME: Disable debug info generation for PE-COFF targets since the + /* FIXME: Disable debug info generation for (PE-)COFF targets since the copy_lto_debug_sections operation of the simple object support in libiberty is not implemented for them yet. */ - || TARGET_PECOFF) + || TARGET_PECOFF || TARGET_COFF) return; /* Now as we are going to output for LTO initialize sections and labels @@ -31902,7 +32053,7 @@ dwarf2out_early_finish (const char *filename) ? debug_line_section_label : debug_skeleton_line_section_label)); - output_comdat_type_unit (ctnode); + output_comdat_type_unit (ctnode, true); *slot = ctnode; } @@ -31950,6 +32101,13 @@ dwarf2out_early_finish (const char *filename) /* If we emitted any indirect strings, output the string table too. */ if (debug_str_hash || skeleton_debug_str_hash) output_indirect_strings (); + if (debug_line_str_hash) + { + switch_to_section (debug_line_str_section); + const enum dwarf_form form = DW_FORM_line_strp; + debug_line_str_hash->traverse (form); + } /* Switch back to the text section. */ switch_to_section (text_section); diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 613030fa814..543445116f0 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -3940,6 +3940,7 @@ try_split (rtx pat, rtx_insn *trial, int last) break; case REG_NON_LOCAL_GOTO: + case REG_LABEL_TARGET: for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn)) { if (JUMP_P (insn)) diff --git a/gcc/except.c b/gcc/except.c index ba42bf68b43..1243ee8dc65 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1755,6 +1755,8 @@ copy_reg_eh_region_note_forward (rtx note_or_insn, rtx_insn *first, rtx last) if (note == NULL) return; } + else if (is_a (note_or_insn)) + return; note = XEXP (note, 0); for (insn = first; insn != last ; insn = NEXT_INSN (insn)) @@ -1777,6 +1779,8 @@ copy_reg_eh_region_note_backward (rtx note_or_insn, rtx_insn *last, rtx first) if (note == NULL) return; } + else if (is_a (note_or_insn)) + return; note = XEXP (note, 0); for (insn = last; insn != first; insn = PREV_INSN (insn)) diff --git a/gcc/explow.c b/gcc/explow.c index fb2b7ff9f95..72e52703c48 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -893,16 +893,7 @@ promote_ssa_mode (const_tree name, int *punsignedp) tree type = TREE_TYPE (name); int unsignedp = TYPE_UNSIGNED (type); - machine_mode mode = TYPE_MODE (type); - - /* Bypass TYPE_MODE when it maps vector modes to BLKmode. */ - if (mode == BLKmode) - { - gcc_assert (VECTOR_TYPE_P (type)); - mode = type->type_common.mode; - } - - machine_mode pmode = promote_mode (type, mode, &unsignedp); + machine_mode pmode = promote_mode (type, TYPE_MODE (type), &unsignedp); if (punsignedp) *punsignedp = unsignedp; diff --git a/gcc/expmed.c b/gcc/expmed.c index 4c74e7dc2ea..114f108cb74 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -838,6 +838,27 @@ store_bit_field_1 (rtx str_rtx, poly_uint64 bitsize, poly_uint64 bitnum, if (MEM_P (op0)) op0 = adjust_bitfield_address_size (op0, op0_mode.else_blk (), 0, MEM_SIZE (op0)); + else if (!op0_mode.exists ()) + { + if (ibitnum == 0 + && known_eq (ibitsize, GET_MODE_BITSIZE (GET_MODE (op0))) + && MEM_P (value) + && !reverse) + { + value = adjust_address (value, GET_MODE (op0), 0); + emit_move_insn (op0, value); + return true; + } + if (!fallback_p) + return false; + rtx temp = assign_stack_temp (GET_MODE (op0), + GET_MODE_SIZE (GET_MODE (op0))); + emit_move_insn (temp, op0); + store_bit_field_1 (temp, bitsize, bitnum, 0, 0, fieldmode, value, + reverse, fallback_p); + emit_move_insn (op0, temp); + return true; + } else op0 = gen_lowpart (op0_mode.require (), op0); } @@ -3343,20 +3364,29 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val, /* Write a REG_EQUAL note on the last insn so that we can cse multiplication sequences. Note that if ACCUM is a SUBREG, we've set the inner register and must properly indicate that. */ - tem = op0, nmode = mode; - accum_inner = accum; - if (GET_CODE (accum) == SUBREG) + tem = op0, nmode = mode; + accum_inner = accum; + if (GET_CODE (accum) == SUBREG) { accum_inner = SUBREG_REG (accum); nmode = GET_MODE (accum_inner); tem = gen_lowpart (nmode, op0); } - insn = get_last_insn (); - set_dst_reg_note (insn, REG_EQUAL, - gen_rtx_MULT (nmode, tem, - gen_int_mode (val_so_far, nmode)), - accum_inner); + /* Don't add a REG_EQUAL note if tem is a paradoxical SUBREG. + In that case, only the low bits of accum would be guaranteed to + be equal to the content of the REG_EQUAL note, the upper bits + can be anything. */ + if (!paradoxical_subreg_p (tem)) + { + insn = get_last_insn (); + wide_int wval_so_far + = wi::uhwi (val_so_far, + GET_MODE_PRECISION (as_a (nmode))); + rtx c = immed_wide_int_const (wval_so_far, nmode); + set_dst_reg_note (insn, REG_EQUAL, gen_rtx_MULT (nmode, tem, c), + accum_inner); + } } } @@ -4480,6 +4510,11 @@ expand_divmod (int rem_flag, enum tree_code code, machine_mode mode, HOST_WIDE_INT d = INTVAL (op1); unsigned HOST_WIDE_INT abs_d; + /* Not prepared to handle division/remainder by + 0xffffffffffffffff8000000000000000 etc. */ + if (d == HOST_WIDE_INT_MIN && size > HOST_BITS_PER_WIDE_INT) + break; + /* Since d might be INT_MIN, we have to cast to unsigned HOST_WIDE_INT before negating to avoid undefined signed overflow. */ @@ -4522,9 +4557,7 @@ expand_divmod (int rem_flag, enum tree_code code, machine_mode mode, || (optab_handler (sdivmod_optab, int_mode) != CODE_FOR_nothing))) ; - else if (EXACT_POWER_OF_2_OR_ZERO_P (abs_d) - && (size <= HOST_BITS_PER_WIDE_INT - || abs_d != (unsigned HOST_WIDE_INT) d)) + else if (EXACT_POWER_OF_2_OR_ZERO_P (abs_d)) { if (rem_flag) { @@ -6038,6 +6071,11 @@ emit_store_flag (rtx target, enum rtx_code code, rtx op0, rtx op1, if (!HAVE_conditional_move) return 0; + /* Do not turn a trapping comparison into a non-trapping one. */ + if ((code != EQ && code != NE && code != UNEQ && code != LTGT) + && flag_trapping_math) + return 0; + /* Try using a setcc instruction for ORDERED/UNORDERED, followed by a conditional move. */ tem = emit_store_flag_1 (subtarget, first_code, op0, op1, mode, 0, diff --git a/gcc/expr.c b/gcc/expr.c index 9ca466144be..8bf5cc28b13 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -1632,14 +1632,6 @@ emit_block_move_hints (rtx x, rtx y, rtx size, enum block_op_methods method, if (may_use_call < 0) return pc_rtx; - /* Since x and y are passed to a libcall, mark the corresponding - tree EXPR as addressable. */ - tree y_expr = MEM_EXPR (y); - tree x_expr = MEM_EXPR (x); - if (y_expr) - mark_addressable (y_expr); - if (x_expr) - mark_addressable (x_expr); retval = emit_block_copy_via_libcall (x, y, size, method == BLOCK_OP_TAILCALL); } @@ -1885,6 +1877,15 @@ emit_block_op_via_libcall (enum built_in_function fncode, rtx dst, rtx src, tree call_expr, dst_tree, src_tree, size_tree; machine_mode size_mode; + /* Since dst and src are passed to a libcall, mark the corresponding + tree EXPR as addressable. */ + tree dst_expr = MEM_EXPR (dst); + tree src_expr = MEM_EXPR (src); + if (dst_expr) + mark_addressable (dst_expr); + if (src_expr) + mark_addressable (src_expr); + dst_addr = copy_addr_to_reg (XEXP (dst, 0)); dst_addr = convert_memory_address (ptr_mode, dst_addr); dst_tree = make_tree (ptr_type_node, dst_addr); @@ -5186,9 +5187,13 @@ expand_assignment (tree to, tree from, bool nontemporal) } else { - rtx from_rtx - = simplify_gen_subreg (to_mode, result, - TYPE_MODE (TREE_TYPE (from)), 0); + rtx from_rtx; + if (MEM_P (result)) + from_rtx = change_address (result, to_mode, NULL_RTX); + else + from_rtx + = simplify_gen_subreg (to_mode, result, + TYPE_MODE (TREE_TYPE (from)), 0); if (from_rtx) { emit_move_insn (XEXP (to_rtx, 0), @@ -5230,6 +5235,21 @@ expand_assignment (tree to, tree from, bool nontemporal) emit_move_insn (XEXP (to_rtx, 1), read_complex_part (temp, true)); } } + /* For calls to functions returning variable length structures, if TO_RTX + is not a MEM, go through a MEM because we must not create temporaries + of the VLA type. */ + else if (!MEM_P (to_rtx) + && TREE_CODE (from) == CALL_EXPR + && COMPLETE_TYPE_P (TREE_TYPE (from)) + && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) != INTEGER_CST) + { + rtx temp = assign_stack_temp (GET_MODE (to_rtx), + GET_MODE_SIZE (GET_MODE (to_rtx))); + result = store_field (temp, bitsize, bitpos, bitregion_start, + bitregion_end, mode1, from, get_alias_set (to), + nontemporal, reversep); + emit_move_insn (to_rtx, temp); + } else { if (MEM_P (to_rtx)) @@ -5242,6 +5262,7 @@ expand_assignment (tree to, tree from, bool nontemporal) MEM_VOLATILE_P (to_rtx) = 1; } + gcc_checking_assert (known_ge (bitpos, 0)); if (optimize_bitfield_assignment_op (bitsize, bitpos, bitregion_start, bitregion_end, mode1, to_rtx, to, from, @@ -5970,10 +5991,11 @@ count_type_elements (const_tree type, bool for_ctor_p) static bool categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, + HOST_WIDE_INT *p_unique_nz_elts, HOST_WIDE_INT *p_init_elts, bool *p_complete) { unsigned HOST_WIDE_INT idx; - HOST_WIDE_INT nz_elts, init_elts, num_fields; + HOST_WIDE_INT nz_elts, unique_nz_elts, init_elts, num_fields; tree value, purpose, elt_type; /* Whether CTOR is a valid constant initializer, in accordance with what @@ -5983,6 +6005,7 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, bool const_p = const_from_elts_p ? true : TREE_STATIC (ctor); nz_elts = 0; + unique_nz_elts = 0; init_elts = 0; num_fields = 0; elt_type = NULL_TREE; @@ -6007,12 +6030,13 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, { case CONSTRUCTOR: { - HOST_WIDE_INT nz = 0, ic = 0; + HOST_WIDE_INT nz = 0, unz = 0, ic = 0; - bool const_elt_p = categorize_ctor_elements_1 (value, &nz, &ic, - p_complete); + bool const_elt_p = categorize_ctor_elements_1 (value, &nz, &unz, + &ic, p_complete); nz_elts += mult * nz; + unique_nz_elts += unz; init_elts += mult * ic; if (const_from_elts_p && const_p) @@ -6024,21 +6048,31 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, case REAL_CST: case FIXED_CST: if (!initializer_zerop (value)) - nz_elts += mult; + { + nz_elts += mult; + unique_nz_elts++; + } init_elts += mult; break; case STRING_CST: nz_elts += mult * TREE_STRING_LENGTH (value); + unique_nz_elts += TREE_STRING_LENGTH (value); init_elts += mult * TREE_STRING_LENGTH (value); break; case COMPLEX_CST: if (!initializer_zerop (TREE_REALPART (value))) - nz_elts += mult; + { + nz_elts += mult; + unique_nz_elts++; + } if (!initializer_zerop (TREE_IMAGPART (value))) - nz_elts += mult; - init_elts += mult; + { + nz_elts += mult; + unique_nz_elts++; + } + init_elts += 2 * mult; break; case VECTOR_CST: @@ -6050,7 +6084,10 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, { tree v = VECTOR_CST_ELT (value, i); if (!initializer_zerop (v)) - nz_elts += mult; + { + nz_elts += mult; + unique_nz_elts++; + } init_elts += mult; } } @@ -6060,6 +6097,7 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, { HOST_WIDE_INT tc = count_type_elements (elt_type, false); nz_elts += mult * tc; + unique_nz_elts += tc; init_elts += mult * tc; if (const_from_elts_p && const_p) @@ -6079,6 +6117,7 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, *p_complete = false; *p_nz_elts += nz_elts; + *p_unique_nz_elts += unique_nz_elts; *p_init_elts += init_elts; return const_p; @@ -6087,6 +6126,11 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, /* Examine CTOR to discover: * how many scalar fields are set to nonzero values, and place it in *P_NZ_ELTS; + * the same, but counting RANGE_EXPRs as multiplier of 1 instead of + high - low + 1 (this can be useful for callers to determine ctors + that could be cheaply initialized with - perhaps nested - loops + compared to copied from huge read-only data), + and place it in *P_UNIQUE_NZ_ELTS; * how many scalar fields in total are in CTOR, and place it in *P_ELT_COUNT. * whether the constructor is complete -- in the sense that every @@ -6098,13 +6142,16 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, bool categorize_ctor_elements (const_tree ctor, HOST_WIDE_INT *p_nz_elts, + HOST_WIDE_INT *p_unique_nz_elts, HOST_WIDE_INT *p_init_elts, bool *p_complete) { *p_nz_elts = 0; + *p_unique_nz_elts = 0; *p_init_elts = 0; *p_complete = true; - return categorize_ctor_elements_1 (ctor, p_nz_elts, p_init_elts, p_complete); + return categorize_ctor_elements_1 (ctor, p_nz_elts, p_unique_nz_elts, + p_init_elts, p_complete); } /* TYPE is initialized by a constructor with NUM_ELTS elements, the last @@ -6135,17 +6182,18 @@ complete_ctor_at_level_p (const_tree type, HOST_WIDE_INT num_elts, return count_type_elements (type, true) == num_elts; } -/* Return 1 if EXP contains mostly (3/4) zeros. */ +/* Return 1 if EXP contains mostly (3/4) zeros. */ static int mostly_zeros_p (const_tree exp) { if (TREE_CODE (exp) == CONSTRUCTOR) { - HOST_WIDE_INT nz_elts, init_elts; + HOST_WIDE_INT nz_elts, unz_elts, init_elts; bool complete_p; - categorize_ctor_elements (exp, &nz_elts, &init_elts, &complete_p); + categorize_ctor_elements (exp, &nz_elts, &unz_elts, &init_elts, + &complete_p); return !complete_p || nz_elts < init_elts / 4; } @@ -6159,10 +6207,11 @@ all_zeros_p (const_tree exp) { if (TREE_CODE (exp) == CONSTRUCTOR) { - HOST_WIDE_INT nz_elts, init_elts; + HOST_WIDE_INT nz_elts, unz_elts, init_elts; bool complete_p; - categorize_ctor_elements (exp, &nz_elts, &init_elts, &complete_p); + categorize_ctor_elements (exp, &nz_elts, &unz_elts, &init_elts, + &complete_p); return nz_elts == 0; } @@ -7071,6 +7120,7 @@ store_field (rtx target, poly_int64 bitsize, poly_int64 bitpos, } /* Store the value in the bitfield. */ + gcc_assert (known_ge (bitpos, 0)); store_bit_field (target, bitsize, bitpos, bitregion_start, bitregion_end, mode, temp, reverse); @@ -8773,8 +8823,8 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode, != INTEGER_CST check. Handle it. */ if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode) { - op0 = convert_modes (innermode, mode, op0, true); - op1 = convert_modes (innermode, mode, op1, false); + op0 = convert_modes (mode, innermode, op0, true); + op1 = convert_modes (mode, innermode, op1, false); return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp)); } @@ -8796,7 +8846,7 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode, if (TREE_CODE (treeop0) != INTEGER_CST) { if (find_widening_optab_handler (this_optab, mode, innermode) - != CODE_FOR_nothing) + != CODE_FOR_nothing) { expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1, EXPAND_NORMAL); @@ -8805,9 +8855,9 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode, if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode) { widen_mult_const: - op0 = convert_modes (innermode, mode, op0, zextend_p); + op0 = convert_modes (mode, innermode, op0, zextend_p); op1 - = convert_modes (innermode, mode, op1, + = convert_modes (mode, innermode, op1, TYPE_UNSIGNED (TREE_TYPE (treeop1))); return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, @@ -8818,21 +8868,19 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode, return REDUCE_BIT_FIELD (temp); } if (find_widening_optab_handler (other_optab, mode, innermode) - != CODE_FOR_nothing + != CODE_FOR_nothing && innermode == word_mode) { rtx htem, hipart; op0 = expand_normal (treeop0); - if (TREE_CODE (treeop1) == INTEGER_CST) - op1 = convert_modes (word_mode, mode, - expand_normal (treeop1), - TYPE_UNSIGNED (TREE_TYPE (treeop1))); - else - op1 = expand_normal (treeop1); - /* op0 and op1 might still be constant, despite the above + op1 = expand_normal (treeop1); + /* op0 and op1 might be constants, despite the above != INTEGER_CST check. Handle it. */ if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode) goto widen_mult_const; + if (TREE_CODE (treeop1) == INTEGER_CST) + op1 = convert_modes (mode, word_mode, op1, + TYPE_UNSIGNED (TREE_TYPE (treeop1))); temp = expand_binop (mode, other_optab, op0, op1, target, unsignedp, OPTAB_LIB_WIDEN); hipart = gen_highpart (word_mode, temp); @@ -10616,6 +10664,14 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode, mode2 = CONSTANT_P (op0) ? TYPE_MODE (TREE_TYPE (tem)) : GET_MODE (op0); + /* Make sure bitpos is not negative, it can wreak havoc later. */ + if (maybe_lt (bitpos, 0)) + { + gcc_checking_assert (offset == NULL_TREE); + offset = size_int (bits_to_bytes_round_down (bitpos)); + bitpos = num_trailing_bits (bitpos); + } + /* If we have either an offset, a BLKmode result, or a reference outside the underlying object, we must force it to memory. Such a case can occur in Ada if we have unchecked conversion @@ -10864,6 +10920,7 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode, && GET_MODE_CLASS (ext_mode) == MODE_INT) reversep = TYPE_REVERSE_STORAGE_ORDER (type); + gcc_checking_assert (known_ge (bitpos, 0)); op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp, (modifier == EXPAND_STACK_PARM ? NULL_RTX : target), @@ -11532,12 +11589,10 @@ do_store_flag (sepops ops, rtx target, machine_mode mode) /* We won't bother with store-flag operations involving function pointers when function pointers must be canonicalized before comparisons. */ if (targetm.have_canonicalize_funcptr_for_compare () - && ((TREE_CODE (TREE_TYPE (arg0)) == POINTER_TYPE - && (TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) - == FUNCTION_TYPE)) - || (TREE_CODE (TREE_TYPE (arg1)) == POINTER_TYPE - && (TREE_CODE (TREE_TYPE (TREE_TYPE (arg1))) - == FUNCTION_TYPE)))) + && ((POINTER_TYPE_P (TREE_TYPE (arg0)) + && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (arg0)))) + || (POINTER_TYPE_P (TREE_TYPE (arg1)) + && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (arg1)))))) return 0; STRIP_NOPS (arg0); diff --git a/gcc/expr.h b/gcc/expr.h index 52a26e7c2a3..49b2766eb67 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -308,7 +308,8 @@ extern bool can_move_by_pieces (unsigned HOST_WIDE_INT, unsigned int); extern unsigned HOST_WIDE_INT highest_pow2_factor (const_tree); extern bool categorize_ctor_elements (const_tree, HOST_WIDE_INT *, - HOST_WIDE_INT *, bool *); + HOST_WIDE_INT *, HOST_WIDE_INT *, + bool *); extern void expand_operands (tree, tree, rtx, rtx*, rtx*, enum expand_modifier); diff --git a/gcc/final.c b/gcc/final.c index 19817e240da..5a65a8ce07c 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -2306,6 +2306,9 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED, ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (cold_function_name)); #endif + if (dwarf2out_do_frame () + && cfun->fde->dw_fde_second_begin != NULL) + ASM_OUTPUT_LABEL (asm_out_file, cfun->fde->dw_fde_second_begin); } break; @@ -4673,7 +4676,11 @@ rest_of_handle_final (void) final_start_function_1 (&first, asm_out_file, &seen, optimize); final_1 (first, asm_out_file, seen, optimize); if (flag_ipa_ra - && !lookup_attribute ("noipa", DECL_ATTRIBUTES (current_function_decl))) + && !lookup_attribute ("noipa", DECL_ATTRIBUTES (current_function_decl)) + /* Functions with naked attributes are supported only with basic asm + statements in the body, thus for supported use cases the information + on clobbered registers is not available. */ + && !lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl))) collect_fn_hard_reg_usage (); final_end_function (); diff --git a/gcc/fold-const.c b/gcc/fold-const.c index faa184a2bbd..c64c4b10f8d 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3179,10 +3179,16 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) switch (TREE_CODE (arg0)) { case INDIRECT_REF: - if (!(flags & OEP_ADDRESS_OF) - && (TYPE_ALIGN (TREE_TYPE (arg0)) - != TYPE_ALIGN (TREE_TYPE (arg1)))) - return 0; + if (!(flags & OEP_ADDRESS_OF)) + { + if (TYPE_ALIGN (TREE_TYPE (arg0)) + != TYPE_ALIGN (TREE_TYPE (arg1))) + return 0; + /* Verify that the access types are compatible. */ + if (TYPE_MAIN_VARIANT (TREE_TYPE (arg0)) + != TYPE_MAIN_VARIANT (TREE_TYPE (arg1))) + return 0; + } flags &= ~OEP_ADDRESS_OF; return OP_SAME (0); @@ -4239,7 +4245,7 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize, There are problems with FP fields since the type_for_size call below can fail for, e.g., XFmode. */ if (! INTEGRAL_TYPE_P (TREE_TYPE (exp))) - return 0; + return NULL_TREE; /* We are interested in the bare arrangement of bits, so strip everything that doesn't affect the machine mode. However, record the type of the @@ -4255,7 +4261,7 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize, exp = TREE_OPERAND (exp, 0); STRIP_NOPS (exp); STRIP_NOPS (and_mask); if (TREE_CODE (and_mask) != INTEGER_CST) - return 0; + return NULL_TREE; } poly_int64 poly_bitsize, poly_bitpos; @@ -4271,7 +4277,11 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize, || (! AGGREGATE_TYPE_P (TREE_TYPE (inner)) && compare_tree_int (TYPE_SIZE (TREE_TYPE (inner)), *pbitpos + *pbitsize) < 0)) - return 0; + return NULL_TREE; + + unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1); + if (unsigned_type == NULL_TREE) + return NULL_TREE; *exp_ = exp; @@ -4282,7 +4292,6 @@ decode_field_reference (location_t loc, tree *exp_, HOST_WIDE_INT *pbitsize, *punsignedp = TYPE_UNSIGNED (outer_type); /* Compute the mask to access the bitfield. */ - unsigned_type = lang_hooks.types.type_for_size (*pbitsize, 1); precision = TYPE_PRECISION (unsigned_type); mask = build_int_cst_type (unsigned_type, -1); @@ -4922,8 +4931,8 @@ build_range_check (location_t loc, tree type, tree exp, int in_p, /* Disable this optimization for function pointer expressions on targets that require function pointer canonicalization. */ if (targetm.have_canonicalize_funcptr_for_compare () - && TREE_CODE (etype) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (etype)) == FUNCTION_TYPE) + && POINTER_TYPE_P (etype) + && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (etype))) return NULL_TREE; if (! in_p) @@ -5515,12 +5524,15 @@ fold_range_test (location_t loc, enum tree_code code, tree type, /* On machines where the branch cost is expensive, if this is a short-circuited branch and the underlying object on both sides is the same, make a non-short-circuit operation. */ - else if (LOGICAL_OP_NON_SHORT_CIRCUIT - && !flag_sanitize_coverage - && lhs != 0 && rhs != 0 - && (code == TRUTH_ANDIF_EXPR - || code == TRUTH_ORIF_EXPR) - && operand_equal_p (lhs, rhs, 0)) + bool logical_op_non_short_circuit = LOGICAL_OP_NON_SHORT_CIRCUIT; + if (PARAM_VALUE (PARAM_LOGICAL_OP_NON_SHORT_CIRCUIT) != -1) + logical_op_non_short_circuit + = PARAM_VALUE (PARAM_LOGICAL_OP_NON_SHORT_CIRCUIT); + if (logical_op_non_short_circuit + && !flag_sanitize_coverage + && lhs != 0 && rhs != 0 + && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR) + && operand_equal_p (lhs, rhs, 0)) { /* If simple enough, just rewrite. Otherwise, make a SAVE_EXPR unless we are at top level or LHS contains a PLACEHOLDER_EXPR, in @@ -5952,12 +5964,13 @@ fold_truth_andor_1 (location_t loc, enum tree_code code, tree truth_type, } /* If the right sides are not constant, do the same for it. Also, - disallow this optimization if a size or signedness mismatch occurs - between the left and right sides. */ + disallow this optimization if a size, signedness or storage order + mismatch occurs between the left and right sides. */ if (l_const == 0) { if (ll_bitsize != lr_bitsize || rl_bitsize != rr_bitsize || ll_unsignedp != lr_unsignedp || rl_unsignedp != rr_unsignedp + || ll_reversep != lr_reversep /* Make sure the two fields on the right correspond to the left without being swapped. */ || ll_bitpos - rl_bitpos != lr_bitpos - rr_bitpos) @@ -8164,7 +8177,11 @@ fold_truth_andor (location_t loc, enum tree_code code, tree type, if ((tem = fold_truth_andor_1 (loc, code, type, arg0, arg1)) != 0) return tem; - if (LOGICAL_OP_NON_SHORT_CIRCUIT + bool logical_op_non_short_circuit = LOGICAL_OP_NON_SHORT_CIRCUIT; + if (PARAM_VALUE (PARAM_LOGICAL_OP_NON_SHORT_CIRCUIT) != -1) + logical_op_non_short_circuit + = PARAM_VALUE (PARAM_LOGICAL_OP_NON_SHORT_CIRCUIT); + if (logical_op_non_short_circuit && !flag_sanitize_coverage && (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR @@ -10798,8 +10815,7 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type, strlen(ptr) != 0 => *ptr != 0 Other cases should reduce to one of these two (or a constant) due to the return value of strlen being unsigned. */ - if (TREE_CODE (arg0) == CALL_EXPR - && integer_zerop (arg1)) + if (TREE_CODE (arg0) == CALL_EXPR && integer_zerop (arg1)) { tree fndecl = get_callee_fndecl (arg0); @@ -10807,12 +10823,17 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type, && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_STRLEN && call_expr_nargs (arg0) == 1 - && TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) == POINTER_TYPE) + && (TREE_CODE (TREE_TYPE (CALL_EXPR_ARG (arg0, 0))) + == POINTER_TYPE)) { - tree iref = build_fold_indirect_ref_loc (loc, - CALL_EXPR_ARG (arg0, 0)); + tree ptrtype + = build_pointer_type (build_qualified_type (char_type_node, + TYPE_QUAL_CONST)); + tree ptr = fold_convert_loc (loc, ptrtype, + CALL_EXPR_ARG (arg0, 0)); + tree iref = build_fold_indirect_ref_loc (loc, ptr); return fold_build2_loc (loc, code, type, iref, - build_int_cst (TREE_TYPE (iref), 0)); + build_int_cst (TREE_TYPE (iref), 0)); } } @@ -11565,10 +11586,16 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, && integer_pow2p (arg1) && TREE_CODE (TREE_OPERAND (arg0, 0)) == BIT_AND_EXPR && operand_equal_p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1), - arg1, OEP_ONLY_CONST)) + arg1, OEP_ONLY_CONST) + /* operand_equal_p compares just value, not precision, so e.g. + arg1 could be 8-bit -128 and be power of two, but BIT_AND_EXPR + second operand 32-bit -128, which is not a power of two (or vice + versa. */ + && integer_pow2p (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))) return pedantic_non_lvalue_loc (loc, - fold_convert_loc (loc, type, - TREE_OPERAND (arg0, 0))); + fold_convert_loc (loc, type, + TREE_OPERAND (arg0, + 0))); /* Disable the transformations below for vectors, since fold_binary_op_with_conditional_arg may undo them immediately, @@ -13983,13 +14010,13 @@ fold_relational_const (enum tree_code code, tree type, tree op0, tree op1) { tree elem0 = VECTOR_CST_ELT (op0, i); tree elem1 = VECTOR_CST_ELT (op1, i); - tree tmp = fold_relational_const (code, type, elem0, elem1); + tree tmp = fold_relational_const (EQ_EXPR, type, elem0, elem1); if (tmp == NULL_TREE) return NULL_TREE; if (integer_zerop (tmp)) - return constant_boolean_node (false, type); + return constant_boolean_node (code == NE_EXPR, type); } - return constant_boolean_node (true, type); + return constant_boolean_node (code == EQ_EXPR, type); } tree_vector_builder elts; if (!elts.new_binary_operation (type, op0, op1, false)) @@ -14660,6 +14687,7 @@ test_vector_folding () tree type = build_vector_type (inner_type, 4); tree zero = build_zero_cst (type); tree one = build_one_cst (type); + tree index = build_index_vector (type, 0, 1); /* Verify equality tests that return a scalar boolean result. */ tree res_type = boolean_type_node; @@ -14667,6 +14695,13 @@ test_vector_folding () ASSERT_TRUE (integer_nonzerop (fold_build2 (EQ_EXPR, res_type, zero, zero))); ASSERT_TRUE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, zero, one))); ASSERT_FALSE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, one, one))); + ASSERT_TRUE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, index, one))); + ASSERT_FALSE (integer_nonzerop (fold_build2 (EQ_EXPR, res_type, + index, one))); + ASSERT_FALSE (integer_nonzerop (fold_build2 (NE_EXPR, res_type, + index, index))); + ASSERT_TRUE (integer_nonzerop (fold_build2 (EQ_EXPR, res_type, + index, index))); } /* Verify folding of VEC_DUPLICATE_EXPRs. */ diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9f78bd71e31..f487a487c2b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,864 @@ +2019-11-29 Harald Anlauf + + Backport from mainline + PR fortran/92629 + * simplify.c (convert_mpz_to_unsigned): Skip assert for argument + range when -fno-range-check is specified. + +2019-11-10 Thomas Koenig + + Backport from trunk + PR fortran/92113 + * trans-decl.c (gfc_get_symbol_decl): If __def_init actually + contains a value, put it into the read-only section. + +2019-10-27 Paul Thomas + + Backport from mainline + PR fortran/86248 + * resolve.c (flag_fn_result_spec): Correct a typo before the + function declaration. + * trans-decl.c (gfc_sym_identifier): Boost the length of 'name' + to allow for all variants. Simplify the code by using a pointer + to the symbol's proc_name and taking the return out of each of + the conditional branches. Allow symbols with fn_result_spec set + that do not come from a procedure namespace and have a module + name to go through the non-fn_result_spec branch. + +2019-10-18 Steven G. Kargl + + PR fortran/69455 + * trans-decl.c (generate_local_decl): Avoid misconstructed + intrinsic modules in a BLOCK construct. + +2019-10-07 Thomas Koenig + + Backport from trunk + PR fortran/84487 + * trans-decl.c (gfc_get_symbol_decl): For __def_init, set + DECL_ARTIFICAL and do not set TREE_READONLY. + +2019-09-28 Paul Thomas + + Backport from mainline + PR fortran/91588 + * expr.c (check_inquiry): Remove extended component refs by + using symbol pointers. If a function argument is an associate + variable with a constant target, copy the target expression in + place of the argument expression. Check that the charlen is not + NULL before using the string length. + +2019-09-18 Thomas Koenig + + Backport from trunk + PR fortran/91550 + * frontend-passes.c (do_subscript): If step equals + zero, a previuos error has been reported; do nothing + in this case. + * resolve.c (gfc_resolve_iterator): Move error checking + after type conversion. + +2019-09-15 Thomas Koenig + + Backport from trunk + PR fortran/91557 + * trans-decl.c (generate_local_decl): Do not warn if the symbol + is artificial. + * trans-types.c (get_formal_from_actual_arglist): Set artificial + attribute on dummy arguments. + +2013-08-13 Thomas Koenig + + Backport from trunk + PR fortran/90563 + * frontend-passes.c (insert_index): Suppress errors while + simplifying the resulting expression. + +2019-08-02 Thomas Koenig + Paul Thomas + + Backport from trunk + PR fortran/90786 + PR fortran/90813 + * trans-expr.c (pointer_assignment_is_proc_pointer) Remove as + it is very simple and only called from one place. + (gfc_trans_pointer_assignment): Rename non_proc_pointer_assign + as non_proc_ptr_assign. Assign to it directly, rather than call + to above, deleted function and use gfc_expr_attr instead of + only checking the reference chain. + * trans-decl.c (sym_identifier): New function. + (mangled_identifier): New function, doing most of the work + of gfc_sym_mangled_identifier. + (gfc_sym_mangled_identifier): Use mangled_identifier. Add mangled + identifier to global symbol table. + (get_proc_pointer_decl): Use backend decl from global identifier + if present. + +2019-07-07 Paul Thomas + + Backport from trunk + PR fortran/91077 + * trans-array.c (gfc_conv_scalarized_array_ref) Delete code + that gave symbol backend decl for subref arrays. + +2019-06-21 Thomas Koenig + + Backport from trunk + PR fortran/90937 + * trans-types.c (get_formal_from_actual_arglist): Get symbol from + current namespace so it will be freed later. If symbol is of type + character, get an empty character length. + +2019-06-12 Thomas Koenig + Tomáš Trnka + + Backport from trunk + PR fortran/90744 + * trans-types.c (get_formal_from_actual_arglist): Unset typespec + flags which make no sense for procedures without explicit + interface. + +2019-06-10 Paul Thomas + + Backport from trunk + PR fortran/90498 + * trans-stmt.c (trans_associate_var) Do not use the saved + descriptor if the expression is a COMPONENT_REF. + +2019-06-09 Paul Thomas + + Backport from trunk + PR fortran/57284 + * resolve.c (find_array_spec): If this is a class expression + and the symbol and component array specs are the same, this is + not an error. + *trans-intrinsic.c (gfc_conv_intrinsic_size): If a class symbol + argument, has no namespace, it has come from the interface + mapping and the _data component must be accessed directly. + +2019-05-30 Marek Polacek + + * lang.opt (ftail-call-workaround): Fix a typo. + +2019-05-30 Jakub Jelinek + + * lang.opt (ftail-call-workaround=): Fix a typo - lenghts to lengths. + +2019-05-29 Jakub Jelinek + + PR fortran/90329 + Backported from mainline + 2019-05-29 Jakub Jelinek + + PR fortran/90329 + * lang.opt (fbroken-callers): Remove. + (ftail-call-workaround, ftail-call-workaround=): New options. + * gfortran.h (struct gfc_namespace): Add implicit_interface_calls. + * interface.c (gfc_procedure_use): Set implicit_interface_calls + for calls to implicit interface procedures. + * trans-decl.c (create_function_arglist): Use flag_tail_call_workaround + instead of flag_broken_callers. If it is not 2, also require + sym->ns->implicit_interface_calls. + * invoke.texi (fbroken-callers): Remove documentation. + (ftail-call-workaround, ftail-call-workaround=): Document. + + 2019-05-19 Thomas Koenig + + PR fortran/90329 + * invoke.texi: Document -fbroken-callers. + * lang.opt: Add -fbroken-callers. + * trans-decl.c (create_function_arglist): Only set + DECL_HIDDEN_STRING_LENGTH if flag_broken_callers is set. + + 2019-05-16 Jakub Jelinek + + PR fortran/90329 + * trans-decl.c (create_function_arglist): Set + DECL_HIDDEN_STRING_LENGTH on hidden string length PARM_DECLs if + len is constant. + +2019-04-30 Jakub Jelinek + + Backported from mainline + 2019-03-11 Jakub Jelinek + + PR fortran/89651 + * trans-openmp.c (gfc_omp_clause_default_ctor): Set TREE_NO_WARNING + on decl if adding COND_EXPR for allocatable. + (gfc_omp_clause_copy_ctor): Set TREE_NO_WARNING on dest. + +2019-04-24 Paul Thomas + + Backport from mainline + PR fortran/87127 + * resolve.c (check_host_association): If an external function + is typed but not declared explicitly to be external, change the + old symbol from a variable to an external function. + +2019-04-14 Thomas Koenig + + Backport from trunk + PR fortran/87352 + * gfortran.h (gfc_component): Add finalized field. + * class.c (finalize_component): If the component is already + finalized, return early. Set component->finalized on exit. + +2019-04-14 Thomas Koenig + + Backport from trunk + PR fortran/89981 + * resolve.c (resolve_global_procedure): If the global symbol is an + ENTRY, also look up its name among the entries. + +2019-04-10 Harald Anlauf + + Backport from trunk + PR fortran/89904 + * check.c (gfc_check_transfer): Reject procedures as actual + arguments for SOURCE and MOLD of TRANSFER intrinsic. + +2019-03-31 Harald Anlauf + + PR fortran/83515 + PR fortran/85797 + * trans-types.c (gfc_typenode_for_spec): Handle conversion for + procedure pointers. + * target-memory.c (gfc_element_size): Handle size determination + for procedure pointers. + +2019-03-30 Thomas Koenig + + PR fortran/78865 + Backport from trunk + * interface.c (compare_actual_formal): Change errors about + missing or extra to gfc_error_now to make sure they are issued. + Change "spec" to "specifier" in message. + * resolve.c (resolve_global_procedure): Also check for mismatching + interface with global symbols if the namespace has already been + resolved. + +2019-03-24 Janus Weil + + PR fortran/71861 + Backport from trunk + * symbol.c (check_conflict): ABSTRACT attribute conflicts with + INTRINSIC attribute. + +2019-03-23 Thomas Koenig + + PR fortran/68009 + Backport from trunk + * iresolve.c: Include trans.h. + (gfc_resolve_fe_runtine_error): Set backend_decl on + resolved_sym. + +2019-03-17 Thomas Koenig + + PR fortran/84394 + Backport from trunk + * symbol.c (gfc_add_subroutine): If we are encountering a + subrtoutine within a BLOCK DATA and the name starts with an + underscore, do not check. + +2019-03-16 Thomas Koenig + + PR fortran/66089 + Backport from trunk + * trans-array.c (gfc_scalar_elemental_arg_saved_as_reference): + Return false if a scalar tempoary is needed. + (gfc_walk_variable_expr): Fix up class refs. + +2019-03-16 Thomas Koenig + + PR fortran/66695 + PR fortran/77746 + PR fortran/79485 + Backport from trunk + * gfortran.h (gfc_symbol): Add bind_c component. + (gfc_get_gsymbol): Add argument bind_c. + * decl.c (add_global_entry): Add bind_c argument to + gfc_get_symbol. + * parse.c (parse_block_data): Likewise. + (parse_module): Likewise. + (add_global_procedure): Likewise. + (add_global_program): Likewise. + * resolve.c (resolve_common_blocks): Likewise. + (resolve_global_procedure): Likewise. + (gfc_verify_binding_labels): Likewise. + * symbol.c (gfc_get_gsymbol): Add argument bind_c. Set bind_c + in gsym. + * trans-decl.c (gfc_get_module_backend_decl): Add bind_c argument + to gfc_get_symbol. + (gfc_get_extern_function_decl): If the sym has a binding label + and it cannot be found in the global symbol tabel, it is the wrong + one and vice versa. + +2019-03-13 Thomas Koenig + + PR fortran/87673 + Backport from trunk + * match.c (gfc_match_type_spec): Remove call to + gfc_resolve_expr for character length. + +2019-03-10 Thomas Koenig + + PR fortran/71544 + Backport from trunk + * trans-types.c (gfc_typenode_for_spec) Set ts->is_c_interop of + C_PTR and C_FUNPTR. + (create_fn_spec): Mark argument as escaping if ts->is_c_interop is set. + +2019-03-10 Thomas Koenig + Steven G. Kargl + + PR fortran/87734 + Backort from trunk + * symbol.c (gfc_add_procedure): Only throw an error if the + procedure has not been declared either PUBLIC or PRIVATE. + * resolve.c (is_illegal_recursion): Remove an assert(). + +2019-03-06 Harald Anlauf + + Backport from trunk + PR fortran/71203 + * expr.c (simplify_const_ref): Avoid null pointer dereference. + +2019-03-06 Thomas Koenig + + PR fortran/72714 + Backport from trunk + * resolve.c (resolve_allocate_expr): Add some tests for coarrays. + +2019-03-03 Harald Anlauf + + Backport from trunk + PR fortran/89077 + * decl.c (gfc_set_constant_character_len): Clear original string + representation after padding has been performed to target length. + * resolve.c (gfc_resolve_substring_charlen): Check substring + length for constantness prior to general calculation of length. + +2019-03-03 Harald Anlauf + Steven G. Kargl + + Backport from trunk + PR fortran/77583 + * symbol.c (check_conflict): Check for valid procedure name + passed to error reporting routine. + +2019-03-03 Thomas Koenig + + PR fortran/89174 + Backport from trunk + * trans-expr.c (gfc_find_and_cut_at_last_class_ref): Add is_mold + to garguments. If we are dealing with a MOLD, call + gfc_expr_to_initialize(). + * trans-stmt.c (gfc_trans_allocate): For MOLD, pass is_mold=true + to gfc_find_and_cut_at_last_class_ref. + * trans.h (gfc_find_and_cut_at_last_class_ref): Add optional + argument is_mold with default false. + +2019-03-03 Thomas Koenig + + PR fortran/87689 + Backport from trunk + * gfortran.dg/lto/20091028-1_0.f90: Add -Wno-lto-type-mismatch to + options. + * gfortran.dg/lto/20091028-2_0.f90: Likewise. + * gfortran.dg/lto/pr87689_0.f: New file. + * gfortran.dg/lto/pr87689_1.f: New file. + * gfortran.dg/altreturn_9_0.f90: New file. + * gfortran.dg/altreturn_9_1.f90: New file. + +2019-03-02 Jerry DeLisle + + Backport from trunk + PR fortran/84387 + * trans-io.c (transfer_expr): Do not return if there are no + components to the derived type or class. + +2019-03-02 Harald Anlauf + + Backport from trunk + PR fortran/89516 + * check.c (gfc_calculate_transfer_sizes): Correct checks for cases + where storage size of elements of MOLD is 0. + + PR fortran/89492 + * check.c (gfc_calculate_transfer_sizes): Handle cases where + storage size of elements of MOLD is 0. + + PR fortran/89266 + PR fortran/88326 + * target-memory.c (gfc_element_size): Return false if element size + cannot be determined; element size is returned separately. + (gfc_target_expr_size): Return false if expression size cannot be + determined; expression size is returned separately. + * target-memory.h: Adjust prototypes. + * check.c (gfc_calculate_transfer_sizes): Adjust references to + gfc_target_expr_size, gfc_element_size. + * arith.c (hollerith2representation): Likewise. + * class.c (find_intrinsic_vtab): Likewise. + * simplify.c (gfc_simplify_sizeof): Likewise. + +2019-02-23 Thomas Koenig + + PR fortran/86119 + Backport from trunk + * class.c (gfc_get_len_component): Add argument k for kind. + If the kind of the resulting expression is not equal to k, + convert it. + * gfortran.h (gfc_len_component): Adjust prototype. + * simplify.c (gfc_simplify_len): Pass kind to + gfc_get_len_component. + +2019-02-23 Paul Thomas + + Backport from trunk + PR fortran/88117 + * resolve.c (deferred_op_assign): Return if the lhs expression + has the pointer attribute. + +2019-02-22 Thomas Koenig + + PR fortran/71066 + Backport from trunk + * trans-decl.c (generate_coarray_sym_init): For an array + constructor in a DATA statement of a coarray variable, set the + rank to 1 to avoid confusion later on. If the constructor + contains only one value, use that for initiailizig. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + +2019-02-10 Harald Anlauf + + Backport from trunk + PR fortran/89077 + * decl.c (add_init_expr_to_sym): Copy length of string initializer + to declared symbol. + +2019-02-10 Thomas Koenig + + PR fortran/71237 + Backport from trunk + * expr.c (gfc_check_assign): Add argument is_init_expr. If we are + looking at an init expression, issue error if the target is not a + TARGET and we are not looking at a procedure pointer. + * gfortran.h (gfc_check_assign): Add optional argument + is_init_expr. + +2019-02-07 Jakub Jelinek + + Backported from mainline + 2019-02-01 Jakub Jelinek + + PR fortran/83246 + PR fortran/89084 + * trans-decl.c (generate_local_decl): Add referenced FL_PARAMETERs + if sym->ns->construct_entities rather than if + sym->ns->parent->code->op == EXEC_BLOCK. + + 2019-01-19 Jakub Jelinek + + PR fortran/88902 + * trans-decl.c (gfc_get_symbol_decl): Don't add length to function + or parent function if it has been added there already. + +2019-02-05 Thomas Koenig + + PR fortran/67679 + Backport from trunk + * trans-array.c (gfc_array_allocate): For setting the bounds on + the new array, add a condition for a not previously allocated + variable. + +2019-02-03 Paul Thomas + + Backport from trunk + PR fortran/88393 + * trans-expr.c (gfc_conv_procedure_call): For derived entities, + passed in parentheses to class formals, invert the order of + copying allocatable components to taking the _data of the + class expression. + +2019-02-03 Paul Thomas + + Backport from trunk + PR fortran/88980 + * trans-array.c (gfc_array_init_size): Add element_size to the + arguments. + (gfc_array_allocate): Remove the recalculation of the size of + the element and use element_size from the call to the above. + Unconditionally set the span field of the descriptor. + +2019-02-03 Paul Thomas + + Backport from trunk + PR fortran/88685 + * expr.c (is_subref_array): Move the check for class pointer + dummy arrays to after the reference check. If we haven't seen + an array reference other than an element and a component is not + class or derived, return false. + +2019-02-02 Thomas Koenig + + PR fortran/88298 + Backport from trunk + * arith.c (gfc_int2int): Do not warn if src->do_not_warn is set. + * gfortran.h (gfc_expr): Add flag do_not_warn. + * intrinsic.c (gfc_convert_type_warn): Set expr->do_not_warn if + no warning is desired. + +2019-02-02 Thomas Koenig + + PR fortran/57048 + Backport from trunk + * interface.c (gfc_compare_types): If a derived type and an + integer both have a derived type, and they are identical, + this is a C binding type and compares equal. + +2019-01-27 Paul Thomas + + Backport from trunk + PR fortran/56386 + PR fortran/58906 + PR fortran/77385 + PR fortran/80260 + PR fortran/82077 + * resolve.c (resolve_variable): Fix up expressions with array + associate names, where the parser did not detect that this is + array and there was no array part_ref in the expression. + * trans-expr.c (gfc_find_and_cut_at_last_class_ref): base_expr + should be a copy of e and not the initialization expr. + +2019-01-25 Paul Thomas + + PR fortran/87336 + * trans-array.c (gfc_get_array_span): Try to get the element + length of incomplete types. Return NULL_TREE otherwise. + (gfc_conv_expr_descriptor): Only set the 'span' field if the + above does not return NULL_TREE. Set 'span' field if possible + for all new descriptors. + +2019-01-15 Steven G. Kargl + + PR fortran/81849 + * resolve.c (resolve_symbol): Host associated varaibles can appear + in the specification statement of a RESULT array. + +2019-01-15 Dominique d'Humieres + + PR fortran/88803 + * gfortran.texi: Replace @xref with @ref and adjust the sentence. + +2019-01-11 Steven G. Kargl + + PR fortran/35031 + * decl.c (gfc_match_entry): Check for F2018:C1546. Fix nearby + mis-indentation. + +2019-01-08 Jakub Jelinek + + Backported from mainline + 2018-12-12 Jakub Jelinek + + PR fortran/88463 + * trans-openmp.c (gfc_omp_predetermined_sharing): Handle TREE_READONLY + VAR_DECLs with DECL_EXTERNAL like those with TREE_STATIC. + + 2018-12-07 Jakub Jelinek + + PR fortran/88377 + * trans-openmp.c (gfc_omp_clause_default_ctor, + gfc_omp_clause_copy_ctor, gfc_omp_clause_assign_op, + gfc_omp_clause_linear_ctor, gfc_omp_clause_dtor): Only consider + GFC_DECL_GET_SCALAR_ALLOCATABLE vars as scalar allocatables if they + have pointer type. + +2018-12-23 Paul Thomas + + Backport from trunk + PR fortran/77703 + * resolve.c (get_temp_from_expr): Use the string length of + constant character expressions. + +2018-12-23 Paul Thomas + + Backport from trunk + PR fortran/77325 + * trans-array.c (gfc_alloc_allocatable_for_assignment): If the + rhs has a charlen expression, convert that and use it. + * trans-expr.c (gfc_trans_assignment_1): The rse.pre for the + assignment of deferred character array vars to a realocatable + lhs should not be added to the exterior block since vector + indices, for example, generate temporaries indexed within the + loop. + +2018-12-22 Steven G . Kargl + + PR fortran/85798 + * decl.c (gfc_match_data): If a component of a derived type entity + appears in data statement, check that does not have the allocatable + attribute. + +2018-12-22 Thomas Koenig + + Backport from trunk + PR fortran/85544 + * frontend-passes.c (optimize_power): Remove. + (optimize_op): Remove call to optimize_power. + * trans-expr.c (gfc_conv_power_op): Handle cases of 1**integer, + (2|4|8|16) ** integer and (-1) ** integer. + +2018-12-22 Steven G. Kargl + + PR fortran/88169 + * module.c (mio_namelist): Remove an error condition/message that + is contrary to the Fortran standard. + +2018-12-21 Paul Thomas + + PR fortran/87359 + * trans-array.c (gfc_is_reallocatable_lhs): Correct the problem + introduced by r264358, which prevented components of associate + names from being reallocated on assignment. + +2018-12-16 Steven G. Kargl + + PR fortran/88116 + PR fortran/88467 + * array.c (gfc_match_array_constructor): Check return value of + gfc_convert_type(). Skip constructor elements with BT_UNKNOWN, + which need to go through resolution. + * intrinsic.c (gfc_convert_type_warn): Return early if the types + martch (i.e., no conversion is required). + * simplify.c (gfc_convert_constant): Remove a gfc_internal_error, + and return gfc_bad_expr. + +2018-12-15 Steven G. Kargl + + PR fortran/88138 + * decl.c (variable_decl): Check that a derived isn't being assigned + an incompatible entity in an initialization. + +2018-12-11 Steven G. Kargl + + PR fortran/88155 + * primary.c (gfc_match_structure_constructor): Set the locus of + an expression to avoid a NULL pointer dereference. + +2018-12-11 Steven G. Kargl + + PR fortran/88249 + * gfortran.h: Update prototype for gfc_resolve_filepos(). + * io.c (gfc_resolve_filepos): Check for UNIT number if ERR= is present. + Use passed in locus for error message. + * resolve.c (gfc_resolve_code): Pass locus in gfc_resolve_filepos() + call. + +2018-12-10 Steven G. Kargl + + PR fortran/87922 + * io.c (gfc_match_open): Additional checks on ASYNCHRONOUS. + +2018-12-10 Steven G. Kargl + + PR fortran/88269 + * io.c (io_constraint): Update macro. If locus line buffer is NULL, + use gfc_current_locus in error messages. + (check_io_constraints): Catch missing IO UNIT in write and read + statements. io_constraint macro is incompatible here. + +2018-12-09 Steven G. Kargl + + PR fortran/88205 + * io.c (gfc_match_open): Move NEWUNIT checks to after STATUS checks. + +2018-12-09 Steven G. Kargl + + PR fortran/88206 + * match.c (gfc_match_type_spec): REAL can be an intrinsic function. + +2018-12-09 Fritz Reese + + PR fortran/88228 + * resolve.c (resolve_operator): Do not call resolve_function. + Break like other cases. + +2018-12-08 Steven G. Kargl + + PR fortran/88048 + * resolve.c (check_data_variable): Named constant cannot be a + data object. + +2018-12-08 Steven G. Kargl + + PR fortran/88025 + * expr.c (gfc_apply_init): Remove asserts that cannot trigger. + Check for a NULL pointer. + +2018-11-25 Thomas Koenig + + Backport from trunk + PR fortran/88073 + * frontend-passes.c (combine_array_constructor): Do not do + anything if in a WHERE statement. + +2018-11-24 Paul Thomas + + Backport from trunk + PR fortran/88143 + * resolve.c (resolve_variable): Check for associate names with + NULL target. + +2018-11-05 Jakub Jelinek + + Backported from mainline + 2018-10-25 Jakub Jelinek + + PR fortran/87725 + * openmp.c (gfc_match_omp_clauses): Parse simd, monotonic and + nonmonotonic modifiers regardless of if they have been parsed + already or if the opposite one has. Fix up check whether + comma after modifier should be parsed. + (resolve_omp_clauses): Diagnose schedule modifier restrictions. + +2019-11-03 Tobias Burnus + Thomas Koenig + + Backport from trunk + PR fortran/87597 + * expr.c (gfc_simplify_expr): Avoid simplifying + the 'array' argument to lbound/ubound/lcobound/ + ucobound. + +2018-10-08 Paul Thomas + + PR fortran/83999 + Backport from trunk + * resolve.c (resolve_fl_procedure): Include class functions in + the test that elemental function results be scalar. + +2018-10-08 Paul Thomas + + Backport from trunk + PR fortran/86372 + * trans-stmt.c (trans_associate_var): Character associate names + with variable string length do not have to be deferred length + for the string length to be set, if variable. + +2018-10-06 Thomas Koenig + + PR fortran/86111 + Backport from trunk + * gfortran.h (enum arith): Add ARITH_WRONGCONCAT. + * arith.h (gfc_arith_error): Issue error for ARITH_WRONGCONCAT. + (gfc_arith_concat): If the types of op1 and op2 are not + character of if their kinds do not match, issue ARITH_WRONGCONCAT. + +2018-09-18 Janus Weil + + Backport from trunk + PR fortran/85395 + * decl.c (match_binding_attributes): Use correct default accessibility + for procedure pointer components. + +2018-09-18 Janus Weil + + Backport from trunk + PR fortran/86830 + * expr.c (gfc_is_simply_contiguous): Handle type-bound procedure calls + with non-polymorphic objects. + +2018-09-18 Paul Thomas + + Backported from trunk + PR fortran/85954 + * resolve.c (resolve_assoc_var): If the target expression is a + deferred charlen dummy and the associate name shares the + charlen, generate a new one. Make sure that new charlens are in + the namespace list so that they get cleaned up. + * trans-array.c (gfc_is_reallocatable_lhs): Associate names are + not reallocatable. + * trans-decl.c (gfc_get_symbol_decl): Put deferred character + length dummy and result arrays on the deferred initialization + list so that the variable length arrays can be correctly dealt + with. + * trans-expr.c (gfc_conv_string_length): Return if 'expr' is + NULL rather than ICEing. + +2018-09-12 Paul Thomas + + Backported from trunk + PR fortran/87284 + * trans-expr.c (gfc_trans_class_init_assign): Access to + to array elements of the dynamic type requires that the array + reference be added to the class expression and not the _data + component, unlike scalar expressions. + +2018-09-11 Paul Thomas + + Backported from trunk + PR fortran/87277 + * expr.c (is_subref_array): Add the check of dimensionality for + class, dummy, pointer arrays. + +2018-09-05 Janus Weil + + Backported from trunk + PR fortran/86116 + * interface.c (compare_type): Remove a CLASS/TYPE check. + (compare_type_characteristics): New function that behaves like the old + 'compare_type'. + (gfc_check_dummy_characteristics, gfc_check_result_characteristics): + Call 'compare_type_characteristics' instead of 'compare_type'. + +2018-09-04 Jerry DeLisle + + * simplify.c (gfc_simplify_modulo): Re-arrange code to test + whether 'P' is zero and issue an error if it is. + +2018-09-01 Paul Thomas + + PR fortran/86328 + PR fortran/86760 + * trans-array.c (gfc_conv_scalarized_array_ref): Do not fix + info->descriptor but pass it directly to gfc_build_array_ref. + (gfc_conv_array_ref): Likewise for se->expr. + * trans.c (gfc_build_array_ref): If 'decl' is a COMPONENT_REF + obtain the span field directly from it. + +2018-08-24 Thomas Koenig + + Backport from trunk + PR fortran/86837 + * frontend-passes.c (var_in_expr_callback): New function. + (var_in_expr): New function. + (traverse_io_block): Use var_in_expr instead of + gfc_check_dependency for checking if the variable depends on the + previous interators. + +2018-08-12 Paul Thomas + + Backported from trunk + PR fortran/86906 + * resolve.c (resolve_fl_variable_derived): Check if the derived + type is use associated before checking for the host association + error. + +2018-07-26 Jakub Jelinek + + Backported from mainline + 2018-07-10 Jakub Jelinek + + PR fortran/86421 + * module.c (omp_declare_simd_clauses): Add LINEAR with _REF, _VAL and + _UVAL suffixes. + (mio_omp_declare_simd): Save and restore ref, val and uval modifiers + on linear clauses. Initialize n->where to gfc_current_locus. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c index 6f97d0f9784..ef9d67412d6 100644 --- a/gcc/fortran/arith.c +++ b/gcc/fortran/arith.c @@ -113,6 +113,11 @@ gfc_arith_error (arith code) p = _("Integer outside symmetric range implied by Standard Fortran at %L"); break; + case ARITH_WRONGCONCAT: + p = + _("Illegal type in character concatenation at %L"); + break; + default: gfc_internal_error ("gfc_arith_error(): Bad error code"); } @@ -982,7 +987,12 @@ gfc_arith_concat (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp) gfc_expr *result; size_t len; - gcc_assert (op1->ts.kind == op2->ts.kind); + /* By cleverly playing around with constructors, is is possible + to get mismaching types here. */ + if (op1->ts.type != BT_CHARACTER || op2->ts.type != BT_CHARACTER + || op1->ts.kind != op2->ts.kind) + return ARITH_WRONGCONCAT; + result = gfc_get_constant_expr (BT_CHARACTER, op1->ts.kind, &op1->where); @@ -2051,7 +2061,7 @@ gfc_int2int (gfc_expr *src, int kind) gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size); - if (warn_conversion && kind < src->ts.kind) + if (warn_conversion && !src->do_not_warn && kind < src->ts.kind) gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L", gfc_typename (&src->ts), gfc_typename (&result->ts), &src->where); @@ -2538,10 +2548,10 @@ gfc_character2character (gfc_expr *src, int kind) static void hollerith2representation (gfc_expr *result, gfc_expr *src) { - int src_len, result_len; + size_t src_len, result_len; src_len = src->representation.length - src->ts.u.pad; - result_len = gfc_target_expr_size (result); + gfc_target_expr_size (result, &result_len); if (src_len > result_len) { diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c index 35681413720..da00457c608 100644 --- a/gcc/fortran/array.c +++ b/gcc/fortran/array.c @@ -1246,7 +1246,9 @@ gfc_match_array_constructor (gfc_expr **result) { c = gfc_constructor_first (head); for (; c; c = gfc_constructor_next (c)) - gfc_convert_type (c->expr, &ts, 1); + if (!gfc_convert_type (c->expr, &ts, 1) + && c->expr->ts.type != BT_UNKNOWN) + return MATCH_ERROR; } } else diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index f304154ac68..2a24147cfe6 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -5413,16 +5413,41 @@ gfc_calculate_transfer_sizes (gfc_expr *source, gfc_expr *mold, gfc_expr *size, return false; /* Calculate the size of the source. */ - *source_size = gfc_target_expr_size (source); - if (*source_size == 0) + if (!gfc_target_expr_size (source, source_size)) return false; /* Determine the size of the element. */ - result_elt_size = gfc_element_size (mold); - if (result_elt_size == 0) + if (!gfc_element_size (mold, &result_elt_size)) return false; - if (mold->expr_type == EXPR_ARRAY || mold->rank || size) + /* If the storage size of SOURCE is greater than zero and MOLD is an array, + * a scalar with the type and type parameters of MOLD shall not have a + * storage size equal to zero. + * If MOLD is a scalar and SIZE is absent, the result is a scalar. + * If MOLD is an array and SIZE is absent, the result is an array and of + * rank one. Its size is as small as possible such that its physical + * representation is not shorter than that of SOURCE. + * If SIZE is present, the result is an array of rank one and size SIZE. + */ + if (result_elt_size == 0 && *source_size > 0 && !size + && mold->expr_type == EXPR_ARRAY) + { + gfc_error ("% argument of % intrinsic at %L is an " + "array and shall not have storage size 0 when % " + "argument has size greater than 0", &mold->where); + return false; + } + + if (result_elt_size == 0 && *source_size == 0 && !size) + { + *result_size = 0; + if (result_length_p) + *result_length_p = 0; + return true; + } + + if ((result_elt_size > 0 && (mold->expr_type == EXPR_ARRAY || mold->rank)) + || size) { int result_length; @@ -5452,6 +5477,26 @@ gfc_check_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size) size_t source_size; size_t result_size; + /* SOURCE shall be a scalar or array of any type. */ + if (source->ts.type == BT_PROCEDURE + && source->symtree->n.sym->attr.subroutine == 1) + { + gfc_error ("% argument of % intrinsic at %L " + "must not be a %s", &source->where, + gfc_basic_typename (source->ts.type)); + return false; + } + + /* MOLD shall be a scalar or array of any type. */ + if (mold->ts.type == BT_PROCEDURE + && mold->symtree->n.sym->attr.subroutine == 1) + { + gfc_error ("% argument of % intrinsic at %L " + "must not be a %s", &mold->where, + gfc_basic_typename (mold->ts.type)); + return false; + } + if (mold->ts.type == BT_HOLLERITH) { gfc_error ("% argument of % intrinsic at %L must not be" @@ -5459,6 +5504,8 @@ gfc_check_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size) return false; } + /* SIZE (optional) shall be an integer scalar. The corresponding actual + argument shall not be an optional dummy argument. */ if (size != NULL) { if (!type_check (size, 2, BT_INTEGER)) diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c index 2eae7f0f351..23a0468dedd 100644 --- a/gcc/fortran/class.c +++ b/gcc/fortran/class.c @@ -561,7 +561,7 @@ gfc_intrinsic_hash_value (gfc_typespec *ts) ref to the _len component. */ gfc_expr * -gfc_get_len_component (gfc_expr *e) +gfc_get_len_component (gfc_expr *e, int k) { gfc_expr *ptr; gfc_ref *ref, **last; @@ -586,6 +586,14 @@ gfc_get_len_component (gfc_expr *e) } /* And replace if with a ref to the _len component. */ gfc_add_len_component (ptr); + if (k != ptr->ts.kind) + { + gfc_typespec ts; + gfc_clear_ts (&ts); + ts.type = BT_INTEGER; + ts.kind = k; + gfc_convert_type_warn (ptr, &ts, 2, 0); + } return ptr; } @@ -899,6 +907,9 @@ finalize_component (gfc_expr *expr, gfc_symbol *derived, gfc_component *comp, if (!comp_is_finalizable (comp)) return; + if (comp->finalized) + return; + e = gfc_copy_expr (expr); if (!e->ref) e->ref = ref = gfc_get_ref (); @@ -1026,6 +1037,7 @@ finalize_component (gfc_expr *expr, gfc_symbol *derived, gfc_component *comp, sub_ns); gfc_free_expr (e); } + comp->finalized = true; } @@ -2661,6 +2673,7 @@ find_intrinsic_vtab (gfc_typespec *ts) gfc_namespace *sub_ns; gfc_namespace *contained; gfc_expr *e; + size_t e_size; gfc_get_symbol (name, ns, &vtype); if (!gfc_add_flavor (&vtype->attr, FL_DERIVED, NULL, @@ -2695,11 +2708,13 @@ find_intrinsic_vtab (gfc_typespec *ts) e = gfc_get_expr (); e->ts = *ts; e->expr_type = EXPR_VARIABLE; + if (ts->type == BT_CHARACTER) + e_size = ts->kind; + else + gfc_element_size (e, &e_size); c->initializer = gfc_get_int_expr (gfc_size_kind, NULL, - ts->type == BT_CHARACTER - ? ts->kind - : gfc_element_size (e)); + e_size); gfc_free_expr (e); /* Add component _extends. */ diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index a72ac03f2aa..e138375607d 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -564,6 +564,7 @@ match gfc_match_data (void) { gfc_data *new_data; + gfc_expr *e; match m; /* Before parsing the rest of a DATA statement, check F2008:c1206. */ @@ -600,6 +601,30 @@ gfc_match_data (void) goto cleanup; } + /* Check for an entity with an allocatable component, which is not + allowed. */ + e = new_data->var->expr; + if (e) + { + bool invalid; + + invalid = false; + for (gfc_ref *ref = e->ref; ref; ref = ref->next) + if ((ref->type == REF_COMPONENT + && ref->u.c.component->attr.allocatable) + || (ref->type == REF_ARRAY + && e->symtree->n.sym->attr.pointer != 1 + && ref->u.ar.as && ref->u.ar.as->type == AS_DEFERRED)) + invalid = true; + + if (invalid) + { + gfc_error ("Allocatable component or deferred-shaped array " + "near %C in DATA statement"); + goto cleanup; + } + } + m = top_val_list (new_data); if (m != MATCH_YES) goto cleanup; @@ -1653,6 +1678,14 @@ gfc_set_constant_character_len (gfc_charlen_t len, gfc_expr *expr, free (expr->value.character.string); expr->value.character.string = s; expr->value.character.length = len; + /* If explicit representation was given, clear it + as it is no longer needed after padding. */ + if (expr->representation.length) + { + expr->representation.length = 0; + free (expr->representation.string); + expr->representation.string = NULL; + } } } @@ -1820,7 +1853,7 @@ add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus) } else if (init->ts.u.cl && init->ts.u.cl->length) sym->ts.u.cl->length = - gfc_copy_expr (sym->value->ts.u.cl->length); + gfc_copy_expr (init->ts.u.cl->length); } } /* Update initializer character length according symbol. */ @@ -2741,6 +2774,22 @@ variable_decl (int elem) param->value = gfc_copy_expr (initializer); } + /* Before adding a possible initilizer, do a simple check for compatibility + of lhs and rhs types. Assigning a REAL value to a derive type is not a + good thing. */ + if (current_ts.type == BT_DERIVED && initializer + && (gfc_numeric_ts (&initializer->ts) + || initializer->ts.type == BT_LOGICAL + || initializer->ts.type == BT_CHARACTER)) + { + gfc_error ("Incompatible initialization between a derive type " + "entity and an entity with %qs type at %C", + gfc_typename (&initializer->ts)); + m = MATCH_ERROR; + goto cleanup; + } + + /* Add the initializer. Note that it is fine if initializer is NULL here, because we sometimes also need to check if a declaration *must* have an initialization expression. */ @@ -3850,7 +3899,6 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) return MATCH_YES; } - m = gfc_match (" type ("); matched_type = (m == MATCH_YES); if (matched_type) @@ -3899,7 +3947,10 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) m = MATCH_YES; if (matched_type && m == MATCH_YES && gfc_match_char (')') != MATCH_YES) - m = MATCH_ERROR; + { + gfc_error ("Malformed type-spec at %C"); + return MATCH_ERROR; + } return m; } @@ -3922,8 +3973,12 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) && !gfc_notify_std (GFC_STD_F2008, "TYPE with " "intrinsic-type-spec at %C")) return MATCH_ERROR; + if (matched_type && gfc_match_char (')') != MATCH_YES) - return MATCH_ERROR; + { + gfc_error ("Malformed type-spec at %C"); + return MATCH_ERROR; + } ts->type = BT_REAL; ts->kind = gfc_default_double_kind; @@ -3953,7 +4008,10 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) return MATCH_ERROR; if (matched_type && gfc_match_char (')') != MATCH_YES) - return MATCH_ERROR; + { + gfc_error ("Malformed type-spec at %C"); + return MATCH_ERROR; + } ts->type = BT_COMPLEX; ts->kind = gfc_default_double_kind; @@ -3974,7 +4032,13 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) if (m == MATCH_ERROR) return m; - m = gfc_match_char (')'); + gfc_gobble_whitespace (); + if (gfc_peek_ascii_char () != ')') + { + gfc_error ("Malformed type-spec at %C"); + return MATCH_ERROR; + } + m = gfc_match_char (')'); /* Burn closing ')'. */ } if (m != MATCH_YES) @@ -7115,7 +7179,7 @@ add_global_entry (const char *name, const char *binding_label, bool sub, name is a global identifier. */ if (!binding_label || gfc_notification_std (GFC_STD_F2008)) { - s = gfc_get_gsymbol (name); + s = gfc_get_gsymbol (name, false); if (s->defined || (s->type != GSYM_UNKNOWN && s->type != type)) { @@ -7137,7 +7201,7 @@ add_global_entry (const char *name, const char *binding_label, bool sub, && (!gfc_notification_std (GFC_STD_F2008) || strcmp (name, binding_label) != 0)) { - s = gfc_get_gsymbol (binding_label); + s = gfc_get_gsymbol (binding_label, true); if (s->defined || (s->type != GSYM_UNKNOWN && s->type != type)) { @@ -7314,9 +7378,11 @@ gfc_match_entry (void) gfc_error ("Missing required parentheses before BIND(C) at %C"); return MATCH_ERROR; } - if (!gfc_add_is_bind_c (&(entry->attr), entry->name, - &(entry->declared_at), 1)) - return MATCH_ERROR; + + if (!gfc_add_is_bind_c (&(entry->attr), entry->name, + &(entry->declared_at), 1)) + return MATCH_ERROR; + } if (!gfc_current_ns->parent @@ -7400,6 +7466,14 @@ gfc_match_entry (void) return MATCH_ERROR; } + /* F2018:C1546 An elemental procedure shall not have the BIND attribute. */ + if (proc->attr.elemental && entry->attr.is_bind_c) + { + gfc_error ("ENTRY statement at %L with BIND(C) prohibited in an " + "elemental procedure", &entry->declared_at); + return MATCH_ERROR; + } + entry->attr.recursive = proc->attr.recursive; entry->attr.elemental = proc->attr.elemental; entry->attr.pure = proc->attr.pure; @@ -10557,7 +10631,8 @@ match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc) done: if (ba->access == ACCESS_UNKNOWN) - ba->access = gfc_typebound_default_access; + ba->access = ppc ? gfc_current_block()->component_access + : gfc_typebound_default_access; if (ppc && !seen_ptr) { diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index b09ff90790c..8a23374a6c9 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1067,14 +1067,17 @@ is_subref_array (gfc_expr * e) if (e->symtree->n.sym->attr.subref_array_pointer) return true; - if (e->symtree->n.sym->ts.type == BT_CLASS - && e->symtree->n.sym->attr.dummy - && CLASS_DATA (e->symtree->n.sym)->attr.class_pointer) - return true; - seen_array = false; + for (ref = e->ref; ref; ref = ref->next) { + /* If we haven't seen the array reference and this is an intrinsic, + what follows cannot be a subreference array. */ + if (!seen_array && ref->type == REF_COMPONENT + && ref->u.c.component->ts.type != BT_CLASS + && !gfc_bt_struct (ref->u.c.component->ts.type)) + return false; + if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT) seen_array = true; @@ -1083,6 +1086,13 @@ is_subref_array (gfc_expr * e) && ref->type != REF_ARRAY) return seen_array; } + + if (e->symtree->n.sym->ts.type == BT_CLASS + && e->symtree->n.sym->attr.dummy + && CLASS_DATA (e->symtree->n.sym)->attr.dimension + && CLASS_DATA (e->symtree->n.sym)->attr.class_pointer) + return true; + return false; } @@ -1774,8 +1784,14 @@ simplify_const_ref (gfc_expr *p) string_len = 0; if (!p->ts.u.cl) - p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns, - NULL); + { + if (p->symtree) + p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns, + NULL); + else + p->ts.u.cl = gfc_new_charlen (gfc_current_ns, + NULL); + } else gfc_free_expr (p->ts.u.cl->length); @@ -1930,7 +1946,20 @@ gfc_simplify_expr (gfc_expr *p, int type) break; case EXPR_FUNCTION: - for (ap = p->value.function.actual; ap; ap = ap->next) + // For array-bound functions, we don't need to optimize + // the 'array' argument. In particular, if the argument + // is a PARAMETER, simplifying might convert an EXPR_VARIABLE + // into an EXPR_ARRAY; the latter has lbound = 1, the former + // can have any lbound. + ap = p->value.function.actual; + if (p->value.function.isym && + (p->value.function.isym->id == GFC_ISYM_LBOUND + || p->value.function.isym->id == GFC_ISYM_UBOUND + || p->value.function.isym->id == GFC_ISYM_LCOBOUND + || p->value.function.isym->id == GFC_ISYM_UCOBOUND)) + ap = ap->next; + + for ( ; ap; ap = ap->next) if (!gfc_simplify_expr (ap->expr, type)) return false; @@ -2367,6 +2396,8 @@ check_inquiry (gfc_expr *e, int not_restricted) int i = 0; gfc_actual_arglist *ap; + gfc_symbol *sym; + gfc_symbol *asym; if (!e->value.function.isym || !e->value.function.isym->inquiry) @@ -2376,20 +2407,22 @@ check_inquiry (gfc_expr *e, int not_restricted) if (e->symtree == NULL) return MATCH_NO; - if (e->symtree->n.sym->from_intmod) + sym = e->symtree->n.sym; + + if (sym->from_intmod) { - if (e->symtree->n.sym->from_intmod == INTMOD_ISO_FORTRAN_ENV - && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_OPTIONS - && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_VERSION) + if (sym->from_intmod == INTMOD_ISO_FORTRAN_ENV + && sym->intmod_sym_id != ISOFORTRAN_COMPILER_OPTIONS + && sym->intmod_sym_id != ISOFORTRAN_COMPILER_VERSION) return MATCH_NO; - if (e->symtree->n.sym->from_intmod == INTMOD_ISO_C_BINDING - && e->symtree->n.sym->intmod_sym_id != ISOCBINDING_C_SIZEOF) + if (sym->from_intmod == INTMOD_ISO_C_BINDING + && sym->intmod_sym_id != ISOCBINDING_C_SIZEOF) return MATCH_NO; } else { - name = e->symtree->n.sym->name; + name = sym->name; functions = (gfc_option.warn_std & GFC_STD_F2003) ? inquiry_func_f2003 : inquiry_func_f95; @@ -2411,41 +2444,48 @@ check_inquiry (gfc_expr *e, int not_restricted) if (!ap->expr) continue; + asym = ap->expr->symtree ? ap->expr->symtree->n.sym : NULL; + if (ap->expr->ts.type == BT_UNKNOWN) { - if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN - && !gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)) + if (asym && asym->ts.type == BT_UNKNOWN + && !gfc_set_default_type (asym, 0, gfc_current_ns)) return MATCH_NO; - ap->expr->ts = ap->expr->symtree->n.sym->ts; + ap->expr->ts = asym->ts; } - /* Assumed character length will not reduce to a constant expression - with LEN, as required by the standard. */ - if (i == 5 && not_restricted && ap->expr->symtree - && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER - && (ap->expr->symtree->n.sym->ts.u.cl->length == NULL - || ap->expr->symtree->n.sym->ts.deferred)) - { - gfc_error ("Assumed or deferred character length variable %qs " - "in constant expression at %L", - ap->expr->symtree->n.sym->name, - &ap->expr->where); - return MATCH_ERROR; - } - else if (not_restricted && !gfc_check_init_expr (ap->expr)) - return MATCH_ERROR; + if (asym && asym->assoc && asym->assoc->target + && asym->assoc->target->expr_type == EXPR_CONSTANT) + { + gfc_free_expr (ap->expr); + ap->expr = gfc_copy_expr (asym->assoc->target); + } - if (not_restricted == 0 - && ap->expr->expr_type != EXPR_VARIABLE - && !check_restricted (ap->expr)) + /* Assumed character length will not reduce to a constant expression + with LEN, as required by the standard. */ + if (i == 5 && not_restricted && asym + && asym->ts.type == BT_CHARACTER + && ((asym->ts.u.cl && asym->ts.u.cl->length == NULL) + || asym->ts.deferred)) + { + gfc_error ("Assumed or deferred character length variable %qs " + "in constant expression at %L", + asym->name, &ap->expr->where); return MATCH_ERROR; + } + else if (not_restricted && !gfc_check_init_expr (ap->expr)) + return MATCH_ERROR; - if (not_restricted == 0 - && ap->expr->expr_type == EXPR_VARIABLE - && ap->expr->symtree->n.sym->attr.dummy - && ap->expr->symtree->n.sym->attr.optional) - return MATCH_NO; + if (not_restricted == 0 + && ap->expr->expr_type != EXPR_VARIABLE + && !check_restricted (ap->expr)) + return MATCH_ERROR; + + if (not_restricted == 0 + && ap->expr->expr_type == EXPR_VARIABLE + && asym->attr.dummy && asym->attr.optional) + return MATCH_NO; } return MATCH_YES; @@ -3455,7 +3495,7 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform, NULLIFY statement. */ bool -gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue) +gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue, bool is_init_expr) { symbol_attribute attr, lhs_attr; gfc_ref *ref; @@ -3886,11 +3926,35 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue) return false; } - if (!attr.target && !attr.pointer) + if (is_init_expr) { - gfc_error ("Pointer assignment target is neither TARGET " - "nor POINTER at %L", &rvalue->where); - return false; + gfc_symbol *sym; + bool target; + + gcc_assert (rvalue->symtree); + sym = rvalue->symtree->n.sym; + + if (sym->ts.type == BT_CLASS && sym->attr.class_ok) + target = CLASS_DATA (sym)->attr.target; + else + target = sym->attr.target; + + if (!target && !proc_pointer) + { + gfc_error ("Pointer assignment target in initialization expression " + "does not have the TARGET attribute at %L", + &rvalue->where); + return false; + } + } + else + { + if (!attr.target && !attr.pointer) + { + gfc_error ("Pointer assignment target is neither TARGET " + "nor POINTER at %L", &rvalue->where); + return false; + } } if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym)) @@ -4024,7 +4088,7 @@ gfc_check_assign_symbol (gfc_symbol *sym, gfc_component *comp, gfc_expr *rvalue) } if (pointer || proc_pointer) - r = gfc_check_pointer_assign (&lvalue, rvalue); + r = gfc_check_pointer_assign (&lvalue, rvalue, true); else { /* If a conversion function, e.g., __convert_i8_i4, was inserted @@ -4273,12 +4337,10 @@ gfc_apply_init (gfc_typespec *ts, symbol_attribute *attr, gfc_expr *init) { if (ts->type == BT_CHARACTER && !attr->pointer && init && ts->u.cl - && ts->u.cl->length && ts->u.cl->length->expr_type == EXPR_CONSTANT) + && ts->u.cl->length + && ts->u.cl->length->expr_type == EXPR_CONSTANT + && ts->u.cl->length->ts.type == BT_INTEGER) { - gcc_assert (ts->u.cl && ts->u.cl->length); - gcc_assert (ts->u.cl->length->expr_type == EXPR_CONSTANT); - gcc_assert (ts->u.cl->length->ts.type == BT_INTEGER); - HOST_WIDE_INT len = gfc_mpz_get_hwi (ts->u.cl->length->value.integer); if (init->expr_type == EXPR_CONSTANT) @@ -5360,16 +5422,13 @@ gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element) return expr->value.function.esym->result->attr.contiguous; else { - /* We have to jump through some hoops if this is a vtab entry. */ - gfc_symbol *s; - gfc_ref *r, *rc; - - s = expr->symtree->n.sym; - if (s->ts.type != BT_CLASS) + /* Type-bound procedures. */ + gfc_symbol *s = expr->symtree->n.sym; + if (s->ts.type != BT_CLASS && s->ts.type != BT_DERIVED) return false; - - rc = NULL; - for (r = expr->ref; r; r = r->next) + + gfc_ref *rc = NULL; + for (gfc_ref *r = expr->ref; r; r = r->next) if (r->type == REF_COMPONENT) rc = r; diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index c13366cf138..2c1aafebb5f 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -1099,6 +1099,31 @@ convert_elseif (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED, return 0; } +/* Callback function to var_in_expr - return true if expr1 and + expr2 are identical variables. */ +static int +var_in_expr_callback (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED, + void *data) +{ + gfc_expr *expr1 = (gfc_expr *) data; + gfc_expr *expr2 = *e; + + if (expr2->expr_type != EXPR_VARIABLE) + return 0; + + return expr1->symtree->n.sym == expr2->symtree->n.sym; +} + +/* Return true if expr1 is found in expr2. */ + +static bool +var_in_expr (gfc_expr *expr1, gfc_expr *expr2) +{ + gcc_assert (expr1->expr_type == EXPR_VARIABLE); + + return gfc_expr_walker (&expr2, var_in_expr_callback, (void *) expr1); +} + struct do_stack { struct do_stack *prev; @@ -1251,9 +1276,9 @@ traverse_io_block (gfc_code *code, bool *has_reached, gfc_code *prev) for (int j = i - 1; j < i; j++) { if (iters[j] - && (gfc_check_dependency (var, iters[j]->start, true) - || gfc_check_dependency (var, iters[j]->end, true) - || gfc_check_dependency (var, iters[j]->step, true))) + && (var_in_expr (var, iters[j]->start) + || var_in_expr (var, iters[j]->end) + || var_in_expr (var, iters[j]->step))) return false; } } @@ -1691,6 +1716,10 @@ combine_array_constructor (gfc_expr *e) if (iterator_level > 0) return false; + /* WHERE also doesn't work. */ + if (in_where > 0) + return false; + op1 = e->value.op.op1; op2 = e->value.op.op2; @@ -1777,84 +1806,6 @@ combine_array_constructor (gfc_expr *e) return true; } -/* Change (-1)**k into 1-ishift(iand(k,1),1) and - 2**k into ishift(1,k) */ - -static bool -optimize_power (gfc_expr *e) -{ - gfc_expr *op1, *op2; - gfc_expr *iand, *ishft; - - if (e->ts.type != BT_INTEGER) - return false; - - op1 = e->value.op.op1; - - if (op1 == NULL || op1->expr_type != EXPR_CONSTANT) - return false; - - if (mpz_cmp_si (op1->value.integer, -1L) == 0) - { - gfc_free_expr (op1); - - op2 = e->value.op.op2; - - if (op2 == NULL) - return false; - - iand = gfc_build_intrinsic_call (current_ns, GFC_ISYM_IAND, - "_internal_iand", e->where, 2, op2, - gfc_get_int_expr (e->ts.kind, - &e->where, 1)); - - ishft = gfc_build_intrinsic_call (current_ns, GFC_ISYM_ISHFT, - "_internal_ishft", e->where, 2, iand, - gfc_get_int_expr (e->ts.kind, - &e->where, 1)); - - e->value.op.op = INTRINSIC_MINUS; - e->value.op.op1 = gfc_get_int_expr (e->ts.kind, &e->where, 1); - e->value.op.op2 = ishft; - return true; - } - else if (mpz_cmp_si (op1->value.integer, 2L) == 0) - { - gfc_free_expr (op1); - - op2 = e->value.op.op2; - if (op2 == NULL) - return false; - - ishft = gfc_build_intrinsic_call (current_ns, GFC_ISYM_ISHFT, - "_internal_ishft", e->where, 2, - gfc_get_int_expr (e->ts.kind, - &e->where, 1), - op2); - *e = *ishft; - return true; - } - - else if (mpz_cmp_si (op1->value.integer, 1L) == 0) - { - op2 = e->value.op.op2; - if (op2 == NULL) - return false; - - gfc_free_expr (op1); - gfc_free_expr (op2); - - e->expr_type = EXPR_CONSTANT; - e->value.op.op1 = NULL; - e->value.op.op2 = NULL; - mpz_init_set_si (e->value.integer, 1); - /* Typespec and location are still OK. */ - return true; - } - - return false; -} - /* Recursive optimization of operators. */ static bool @@ -1915,9 +1866,6 @@ optimize_op (gfc_expr *e) case INTRINSIC_DIVIDE: return combine_array_constructor (e) || changed; - case INTRINSIC_POWER: - return optimize_power (e); - default: break; } @@ -2513,7 +2461,12 @@ insert_index (gfc_expr *e, gfc_symbol *sym, mpz_t val, mpz_t ret) data.sym = sym; mpz_init_set (data.val, val); gfc_expr_walker (&n, callback_insert_index, (void *) &data); + + /* Suppress errors here - we could get errors here such as an + out of bounds access for arrays, see PR 90563. */ + gfc_push_suppress_errors (); gfc_simplify_expr (n, 0); + gfc_pop_suppress_errors (); if (n->expr_type == EXPR_CONSTANT) { @@ -2563,6 +2516,7 @@ do_subscript (gfc_expr **e) bool have_do_start, have_do_end; bool error_not_proven; int warn; + int sgn; dl = lp->c; if (dl == NULL) @@ -2591,7 +2545,16 @@ do_subscript (gfc_expr **e) Do not warn in this case. */ if (dl->ext.iterator->step->expr_type == EXPR_CONSTANT) - mpz_init_set (do_step, dl->ext.iterator->step->value.integer); + { + sgn = mpz_cmp_ui (dl->ext.iterator->step->value.integer, 0); + /* This can happen, but then the error has been + reported previusly. */ + if (sgn == 0) + continue; + + mpz_init_set (do_step, dl->ext.iterator->step->value.integer); + } + else continue; @@ -2615,6 +2578,16 @@ do_subscript (gfc_expr **e) if (!have_do_start && !have_do_end) return 0; + /* No warning inside a zero-trip loop. */ + if (have_do_start && have_do_end) + { + int cmp; + + cmp = mpz_cmp (do_end, do_start); + if ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0)) + break; + } + /* May have to correct the end value if the step does not equal one. */ if (have_do_start && have_do_end && mpz_cmp_ui (do_step, 1) != 0) diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 507570ccbff..16748a014e9 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -191,7 +191,8 @@ enum gfc_intrinsic_op /* Arithmetic results. */ enum arith { ARITH_OK = 1, ARITH_OVERFLOW, ARITH_UNDERFLOW, ARITH_NAN, - ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT + ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT, + ARITH_WRONGCONCAT }; /* Statements. */ @@ -1079,6 +1080,7 @@ typedef struct gfc_component struct gfc_typebound_proc *tb; /* When allocatable/pointer and in a coarray the associated token. */ tree caf_token; + bool finalized; } gfc_component; @@ -1855,6 +1857,9 @@ typedef struct gfc_namespace /* Set to 1 for !$ACC ROUTINE namespaces. */ unsigned oacc_routine:1; + + /* Set to 1 if there are any calls to procedures with implicit interface. */ + unsigned implicit_interface_calls:1; } gfc_namespace; @@ -1882,6 +1887,7 @@ typedef struct gfc_gsymbol enum gfc_symbol_type type; int defined, used; + bool bind_c; locus where; gfc_namespace *ns; } @@ -2143,6 +2149,9 @@ typedef struct gfc_expr /* Will require finalization after use. */ unsigned int must_finalize : 1; + /* Set this if no warning should be given somewhere in a lower level. */ + + unsigned int do_not_warn : 1; /* If an expression comes from a Hollerith constant or compile-time evaluation of a transfer statement, it may have a prescribed target- memory representation, and these cannot always be backformed from @@ -3055,7 +3064,7 @@ void gfc_enforce_clean_symbol_state (void); void gfc_free_dt_list (void); -gfc_gsymbol *gfc_get_gsymbol (const char *); +gfc_gsymbol *gfc_get_gsymbol (const char *, bool bind_c); gfc_gsymbol *gfc_find_gsymbol (gfc_gsymbol *, const char *); gfc_gsymbol *gfc_find_case_gsymbol (gfc_gsymbol *, const char *); @@ -3196,7 +3205,7 @@ int gfc_kind_max (gfc_expr *, gfc_expr *); bool gfc_check_conformance (gfc_expr *, gfc_expr *, const char *, ...) ATTRIBUTE_PRINTF_3; bool gfc_check_assign (gfc_expr *, gfc_expr *, int, bool c = true); -bool gfc_check_pointer_assign (gfc_expr *, gfc_expr *); +bool gfc_check_pointer_assign (gfc_expr *, gfc_expr *, bool is_init_expr = false); bool gfc_check_assign_symbol (gfc_symbol *, gfc_component *, gfc_expr *); gfc_expr *gfc_build_default_init_expr (gfc_typespec *, locus *); @@ -3345,7 +3354,7 @@ bool gfc_resolve_open (gfc_open *); void gfc_free_close (gfc_close *); bool gfc_resolve_close (gfc_close *); void gfc_free_filepos (gfc_filepos *); -bool gfc_resolve_filepos (gfc_filepos *); +bool gfc_resolve_filepos (gfc_filepos *, locus *); void gfc_free_inquire (gfc_inquire *); bool gfc_resolve_inquire (gfc_inquire *); void gfc_free_dt (gfc_dt *); @@ -3422,7 +3431,7 @@ bool gfc_is_class_scalar_expr (gfc_expr *); bool gfc_is_class_container_ref (gfc_expr *e); gfc_expr *gfc_class_initializer (gfc_typespec *, gfc_expr *); unsigned int gfc_hash_value (gfc_symbol *); -gfc_expr *gfc_get_len_component (gfc_expr *e); +gfc_expr *gfc_get_len_component (gfc_expr *e, int); bool gfc_build_class_symbol (gfc_typespec *, symbol_attribute *, gfc_array_spec **); gfc_symbol *gfc_find_derived_vtab (gfc_symbol *); diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index 6f894816c62..2af2981583d 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -1436,8 +1436,8 @@ are four-byte integers by default, and eight-byte integers if the compability only) is in effect. The representation of the record markers is that of unformatted files -given with the @option{-fconvert} option, the @xref{CONVERT specifier} -on the open statement or the @xref{GFORTRAN_CONVERT_UNIT} environment +given with the @option{-fconvert} option, the @ref{CONVERT specifier} +in an open statement or the @ref{GFORTRAN_CONVERT_UNIT} environment variable. The maximum number of bytes of user data in a subrecord is 2147483639 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 7f7b2c631cb..04850b0406c 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -692,6 +692,15 @@ gfc_compare_types (gfc_typespec *ts1, gfc_typespec *ts2) if (ts1->type == BT_VOID || ts2->type == BT_VOID) return true; + /* Special case for our C interop types. There should be a better + way of doing this... */ + + if (((ts1->type == BT_INTEGER && ts2->type == BT_DERIVED) + || (ts1->type == BT_DERIVED && ts2->type == BT_INTEGER)) + && ts1->u.derived && ts2->u.derived + && ts1->u.derived == ts2->u.derived) + return true; + /* The _data component is not always present, therefore check for its presence before assuming, that its derived->attr is available. When the _data component is not present, then nevertheless the @@ -735,13 +744,20 @@ compare_type (gfc_symbol *s1, gfc_symbol *s2) if (s2->attr.ext_attr & (1 << EXT_ATTR_NO_ARG_CHECK)) return true; + return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED; +} + + +static bool +compare_type_characteristics (gfc_symbol *s1, gfc_symbol *s2) +{ /* TYPE and CLASS of the same declared type are type compatible, but have different characteristics. */ if ((s1->ts.type == BT_CLASS && s2->ts.type == BT_DERIVED) || (s1->ts.type == BT_DERIVED && s2->ts.type == BT_CLASS)) return false; - return gfc_compare_types (&s1->ts, &s2->ts) || s2->ts.type == BT_ASSUMED; + return compare_type (s1, s2); } @@ -1291,7 +1307,8 @@ gfc_check_dummy_characteristics (gfc_symbol *s1, gfc_symbol *s2, /* Check type and rank. */ if (type_must_agree) { - if (!compare_type (s1, s2) || !compare_type (s2, s1)) + if (!compare_type_characteristics (s1, s2) + || !compare_type_characteristics (s2, s1)) { snprintf (errmsg, err_len, "Type mismatch in argument '%s' (%s/%s)", s1->name, gfc_typename (&s1->ts), gfc_typename (&s2->ts)); @@ -1510,7 +1527,7 @@ gfc_check_result_characteristics (gfc_symbol *s1, gfc_symbol *s2, return true; /* Check type and rank. */ - if (!compare_type (r1, r2)) + if (!compare_type_characteristics (r1, r2)) { snprintf (errmsg, err_len, "Type mismatch in function result (%s/%s)", gfc_typename (&r1->ts), gfc_typename (&r2->ts)); @@ -2924,17 +2941,19 @@ compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal, if (f->sym == NULL) { + /* These errors have to be issued, otherwise an ICE can occur. + See PR 78865. */ if (where) - gfc_error ("Missing alternate return spec in subroutine call " - "at %L", where); + gfc_error_now ("Missing alternate return specifier in subroutine " + "call at %L", where); return false; } if (a->expr == NULL) { if (where) - gfc_error ("Unexpected alternate return spec in subroutine " - "call at %L", where); + gfc_error_now ("Unexpected alternate return specifier in " + "subroutine call at %L", where); return false; } @@ -3638,6 +3657,7 @@ gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where) gfc_warning (OPT_Wimplicit_procedure, "Procedure %qs called at %L is not explicitly declared", sym->name, where); + gfc_find_proc_namespace (sym->ns)->implicit_interface_calls = 1; } if (sym->attr.if_source == IFSRC_UNKNOWN) diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index d9cc2493d3c..a6d3f4a0163 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -4939,6 +4939,8 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag) if (ts->type == BT_UNKNOWN) goto bad; + expr->do_not_warn = ! wflag; + /* NULL and zero size arrays get their type here, unless they already have a typespec. */ if ((expr->expr_type == EXPR_NULL @@ -4953,6 +4955,13 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag) if (expr->ts.type == BT_UNKNOWN) goto bad; + /* In building an array constructor, gfortran can end up here when no + conversion is required for an intrinsic type. We need to let derived + types drop through. */ + if (from_ts.type != BT_DERIVED + && (from_ts.type == ts->type && from_ts.kind == ts->kind)) + return true; + if (expr->ts.type == BT_DERIVED && ts->type == BT_DERIVED && gfc_compare_types (&expr->ts, ts)) return true; diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index 3d64056591e..ded17ac0f47 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -181,7 +181,8 @@ and warnings}. @item Code Generation Options @xref{Code Gen Options,,Options for code generation conventions}. @gccoptlist{-faggressive-function-elimination -fblas-matmul-limit=@var{n} @gol --fbounds-check -fcheck-array-temporaries @gol +-fbounds-check -ftail-call-workaround -ftail-call-workaround=@var{n} @gol +-fcheck-array-temporaries @gol -fcheck=@var{} @gol -fcoarray=@var{} -fexternal-blas -ff2c -ffrontend-loop-interchange @gol @@ -1580,6 +1581,39 @@ warnings for generated array temporaries. @c Note: This option is also referred in gcc's manpage Deprecated alias for @option{-fcheck=bounds}. +@item -ftail-call-workaround +@itemx -ftail-call-workaround=@var{n} +@opindex @code{tail-call-workaround} +Some C interfaces to Fortran codes violate the gfortran ABI by +omitting the hidden character length arguments as described in +@xref{Argument passing conventions}. This can lead to crashes +because pushing arguments for tail calls can overflow the stack. + +To provide a workaround for existing binary packages, this option +disables tail call optimization for gfortran procedures with character +arguments. With @option{-ftail-call-workaround=2} tail call optimization +is disabled in all gfortran procedures with character arguments, +with @option{-ftail-call-workaround=1} or equivalent +@option{-ftail-call-workaround} only in gfortran procedures with character +arguments that call implicitly prototyped procedures. + +Using this option can lead to problems including crashes due to +insufficient stack space. + +It is @emph{very strongly} recommended to fix the code in question. +The @option{-fc-prototypes-external} option can be used to generate +prototypes which conform to gfortran's ABI, for inclusion in the +source code. + +Support for this option will likely be withdrawn in a future release +of gfortran. + +The negative form, @option{-fno-tail-call-workaround} or equivalent +@option{-ftail-call-workaround=0}, can be used to disable this option. + +Default is currently @option{-ftail-call-workaround}, this will change +in future releases. + @item -fcheck-array-temporaries @opindex @code{fcheck-array-temporaries} Deprecated alias for @option{-fcheck=array-temps}. diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index 0aa31bb6a4f..9c3e6892a07 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -2150,33 +2150,6 @@ gfc_match_open (void) warn = (open->err || open->iostat) ? true : false; - /* Checks on NEWUNIT specifier. */ - if (open->newunit) - { - if (open->unit) - { - gfc_error ("UNIT specifier not allowed with NEWUNIT at %C"); - goto cleanup; - } - - if (!open->file && open->status) - { - if (open->status->expr_type == EXPR_CONSTANT - && gfc_wide_strncasecmp (open->status->value.character.string, - "scratch", 7) != 0) - { - gfc_error ("NEWUNIT specifier must have FILE= " - "or STATUS='scratch' at %C"); - goto cleanup; - } - } - } - else if (!open->unit) - { - gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified"); - goto cleanup; - } - /* Checks on the ACCESS specifier. */ if (open->access && open->access->expr_type == EXPR_CONSTANT) { @@ -2232,6 +2205,21 @@ gfc_match_open (void) if (!is_char_type ("ASYNCHRONOUS", open->asynchronous)) goto cleanup; + if (open->asynchronous->ts.kind != 1) + { + gfc_error ("ASYNCHRONOUS= specifier at %L must be of default " + "CHARACTER kind", &open->asynchronous->where); + return MATCH_ERROR; + } + + if (open->asynchronous->expr_type == EXPR_ARRAY + || open->asynchronous->expr_type == EXPR_STRUCTURE) + { + gfc_error ("ASYNCHRONOUS= specifier at %L must be scalar", + &open->asynchronous->where); + return MATCH_ERROR; + } + if (open->asynchronous->expr_type == EXPR_CONSTANT) { static const char * asynchronous[] = { "YES", "NO", NULL }; @@ -2501,6 +2489,33 @@ gfc_match_open (void) } } + /* Checks on NEWUNIT specifier. */ + if (open->newunit) + { + if (open->unit) + { + gfc_error ("UNIT specifier not allowed with NEWUNIT at %C"); + goto cleanup; + } + + if (!open->file && open->status) + { + if (open->status->expr_type == EXPR_CONSTANT + && gfc_wide_strncasecmp (open->status->value.character.string, + "scratch", 7) != 0) + { + gfc_error ("NEWUNIT specifier must have FILE= " + "or STATUS='scratch' at %C"); + goto cleanup; + } + } + } + else if (!open->unit) + { + gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified"); + goto cleanup; + } + /* Things that are not allowed for unformatted I/O. */ if (open->form && open->form->expr_type == EXPR_CONSTANT && (open->delim || open->decimal || open->encoding || open->round @@ -2834,22 +2849,21 @@ match_filepos (gfc_statement st, gfc_exec_op op) bool -gfc_resolve_filepos (gfc_filepos *fp) +gfc_resolve_filepos (gfc_filepos *fp, locus *where) { RESOLVE_TAG (&tag_unit, fp->unit); RESOLVE_TAG (&tag_iostat, fp->iostat); RESOLVE_TAG (&tag_iomsg, fp->iomsg); - if (!gfc_reference_st_label (fp->err, ST_LABEL_TARGET)) - return false; - if (!fp->unit && (fp->iostat || fp->iomsg)) + if (!fp->unit && (fp->iostat || fp->iomsg || fp->err)) { - locus where; - where = fp->iostat ? fp->iostat->where : fp->iomsg->where; - gfc_error ("UNIT number missing in statement at %L", &where); + gfc_error ("UNIT number missing in statement at %L", where); return false; } + if (!gfc_reference_st_label (fp->err, ST_LABEL_TARGET)) + return false; + if (fp->unit->expr_type == EXPR_CONSTANT && fp->unit->ts.type == BT_INTEGER && mpz_sgn (fp->unit->value.integer) < 0) @@ -3678,10 +3692,13 @@ static match check_io_constraints (io_kind k, gfc_dt *dt, gfc_code *io_code, locus *spec_end) { -#define io_constraint(condition,msg,arg)\ +#define io_constraint(condition, msg, arg)\ if (condition) \ {\ - gfc_error(msg,arg);\ + if ((arg)->lb != NULL)\ + gfc_error ((msg), (arg));\ + else\ + gfc_error ((msg), &gfc_current_locus);\ m = MATCH_ERROR;\ } @@ -3741,11 +3758,14 @@ if (condition) \ if (expr && expr->ts.type != BT_CHARACTER) { - io_constraint (gfc_pure (NULL) && (k == M_READ || k == M_WRITE), - "IO UNIT in %s statement at %C must be " + if (gfc_pure (NULL) && (k == M_READ || k == M_WRITE)) + { + gfc_error ("IO UNIT in %s statement at %C must be " "an internal file in a PURE procedure", io_kind_name (k)); - + return MATCH_ERROR; + } + if (k == M_READ || k == M_WRITE) gfc_unset_implicit_pure (NULL); } @@ -3793,6 +3813,21 @@ if (condition) \ if (!is_char_type ("ASYNCHRONOUS", dt->asynchronous)) return MATCH_ERROR; + if (dt->asynchronous->ts.kind != 1) + { + gfc_error ("ASYNCHRONOUS= specifier at %L must be of default " + "CHARACTER kind", &dt->asynchronous->where); + return MATCH_ERROR; + } + + if (dt->asynchronous->expr_type == EXPR_ARRAY + || dt->asynchronous->expr_type == EXPR_STRUCTURE) + { + gfc_error ("ASYNCHRONOUS= specifier at %L must be scalar", + &dt->asynchronous->where); + return MATCH_ERROR; + } + if (!compare_to_allowed_values ("ASYNCHRONOUS", asynchronous, NULL, NULL, dt->asynchronous->value.character.string, diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index f15b8f2773a..7e70a061acd 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see #include "intrinsic.h" #include "constructor.h" #include "arith.h" +#include "trans.h" /* Given printf-like arguments, return a stable version of the result string. @@ -2377,6 +2378,10 @@ gfc_resolve_fe_runtime_error (gfc_code *c) a->name = "%VAL"; c->resolved_sym = gfc_get_intrinsic_sub_symbol (name); + /* We set the backend_decl here because runtime_error is a + variadic function and we would use the wrong calling + convention otherwise. */ + c->resolved_sym->backend_decl = gfor_fndecl_runtime_error; } void diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt index 1cb7b6b4f84..ec9c02228da 100644 --- a/gcc/fortran/lang.opt +++ b/gcc/fortran/lang.opt @@ -742,6 +742,13 @@ fsign-zero Fortran Var(flag_sign_zero) Init(1) Apply negative sign to zero values. +ftail-call-workaround +Fortran Alias(ftail-call-workaround=,1,0) + +ftail-call-workaround= +Fortran RejectNegative Joined UInteger IntegerRange(0, 2) Var(flag_tail_call_workaround) Init(1) +Disallow tail call optimization when a calling routine may have omitted character lengths. + funderscoring Fortran Var(flag_underscoring) Init(1) Append underscores to externally visible names. diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 0931edd84aa..d0a4b53da6b 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -2105,8 +2105,6 @@ gfc_match_type_spec (gfc_typespec *ts) ts->type = BT_CHARACTER; m = gfc_match_char_spec (ts); - if (ts->u.cl && ts->u.cl->length) - gfc_resolve_expr (ts->u.cl->length); if (m == MATCH_NO) m = MATCH_YES; @@ -2208,6 +2206,9 @@ gfc_match_type_spec (gfc_typespec *ts) return MATCH_NO; } + if (e->expr_type != EXPR_CONSTANT) + goto ohno; + gfc_next_char (); /* Burn the ')'. */ ts->kind = (int) mpz_get_si (e->value.integer); if (gfc_validate_kind (ts->type, ts->kind , true) == -1) @@ -2222,6 +2223,8 @@ gfc_match_type_spec (gfc_typespec *ts) } } +ohno: + /* If a type is not matched, simply return MATCH_NO. */ gfc_current_locus = old_locus; return MATCH_NO; diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 2b20e519d19..4c5d9e92f66 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -3697,7 +3697,6 @@ static void mio_namelist (gfc_symbol *sym) { gfc_namelist *n, *m; - const char *check_name; mio_lparen (); @@ -3708,17 +3707,6 @@ mio_namelist (gfc_symbol *sym) } else { - /* This departure from the standard is flagged as an error. - It does, in fact, work correctly. TODO: Allow it - conditionally? */ - if (sym->attr.flavor == FL_NAMELIST) - { - check_name = find_use_name (sym->name, false); - if (check_name && strcmp (check_name, sym->name) != 0) - gfc_error ("Namelist %s cannot be renamed by USE " - "association to %s", sym->name, check_name); - } - m = NULL; while (peek_atom () != ATOM_RPAREN) { @@ -4100,6 +4088,9 @@ static const mstring omp_declare_simd_clauses[] = minit ("UNIFORM", 3), minit ("LINEAR", 4), minit ("ALIGNED", 5), + minit ("LINEAR_REF", 33), + minit ("LINEAR_VAL", 34), + minit ("LINEAR_UVAL", 35), minit (NULL, -1) }; @@ -4142,7 +4133,10 @@ mio_omp_declare_simd (gfc_namespace *ns, gfc_omp_declare_simd **odsp) } for (n = ods->clauses->lists[OMP_LIST_LINEAR]; n; n = n->next) { - mio_name (4, omp_declare_simd_clauses); + if (n->u.linear_op == OMP_LINEAR_DEFAULT) + mio_name (4, omp_declare_simd_clauses); + else + mio_name (32 + n->u.linear_op, omp_declare_simd_clauses); mio_symbol_ref (&n->sym); mio_expr (&n->expr); } @@ -4183,11 +4177,20 @@ mio_omp_declare_simd (gfc_namespace *ns, gfc_omp_declare_simd **odsp) case 4: case 5: *ptrs[t - 3] = n = gfc_get_omp_namelist (); + finish_namelist: + n->where = gfc_current_locus; ptrs[t - 3] = &n->next; mio_symbol_ref (&n->sym); if (t != 3) mio_expr (&n->expr); break; + case 33: + case 34: + case 35: + *ptrs[1] = n = gfc_get_omp_namelist (); + n->u.linear_op = (enum gfc_omp_linear_op) (t - 32); + t = 4; + goto finish_namelist; } } } diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 97d6e782373..707c43cee62 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -1705,22 +1705,17 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, locus old_loc2 = gfc_current_locus; do { - if (!c->sched_simd - && gfc_match ("simd") == MATCH_YES) + if (gfc_match ("simd") == MATCH_YES) { c->sched_simd = true; nmodifiers++; } - else if (!c->sched_monotonic - && !c->sched_nonmonotonic - && gfc_match ("monotonic") == MATCH_YES) + else if (gfc_match ("monotonic") == MATCH_YES) { c->sched_monotonic = true; nmodifiers++; } - else if (!c->sched_monotonic - && !c->sched_nonmonotonic - && gfc_match ("nonmonotonic") == MATCH_YES) + else if (gfc_match ("nonmonotonic") == MATCH_YES) { c->sched_nonmonotonic = true; nmodifiers++; @@ -1731,7 +1726,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, gfc_current_locus = old_loc2; break; } - if (nmodifiers == 0 + if (nmodifiers == 1 && gfc_match (" , ") == MATCH_YES) continue; else if (gfc_match (" : ") == MATCH_YES) @@ -4068,6 +4063,30 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, gfc_warning (0, "INTEGER expression of SCHEDULE clause's chunk_size " "at %L must be positive", &expr->where); } + if (omp_clauses->sched_kind != OMP_SCHED_NONE + && omp_clauses->sched_nonmonotonic) + { + if (omp_clauses->sched_kind != OMP_SCHED_DYNAMIC + && omp_clauses->sched_kind != OMP_SCHED_GUIDED) + { + const char *p; + switch (omp_clauses->sched_kind) + { + case OMP_SCHED_STATIC: p = "STATIC"; break; + case OMP_SCHED_RUNTIME: p = "RUNTIME"; break; + case OMP_SCHED_AUTO: p = "AUTO"; break; + default: gcc_unreachable (); + } + gfc_error ("NONMONOTONIC modifier specified for %s schedule kind " + "at %L", p, &code->loc); + } + else if (omp_clauses->sched_monotonic) + gfc_error ("Both MONOTONIC and NONMONOTONIC schedule modifiers " + "specified at %L", &code->loc); + else if (omp_clauses->ordered) + gfc_error ("NONMONOTONIC schedule modifier specified with ORDERED " + "clause at %L", &code->loc); + } /* Check that no symbol appears on multiple clauses, except that a symbol can appear on both firstprivate and lastprivate. */ diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 4ce6eb42750..e920c71d569 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -5830,7 +5830,7 @@ parse_block_data (void) } else { - s = gfc_get_gsymbol (gfc_new_block->name); + s = gfc_get_gsymbol (gfc_new_block->name, false); if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_BLOCK_DATA)) gfc_global_used (s, &gfc_new_block->declared_at); @@ -5912,7 +5912,7 @@ parse_module (void) gfc_gsymbol *s; bool error; - s = gfc_get_gsymbol (gfc_new_block->name); + s = gfc_get_gsymbol (gfc_new_block->name, false); if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_MODULE)) gfc_global_used (s, &gfc_new_block->declared_at); else @@ -5976,7 +5976,7 @@ add_global_procedure (bool sub) name is a global identifier. */ if (!gfc_new_block->binding_label || gfc_notification_std (GFC_STD_F2008)) { - s = gfc_get_gsymbol (gfc_new_block->name); + s = gfc_get_gsymbol (gfc_new_block->name, false); if (s->defined || (s->type != GSYM_UNKNOWN @@ -6001,7 +6001,7 @@ add_global_procedure (bool sub) && (!gfc_notification_std (GFC_STD_F2008) || strcmp (gfc_new_block->name, gfc_new_block->binding_label) != 0)) { - s = gfc_get_gsymbol (gfc_new_block->binding_label); + s = gfc_get_gsymbol (gfc_new_block->binding_label, true); if (s->defined || (s->type != GSYM_UNKNOWN @@ -6033,7 +6033,7 @@ add_global_program (void) if (gfc_new_block == NULL) return; - s = gfc_get_gsymbol (gfc_new_block->name); + s = gfc_get_gsymbol (gfc_new_block->name, false); if (s->defined || (s->type != GSYM_UNKNOWN && s->type != GSYM_PROGRAM)) gfc_global_used (s, &gfc_new_block->declared_at); diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index 094f2101bbc..def06c501c6 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -3061,6 +3061,7 @@ gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result) e = gfc_get_expr (); e->symtree = symtree; e->expr_type = EXPR_FUNCTION; + e->where = gfc_current_locus; gcc_assert (gfc_fl_struct (sym->attr.flavor) && symtree->n.sym->attr.flavor == FL_PROCEDURE); diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index d09cfa68da6..8afc72350c1 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1045,7 +1045,7 @@ resolve_common_blocks (gfc_symtree *common_root) } if (!gsym) { - gsym = gfc_get_gsymbol (common_root->n.common->name); + gsym = gfc_get_gsymbol (common_root->n.common->name, false); gsym->type = GSYM_COMMON; gsym->where = common_root->n.common->where; gsym->defined = 1; @@ -1067,7 +1067,7 @@ resolve_common_blocks (gfc_symtree *common_root) } if (!gsym) { - gsym = gfc_get_gsymbol (common_root->n.common->binding_label); + gsym = gfc_get_gsymbol (common_root->n.common->binding_label, true); gsym->type = GSYM_COMMON; gsym->where = common_root->n.common->where; gsym->defined = 1; @@ -1681,8 +1681,6 @@ is_illegal_recursion (gfc_symbol* sym, gfc_namespace* context) || gfc_fl_struct (sym->attr.flavor)) return false; - gcc_assert (sym->attr.flavor == FL_PROCEDURE); - /* If we've got an ENTRY, find real procedure. */ if (sym->attr.entry && sym->ns->entries) proc_sym = sym->ns->entries->sym; @@ -2484,7 +2482,8 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION; - gsym = gfc_get_gsymbol (sym->binding_label ? sym->binding_label : sym->name); + gsym = gfc_get_gsymbol (sym->binding_label ? sym->binding_label : sym->name, + sym->binding_label != NULL); if ((gsym->type != GSYM_UNKNOWN && gsym->type != type)) gfc_global_used (gsym, where); @@ -2494,64 +2493,64 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, && gsym->type != GSYM_UNKNOWN && !gsym->binding_label && gsym->ns - && gsym->ns->resolved != -1 && gsym->ns->proc_name && not_in_recursive (sym, gsym->ns) && not_entry_self_reference (sym, gsym->ns)) { gfc_symbol *def_sym; + def_sym = gsym->ns->proc_name; /* Resolve the gsymbol namespace if needed. */ - if (!gsym->ns->resolved) + if (gsym->ns->resolved != -1) { - gfc_dt_list *old_dt_list; + if (!gsym->ns->resolved) + { + gfc_dt_list *old_dt_list; - /* Stash away derived types so that the backend_decls do not - get mixed up. */ - old_dt_list = gfc_derived_types; - gfc_derived_types = NULL; + /* Stash away derived types so that the backend_decls + do not get mixed up. */ + old_dt_list = gfc_derived_types; + gfc_derived_types = NULL; - gfc_resolve (gsym->ns); + gfc_resolve (gsym->ns); - /* Store the new derived types with the global namespace. */ - if (gfc_derived_types) - gsym->ns->derived_types = gfc_derived_types; + /* Store the new derived types with the global namespace. */ + if (gfc_derived_types) + gsym->ns->derived_types = gfc_derived_types; - /* Restore the derived types of this namespace. */ - gfc_derived_types = old_dt_list; - } + /* Restore the derived types of this namespace. */ + gfc_derived_types = old_dt_list; + } - /* Make sure that translation for the gsymbol occurs before - the procedure currently being resolved. */ - ns = gfc_global_ns_list; - for (; ns && ns != gsym->ns; ns = ns->sibling) - { - if (ns->sibling == gsym->ns) + /* Make sure that translation for the gsymbol occurs before + the procedure currently being resolved. */ + ns = gfc_global_ns_list; + for (; ns && ns != gsym->ns; ns = ns->sibling) { - ns->sibling = gsym->ns->sibling; - gsym->ns->sibling = gfc_global_ns_list; - gfc_global_ns_list = gsym->ns; - break; + if (ns->sibling == gsym->ns) + { + ns->sibling = gsym->ns->sibling; + gsym->ns->sibling = gfc_global_ns_list; + gfc_global_ns_list = gsym->ns; + break; + } } - } - def_sym = gsym->ns->proc_name; - - /* This can happen if a binding name has been specified. */ - if (gsym->binding_label && gsym->sym_name != def_sym->name) - gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &def_sym); + /* This can happen if a binding name has been specified. */ + if (gsym->binding_label && gsym->sym_name != def_sym->name) + gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &def_sym); - if (def_sym->attr.entry_master) - { - gfc_entry_list *entry; - for (entry = gsym->ns->entries; entry; entry = entry->next) - if (strcmp (entry->sym->name, sym->name) == 0) - { - def_sym = entry->sym; - break; - } + if (def_sym->attr.entry_master || def_sym->attr.entry) + { + gfc_entry_list *entry; + for (entry = gsym->ns->entries; entry; entry = entry->next) + if (strcmp (entry->sym->name, sym->name) == 0) + { + def_sym = entry->sym; + break; + } + } } - if (sym->attr.function && !gfc_compare_types (&sym->ts, &def_sym->ts)) { gfc_error ("Return type mismatch of function %qs at %L (%s/%s)", @@ -3926,7 +3925,7 @@ resolve_operator (gfc_expr *e) if (op2->ts.type != e->ts.type || op2->ts.kind != e->ts.kind) gfc_convert_type (op2, &e->ts, 1); e = logical_to_bitwise (e); - return resolve_function (e); + break; } sprintf (msg, _("Operands of logical operator %%<%s%%> at %%L are %s/%s"), @@ -3942,7 +3941,7 @@ resolve_operator (gfc_expr *e) e->ts.type = BT_INTEGER; e->ts.kind = op1->ts.kind; e = logical_to_bitwise (e); - return resolve_function (e); + break; } if (op1->ts.type == BT_LOGICAL) @@ -4633,9 +4632,13 @@ find_array_spec (gfc_expr *e) gfc_array_spec *as; gfc_component *c; gfc_ref *ref; + bool class_as = false; if (e->symtree->n.sym->ts.type == BT_CLASS) - as = CLASS_DATA (e->symtree->n.sym)->as; + { + as = CLASS_DATA (e->symtree->n.sym)->as; + class_as = true; + } else as = e->symtree->n.sym->as; @@ -4654,7 +4657,7 @@ find_array_spec (gfc_expr *e) c = ref->u.c.component; if (c->attr.dimension) { - if (as != NULL) + if (as != NULL && !(class_as && as == c->as)) gfc_internal_error ("find_array_spec(): unused as(1)"); as = c->as; } @@ -4881,6 +4884,7 @@ gfc_resolve_substring_charlen (gfc_expr *e) gfc_ref *char_ref; gfc_expr *start, *end; gfc_typespec *ts = NULL; + mpz_t diff; for (char_ref = e->ref; char_ref; char_ref = char_ref->next) { @@ -4932,11 +4936,25 @@ gfc_resolve_substring_charlen (gfc_expr *e) return; } - /* Length = (end - start + 1). */ - e->ts.u.cl->length = gfc_subtract (end, start); - e->ts.u.cl->length = gfc_add (e->ts.u.cl->length, - gfc_get_int_expr (gfc_charlen_int_kind, - NULL, 1)); + /* Length = (end - start + 1). + Check first whether it has a constant length. */ + if (gfc_dep_difference (end, start, &diff)) + { + gfc_expr *len = gfc_get_constant_expr (BT_INTEGER, gfc_charlen_int_kind, + &e->where); + + mpz_add_ui (len->value.integer, diff, 1); + mpz_clear (diff); + e->ts.u.cl->length = len; + /* The check for length < 0 is handled below */ + } + else + { + e->ts.u.cl->length = gfc_subtract (end, start); + e->ts.u.cl->length = gfc_add (e->ts.u.cl->length, + gfc_get_int_expr (gfc_charlen_int_kind, + NULL, 1)); + } /* F2008, 6.4.1: Both the starting point and the ending point shall be within the range 1, 2, ..., n unless the starting point exceeds @@ -5329,7 +5347,7 @@ resolve_variable (gfc_expr *e) the ts' type of the component refs is still array valued, which can't be translated that way. */ if (sym->assoc && e->rank == 0 && e->ref && sym->ts.type == BT_CLASS - && sym->assoc->target->ts.type == BT_CLASS + && sym->assoc->target && sym->assoc->target->ts.type == BT_CLASS && CLASS_DATA (sym->assoc->target)->as) { gfc_ref *ref = e->ref; @@ -5358,6 +5376,23 @@ resolve_variable (gfc_expr *e) gfc_fix_class_refs (e); if (!sym->attr.dimension && e->ref && e->ref->type == REF_ARRAY) return false; + else if (sym->attr.dimension && (!e->ref || e->ref->type != REF_ARRAY)) + { + /* This can happen because the parser did not detect that the + associate name is an array and the expression had no array + part_ref. */ + gfc_ref *ref = gfc_get_ref (); + ref->type = REF_ARRAY; + ref->u.ar = *gfc_get_array_ref(); + ref->u.ar.type = AR_FULL; + if (sym->as) + { + ref->u.ar.as = sym->as; + ref->u.ar.dimen = sym->as->rank; + } + ref->next = e->ref; + e->ref = ref; + } } if (sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.generic) @@ -5598,11 +5633,14 @@ resolve_variable (gfc_expr *e) /* Checks to see that the correct symbol has been host associated. - The only situation where this arises is that in which a twice - contained function is parsed after the host association is made. - Therefore, on detecting this, change the symbol in the expression - and convert the array reference into an actual arglist if the old - symbol is a variable. */ + The only situations where this arises are: + (i) That in which a twice contained function is parsed after + the host association is made. On detecting this, change + the symbol in the expression and convert the array reference + into an actual arglist if the old symbol is a variable; or + (ii) That in which an external function is typed but not declared + explcitly to be external. Here, the old symbol is changed + from a variable to an external function. */ static bool check_host_association (gfc_expr *e) { @@ -5692,6 +5730,26 @@ check_host_association (gfc_expr *e) gfc_resolve_expr (e); sym->refs++; } + /* This case corresponds to a call, from a block or a contained + procedure, to an external function, which has not been declared + as being external in the main program but has been typed. */ + else if (sym && old_sym != sym + && !e->ref + && sym->ts.type == BT_UNKNOWN + && old_sym->ts.type != BT_UNKNOWN + && sym->attr.flavor == FL_PROCEDURE + && old_sym->attr.flavor == FL_VARIABLE + && sym->ns->parent == old_sym->ns + && sym->ns->proc_name + && (sym->ns->proc_name->attr.flavor == FL_LABEL + || sym->ns->proc_name->attr.flavor == FL_PROCEDURE)) + { + old_sym->attr.flavor = FL_PROCEDURE; + old_sym->attr.external = 1; + old_sym->attr.function = 1; + old_sym->result = old_sym; + gfc_resolve_expr (e); + } } /* This might have changed! */ return e->expr_type == EXPR_FUNCTION; @@ -6871,19 +6929,6 @@ gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope) "Step expression in DO loop")) return false; - if (iter->step->expr_type == EXPR_CONSTANT) - { - if ((iter->step->ts.type == BT_INTEGER - && mpz_cmp_ui (iter->step->value.integer, 0) == 0) - || (iter->step->ts.type == BT_REAL - && mpfr_sgn (iter->step->value.real) == 0)) - { - gfc_error ("Step expression in DO loop at %L cannot be zero", - &iter->step->where); - return false; - } - } - /* Convert start, end, and step to the same type as var. */ if (iter->start->ts.kind != iter->var->ts.kind || iter->start->ts.type != iter->var->ts.type) @@ -6897,6 +6942,19 @@ gfc_resolve_iterator (gfc_iterator *iter, bool real_ok, bool own_scope) || iter->step->ts.type != iter->var->ts.type) gfc_convert_type (iter->step, &iter->var->ts, 1); + if (iter->step->expr_type == EXPR_CONSTANT) + { + if ((iter->step->ts.type == BT_INTEGER + && mpz_cmp_ui (iter->step->value.integer, 0) == 0) + || (iter->step->ts.type == BT_REAL + && mpfr_sgn (iter->step->value.real) == 0)) + { + gfc_error ("Step expression in DO loop at %L cannot be zero", + &iter->step->where); + return false; + } + } + if (iter->start->expr_type == EXPR_CONSTANT && iter->end->expr_type == EXPR_CONSTANT && iter->step->expr_type == EXPR_CONSTANT) @@ -7198,6 +7256,10 @@ gfc_expr_to_initialize (gfc_expr *e) for (ref = result->ref; ref; ref = ref->next) if (ref->type == REF_ARRAY && ref->next == NULL) { + if (ref->u.ar.dimen == 0 + && ref->u.ar.as && ref->u.ar.as->corank) + return result; + ref->u.ar.type = AR_FULL; for (i = 0; i < ref->u.ar.dimen; i++) @@ -7623,13 +7685,54 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec) if (codimension) for (i = ar->dimen; i < ar->dimen + ar->codimen; i++) - if (ar->dimen_type[i] == DIMEN_THIS_IMAGE) - { - gfc_error ("Coarray specification required in ALLOCATE statement " - "at %L", &e->where); - goto failure; - } + { + switch (ar->dimen_type[i]) + { + case DIMEN_THIS_IMAGE: + gfc_error ("Coarray specification required in ALLOCATE statement " + "at %L", &e->where); + goto failure; + case DIMEN_RANGE: + if (ar->start[i] == 0 || ar->end[i] == 0) + { + /* If ar->stride[i] is NULL, we issued a previous error. */ + if (ar->stride[i] == NULL) + gfc_error ("Bad array specification in ALLOCATE statement " + "at %L", &e->where); + goto failure; + } + else if (gfc_dep_compare_expr (ar->start[i], ar->end[i]) == 1) + { + gfc_error ("Upper cobound is less than lower cobound at %L", + &ar->start[i]->where); + goto failure; + } + break; + + case DIMEN_ELEMENT: + if (ar->start[i]->expr_type == EXPR_CONSTANT) + { + gcc_assert (ar->start[i]->ts.type == BT_INTEGER); + if (mpz_cmp_si (ar->start[i]->value.integer, 1) < 0) + { + gfc_error ("Upper cobound is less than lower cobound " + " of 1 at %L", &ar->start[i]->where); + goto failure; + } + } + break; + + case DIMEN_STAR: + break; + + default: + gfc_error ("Bad array specification in ALLOCATE statement at %L", + &e->where); + goto failure; + + } + } for (i = 0; i < ar->dimen; i++) { if (ar->type == AR_ELEMENT || ar->type == AR_FULL) @@ -8658,6 +8761,14 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) if (!sym->ts.u.cl) sym->ts.u.cl = target->ts.u.cl; + if (sym->ts.deferred && target->expr_type == EXPR_VARIABLE + && target->symtree->n.sym->attr.dummy + && sym->ts.u.cl == target->ts.u.cl) + { + sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL); + sym->ts.deferred = 1; + } + if (!sym->ts.u.cl->length && !sym->ts.deferred && target->expr_type == EXPR_CONSTANT) @@ -8670,7 +8781,7 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) || sym->ts.u.cl->length->expr_type != EXPR_CONSTANT) && target->expr_type != EXPR_VARIABLE) { - sym->ts.u.cl = gfc_get_charlen(); + sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL); sym->ts.deferred = 1; /* This is reset in trans-stmt.c after the assignment @@ -10491,6 +10602,11 @@ get_temp_from_expr (gfc_expr *e, gfc_namespace *ns) gfc_get_sym_tree (name, ns, &tmp, false); gfc_add_type (tmp->n.sym, &e->ts, NULL); + if (e->expr_type == EXPR_CONSTANT && e->ts.type == BT_CHARACTER) + tmp->n.sym->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind, + NULL, + e->value.character.length); + as = NULL; ref = NULL; aref = NULL; @@ -10981,6 +11097,9 @@ deferred_op_assign (gfc_code **code, gfc_namespace *ns) if (!gfc_check_dependency ((*code)->expr1, (*code)->expr2, 1)) return false; + if (gfc_expr_attr ((*code)->expr1).pointer) + return false; + tmp_expr = get_temp_from_expr ((*code)->expr1, ns); tmp_expr->where = (*code)->loc; @@ -11395,7 +11514,7 @@ gfc_resolve_code (gfc_code *code, gfc_namespace *ns) case EXEC_ENDFILE: case EXEC_REWIND: case EXEC_FLUSH: - if (!gfc_resolve_filepos (code->ext.filepos)) + if (!gfc_resolve_filepos (code->ext.filepos, &code->loc)) break; resolve_branch (code->ext.filepos->err, code); @@ -11617,7 +11736,7 @@ gfc_verify_binding_labels (gfc_symbol *sym) && (gsym->type == GSYM_FUNCTION || gsym->type == GSYM_SUBROUTINE))) { if (!gsym) - gsym = gfc_get_gsymbol (sym->binding_label); + gsym = gfc_get_gsymbol (sym->binding_label, true); gsym->where = sym->declared_at; gsym->sym_name = sym->name; gsym->binding_label = sym->binding_label; @@ -12050,6 +12169,7 @@ resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag) namespace. 14.6.1.3 of the standard and the discussion on comp.lang.fortran. */ if (sym->ns != sym->ts.u.derived->ns + && !sym->ts.u.derived->attr.use_assoc && sym->ns->proc_name->attr.if_source != IFSRC_IFBODY) { gfc_symbol *s; @@ -12404,7 +12524,8 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag) } /* An elemental function is required to return a scalar 12.7.1 */ - if (sym->attr.elemental && sym->attr.function && sym->as) + if (sym->attr.elemental && sym->attr.function + && (sym->as || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as))) { gfc_error ("ELEMENTAL function %qs at %L must have a scalar " "result", sym->name, &sym->declared_at); @@ -15198,7 +15319,7 @@ resolve_symbol (gfc_symbol *sym) /* Set the formal_arg_flag so that check_conflict will not throw an error for host associated variables in the specification expression for an array_valued function. */ - if (sym->attr.function && sym->as) + if ((sym->attr.function || sym->attr.result) && sym->as) formal_arg_flag = true; saved_specification_expr = specification_expr; @@ -15350,7 +15471,10 @@ check_data_variable (gfc_data_variable *var, locus *where) e = e->value.function.actual->expr; if (e->expr_type != EXPR_VARIABLE) - gfc_internal_error ("check_data_variable(): Bad expression"); + { + gfc_error ("Expecting definable entity near %L", where); + return false; + } sym = e->symtree->n.sym; @@ -15358,6 +15482,7 @@ check_data_variable (gfc_data_variable *var, locus *where) { gfc_error ("BLOCK DATA element %qs at %L must be in COMMON", sym->name, &sym->declared_at); + return false; } if (e->ref == NULL && sym->as) @@ -16230,8 +16355,8 @@ resolve_equivalence (gfc_equiv *eq) } -/* Function called by resolve_fntype to flag other symbol used in the - length type parameter specification of function resuls. */ +/* Function called by resolve_fntype to flag other symbols used in the + length type parameter specification of function results. */ static bool flag_fn_result_spec (gfc_expr *expr, diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 2eb467a1915..e043c90a4ec 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -169,8 +169,10 @@ convert_mpz_to_unsigned (mpz_t x, int bitsize) } else { - /* Confirm that no bits above the signed range are set. */ - gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX); + /* Confirm that no bits above the signed range are set if we + are doing range checking. */ + if (flag_range_check != 0) + gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX); } } @@ -4469,7 +4471,7 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind) /* The expression in assoc->target points to a ref to the _data component of the unlimited polymorphic entity. To get the _len component the last _data ref needs to be stripped and a ref to the _len component added. */ - return gfc_get_len_component (e->symtree->n.sym->assoc->target); + return gfc_get_len_component (e->symtree->n.sym->assoc->target, k); else return NULL; } @@ -5509,54 +5511,57 @@ gfc_simplify_modulo (gfc_expr *a, gfc_expr *p) gfc_expr *result; int kind; - if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT) + /* First check p. */ + if (p->expr_type != EXPR_CONSTANT) return NULL; - kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind; - result = gfc_get_constant_expr (a->ts.type, kind, &a->where); - - switch (a->ts.type) + /* p shall not be 0. */ + switch (p->ts.type) { case BT_INTEGER: if (mpz_cmp_ui (p->value.integer, 0) == 0) { - /* Result is processor-dependent. This processor just opts - to not handle it at all. */ - gfc_error ("Second argument of MODULO at %L is zero", &a->where); - gfc_free_expr (result); + gfc_error ("Argument %qs of MODULO at %L shall not be zero", + "P", &p->where); return &gfc_bad_expr; } - mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer); - break; - case BT_REAL: if (mpfr_cmp_ui (p->value.real, 0) == 0) { - /* Result is processor-dependent. */ - gfc_error ("Second argument of MODULO at %L is zero", &p->where); - gfc_free_expr (result); + gfc_error ("Argument %qs of MODULO at %L shall not be zero", + "P", &p->where); return &gfc_bad_expr; } - - gfc_set_model_kind (kind); - mpfr_fmod (result->value.real, a->value.real, p->value.real, - GFC_RND_MODE); - if (mpfr_cmp_ui (result->value.real, 0) != 0) - { - if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real)) - mpfr_add (result->value.real, result->value.real, p->value.real, - GFC_RND_MODE); - } - else - mpfr_copysign (result->value.real, result->value.real, - p->value.real, GFC_RND_MODE); break; - default: gfc_internal_error ("gfc_simplify_modulo(): Bad arguments"); } + if (a->expr_type != EXPR_CONSTANT) + return NULL; + + kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind; + result = gfc_get_constant_expr (a->ts.type, kind, &a->where); + + if (a->ts.type == BT_INTEGER) + mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer); + else + { + gfc_set_model_kind (kind); + mpfr_fmod (result->value.real, a->value.real, p->value.real, + GFC_RND_MODE); + if (mpfr_cmp_ui (result->value.real, 0) != 0) + { + if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real)) + mpfr_add (result->value.real, result->value.real, p->value.real, + GFC_RND_MODE); + } + else + mpfr_copysign (result->value.real, result->value.real, + p->value.real, GFC_RND_MODE); + } + return range_check (result, "MODULO"); } @@ -6918,6 +6923,7 @@ gfc_simplify_sizeof (gfc_expr *x) { gfc_expr *result = NULL; mpz_t array_size; + size_t res_size; if (x->ts.type == BT_CLASS || x->ts.deferred) return NULL; @@ -6933,7 +6939,8 @@ gfc_simplify_sizeof (gfc_expr *x) result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind, &x->where); - mpz_set_si (result->value.integer, gfc_target_expr_size (x)); + gfc_target_expr_size (x, &res_size); + mpz_set_si (result->value.integer, res_size); return result; } @@ -6947,6 +6954,7 @@ gfc_simplify_storage_size (gfc_expr *x, { gfc_expr *result = NULL; int k; + size_t siz; if (x->ts.type == BT_CLASS || x->ts.deferred) return NULL; @@ -6962,7 +6970,8 @@ gfc_simplify_storage_size (gfc_expr *x, result = gfc_get_constant_expr (BT_INTEGER, k, &x->where); - mpz_set_si (result->value.integer, gfc_element_size (x)); + gfc_element_size (x, &siz); + mpz_set_si (result->value.integer, siz); mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT); return range_check (result, "STORAGE_SIZE"); @@ -7995,7 +8004,7 @@ gfc_convert_constant (gfc_expr *e, bt type, int kind) default: oops: - gfc_internal_error ("gfc_convert_constant(): Unexpected type"); + return &gfc_bad_expr; } result = NULL; diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 4ea66e3f387..e783319298c 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -522,7 +522,7 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where) /* The copying of procedure dummy arguments for module procedures in a submodule occur whilst the current state is COMP_CONTAINS. It is necessary, therefore, to let this through. */ - if (attr->dummy + if (name && attr->dummy && (attr->function || attr->subroutine) && gfc_current_state () == COMP_CONTAINS && !(gfc_new_block && gfc_new_block->abr_modproc_decl)) @@ -554,6 +554,7 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where) conf (external, intrinsic); conf (entry, intrinsic); + conf (abstract, intrinsic); if ((attr->if_source == IFSRC_DECL && !attr->procedure) || attr->contained) conf (external, subroutine); @@ -1685,7 +1686,15 @@ gfc_add_subroutine (symbol_attribute *attr, const char *name, locus *where) return false; attr->subroutine = 1; - return check_conflict (attr, name, where); + + /* If we are looking at a BLOCK DATA statement and we encounter a + name with a leading underscore (which must be + compiler-generated), do not check. See PR 84394. */ + + if (name && *name != '_' && gfc_current_state () != COMP_BLOCK_DATA) + return check_conflict (attr, name, where); + else + return true; } @@ -1801,7 +1810,8 @@ gfc_add_procedure (symbol_attribute *attr, procedure_type t, if (where == NULL) where = &gfc_current_locus; - if (attr->proc != PROC_UNKNOWN && !attr->module_procedure) + if (attr->proc != PROC_UNKNOWN && !attr->module_procedure + && attr->access == ACCESS_UNKNOWN) { if (attr->proc == PROC_ST_FUNCTION && t == PROC_INTERNAL && !gfc_notification_std (GFC_STD_F2008)) @@ -4352,7 +4362,7 @@ gsym_compare (void *_s1, void *_s2) /* Get a global symbol, creating it if it doesn't exist. */ gfc_gsymbol * -gfc_get_gsymbol (const char *name) +gfc_get_gsymbol (const char *name, bool bind_c) { gfc_gsymbol *s; @@ -4363,6 +4373,7 @@ gfc_get_gsymbol (const char *name) s = XCNEW (gfc_gsymbol); s->type = GSYM_UNKNOWN; s->name = gfc_get_string ("%s", name); + s->bind_c = bind_c; gfc_insert_bbt (&gfc_gsym_root, s, gsym_compare); diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c index 6b9292b5faf..35a631aa878 100644 --- a/gcc/fortran/target-memory.c +++ b/gcc/fortran/target-memory.c @@ -73,26 +73,30 @@ size_character (gfc_charlen_t length, int kind) /* Return the size of a single element of the given expression. - Identical to gfc_target_expr_size for scalars. */ + Equivalent to gfc_target_expr_size for scalars. */ -size_t -gfc_element_size (gfc_expr *e) +bool +gfc_element_size (gfc_expr *e, size_t *siz) { tree type; switch (e->ts.type) { case BT_INTEGER: - return size_integer (e->ts.kind); + *siz = size_integer (e->ts.kind); + return true; case BT_REAL: - return size_float (e->ts.kind); + *siz = size_float (e->ts.kind); + return true; case BT_COMPLEX: - return size_complex (e->ts.kind); + *siz = size_complex (e->ts.kind); + return true; case BT_LOGICAL: - return size_logical (e->ts.kind); + *siz = size_logical (e->ts.kind); + return true; case BT_CHARACTER: if (e->expr_type == EXPR_CONSTANT) - return size_character (e->value.character.length, e->ts.kind); + *siz = size_character (e->value.character.length, e->ts.kind); else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL && e->ts.u.cl->length->expr_type == EXPR_CONSTANT && e->ts.u.cl->length->ts.type == BT_INTEGER) @@ -100,17 +104,23 @@ gfc_element_size (gfc_expr *e) HOST_WIDE_INT length; gfc_extract_hwi (e->ts.u.cl->length, &length); - return size_character (length, e->ts.kind); + *siz = size_character (length, e->ts.kind); } else - return 0; + { + *siz = 0; + return false; + } + return true; case BT_HOLLERITH: - return e->representation.length; + *siz = e->representation.length; + return true; case BT_DERIVED: case BT_CLASS: case BT_VOID: case BT_ASSUMED: + case BT_PROCEDURE: { /* Determine type size without clobbering the typespec for ISO C binding types. */ @@ -120,36 +130,43 @@ gfc_element_size (gfc_expr *e) type = gfc_typenode_for_spec (&ts); size = int_size_in_bytes (type); gcc_assert (size >= 0); - return size; + *siz = size; } + return true; default: gfc_internal_error ("Invalid expression in gfc_element_size."); - return 0; + *siz = 0; + return false; } + return true; } /* Return the size of an expression in its target representation. */ -size_t -gfc_target_expr_size (gfc_expr *e) +bool +gfc_target_expr_size (gfc_expr *e, size_t *size) { mpz_t tmp; - size_t asz; + size_t asz, el_size; gcc_assert (e != NULL); + *size = 0; if (e->rank) { if (gfc_array_size (e, &tmp)) asz = mpz_get_ui (tmp); else - asz = 0; + return false; } else asz = 1; - return asz * gfc_element_size (e); + if (!gfc_element_size (e, &el_size)) + return false; + *size = asz * el_size; + return true; } @@ -675,7 +692,7 @@ expr_to_char (gfc_expr *e, locus *loc, /* Otherwise, use the target-memory machinery to write a bitwise image, appropriate to the target, in a buffer and check off the initialized part of the buffer. */ - len = gfc_target_expr_size (e); + gfc_target_expr_size (e, &len); buffer = (unsigned char*)alloca (len); len = gfc_target_encode_expr (e, buffer, len); @@ -722,7 +739,9 @@ gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, locus *loc, for (c = gfc_constructor_first (e->value.constructor); c; c = gfc_constructor_next (c)) { - size_t elt_size = gfc_target_expr_size (c->expr); + size_t elt_size; + + gfc_target_expr_size (c->expr, &elt_size); if (mpz_cmp_si (c->offset, 0) != 0) len = elt_size * (size_t)mpz_get_si (c->offset); diff --git a/gcc/fortran/target-memory.h b/gcc/fortran/target-memory.h index 8f25899a92c..0a4316e6641 100644 --- a/gcc/fortran/target-memory.h +++ b/gcc/fortran/target-memory.h @@ -24,8 +24,8 @@ along with GCC; see the file COPYING3. If not see /* Convert a BOZ to REAL or COMPLEX. */ bool gfc_convert_boz (gfc_expr *, gfc_typespec *); -size_t gfc_element_size (gfc_expr *); -size_t gfc_target_expr_size (gfc_expr *); +bool gfc_element_size (gfc_expr *, size_t *); +bool gfc_target_expr_size (gfc_expr *, size_t *); /* Write a constant expression in binary form to a target buffer. */ size_t gfc_encode_character (int, size_t, const gfc_char_t *, unsigned char *, diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index f79f3ec583a..9b898888e3d 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -849,10 +849,22 @@ gfc_get_array_span (tree desc, gfc_expr *expr) else { /* If none of the fancy stuff works, the span is the element - size of the array. */ + size of the array. Attempt to deal with unbounded character + types if possible. Otherwise, return NULL_TREE. */ tmp = gfc_get_element_type (TREE_TYPE (desc)); - tmp = fold_convert (gfc_array_index_type, - size_in_bytes (tmp)); + if (tmp && TREE_CODE (tmp) == ARRAY_TYPE + && TYPE_MAX_VALUE (TYPE_DOMAIN (tmp)) == NULL_TREE) + { + if (expr->expr_type == EXPR_VARIABLE + && expr->ts.type == BT_CHARACTER) + tmp = fold_convert (gfc_array_index_type, + gfc_get_expr_charlen (expr)); + else + tmp = NULL_TREE; + } + else + tmp = fold_convert (gfc_array_index_type, + size_in_bytes (tmp)); } return tmp; } @@ -1152,6 +1164,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss, tree nelem; tree cond; tree or_expr; + tree elemsize; tree class_expr = NULL_TREE; int n, dim, tmp_dim; int total_dim = 0; @@ -1317,21 +1330,21 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss, } } + if (class_expr == NULL_TREE) + elemsize = fold_convert (gfc_array_index_type, + TYPE_SIZE_UNIT (gfc_get_element_type (type))); + else + elemsize = gfc_class_vtab_size_get (class_expr); + /* Get the size of the array. */ if (size && !callee_alloc) { - tree elemsize; /* If or_expr is true, then the extent in at least one dimension is zero and the size is set to zero. */ size = fold_build3_loc (input_location, COND_EXPR, gfc_array_index_type, or_expr, gfc_index_zero_node, size); nelem = size; - if (class_expr == NULL_TREE) - elemsize = fold_convert (gfc_array_index_type, - TYPE_SIZE_UNIT (gfc_get_element_type (type))); - else - elemsize = gfc_class_vtab_size_get (class_expr); size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, size, elemsize); @@ -1342,6 +1355,10 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss, size = NULL_TREE; } + /* Set the span. */ + tmp = fold_convert (gfc_array_index_type, elemsize); + gfc_conv_descriptor_span_set (pre, desc, tmp); + gfc_trans_allocate_array_storage (pre, post, info, size, nelem, initial, dynamic, dealloc); @@ -2640,6 +2657,9 @@ gfc_scalar_elemental_arg_saved_as_reference (gfc_ss_info * ss_info) if (ss_info->type != GFC_SS_REFERENCE) return false; + if (ss_info->data.scalar.needs_temporary) + return false; + /* If the actual argument can be absent (in other words, it can be a NULL reference), don't try to evaluate it; pass instead the reference directly. */ @@ -3402,10 +3422,8 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar) if (build_class_array_ref (se, base, index)) return; - if (expr && ((is_subref_array (expr) - && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (info->descriptor))) - || (expr->ts.deferred && (expr->expr_type == EXPR_VARIABLE - || expr->expr_type == EXPR_FUNCTION)))) + if (expr && (expr->ts.deferred && (expr->expr_type == EXPR_VARIABLE + || expr->expr_type == EXPR_FUNCTION))) decl = expr->symtree->n.sym->backend_decl; /* A pointer array component can be detected from its field decl. Fix @@ -3414,11 +3432,7 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar) if (is_pointer_array (info->descriptor)) { if (TREE_CODE (info->descriptor) == COMPONENT_REF) - { - decl = gfc_evaluate_now (info->descriptor, &se->pre); - GFC_DECL_PTR_ARRAY_P (decl) = 1; - TREE_USED (decl) = 1; - } + decl = info->descriptor; else if (TREE_CODE (info->descriptor) == INDIRECT_REF) decl = TREE_OPERAND (info->descriptor, 0); @@ -3659,11 +3673,7 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_expr *expr, && is_pointer_array (se->expr)) { if (TREE_CODE (se->expr) == COMPONENT_REF) - { - decl = gfc_evaluate_now (se->expr, &se->pre); - GFC_DECL_PTR_ARRAY_P (decl) = 1; - TREE_USED (decl) = 1; - } + decl = se->expr; else if (TREE_CODE (se->expr) == INDIRECT_REF) decl = TREE_OPERAND (se->expr, 0); else @@ -5317,14 +5327,14 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset, gfc_expr ** lower, gfc_expr ** upper, stmtblock_t * pblock, stmtblock_t * descriptor_block, tree * overflow, tree expr3_elem_size, tree *nelems, gfc_expr *expr3, - tree expr3_desc, bool e3_is_array_constr, gfc_expr *expr) + tree expr3_desc, bool e3_is_array_constr, gfc_expr *expr, + tree *element_size) { tree type; tree tmp; tree size; tree offset; tree stride; - tree element_size; tree or_expr; tree thencase; tree elsecase; @@ -5551,10 +5561,10 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset, tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type)); /* Convert to size_t. */ - element_size = fold_convert (size_type_node, tmp); + *element_size = fold_convert (size_type_node, tmp); if (rank == 0) - return element_size; + return *element_size; *nelems = gfc_evaluate_now (stride, pblock); stride = fold_convert (size_type_node, stride); @@ -5564,14 +5574,14 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset, dividing. */ tmp = fold_build2_loc (input_location, TRUNC_DIV_EXPR, size_type_node, - TYPE_MAX_VALUE (size_type_node), element_size); + TYPE_MAX_VALUE (size_type_node), *element_size); cond = gfc_unlikely (fold_build2_loc (input_location, LT_EXPR, logical_type_node, tmp, stride), PRED_FORTRAN_OVERFLOW); tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node, cond, integer_one_node, integer_zero_node); cond = gfc_unlikely (fold_build2_loc (input_location, EQ_EXPR, - logical_type_node, element_size, + logical_type_node, *element_size, build_int_cst (size_type_node, 0)), PRED_FORTRAN_SIZE_ZERO); tmp = fold_build3_loc (input_location, COND_EXPR, integer_type_node, cond, @@ -5581,7 +5591,7 @@ gfc_array_init_size (tree descriptor, int rank, int corank, tree * poffset, *overflow = gfc_evaluate_now (tmp, pblock); size = fold_build2_loc (input_location, MULT_EXPR, size_type_node, - stride, element_size); + stride, *element_size); if (poffset != NULL) { @@ -5659,6 +5669,8 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, tree var_overflow = NULL_TREE; tree cond; tree set_descriptor; + tree not_prev_allocated = NULL_TREE; + tree element_size = NULL_TREE; stmtblock_t set_descriptor_block; stmtblock_t elseblock; gfc_expr **lower; @@ -5767,7 +5779,7 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, &offset, lower, upper, &se->pre, &set_descriptor_block, &overflow, expr3_elem_size, nelems, expr3, e3_arr_desc, - e3_is_array_constr, expr); + e3_is_array_constr, expr, &element_size); if (dimension) { @@ -5796,8 +5808,6 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, } } - gfc_start_block (&elseblock); - /* Allocate memory to store the data. */ if (POINTER_TYPE_P (TREE_TYPE (se->expr))) se->expr = build_fold_indirect_ref_loc (input_location, se->expr); @@ -5813,6 +5823,19 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, pointer = gfc_conv_descriptor_data_get (se->expr); STRIP_NOPS (pointer); + if (allocatable) + { + not_prev_allocated = gfc_create_var (logical_type_node, + "not_prev_allocated"); + tmp = fold_build2_loc (input_location, EQ_EXPR, + logical_type_node, pointer, + build_int_cst (TREE_TYPE (pointer), 0)); + + gfc_add_modify (&se->pre, not_prev_allocated, tmp); + } + + gfc_start_block (&elseblock); + /* The allocatable variant takes the old pointer as first argument. */ if (allocatable) gfc_allocate_allocatable (&elseblock, pointer, size, token, @@ -5839,20 +5862,11 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, gfc_add_expr_to_block (&se->pre, tmp); - /* Update the array descriptors. */ + /* Update the array descriptor with the offset and the span. */ if (dimension) - gfc_conv_descriptor_offset_set (&set_descriptor_block, se->expr, offset); - - /* Pointer arrays need the span field to be set. */ - if (is_pointer_array (se->expr) - || (expr->ts.type == BT_CLASS - && CLASS_DATA (expr)->attr.class_pointer)) { - if (expr3 && expr3_elem_size != NULL_TREE) - tmp = expr3_elem_size; - else - tmp = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (se->expr))); - tmp = fold_convert (gfc_array_index_type, tmp); + gfc_conv_descriptor_offset_set (&set_descriptor_block, se->expr, offset); + tmp = fold_convert (gfc_array_index_type, element_size); gfc_conv_descriptor_span_set (&set_descriptor_block, se->expr, tmp); } @@ -5862,6 +5876,11 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, cond = fold_build2_loc (input_location, EQ_EXPR, logical_type_node, status, build_int_cst (TREE_TYPE (status), 0)); + + if (not_prev_allocated != NULL_TREE) + cond = fold_build2_loc (input_location, TRUTH_OR_EXPR, + logical_type_node, cond, not_prev_allocated); + gfc_add_expr_to_block (&se->pre, fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, @@ -7062,7 +7081,8 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr) /* ....and set the span field. */ tmp = gfc_get_array_span (desc, expr); - gfc_conv_descriptor_span_set (&se->pre, se->expr, tmp); + if (tmp != NULL_TREE) + gfc_conv_descriptor_span_set (&se->pre, se->expr, tmp); } else if (se->want_pointer) { @@ -7329,13 +7349,9 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr) desc = info->descriptor; if (se->direct_byref && !se->byref_noassign) { - /* For pointer assignments we fill in the destination.... */ + /* For pointer assignments we fill in the destination. */ parm = se->expr; parmtype = TREE_TYPE (parm); - - /* ....and set the span field. */ - tmp = gfc_get_array_span (desc, expr); - gfc_conv_descriptor_span_set (&loop.pre, parm, tmp); } else { @@ -7373,6 +7389,11 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr) } } + /* Set the span field. */ + tmp = gfc_get_array_span (desc, expr); + if (tmp != NULL_TREE) + gfc_conv_descriptor_span_set (&loop.pre, parm, tmp); + offset = gfc_index_zero_node; /* The following can be somewhat confusing. We have two @@ -9505,19 +9526,30 @@ gfc_is_reallocatable_lhs (gfc_expr *expr) sym = expr->symtree->n.sym; + if (sym->attr.associate_var && !expr->ref) + return false; + /* An allocatable class variable with no reference. */ if (sym->ts.type == BT_CLASS + && !sym->attr.associate_var && CLASS_DATA (sym)->attr.allocatable - && expr->ref && expr->ref->type == REF_COMPONENT - && strcmp (expr->ref->u.c.component->name, "_data") == 0 - && expr->ref->next == NULL) + && expr->ref + && ((expr->ref->type == REF_ARRAY && expr->ref->u.ar.type == AR_FULL + && expr->ref->next == NULL) + || (expr->ref->type == REF_COMPONENT + && strcmp (expr->ref->u.c.component->name, "_data") == 0 + && (expr->ref->next == NULL + || (expr->ref->next->type == REF_ARRAY + && expr->ref->next->u.ar.type == AR_FULL + && expr->ref->next->next == NULL))))) return true; /* An allocatable variable. */ if (sym->attr.allocatable - && expr->ref - && expr->ref->type == REF_ARRAY - && expr->ref->u.ar.type == AR_FULL) + && !sym->attr.associate_var + && expr->ref + && expr->ref->type == REF_ARRAY + && expr->ref->u.ar.type == AR_FULL) return true; /* All that can be left are allocatable components. */ @@ -9932,6 +9964,15 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop, tmp = concat_str_length (expr2); expr2->ts.u.cl->backend_decl = gfc_evaluate_now (tmp, &fblock); } + else if (!tmp && expr2->ts.u.cl->length) + { + gfc_se tmpse; + gfc_init_se (&tmpse, NULL); + gfc_conv_expr_type (&tmpse, expr2->ts.u.cl->length, + gfc_charlen_type_node); + tmp = tmpse.expr; + expr2->ts.u.cl->backend_decl = gfc_evaluate_now (tmp, &fblock); + } tmp = fold_convert (TREE_TYPE (expr1->ts.u.cl->backend_decl), tmp); } @@ -10321,6 +10362,8 @@ gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * expr) { gfc_ref *ref; + gfc_fix_class_refs (expr); + for (ref = expr->ref; ref; ref = ref->next) if (ref->type == REF_ARRAY && ref->u.ar.type != AR_ELEMENT) break; diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 6c4a2214ce7..1e46b627f8f 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -342,64 +342,86 @@ gfc_get_label_decl (gfc_st_label * lp) } } +/* Return the name of an identifier. */ -/* Convert a gfc_symbol to an identifier of the same name. */ - -static tree -gfc_sym_identifier (gfc_symbol * sym) +static const char * +sym_identifier (gfc_symbol *sym) { if (sym->attr.is_main_program && strcmp (sym->name, "main") == 0) - return (get_identifier ("MAIN__")); + return "MAIN__"; else - return (get_identifier (sym->name)); + return sym->name; } - -/* Construct mangled name from symbol name. */ +/* Convert a gfc_symbol to an identifier of the same name. */ static tree -gfc_sym_mangled_identifier (gfc_symbol * sym) +gfc_sym_identifier (gfc_symbol * sym) { - char name[GFC_MAX_MANGLED_SYMBOL_LEN + 1]; + return get_identifier (sym_identifier (sym)); +} + +/* Construct mangled name from symbol name. */ +static const char * +mangled_identifier (gfc_symbol *sym) +{ + gfc_symbol *proc = sym->ns->proc_name; + static char name[3*GFC_MAX_MANGLED_SYMBOL_LEN + 14]; /* Prevent the mangling of identifiers that have an assigned binding label (mainly those that are bind(c)). */ + if (sym->attr.is_bind_c == 1 && sym->binding_label) - return get_identifier (sym->binding_label); + return sym->binding_label; - if (!sym->fn_result_spec) + if (!sym->fn_result_spec + || (sym->module && !(proc && proc->attr.flavor == FL_PROCEDURE))) { if (sym->module == NULL) - return gfc_sym_identifier (sym); + return sym_identifier (sym); else - { - snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name); - return get_identifier (name); - } + snprintf (name, sizeof name, "__%s_MOD_%s", sym->module, sym->name); } else { /* This is an entity that is actually local to a module procedure that appears in the result specification expression. Since sym->module will be a zero length string, we use ns->proc_name - instead. */ - if (sym->ns->proc_name && sym->ns->proc_name->module) - { - snprintf (name, sizeof name, "__%s_MOD__%s_PROC_%s", - sym->ns->proc_name->module, - sym->ns->proc_name->name, - sym->name); - return get_identifier (name); - } + to provide the module name instead. */ + if (proc && proc->module) + snprintf (name, sizeof name, "__%s_MOD__%s_PROC_%s", + proc->module, proc->name, sym->name); else - { - snprintf (name, sizeof name, "__%s_PROC_%s", - sym->ns->proc_name->name, sym->name); - return get_identifier (name); - } + snprintf (name, sizeof name, "__%s_PROC_%s", + proc->name, sym->name); } + + return name; } +/* Get mangled identifier, adding the symbol to the global table if + it is not yet already there. */ + +static tree +gfc_sym_mangled_identifier (gfc_symbol * sym) +{ + tree result; + gfc_gsymbol *gsym; + const char *name; + + name = mangled_identifier (sym); + result = get_identifier (name); + + gsym = gfc_find_gsymbol (gfc_gsym_root, name); + if (gsym == NULL) + { + gsym = gfc_get_gsymbol (name, false); + gsym->ns = sym->ns; + gsym->sym_name = sym->name; + } + + return result; +} /* Construct mangled function name from symbol name. */ @@ -839,7 +861,7 @@ gfc_get_module_backend_decl (gfc_symbol *sym) { if (!gsym) { - gsym = gfc_get_gsymbol (sym->module); + gsym = gfc_get_gsymbol (sym->module, false); gsym->type = GSYM_MODULE; gsym->ns = gfc_get_namespace (NULL, 0); } @@ -1543,6 +1565,13 @@ gfc_get_symbol_decl (gfc_symbol * sym) /* Dummy variables should already have been created. */ gcc_assert (sym->backend_decl); + /* However, the string length of deferred arrays must be set. */ + if (sym->ts.type == BT_CHARACTER + && sym->ts.deferred + && sym->attr.dimension + && sym->attr.allocatable) + gfc_defer_symbol_init (sym); + if (sym->attr.pointer && sym->attr.dimension && sym->ts.type != BT_CLASS) GFC_DECL_PTR_ARRAY_P (sym->backend_decl) = 1; @@ -1595,13 +1624,17 @@ gfc_get_symbol_decl (gfc_symbol * sym) if (VAR_P (length) && DECL_FILE_SCOPE_P (length)) { /* Add the string length to the same context as the symbol. */ - if (DECL_CONTEXT (sym->backend_decl) == current_function_decl) - gfc_add_decl_to_function (length); - else - gfc_add_decl_to_parent_function (length); + if (DECL_CONTEXT (length) == NULL_TREE) + { + if (DECL_CONTEXT (sym->backend_decl) + == current_function_decl) + gfc_add_decl_to_function (length); + else + gfc_add_decl_to_parent_function (length); + } - gcc_assert (DECL_CONTEXT (sym->backend_decl) == - DECL_CONTEXT (length)); + gcc_assert (DECL_CONTEXT (sym->backend_decl) + == DECL_CONTEXT (length)); gfc_defer_symbol_init (sym); } @@ -1852,9 +1885,18 @@ gfc_get_symbol_decl (gfc_symbol * sym) if (sym->attr.associate_var) GFC_DECL_ASSOCIATE_VAR_P (decl) = 1; - if (sym->attr.vtab - || (sym->name[0] == '_' && strncmp ("__def_init", sym->name, 10) == 0)) - TREE_READONLY (decl) = 1; + /* We only mark __def_init as read-only if it actually has an + initializer so it does not needlessly take up space in the + read-only section and can go into the BSS instead, see PR 84487. + Marking this as artificial means that OpenMP will treat this as + predetermined shared. */ + + if (sym->attr.vtab || strncmp ("__def_init", sym->name, 10) == 0) + { + DECL_ARTIFICIAL (decl) = 1; + if (sym->attr.vtab || sym->value) + TREE_READONLY (decl) = 1; + } return decl; } @@ -1894,6 +1936,22 @@ get_proc_pointer_decl (gfc_symbol *sym) tree decl; tree attributes; + if (sym->module || sym->fn_result_spec) + { + const char *name; + gfc_gsymbol *gsym; + + name = mangled_identifier (sym); + gsym = gfc_find_gsymbol (gfc_gsym_root, name); + if (gsym != NULL) + { + gfc_symbol *s; + gfc_find_symbol (sym->name, gsym->ns, 0, &s); + if (s && s->backend_decl) + return s->backend_decl; + } + } + decl = sym->backend_decl; if (decl) return decl; @@ -1966,7 +2024,7 @@ get_proc_pointer_decl (gfc_symbol *sym) /* Get a basic decl for an external function. */ tree -gfc_get_extern_function_decl (gfc_symbol * sym) +gfc_get_extern_function_decl (gfc_symbol * sym, gfc_actual_arglist *actual_args) { tree type; tree fndecl; @@ -1991,9 +2049,22 @@ gfc_get_extern_function_decl (gfc_symbol * sym) return get_proc_pointer_decl (sym); /* See if this is an external procedure from the same file. If so, - return the backend_decl. */ - gsym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label - ? sym->binding_label : sym->name); + return the backend_decl. If we are looking at a BIND(C) + procedure and the symbol is not BIND(C), or vice versa, we + haven't found the right procedure. */ + + if (sym->binding_label) + { + gsym = gfc_find_gsymbol (gfc_gsym_root, sym->binding_label); + if (gsym && !gsym->bind_c) + gsym = NULL; + } + else + { + gsym = gfc_find_gsymbol (gfc_gsym_root, sym->name); + if (gsym && gsym->bind_c) + gsym = NULL; + } if (gsym && !gsym->defined) gsym = NULL; @@ -2139,7 +2210,7 @@ gfc_get_extern_function_decl (gfc_symbol * sym) mangled_name = gfc_sym_mangled_function_id (sym); } - type = gfc_get_function_type (sym); + type = gfc_get_function_type (sym, actual_args); fndecl = build_decl (input_location, FUNCTION_DECL, name, type); @@ -2489,6 +2560,17 @@ create_function_arglist (gfc_symbol * sym) TREE_READONLY (length) = 1; gfc_finish_decl (length); + /* Marking the length DECL_HIDDEN_STRING_LENGTH will lead + to tail calls being disabled. Only do that if we + potentially have broken callers. */ + if (flag_tail_call_workaround + && f->sym->ts.u.cl + && f->sym->ts.u.cl->length + && f->sym->ts.u.cl->length->expr_type == EXPR_CONSTANT + && (flag_tail_call_workaround == 2 + || f->sym->ns->implicit_interface_calls)) + DECL_HIDDEN_STRING_LENGTH (length) = 1; + /* Remember the passed value. */ if (!f->sym->ts.u.cl || f->sym->ts.u.cl->passed_length) { @@ -5373,6 +5455,33 @@ generate_coarray_sym_init (gfc_symbol *sym) /* Handle "static" initializer. */ if (sym->value) { + if (sym->value->expr_type == EXPR_ARRAY) + { + gfc_constructor *c, *cnext; + + /* Test if the array has more than one element. */ + c = gfc_constructor_first (sym->value->value.constructor); + gcc_assert (c); /* Empty constructor should not happen here. */ + cnext = gfc_constructor_next (c); + + if (cnext) + { + /* An EXPR_ARRAY with a rank > 1 here has to come from a + DATA statement. Set its rank here as not to confuse + the following steps. */ + sym->value->rank = 1; + } + else + { + /* There is only a single value in the constructor, use + it directly for the assignment. */ + gfc_expr *new_expr; + new_expr = gfc_copy_expr (c->expr); + gfc_free_expr (sym->value); + sym->value = new_expr; + } + } + sym->attr.pointer = 1; tmp = gfc_trans_assignment (gfc_lval_expr_from_sym (sym), sym->value, true, false); @@ -5617,9 +5726,11 @@ generate_local_decl (gfc_symbol * sym) } else if (warn_unused_dummy_argument) { - gfc_warning (OPT_Wunused_dummy_argument, - "Unused dummy argument %qs at %L", sym->name, - &sym->declared_at); + if (!sym->attr.artificial) + gfc_warning (OPT_Wunused_dummy_argument, + "Unused dummy argument %qs at %L", sym->name, + &sym->declared_at); + if (sym->backend_decl != NULL_TREE) TREE_NO_WARNING(sym->backend_decl) = 1; } @@ -5709,12 +5820,16 @@ generate_local_decl (gfc_symbol * sym) "imported at %L", sym->name, &sym->declared_at); } - if (sym->ns - && sym->ns->parent - && sym->ns->parent->code - && sym->ns->parent->code->op == EXEC_BLOCK) + if (sym->ns && sym->ns->construct_entities) { - if (sym->attr.referenced) + /* Construction of the intrinsic modules within a BLOCK + construct, where ONLY and RENAMED entities are included, + seems to be bogus. This is a workaround that can be removed + if someone ever takes on the task to creating full-fledge + modules. See PR 69455. */ + if (sym->attr.referenced + && sym->from_intmod != INTMOD_ISO_C_BINDING + && sym->from_intmod != INTMOD_ISO_FORTRAN_ENV) gfc_get_symbol_decl (sym); sym->mark = 1; } diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 9a7ad57ca80..dd0cd86ebba 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -352,7 +352,7 @@ gfc_vptr_size_get (tree vptr) of refs following. */ gfc_expr * -gfc_find_and_cut_at_last_class_ref (gfc_expr *e) +gfc_find_and_cut_at_last_class_ref (gfc_expr *e, bool is_mold) { gfc_expr *base_expr; gfc_ref *ref, *class_ref, *tail = NULL, *array_ref; @@ -394,7 +394,10 @@ gfc_find_and_cut_at_last_class_ref (gfc_expr *e) e->ref = NULL; } - base_expr = gfc_expr_to_initialize (e); + if (is_mold) + base_expr = gfc_expr_to_initialize (e); + else + base_expr = gfc_copy_expr (e); /* Restore the original tail expression. */ if (class_ref) @@ -1505,7 +1508,6 @@ gfc_trans_class_init_assign (gfc_code *code) gfc_start_block (&block); lhs = gfc_copy_expr (code->expr1); - gfc_add_data_component (lhs); rhs = gfc_copy_expr (code->expr1); gfc_add_vptr_component (rhs); @@ -1523,11 +1525,15 @@ gfc_trans_class_init_assign (gfc_code *code) { gfc_array_spec *tmparr = gfc_get_array_spec (); *tmparr = *CLASS_DATA (code->expr1)->as; + /* Adding the array ref to the class expression results in correct + indexing to the dynamic type. */ gfc_add_full_array_ref (lhs, tmparr); tmp = gfc_trans_class_array_init_assign (rhs, lhs, code->expr1); } else { + /* Scalar initialization needs the _data component. */ + gfc_add_data_component (lhs); sz = gfc_copy_expr (code->expr1); gfc_add_vptr_component (sz); gfc_add_size_component (sz); @@ -2234,7 +2240,8 @@ gfc_conv_string_length (gfc_charlen * cl, gfc_expr * expr, stmtblock_t * pblock) if (!cl->length) { gfc_expr* expr_flat; - gcc_assert (expr); + if (!expr) + return; expr_flat = gfc_copy_expr (expr); flatten_array_ctors_without_strlen (expr_flat); gfc_resolve_expr (expr_flat); @@ -3015,6 +3022,83 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr) if (gfc_conv_cst_int_power (se, lse.expr, rse.expr)) return; + if (INTEGER_CST_P (lse.expr) + && TREE_CODE (TREE_TYPE (rse.expr)) == INTEGER_TYPE) + { + wi::tree_to_wide_ref wlhs = wi::to_wide (lse.expr); + HOST_WIDE_INT v; + v = wlhs.to_shwi (); + if (v == 1) + { + /* 1**something is always 1. */ + se->expr = build_int_cst (TREE_TYPE (lse.expr), 1); + return; + } + else if (v == 2 || v == 4 || v == 8 || v == 16) + { + /* 2**n = 1<expr = fold_build3_loc (input_location, COND_EXPR, type, cond2, + build_int_cst (type, 0), cond); + return; + } + else if (v == -1) + { + /* (-1)**n is 1 - ((n & 1) << 1) */ + tree type; + tree tmp; + + type = TREE_TYPE (lse.expr); + tmp = fold_build2_loc (input_location, BIT_AND_EXPR, type, + rse.expr, build_int_cst (type, 1)); + tmp = fold_build2_loc (input_location, LSHIFT_EXPR, type, + tmp, build_int_cst (type, 1)); + tmp = fold_build2_loc (input_location, MINUS_EXPR, type, + build_int_cst (type, 1), tmp); + se->expr = tmp; + return; + } + } + gfc_int4_type_node = gfc_get_int_type (4); /* In case of integer operands with kinds 1 or 2, we call the integer kind 4 @@ -3753,7 +3837,8 @@ conv_base_obj_fcn_val (gfc_se * se, tree base_object, gfc_expr * expr) static void -conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr) +conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr, + gfc_actual_arglist *actual_args) { tree tmp; @@ -3771,7 +3856,7 @@ conv_function_val (gfc_se * se, gfc_symbol * sym, gfc_expr * expr) else { if (!sym->backend_decl) - sym->backend_decl = gfc_get_extern_function_decl (sym); + sym->backend_decl = gfc_get_extern_function_decl (sym, actual_args); TREE_USED (sym->backend_decl) = 1; @@ -5666,6 +5751,16 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, break; } + if (e->ts.type == BT_DERIVED && fsym && fsym->ts.type == BT_CLASS) + { + /* The derived type is passed to gfc_deallocate_alloc_comp. + Therefore, class actuals can be handled correctly but derived + types passed to class formals need the _data component. */ + tmp = gfc_class_data_get (tmp); + if (!CLASS_DATA (fsym)->attr.dimension) + tmp = build_fold_indirect_ref_loc (input_location, tmp); + } + if (e->expr_type == EXPR_OP && e->value.op.op == INTRINSIC_PARENTHESES && e->value.op.op1->expr_type == EXPR_VARIABLE) @@ -5677,16 +5772,6 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, gfc_add_expr_to_block (&se->post, local_tmp); } - if (e->ts.type == BT_DERIVED && fsym && fsym->ts.type == BT_CLASS) - { - /* The derived type is passed to gfc_deallocate_alloc_comp. - Therefore, class actuals can handled correctly but derived - types passed to class formals need the _data component. */ - tmp = gfc_class_data_get (tmp); - if (!CLASS_DATA (fsym)->attr.dimension) - tmp = build_fold_indirect_ref_loc (input_location, tmp); - } - tmp = gfc_deallocate_alloc_comp (e->ts.u.derived, tmp, parm_rank); gfc_prepend_expr_to_block (&post, tmp); @@ -6195,7 +6280,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, /* Generate the actual call. */ if (base_object == NULL_TREE) - conv_function_val (se, sym, expr); + conv_function_val (se, sym, expr, args); else conv_base_obj_fcn_val (se, base_object, expr); @@ -8304,23 +8389,6 @@ trans_caf_token_assign (gfc_se *lse, gfc_se *rse, gfc_expr *expr1, } } -/* Indentify class valued proc_pointer assignments. */ - -static bool -pointer_assignment_is_proc_pointer (gfc_expr * expr1, gfc_expr * expr2) -{ - gfc_ref * ref; - - ref = expr1->ref; - while (ref && ref->next) - ref = ref->next; - - return ref && ref->type == REF_COMPONENT - && ref->u.c.component->attr.proc_pointer - && expr2->expr_type == EXPR_VARIABLE - && expr2->symtree->n.sym->attr.flavor == FL_PROCEDURE; -} - /* Do everything that is needed for a CLASS function expr2. */ @@ -8373,7 +8441,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) tree desc; tree tmp; tree expr1_vptr = NULL_TREE; - bool scalar, non_proc_pointer_assign; + bool scalar, non_proc_ptr_assign; gfc_ss *ss; gfc_start_block (&block); @@ -8381,7 +8449,9 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) gfc_init_se (&lse, NULL); /* Usually testing whether this is not a proc pointer assignment. */ - non_proc_pointer_assign = !pointer_assignment_is_proc_pointer (expr1, expr2); + non_proc_ptr_assign = !(gfc_expr_attr (expr1).proc_pointer + && expr2->expr_type == EXPR_VARIABLE + && expr2->symtree->n.sym->attr.flavor == FL_PROCEDURE); /* Check whether the expression is a scalar or not; we cannot use expr1->rank as it can be nonzero for proc pointers. */ @@ -8391,7 +8461,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) gfc_free_ss_chain (ss); if (expr1->ts.type == BT_DERIVED && expr2->ts.type == BT_CLASS - && expr2->expr_type != EXPR_FUNCTION && non_proc_pointer_assign) + && expr2->expr_type != EXPR_FUNCTION && non_proc_ptr_assign) { gfc_add_data_component (expr2); /* The following is required as gfc_add_data_component doesn't @@ -8411,7 +8481,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) else gfc_conv_expr (&rse, expr2); - if (non_proc_pointer_assign && expr1->ts.type == BT_CLASS) + if (non_proc_ptr_assign && expr1->ts.type == BT_CLASS) { trans_class_vptr_len_assignment (&block, expr1, expr2, &rse, NULL, NULL); @@ -10203,19 +10273,27 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, /* When assigning a character function result to a deferred-length variable, the function call must happen before the (re)allocation of the lhs - otherwise the character length of the result is not known. - NOTE: This relies on having the exact dependence of the length type + NOTE 1: This relies on having the exact dependence of the length type parameter available to the caller; gfortran saves it in the .mod files. - NOTE ALSO: The concatenation operation generates a temporary pointer, + NOTE 2: Vector array references generate an index temporary that must + not go outside the loop. Otherwise, variables should not generate + a pre block. + NOTE 3: The concatenation operation generates a temporary pointer, whose allocation must go to the innermost loop. - NOTE ALSO (2): A character conversion may generate a temporary, too. */ + NOTE 4: Elemental functions may generate a temporary, too. */ if (flag_realloc_lhs && expr2->ts.type == BT_CHARACTER && expr1->ts.deferred && !(lss != gfc_ss_terminator - && ((expr2->expr_type == EXPR_OP - && expr2->value.op.op == INTRINSIC_CONCAT) + && rss != gfc_ss_terminator + && ((expr2->expr_type == EXPR_VARIABLE && expr2->rank) + || (expr2->expr_type == EXPR_FUNCTION + && expr2->value.function.esym != NULL + && expr2->value.function.esym->attr.elemental) || (expr2->expr_type == EXPR_FUNCTION && expr2->value.function.isym != NULL - && expr2->value.function.isym->id == GFC_ISYM_CONVERSION)))) + && expr2->value.function.isym->elemental) + || (expr2->expr_type == EXPR_OP + && expr2->value.op.op == INTRINSIC_CONCAT)))) gfc_add_block_to_block (&block, &rse.pre); /* Nullify the allocatable components corresponding to those of the lhs diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index dcb055ea38d..24c261d012d 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -6820,6 +6820,8 @@ gfc_conv_intrinsic_size (gfc_se * se, gfc_expr * expr) tree fncall0; tree fncall1; gfc_se argse; + gfc_expr *e; + gfc_symbol *sym = NULL; gfc_init_se (&argse, NULL); actual = expr->value.function.actual; @@ -6827,12 +6829,31 @@ gfc_conv_intrinsic_size (gfc_se * se, gfc_expr * expr) if (actual->expr->ts.type == BT_CLASS) gfc_add_class_array_ref (actual->expr); + e = actual->expr; + + /* These are emerging from the interface mapping, when a class valued + function appears as the rhs in a realloc on assign statement, where + the size of the result is that of one of the actual arguments. */ + if (e->expr_type == EXPR_VARIABLE + && e->symtree->n.sym->ns == NULL /* This is distinctive! */ + && e->symtree->n.sym->ts.type == BT_CLASS + && e->ref && e->ref->type == REF_COMPONENT + && strcmp (e->ref->u.c.component->name, "_data") == 0) + sym = e->symtree->n.sym; + argse.data_not_needed = 1; - if (gfc_is_class_array_function (actual->expr)) + if (gfc_is_class_array_function (e)) { /* For functions that return a class array conv_expr_descriptor is not able to get the descriptor right. Therefore this special case. */ - gfc_conv_expr_reference (&argse, actual->expr); + gfc_conv_expr_reference (&argse, e); + argse.expr = gfc_build_addr_expr (NULL_TREE, + gfc_class_data_get (argse.expr)); + } + else if (sym && sym->backend_decl) + { + gcc_assert (GFC_CLASS_TYPE_P (TREE_TYPE (sym->backend_decl))); + argse.expr = sym->backend_decl; argse.expr = gfc_build_addr_expr (NULL_TREE, gfc_class_data_get (argse.expr)); } diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c index 2626c4651e2..b07ce83c378 100644 --- a/gcc/fortran/trans-io.c +++ b/gcc/fortran/trans-io.c @@ -2408,8 +2408,6 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr, case_bt_struct: case BT_CLASS: - if (ts->u.derived->components == NULL) - return; if (gfc_bt_struct (ts->type) || ts->type == BT_CLASS) { gfc_symbol *derived; diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 795175d701a..1eaad896503 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -149,7 +149,8 @@ gfc_omp_predetermined_sharing (tree decl) variables at all (they can't be redefined), but they can nevertheless appear in parallel/task regions and for default(none) purposes treat them as shared. For vtables likely the same handling is desirable. */ - if (VAR_P (decl) && TREE_READONLY (decl) && TREE_STATIC (decl)) + if (VAR_P (decl) && TREE_READONLY (decl) + && (TREE_STATIC (decl) || DECL_EXTERNAL (decl))) return OMP_CLAUSE_DEFAULT_SHARED; return OMP_CLAUSE_DEFAULT_UNSPECIFIED; @@ -460,7 +461,8 @@ gfc_omp_clause_default_ctor (tree clause, tree decl, tree outer) if ((! GFC_DESCRIPTOR_TYPE_P (type) || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) - && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) + && (!GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)) + || !POINTER_TYPE_P (type))) { if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) { @@ -546,6 +548,9 @@ gfc_omp_clause_default_ctor (tree clause, tree decl, tree outer) build3_loc (input_location, COND_EXPR, void_type_node, cond, then_b, else_b)); + /* Avoid -W*uninitialized warnings. */ + if (DECL_P (decl)) + TREE_NO_WARNING (decl) = 1; } else gfc_add_expr_to_block (&block, then_b); @@ -567,7 +572,8 @@ gfc_omp_clause_copy_ctor (tree clause, tree dest, tree src) if ((! GFC_DESCRIPTOR_TYPE_P (type) || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) - && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) + && (!GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)) + || !POINTER_TYPE_P (type))) { if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) { @@ -651,6 +657,9 @@ gfc_omp_clause_copy_ctor (tree clause, tree dest, tree src) gfc_add_expr_to_block (&block, build3_loc (input_location, COND_EXPR, void_type_node, cond, then_b, else_b)); + /* Avoid -W*uninitialized warnings. */ + if (DECL_P (dest)) + TREE_NO_WARNING (dest) = 1; return gfc_finish_block (&block); } @@ -667,7 +676,8 @@ gfc_omp_clause_assign_op (tree clause, tree dest, tree src) if ((! GFC_DESCRIPTOR_TYPE_P (type) || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) - && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) + && (!GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)) + || !POINTER_TYPE_P (type))) { if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) { @@ -905,7 +915,8 @@ gfc_omp_clause_linear_ctor (tree clause, tree dest, tree src, tree add) if ((! GFC_DESCRIPTOR_TYPE_P (type) || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) - && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) + && (!GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)) + || !POINTER_TYPE_P (type))) { gcc_assert (TREE_CODE (type) == ARRAY_TYPE); if (!TYPE_DOMAIN (type) @@ -989,7 +1000,8 @@ gfc_omp_clause_dtor (tree clause, tree decl) if ((! GFC_DESCRIPTOR_TYPE_P (type) || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE) - && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause))) + && (!GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)) + || !POINTER_TYPE_P (type))) { if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause))) return gfc_walk_alloc_comps (decl, NULL_TREE, diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index cc1a4294327..32eb25dce79 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -1842,7 +1842,8 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block) { if (e->symtree && DECL_LANG_SPECIFIC (e->symtree->n.sym->backend_decl) - && GFC_DECL_SAVED_DESCRIPTOR (e->symtree->n.sym->backend_decl)) + && GFC_DECL_SAVED_DESCRIPTOR (e->symtree->n.sym->backend_decl) + && TREE_CODE (target_expr) != COMPONENT_REF) /* Use the original class descriptor stored in the saved descriptor to get the target_expr. */ target_expr = @@ -1887,7 +1888,6 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block) } if (sym->ts.type == BT_CHARACTER - && sym->ts.deferred && !sym->attr.select_type_temporary && VAR_P (sym->ts.u.cl->backend_decl) && se.string_length != sym->ts.u.cl->backend_decl) @@ -6607,7 +6607,7 @@ gfc_trans_allocate (gfc_code * code) /* Use class_init_assign to initialize expr. */ gfc_code *ini; ini = gfc_get_code (EXEC_INIT_ASSIGN); - ini->expr1 = gfc_find_and_cut_at_last_class_ref (expr); + ini->expr1 = gfc_find_and_cut_at_last_class_ref (expr, true); tmp = gfc_trans_class_init_assign (ini); gfc_free_statements (ini); gfc_add_expr_to_block (&block, tmp); diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index f50eb0a9f01..cc505aeb0bd 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -1213,7 +1213,8 @@ gfc_typenode_for_spec (gfc_typespec * spec, int codim) { spec->type = BT_INTEGER; spec->kind = gfc_index_integer_kind; - spec->f90_type = BT_VOID; + spec->f90_type = BT_VOID; + spec->is_c_interop = 1; /* Mark as escaping later. */ } break; case BT_VOID: @@ -1230,6 +1231,9 @@ gfc_typenode_for_spec (gfc_typespec * spec, int codim) basetype = pfunc_type_node; } break; + case BT_PROCEDURE: + basetype = pfunc_type_node; + break; default: gcc_unreachable (); } @@ -2978,7 +2982,8 @@ create_fn_spec (gfc_symbol *sym, tree fntype) || f->sym->ts.u.derived->attr.pointer_comp)) || (f->sym->ts.type == BT_CLASS && (CLASS_DATA (f->sym)->ts.u.derived->attr.proc_pointer_comp - || CLASS_DATA (f->sym)->ts.u.derived->attr.pointer_comp))) + || CLASS_DATA (f->sym)->ts.u.derived->attr.pointer_comp)) + || (f->sym->ts.type == BT_INTEGER && f->sym->ts.is_c_interop)) spec[spec_len++] = '.'; else if (f->sym->attr.intent == INTENT_IN) spec[spec_len++] = 'r'; @@ -2991,9 +2996,65 @@ create_fn_spec (gfc_symbol *sym, tree fntype) return build_type_attribute_variant (fntype, tmp); } +/* Helper function - if we do not find an interface for a procedure, + construct it from the actual arglist. Luckily, this can only + happen for call by reference, so the information we actually need + to provide (and which would be impossible to guess from the call + itself) is not actually needed. */ + +static void +get_formal_from_actual_arglist (gfc_symbol *sym, gfc_actual_arglist *actual_args) +{ + gfc_actual_arglist *a; + gfc_formal_arglist **f; + gfc_symbol *s; + char name[GFC_MAX_SYMBOL_LEN + 1]; + static int var_num; + + f = &sym->formal; + for (a = actual_args; a != NULL; a = a->next) + { + (*f) = gfc_get_formal_arglist (); + if (a->expr) + { + snprintf (name, GFC_MAX_SYMBOL_LEN, "_formal_%d", var_num ++); + gfc_get_symbol (name, gfc_current_ns, &s); + if (a->expr->ts.type == BT_PROCEDURE) + { + s->attr.flavor = FL_PROCEDURE; + } + else + { + s->ts = a->expr->ts; + + if (s->ts.type == BT_CHARACTER) + s->ts.u.cl = gfc_get_charlen (); + + s->ts.deferred = 0; + s->ts.is_iso_c = 0; + s->ts.is_c_interop = 0; + s->attr.flavor = FL_VARIABLE; + if (a->expr->rank > 0) + { + s->attr.dimension = 1; + s->as = gfc_get_array_spec (); + s->as->type = AS_ASSUMED_SIZE; + } + } + s->attr.dummy = 1; + s->attr.artificial = 1; + s->attr.intent = INTENT_UNKNOWN; + (*f)->sym = s; + } + else /* If a->expr is NULL, this is an alternate rerturn. */ + (*f)->sym = NULL; + + f = &((*f)->next); + } +} tree -gfc_get_function_type (gfc_symbol * sym) +gfc_get_function_type (gfc_symbol * sym, gfc_actual_arglist *actual_args) { tree type; vec *typelist = NULL; @@ -3051,6 +3112,10 @@ gfc_get_function_type (gfc_symbol * sym) vec_safe_push (typelist, build_pointer_type(gfc_charlen_type_node)); } } + if (sym->backend_decl == error_mark_node && actual_args != NULL + && sym->formal == NULL && (sym->attr.proc == PROC_EXTERNAL + || sym->attr.proc == PROC_UNKNOWN)) + get_formal_from_actual_arglist (sym, actual_args); /* Build the argument types for the function. */ for (f = gfc_sym_get_dummy_args (sym); f; f = f->next) diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h index 197b173f041..28312cfd33e 100644 --- a/gcc/fortran/trans-types.h +++ b/gcc/fortran/trans-types.h @@ -88,7 +88,7 @@ tree gfc_sym_type (gfc_symbol *); tree gfc_typenode_for_spec (gfc_typespec *, int c = 0); int gfc_copy_dt_decls_ifequal (gfc_symbol *, gfc_symbol *, bool); -tree gfc_get_function_type (gfc_symbol *); +tree gfc_get_function_type (gfc_symbol *, gfc_actual_arglist *args = NULL); tree gfc_type_for_size (unsigned, int); tree gfc_type_for_mode (machine_mode, int); diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index aa10fbb405a..153bab63396 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -407,7 +407,12 @@ gfc_build_array_ref (tree base, tree offset, tree decl, tree vptr) if (vptr) span = gfc_vptr_size_get (vptr); else if (decl) - span = get_array_span (type, decl); + { + if (TREE_CODE (decl) == COMPONENT_REF) + span = gfc_conv_descriptor_span_get (decl); + else + span = get_array_span (type, decl); + } /* If a non-null span has been generated reference the element with pointer arithmetic. */ diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index d16c15061c6..103ad6787ad 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -412,7 +412,7 @@ tree gfc_class_data_get (tree); tree gfc_class_vptr_get (tree); tree gfc_class_len_get (tree); tree gfc_class_len_or_zero_get (tree); -gfc_expr * gfc_find_and_cut_at_last_class_ref (gfc_expr *); +gfc_expr * gfc_find_and_cut_at_last_class_ref (gfc_expr *, bool is_mold = false); /* Get an accessor to the class' vtab's * field, when a class handle is available. */ tree gfc_class_vtab_hash_get (tree); @@ -579,7 +579,8 @@ void gfc_merge_block_scope (stmtblock_t * block); tree gfc_get_label_decl (gfc_st_label *); /* Return the decl for an external function. */ -tree gfc_get_extern_function_decl (gfc_symbol *); +tree gfc_get_extern_function_decl (gfc_symbol *, + gfc_actual_arglist *args = NULL); /* Return the decl for a function. */ tree gfc_get_function_decl (gfc_symbol *); diff --git a/gcc/function-tests.c b/gcc/function-tests.c index 1b5ebf31835..196b3a3828e 100644 --- a/gcc/function-tests.c +++ b/gcc/function-tests.c @@ -661,6 +661,7 @@ test_expansion_to_rtl () ASSERT_STR_CONTAINS (dump, ") ;; function \"test_fn\"\n"); free (dump); + free_after_compilation (fun); } /* Run all of the selftests within this file. */ diff --git a/gcc/function.c b/gcc/function.c index 61515e38e47..ebc7eda1604 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2477,8 +2477,7 @@ assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm, /* If the parm is to be passed as a transparent union or record, use the type of the first field for the tests below. We have already verified that the modes are the same. */ - if ((TREE_CODE (passed_type) == UNION_TYPE - || TREE_CODE (passed_type) == RECORD_TYPE) + if (RECORD_OR_UNION_TYPE_P (passed_type) && TYPE_TRANSPARENT_AGGR (passed_type)) passed_type = TREE_TYPE (first_field (passed_type)); @@ -3098,7 +3097,7 @@ assign_parm_setup_block (struct assign_parm_data_all *all, move_block_from_reg (REGNO (entry_parm), mem, size_stored / UNITS_PER_WORD); } - else if (data->stack_parm == 0) + else if (data->stack_parm == 0 && !TYPE_EMPTY_P (data->passed_type)) { push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn); emit_block_move (stack_parm, data->entry_parm, GEN_INT (size), @@ -3474,7 +3473,9 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm, dest = validize_mem (copy_rtx (data->stack_parm)); src = validize_mem (copy_rtx (data->entry_parm)); - if (MEM_P (src)) + if (TYPE_EMPTY_P (data->passed_type)) + /* Empty types don't really need to be copied. */; + else if (MEM_P (src)) { /* Use a block move to handle potentially misaligned entry_parm. */ if (!to_conversion) @@ -3749,6 +3750,16 @@ assign_parms (tree fndecl) { assign_parm_find_stack_rtl (parm, &data); assign_parm_adjust_entry_rtl (&data); + /* For arguments that occupy no space in the parameter + passing area, have non-zero size and have address taken, + force creation of a stack slot so that they have distinct + address from other parameters. */ + if (TYPE_EMPTY_P (data.passed_type) + && TREE_ADDRESSABLE (parm) + && data.entry_parm == data.stack_parm + && MEM_P (data.entry_parm) + && int_size_in_bytes (data.passed_type)) + data.stack_parm = NULL_RTX; } if (!POINTER_BOUNDS_TYPE_P (data.passed_type)) { @@ -6689,7 +6700,7 @@ match_asm_constraints_1 (rtx_insn *insn, rtx *p_sets, int noutputs) output_matched[match] = true; start_sequence (); - emit_move_insn (output, input); + emit_move_insn (output, copy_rtx (input)); insns = get_insns (); end_sequence (); emit_insn_before (insns, insn); diff --git a/gcc/gcov.c b/gcc/gcov.c index 6bbfe33ca33..a99802079dc 100644 --- a/gcc/gcov.c +++ b/gcc/gcov.c @@ -536,6 +536,7 @@ static int process_args (int, char **); static void print_usage (int) ATTRIBUTE_NORETURN; static void print_version (void) ATTRIBUTE_NORETURN; static void process_file (const char *); +static void process_all_functions (void); static void generate_results (const char *); static void create_file_names (const char *); static char *canonicalize_name (const char *); @@ -603,27 +604,11 @@ bool function_info::group_line_p (unsigned n, unsigned src_idx) typedef vector arc_vector_t; typedef vector block_vector_t; -/* Enum with types of loop in CFG. */ - -enum loop_type -{ - NO_LOOP = 0, - LOOP = 1, - NEGATIVE_LOOP = 3 -}; - -/* Loop_type operator that merges two values: A and B. */ - -inline loop_type& operator |= (loop_type& a, loop_type b) -{ - return a = static_cast (a | b); -} - /* Handle cycle identified by EDGES, where the function finds minimum cs_count and subtract the value from all counts. The subtracted value is added to COUNT. Returns type of loop. */ -static loop_type +static void handle_cycle (const arc_vector_t &edges, int64_t &count) { /* Find the minimum edge of the cycle, and reduce all nodes in the cycle by @@ -639,7 +624,7 @@ handle_cycle (const arc_vector_t &edges, int64_t &count) for (unsigned i = 0; i < edges.size (); i++) edges[i]->cs_count -= cycle_count; - return cycle_count < 0 ? NEGATIVE_LOOP : LOOP; + gcc_assert (cycle_count > 0); } /* Unblock a block U from BLOCKED. Apart from that, iterate all blocks @@ -665,17 +650,28 @@ unblock (const block_info *u, block_vector_t &blocked, unblock (*it, blocked, block_lists); } +/* Return true when PATH contains a zero cycle arc count. */ + +static bool +path_contains_zero_cycle_arc (arc_vector_t &path) +{ + for (unsigned i = 0; i < path.size (); i++) + if (path[i]->cs_count == 0) + return true; + return false; +} + /* Find circuit going to block V, PATH is provisional seen cycle. BLOCKED is vector of blocked vertices, BLOCK_LISTS contains vertices blocked by a block. COUNT is accumulated count of the current LINE. Returns what type of loop it contains. */ -static loop_type +static bool circuit (block_info *v, arc_vector_t &path, block_info *start, block_vector_t &blocked, vector &block_lists, line_info &linfo, int64_t &count) { - loop_type result = NO_LOOP; + bool loop_found = false; /* Add v to the block list. */ gcc_assert (find (blocked.begin (), blocked.end (), v) == blocked.end ()); @@ -685,26 +681,35 @@ circuit (block_info *v, arc_vector_t &path, block_info *start, for (arc_info *arc = v->succ; arc; arc = arc->succ_next) { block_info *w = arc->dst; - if (w < start || !linfo.has_block (w)) + if (w < start + || arc->cs_count == 0 + || !linfo.has_block (w)) continue; path.push_back (arc); if (w == start) - /* Cycle has been found. */ - result |= handle_cycle (path, count); - else if (find (blocked.begin (), blocked.end (), w) == blocked.end ()) - result |= circuit (w, path, start, blocked, block_lists, linfo, count); + { + /* Cycle has been found. */ + handle_cycle (path, count); + loop_found = true; + } + else if (!path_contains_zero_cycle_arc (path) + && find (blocked.begin (), blocked.end (), w) == blocked.end ()) + loop_found |= circuit (w, path, start, blocked, block_lists, linfo, + count); path.pop_back (); } - if (result != NO_LOOP) + if (loop_found) unblock (v, blocked, block_lists); else for (arc_info *arc = v->succ; arc; arc = arc->succ_next) { block_info *w = arc->dst; - if (w < start || !linfo.has_block (w)) + if (w < start + || arc->cs_count == 0 + || !linfo.has_block (w)) continue; size_t index @@ -715,14 +720,13 @@ circuit (block_info *v, arc_vector_t &path, block_info *start, list.push_back (v); } - return result; + return loop_found; } -/* Find cycles for a LINFO. If HANDLE_NEGATIVE_CYCLES is set and the line - contains a negative loop, then perform the same function once again. */ +/* Find cycles for a LINFO. */ static gcov_type -get_cycles_count (line_info &linfo, bool handle_negative_cycles = true) +get_cycles_count (line_info &linfo) { /* Note that this algorithm works even if blocks aren't in sorted order. Each iteration of the circuit detection is completely independent @@ -730,7 +734,7 @@ get_cycles_count (line_info &linfo, bool handle_negative_cycles = true) Therefore, operating on a permuted order (i.e., non-sorted) only has the effect of permuting the output cycles. */ - loop_type result = NO_LOOP; + bool loop_found = false; gcov_type count = 0; for (vector::iterator it = linfo.blocks.begin (); it != linfo.blocks.end (); it++) @@ -738,14 +742,10 @@ get_cycles_count (line_info &linfo, bool handle_negative_cycles = true) arc_vector_t path; block_vector_t blocked; vector block_lists; - result |= circuit (*it, path, *it, blocked, block_lists, linfo, - count); + loop_found |= circuit (*it, path, *it, blocked, block_lists, linfo, + count); } - /* If we have a negative cycle, repeat the find_cycles routine. */ - if (result == NEGATIVE_LOOP && handle_negative_cycles) - count += get_cycles_count (linfo, false); - return count; } @@ -791,6 +791,7 @@ main (int argc, char **argv) if (flag_intermediate_format || argno == argc - 1) { + process_all_functions (); generate_results (argv[argno]); release_structures (); } @@ -1066,7 +1067,8 @@ output_intermediate_file (FILE *gcov_file, source_info *src) } /* Follow with lines associated with the source file. */ - output_intermediate_line (gcov_file, &src->lines[line_num], line_num); + if (line_num < src->lines.size ()) + output_intermediate_line (gcov_file, &src->lines[line_num], line_num); } } @@ -1132,11 +1134,14 @@ process_file (const char *file_name) { create_file_names (file_name); read_graph_file (); - if (functions.empty ()) - return; - read_count_file (); +} + +/* Process all functions in all files. */ +static void +process_all_functions (void) +{ hash_map fn_map; /* Identify group functions. */ @@ -1213,7 +1218,6 @@ process_file (const char *file_name) if (fn->is_group) fn->lines.resize (fn->end_line - fn->start_line + 1); - solve_flow_graph (fn); if (fn->has_catch) find_exception_blocks (fn); diff --git a/gcc/gcse.c b/gcc/gcse.c index 8b9518e4f94..36420b9b52e 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -1532,7 +1532,8 @@ compute_hash_table_work (struct gcse_hash_table_d *table) 0, regno, hrsi) record_last_reg_set_info (insn, regno); - if (! RTL_CONST_OR_PURE_CALL_P (insn)) + if (! RTL_CONST_OR_PURE_CALL_P (insn) + || RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)) record_last_mem_set_info (insn); } @@ -1963,14 +1964,11 @@ pre_expr_reaches_here_p (basic_block occr_bb, struct gcse_expr *expr, basic_bloc return rval; } -/* Generate RTL to copy an EXPR to its `reaching_reg' and return it. */ +/* Generate RTL to copy an EXP to REG and return it. */ -static rtx_insn * -process_insert_insn (struct gcse_expr *expr) +rtx_insn * +prepare_copy_insn (rtx reg, rtx exp) { - rtx reg = expr->reaching_reg; - /* Copy the expression to make sure we don't have any sharing issues. */ - rtx exp = copy_rtx (expr->expr); rtx_insn *pat; start_sequence (); @@ -1996,6 +1994,18 @@ process_insert_insn (struct gcse_expr *expr) return pat; } +/* Generate RTL to copy an EXPR to its `reaching_reg' and return it. */ + +static rtx_insn * +process_insert_insn (struct gcse_expr *expr) +{ + rtx reg = expr->reaching_reg; + /* Copy the expression to make sure we don't have any sharing issues. */ + rtx exp = copy_rtx (expr->expr); + + return prepare_copy_insn (reg, exp); +} + /* Add EXPR to the end of basic block BB. This is used by both the PRE and code hoisting. */ diff --git a/gcc/genmatch.c b/gcc/genmatch.c index be6efe3bf12..a75d8b3bb53 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -2680,12 +2680,14 @@ dt_operand::gen_match_op (FILE *f, int indent, const char *opname, bool) char match_opname[20]; match_dop->get_name (match_opname); if (value_match) - fprintf_indent (f, indent, "if (%s == %s || operand_equal_p (%s, %s, 0))\n", - opname, match_opname, opname, match_opname); + fprintf_indent (f, indent, "if ((%s == %s && ! TREE_SIDE_EFFECTS (%s)) " + "|| operand_equal_p (%s, %s, 0))\n", + opname, match_opname, opname, opname, match_opname); else - fprintf_indent (f, indent, "if (%s == %s || (operand_equal_p (%s, %s, 0) " + fprintf_indent (f, indent, "if ((%s == %s && ! TREE_SIDE_EFFECTS (%s)) " + "|| (operand_equal_p (%s, %s, 0) " "&& types_match (%s, %s)))\n", - opname, match_opname, opname, match_opname, + opname, match_opname, opname, opname, match_opname, opname, match_opname); fprintf_indent (f, indent + 2, "{\n"); return 1; diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c index 51783e51356..821535ec026 100644 --- a/gcc/ggc-page.c +++ b/gcc/ggc-page.c @@ -2555,6 +2555,9 @@ ggc_pch_read (FILE *f, void *addr) count_old_page_tables = G.by_depth_in_use; + if (fread (&d, sizeof (d), 1, f) != 1) + fatal_error (input_location, "cannot read PCH file: %m"); + /* We've just read in a PCH file. So, every object that used to be allocated is now free. */ clear_marks (); @@ -2583,8 +2586,6 @@ ggc_pch_read (FILE *f, void *addr) /* Allocate the appropriate page-table entries for the pages read from the PCH file. */ - if (fread (&d, sizeof (d), 1, f) != 1) - fatal_error (input_location, "can%'t read PCH file: %m"); for (i = 0; i < NUM_ORDERS; i++) { diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index ee98ae51246..7f2a0a526fe 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -3031,11 +3031,10 @@ gimple_fold_builtin_sprintf (gimple_stmt_iterator *gsi) gimple_seq stmts = NULL; gimple *repl = gimple_build_call (fn, 2, dest, fmt); gimple_seq_add_stmt_without_update (&stmts, repl); - if (gimple_call_lhs (stmt)) + if (tree lhs = gimple_call_lhs (stmt)) { - repl = gimple_build_assign (gimple_call_lhs (stmt), - build_int_cst (integer_type_node, - strlen (fmt_str))); + repl = gimple_build_assign (lhs, build_int_cst (TREE_TYPE (lhs), + strlen (fmt_str))); gimple_seq_add_stmt_without_update (&stmts, repl); gsi_replace_with_seq_vops (gsi, stmts); /* gsi now points at the assignment to the lhs, get a @@ -3079,12 +3078,12 @@ gimple_fold_builtin_sprintf (gimple_stmt_iterator *gsi) gimple_seq stmts = NULL; gimple *repl = gimple_build_call (fn, 2, dest, orig); gimple_seq_add_stmt_without_update (&stmts, repl); - if (gimple_call_lhs (stmt)) + if (tree lhs = gimple_call_lhs (stmt)) { - if (!useless_type_conversion_p (integer_type_node, + if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (orig_len))) - orig_len = fold_convert (integer_type_node, orig_len); - repl = gimple_build_assign (gimple_call_lhs (stmt), orig_len); + orig_len = fold_convert (TREE_TYPE (lhs), orig_len); + repl = gimple_build_assign (lhs, orig_len); gimple_seq_add_stmt_without_update (&stmts, repl); gsi_replace_with_seq_vops (gsi, stmts); /* gsi now points at the assignment to the lhs, get a @@ -3164,10 +3163,10 @@ gimple_fold_builtin_snprintf (gimple_stmt_iterator *gsi) gimple_seq stmts = NULL; gimple *repl = gimple_build_call (fn, 2, dest, fmt); gimple_seq_add_stmt_without_update (&stmts, repl); - if (gimple_call_lhs (stmt)) + if (tree lhs = gimple_call_lhs (stmt)) { - repl = gimple_build_assign (gimple_call_lhs (stmt), - build_int_cst (integer_type_node, len)); + repl = gimple_build_assign (lhs, + build_int_cst (TREE_TYPE (lhs), len)); gimple_seq_add_stmt_without_update (&stmts, repl); gsi_replace_with_seq_vops (gsi, stmts); /* gsi now points at the assignment to the lhs, get a @@ -3216,12 +3215,12 @@ gimple_fold_builtin_snprintf (gimple_stmt_iterator *gsi) gimple_seq stmts = NULL; gimple *repl = gimple_build_call (fn, 2, dest, orig); gimple_seq_add_stmt_without_update (&stmts, repl); - if (gimple_call_lhs (stmt)) + if (tree lhs = gimple_call_lhs (stmt)) { - if (!useless_type_conversion_p (integer_type_node, + if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (orig_len))) - orig_len = fold_convert (integer_type_node, orig_len); - repl = gimple_build_assign (gimple_call_lhs (stmt), orig_len); + orig_len = fold_convert (TREE_TYPE (lhs), orig_len); + repl = gimple_build_assign (lhs, orig_len); gimple_seq_add_stmt_without_update (&stmts, repl); gsi_replace_with_seq_vops (gsi, stmts); /* gsi now points at the assignment to the lhs, get a @@ -6721,14 +6720,10 @@ fold_const_aggregate_ref_1 (tree t, tree (*valueize) (tree)) = wi::sext (wi::to_poly_offset (idx) - wi::to_poly_offset (low_bound), TYPE_PRECISION (TREE_TYPE (idx))); - + woffset *= tree_to_uhwi (unit_size); + woffset *= BITS_PER_UNIT; if (woffset.to_shwi (&offset)) { - /* TODO: This code seems wrong, multiply then check - to see if it fits. */ - offset *= tree_to_uhwi (unit_size); - offset *= BITS_PER_UNIT; - base = TREE_OPERAND (t, 0); ctor = get_base_constructor (base, &offset, valueize); /* Empty constructor. Always fold to 0. */ diff --git a/gcc/gimple-loop-interchange.cc b/gcc/gimple-loop-interchange.cc index eb35263e69c..19510ad244a 100644 --- a/gcc/gimple-loop-interchange.cc +++ b/gcc/gimple-loop-interchange.cc @@ -688,11 +688,16 @@ loop_cand::analyze_induction_var (tree var, tree chrec) /* Var is loop invariant, though it's unlikely to happen. */ if (tree_does_not_contain_chrecs (chrec)) { + /* Punt on floating point invariants if honoring signed zeros, + representing that as + 0.0 would change the result if init + is -0.0. Similarly for SNaNs it can raise exception. */ + if (HONOR_SIGNED_ZEROS (chrec) || HONOR_SNANS (chrec)) + return false; struct induction *iv = XCNEW (struct induction); iv->var = var; iv->init_val = init; iv->init_expr = chrec; - iv->step = build_int_cst (TREE_TYPE (chrec), 0); + iv->step = build_zero_cst (TREE_TYPE (chrec)); m_inductions.safe_push (iv); return true; } diff --git a/gcc/gimple-loop-jam.c b/gcc/gimple-loop-jam.c index 2ecd1bb5a7c..381f3a85515 100644 --- a/gcc/gimple-loop-jam.c +++ b/gcc/gimple-loop-jam.c @@ -161,7 +161,7 @@ bb_prevents_fusion_p (basic_block bb) gimple_stmt_iterator gsi; /* BB is duplicated by outer unrolling and then all N-1 first copies move into the body of the fused inner loop. If BB exits the outer loop - the last copy still doess so, and the first N-1 copies are cancelled + the last copy still does so, and the first N-1 copies are cancelled by loop unrolling, so also after fusion it's the exit block. But there might be other reasons that prevent fusion: * stores or unknown side-effects prevent fusion @@ -227,6 +227,33 @@ unroll_jam_possible_p (struct loop *outer, struct loop *loop) || !expr_invariant_in_loop_p (outer, niter.niter)) return false; + /* If the inner loop produces any values that are used inside the + outer loop (except the virtual op) then it can flow + back (perhaps indirectly) into the inner loop. This prevents + fusion: without fusion the value at the last iteration is used, + with fusion the value after the initial iteration is used. + + If all uses are outside the outer loop this doesn't prevent fusion; + the value of the last iteration is still used (and the values from + all intermediate iterations are dead). */ + gphi_iterator psi; + for (psi = gsi_start_phis (single_exit (loop)->dest); + !gsi_end_p (psi); gsi_next (&psi)) + { + imm_use_iterator imm_iter; + use_operand_p use_p; + tree op = gimple_phi_result (psi.phi ()); + if (virtual_operand_p (op)) + continue; + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, op) + { + gimple *use_stmt = USE_STMT (use_p); + if (!is_gimple_debug (use_stmt) + && flow_bb_inside_loop_p (outer, gimple_bb (use_stmt))) + return false; + } + } + /* And check blocks belonging to just outer loop. */ bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun)); n = get_loop_body_with_size (outer, bbs, n_basic_blocks_for_fn (cfun)); @@ -245,7 +272,6 @@ unroll_jam_possible_p (struct loop *outer, struct loop *loop) body would be the after-iter value of the first body) if it's over an associative and commutative operation. We wouldn't be able to handle unknown cycles. */ - gphi_iterator psi; for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi)) { affine_iv iv; @@ -429,7 +455,7 @@ tree_loop_unroll_and_jam (void) fprintf (dump_file, "Cannot analyze data dependencies\n"); free_data_refs (datarefs); free_dependence_relations (dependences); - return false; + continue; } if (!datarefs.length ()) continue; diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c index 4266fb3d906..4e63c97e55b 100644 --- a/gcc/gimple-match-head.c +++ b/gcc/gimple-match-head.c @@ -100,17 +100,34 @@ gimple_resimplify1 (gimple_seq *seq, } } + /* Limit recursion, there are cases like PR80887 and others, for + example when value-numbering presents us with unfolded expressions + that we are really not prepared to handle without eventual + oscillation like ((_50 + 0) + 8) where _50 gets mapped to _50 + itself as available expression. */ + static unsigned depth; + if (depth > 10) + { + if (dump_file && (dump_flags & TDF_FOLDING)) + fprintf (dump_file, "Aborting expression simplification due to " + "deep recursion\n"); + return false; + } + + ++depth; code_helper res_code2; tree res_ops2[3] = {}; if (gimple_simplify (&res_code2, res_ops2, seq, valueize, *res_code, type, res_ops[0])) { + --depth; *res_code = res_code2; res_ops[0] = res_ops2[0]; res_ops[1] = res_ops2[1]; res_ops[2] = res_ops2[2]; return true; } + --depth; return false; } @@ -160,17 +177,30 @@ gimple_resimplify2 (gimple_seq *seq, canonicalized = true; } + /* Limit recursion, see gimple_resimplify1. */ + static unsigned depth; + if (depth > 10) + { + if (dump_file && (dump_flags & TDF_FOLDING)) + fprintf (dump_file, "Aborting expression simplification due to " + "deep recursion\n"); + return false; + } + + ++depth; code_helper res_code2; tree res_ops2[3] = {}; if (gimple_simplify (&res_code2, res_ops2, seq, valueize, *res_code, type, res_ops[0], res_ops[1])) { + --depth; *res_code = res_code2; res_ops[0] = res_ops2[0]; res_ops[1] = res_ops2[1]; res_ops[2] = res_ops2[2]; return true; } + --depth; return canonicalized; } @@ -219,18 +249,31 @@ gimple_resimplify3 (gimple_seq *seq, canonicalized = true; } + /* Limit recursion, see gimple_resimplify1. */ + static unsigned depth; + if (depth > 10) + { + if (dump_file && (dump_flags & TDF_FOLDING)) + fprintf (dump_file, "Aborting expression simplification due to " + "deep recursion\n"); + return false; + } + + ++depth; code_helper res_code2; tree res_ops2[3] = {}; if (gimple_simplify (&res_code2, res_ops2, seq, valueize, *res_code, type, res_ops[0], res_ops[1], res_ops[2])) { + --depth; *res_code = res_code2; res_ops[0] = res_ops2[0]; res_ops[1] = res_ops2[1]; res_ops[2] = res_ops2[2]; return true; } + --depth; return canonicalized; } diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c index 6695526f370..487770f8488 100644 --- a/gcc/gimple-pretty-print.c +++ b/gcc/gimple-pretty-print.c @@ -2040,6 +2040,8 @@ dump_gimple_asm (pretty_printer *buffer, gasm *gs, int spc, dump_flags_t flags) pp_string (buffer, "__asm__"); if (gimple_asm_volatile_p (gs)) pp_string (buffer, " __volatile__"); + if (gimple_asm_inline_p (gs)) + pp_string (buffer, " __inline__"); if (gimple_asm_nlabels (gs)) pp_string (buffer, " goto"); pp_string (buffer, "(\""); diff --git a/gcc/gimple-ssa-backprop.c b/gcc/gimple-ssa-backprop.c index 908854d1c44..edbbae5394a 100644 --- a/gcc/gimple-ssa-backprop.c +++ b/gcc/gimple-ssa-backprop.c @@ -501,10 +501,11 @@ bool backprop::intersect_uses (tree var, usage_info *info) { imm_use_iterator iter; - gimple *stmt; + use_operand_p use_p; *info = usage_info::intersection_identity (); - FOR_EACH_IMM_USE_STMT (stmt, iter, var) + FOR_EACH_IMM_USE_FAST (use_p, iter, var) { + gimple *stmt = USE_STMT (use_p); if (is_gimple_debug (stmt)) continue; gphi *phi = dyn_cast (stmt); @@ -528,10 +529,7 @@ backprop::intersect_uses (tree var, usage_info *info) process_use (stmt, var, &subinfo); *info &= subinfo; if (!info->is_useful ()) - { - BREAK_FROM_IMM_USE_STMT (iter); - return false; - } + return false; } } return true; diff --git a/gcc/gimple-ssa-isolate-paths.c b/gcc/gimple-ssa-isolate-paths.c index 131705d1827..1a81f853141 100644 --- a/gcc/gimple-ssa-isolate-paths.c +++ b/gcc/gimple-ssa-isolate-paths.c @@ -270,7 +270,7 @@ stmt_uses_name_in_undefined_way (gimple *use_stmt, tree name, location_t loc) divisor. */ if (!POINTER_TYPE_P (TREE_TYPE (name))) { - if (!flag_non_call_exceptions) + if (!cfun->can_throw_non_call_exceptions) return is_divmod_with_given_divisor (use_stmt, name); return false; } @@ -309,7 +309,7 @@ stmt_uses_name_in_undefined_way (gimple *use_stmt, tree name, location_t loc) bool stmt_uses_0_or_null_in_undefined_way (gimple *stmt) { - if (!flag_non_call_exceptions + if (!cfun->can_throw_non_call_exceptions && is_divmod_with_given_divisor (stmt, integer_zero_node)) return true; diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c index 5cc4133aba7..613b3fe1efa 100644 --- a/gcc/gimple-ssa-sprintf.c +++ b/gcc/gimple-ssa-sprintf.c @@ -376,9 +376,14 @@ target_to_host (char *hostr, size_t hostsz, const char *targstr) overlong strings just like the translated strings are. */ if (target_to_host_charmap['\0'] == 1) { - strncpy (hostr, targstr, hostsz - 4); - if (strlen (targstr) >= hostsz) - strcpy (hostr + hostsz - 4, "..."); + size_t len = strlen (targstr); + if (len >= hostsz) + { + memcpy (hostr, targstr, hostsz - 4); + strcpy (hostr + hostsz - 4, "..."); + } + else + memcpy (hostr, targstr, len + 1); return hostr; } @@ -392,10 +397,9 @@ target_to_host (char *hostr, size_t hostsz, const char *targstr) if (!*targstr) break; - if (size_t (ph - hostr) == hostsz - 4) + if (size_t (ph - hostr) == hostsz) { - *ph = '\0'; - strcat (ph, "..."); + strcpy (ph - 4, "..."); break; } } @@ -3662,10 +3666,10 @@ try_substitute_return_value (gimple_stmt_iterator *gsi, are badly declared. */ && !stmt_ends_bb_p (info.callstmt)) { - tree cst = build_int_cst (integer_type_node, retval[0]); + tree cst = build_int_cst (lhs ? TREE_TYPE (lhs) : integer_type_node, + retval[0]); - if (lhs == NULL_TREE - && info.nowrite) + if (lhs == NULL_TREE && info.nowrite) { /* Remove the call to the bounded function with a zero size (e.g., snprintf(0, 0, "%i", 123)) if there is no lhs. */ @@ -3706,7 +3710,7 @@ try_substitute_return_value (gimple_stmt_iterator *gsi, } } } - else if (lhs) + else if (lhs && types_compatible_p (TREE_TYPE (lhs), integer_type_node)) { bool setrange = false; diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c index 7a074185833..df7deb39ce5 100644 --- a/gcc/gimple-ssa-store-merging.c +++ b/gcc/gimple-ssa-store-merging.c @@ -1416,6 +1416,7 @@ struct merged_store_group unsigned int load_align[2]; unsigned int first_order; unsigned int last_order; + unsigned int first_nonmergeable_order; auto_vec stores; /* We record the first and last original statements in the sequence because @@ -1806,6 +1807,7 @@ merged_store_group::merged_store_group (store_immediate_info *info) width has been finalized. */ val = NULL; mask = NULL; + first_nonmergeable_order = ~0U; unsigned HOST_WIDE_INT align_bitpos = 0; get_object_alignment_1 (gimple_assign_lhs (info->stmt), &align, &align_bitpos); @@ -2640,23 +2642,153 @@ imm_store_chain_info::coalesce_immediate_stores () } } + if (info->order >= merged_store->first_nonmergeable_order) + ; + /* |---store 1---| |---store 2---| Overlapping stores. */ - if (IN_RANGE (info->bitpos, merged_store->start, - merged_store->start + merged_store->width - 1)) + else if (IN_RANGE (info->bitpos, merged_store->start, + merged_store->start + merged_store->width - 1)) { /* Only allow overlapping stores of constants. */ if (info->rhs_code == INTEGER_CST - && merged_store->stores[0]->rhs_code == INTEGER_CST - && check_no_overlap (m_store_info, i, INTEGER_CST, - MAX (merged_store->last_order, info->order), - MAX (merged_store->start - + merged_store->width, - info->bitpos + info->bitsize))) + && merged_store->stores[0]->rhs_code == INTEGER_CST) { - merged_store->merge_overlapping (info); - continue; + unsigned int last_order + = MAX (merged_store->last_order, info->order); + unsigned HOST_WIDE_INT end + = MAX (merged_store->start + merged_store->width, + info->bitpos + info->bitsize); + if (check_no_overlap (m_store_info, i, INTEGER_CST, + last_order, end)) + { + /* check_no_overlap call above made sure there are no + overlapping stores with non-INTEGER_CST rhs_code + in between the first and last of the stores we've + just merged. If there are any INTEGER_CST rhs_code + stores in between, we need to merge_overlapping them + even if in the sort_by_bitpos order there are other + overlapping stores in between. Keep those stores as is. + Example: + MEM[(int *)p_28] = 0; + MEM[(char *)p_28 + 3B] = 1; + MEM[(char *)p_28 + 1B] = 2; + MEM[(char *)p_28 + 2B] = MEM[(char *)p_28 + 6B]; + We can't merge the zero store with the store of two and + not merge anything else, because the store of one is + in the original order in between those two, but in + store_by_bitpos order it comes after the last store that + we can't merge with them. We can merge the first 3 stores + and keep the last store as is though. */ + unsigned int len = m_store_info.length (); + unsigned int try_order = last_order; + unsigned int first_nonmergeable_order; + unsigned int k; + bool last_iter = false; + int attempts = 0; + do + { + unsigned int max_order = 0; + unsigned first_nonmergeable_int_order = ~0U; + unsigned HOST_WIDE_INT this_end = end; + k = i; + first_nonmergeable_order = ~0U; + for (unsigned int j = i + 1; j < len; ++j) + { + store_immediate_info *info2 = m_store_info[j]; + if (info2->bitpos >= this_end) + break; + if (info2->order < try_order) + { + if (info2->rhs_code != INTEGER_CST) + { + /* Normally check_no_overlap makes sure this + doesn't happen, but if end grows below, + then we need to process more stores than + check_no_overlap verified. Example: + MEM[(int *)p_5] = 0; + MEM[(short *)p_5 + 3B] = 1; + MEM[(char *)p_5 + 4B] = _9; + MEM[(char *)p_5 + 2B] = 2; */ + k = 0; + break; + } + k = j; + this_end = MAX (this_end, + info2->bitpos + info2->bitsize); + } + else if (info2->rhs_code == INTEGER_CST + && !last_iter) + { + max_order = MAX (max_order, info2->order + 1); + first_nonmergeable_int_order + = MIN (first_nonmergeable_int_order, + info2->order); + } + else + first_nonmergeable_order + = MIN (first_nonmergeable_order, info2->order); + } + if (k == 0) + { + if (last_order == try_order) + break; + /* If this failed, but only because we grew + try_order, retry with the last working one, + so that we merge at least something. */ + try_order = last_order; + last_iter = true; + continue; + } + last_order = try_order; + /* Retry with a larger try_order to see if we could + merge some further INTEGER_CST stores. */ + if (max_order + && (first_nonmergeable_int_order + < first_nonmergeable_order)) + { + try_order = MIN (max_order, + first_nonmergeable_order); + try_order + = MIN (try_order, + merged_store->first_nonmergeable_order); + if (try_order > last_order && ++attempts < 16) + continue; + } + first_nonmergeable_order + = MIN (first_nonmergeable_order, + first_nonmergeable_int_order); + end = this_end; + break; + } + while (1); + + if (k != 0) + { + merged_store->merge_overlapping (info); + + merged_store->first_nonmergeable_order + = MIN (merged_store->first_nonmergeable_order, + first_nonmergeable_order); + + for (unsigned int j = i + 1; j <= k; j++) + { + store_immediate_info *info2 = m_store_info[j]; + gcc_assert (info2->bitpos < end); + if (info2->order < last_order) + { + gcc_assert (info2->rhs_code == INTEGER_CST); + if (info != info2) + merged_store->merge_overlapping (info2); + } + /* Other stores are kept and not merged in any + way. */ + } + ignore = k; + continue; + } + } } } /* |---store 1---||---store 2---| diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c index b86ce858dc2..edfebc281ef 100644 --- a/gcc/gimple-ssa-strength-reduction.c +++ b/gcc/gimple-ssa-strength-reduction.c @@ -1268,7 +1268,7 @@ slsr_process_mul (gimple *gs, tree rhs1, tree rhs2, bool speed) c->next_interp = c2->cand_num; c2->first_interp = c->cand_num; } - else if (TREE_CODE (rhs2) == INTEGER_CST) + else if (TREE_CODE (rhs2) == INTEGER_CST && !integer_zerop (rhs2)) { /* Record an interpretation for the multiply-immediate. */ c = create_mul_imm_cand (gs, rhs1, rhs2, speed); @@ -2779,17 +2779,23 @@ record_phi_increments_1 (slsr_cand_t basis, gimple *phi) for (i = 0; i < gimple_phi_num_args (phi); i++) { tree arg = gimple_phi_arg_def (phi, i); + gimple *arg_def = SSA_NAME_DEF_STMT (arg); - if (!operand_equal_p (arg, phi_cand->base_expr, 0)) + if (gimple_code (arg_def) == GIMPLE_PHI) + record_phi_increments_1 (basis, arg_def); + else { - gimple *arg_def = SSA_NAME_DEF_STMT (arg); + widest_int diff; - if (gimple_code (arg_def) == GIMPLE_PHI) - record_phi_increments_1 (basis, arg_def); + if (operand_equal_p (arg, phi_cand->base_expr, 0)) + { + diff = -basis->index; + record_increment (phi_cand, diff, PHI_ADJUST); + } else { slsr_cand_t arg_cand = base_cand_from_table (arg); - widest_int diff = arg_cand->index - basis->index; + diff = arg_cand->index - basis->index; record_increment (arg_cand, diff, PHI_ADJUST); } } @@ -2864,29 +2870,43 @@ phi_incr_cost_1 (slsr_cand_t c, const widest_int &incr, gimple *phi, for (i = 0; i < gimple_phi_num_args (phi); i++) { tree arg = gimple_phi_arg_def (phi, i); + gimple *arg_def = SSA_NAME_DEF_STMT (arg); - if (!operand_equal_p (arg, phi_cand->base_expr, 0)) + if (gimple_code (arg_def) == GIMPLE_PHI) { - gimple *arg_def = SSA_NAME_DEF_STMT (arg); - - if (gimple_code (arg_def) == GIMPLE_PHI) + int feeding_savings = 0; + tree feeding_var = gimple_phi_result (arg_def); + cost += phi_incr_cost_1 (c, incr, arg_def, &feeding_savings); + if (uses_consumed_by_stmt (feeding_var, phi)) + *savings += feeding_savings; + } + else + { + widest_int diff; + slsr_cand_t arg_cand; + + /* When the PHI argument is just a pass-through to the base + expression of the hidden basis, the difference is zero minus + the index of the basis. There is no potential savings by + eliminating a statement in this case. */ + if (operand_equal_p (arg, phi_cand->base_expr, 0)) { - int feeding_savings = 0; - tree feeding_var = gimple_phi_result (arg_def); - cost += phi_incr_cost_1 (c, incr, arg_def, &feeding_savings); - if (uses_consumed_by_stmt (feeding_var, phi)) - *savings += feeding_savings; + arg_cand = (slsr_cand_t)NULL; + diff = -basis->index; } else { - slsr_cand_t arg_cand = base_cand_from_table (arg); - widest_int diff = arg_cand->index - basis->index; - - if (incr == diff) + arg_cand = base_cand_from_table (arg); + diff = arg_cand->index - basis->index; + } + + if (incr == diff) + { + tree basis_lhs = gimple_assign_lhs (basis->cand_stmt); + cost += add_cost (true, TYPE_MODE (TREE_TYPE (basis_lhs))); + if (arg_cand) { - tree basis_lhs = gimple_assign_lhs (basis->cand_stmt); tree lhs = gimple_assign_lhs (arg_cand->cand_stmt); - cost += add_cost (true, TYPE_MODE (TREE_TYPE (basis_lhs))); if (uses_consumed_by_stmt (lhs, phi)) *savings += stmt_cost (arg_cand->cand_stmt, true); } @@ -3228,23 +3248,26 @@ ncd_with_phi (slsr_cand_t c, const widest_int &incr, gphi *phi, for (i = 0; i < gimple_phi_num_args (phi); i++) { tree arg = gimple_phi_arg_def (phi, i); + gimple *arg_def = SSA_NAME_DEF_STMT (arg); - if (!operand_equal_p (arg, phi_cand->base_expr, 0)) + if (gimple_code (arg_def) == GIMPLE_PHI) + ncd = ncd_with_phi (c, incr, as_a (arg_def), ncd, where); + else { - gimple *arg_def = SSA_NAME_DEF_STMT (arg); + widest_int diff; - if (gimple_code (arg_def) == GIMPLE_PHI) - ncd = ncd_with_phi (c, incr, as_a (arg_def), ncd, - where); - else + if (operand_equal_p (arg, phi_cand->base_expr, 0)) + diff = -basis->index; + else { slsr_cand_t arg_cand = base_cand_from_table (arg); - widest_int diff = arg_cand->index - basis->index; - basic_block pred = gimple_phi_arg_edge (phi, i)->src; - - if ((incr == diff) || (!address_arithmetic_p && incr == -diff)) - ncd = ncd_for_two_cands (ncd, pred, *where, NULL, where); + diff = arg_cand->index - basis->index; } + + basic_block pred = gimple_phi_arg_edge (phi, i)->src; + + if ((incr == diff) || (!address_arithmetic_p && incr == -diff)) + ncd = ncd_for_two_cands (ncd, pred, *where, NULL, where); } } @@ -3515,51 +3538,53 @@ all_phi_incrs_profitable_1 (slsr_cand_t c, gphi *phi, int *spread) return false; tree arg = gimple_phi_arg_def (phi, i); + gimple *arg_def = SSA_NAME_DEF_STMT (arg); - if (!operand_equal_p (arg, phi_cand->base_expr, 0)) + if (gimple_code (arg_def) == GIMPLE_PHI) { - gimple *arg_def = SSA_NAME_DEF_STMT (arg); + if (!all_phi_incrs_profitable_1 (c, as_a (arg_def), spread) + || *spread > MAX_SPREAD) + return false; + } + else + { + int j; + widest_int increment; - if (gimple_code (arg_def) == GIMPLE_PHI) - { - if (!all_phi_incrs_profitable_1 (c, as_a (arg_def), - spread) - || *spread > MAX_SPREAD) - return false; - } + if (operand_equal_p (arg, phi_cand->base_expr, 0)) + increment = -basis->index; else { - int j; slsr_cand_t arg_cand = base_cand_from_table (arg); - widest_int increment = arg_cand->index - basis->index; - - if (!address_arithmetic_p && wi::neg_p (increment)) - increment = -increment; + increment = arg_cand->index - basis->index; + } - j = incr_vec_index (increment); + if (!address_arithmetic_p && wi::neg_p (increment)) + increment = -increment; - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, " Conditional candidate %d, phi: ", - c->cand_num); - print_gimple_stmt (dump_file, phi, 0); - fputs (" increment: ", dump_file); - print_decs (increment, dump_file); - if (j < 0) - fprintf (dump_file, - "\n Not replaced; incr_vec overflow.\n"); - else { - fprintf (dump_file, "\n cost: %d\n", incr_vec[j].cost); - if (profitable_increment_p (j)) - fputs (" Replacing...\n", dump_file); - else - fputs (" Not replaced.\n", dump_file); - } - } + j = incr_vec_index (increment); - if (j < 0 || !profitable_increment_p (j)) - return false; + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, " Conditional candidate %d, phi: ", + c->cand_num); + print_gimple_stmt (dump_file, phi, 0); + fputs (" increment: ", dump_file); + print_decs (increment, dump_file); + if (j < 0) + fprintf (dump_file, + "\n Not replaced; incr_vec overflow.\n"); + else { + fprintf (dump_file, "\n cost: %d\n", incr_vec[j].cost); + if (profitable_increment_p (j)) + fputs (" Replacing...\n", dump_file); + else + fputs (" Not replaced.\n", dump_file); + } } + + if (j < 0 || !profitable_increment_p (j)) + return false; } } diff --git a/gcc/gimple-ssa-warn-restrict.c b/gcc/gimple-ssa-warn-restrict.c index 3d0664da028..722bc6f921f 100644 --- a/gcc/gimple-ssa-warn-restrict.c +++ b/gcc/gimple-ssa-warn-restrict.c @@ -314,13 +314,9 @@ builtin_memref::extend_offset_range (tree offset) offrange[0] += offset_int::from (min, SIGNED); offrange[1] += offset_int::from (max, SIGNED); } - else if (rng == VR_ANTI_RANGE) - { - offrange[0] += offset_int::from (max + 1, SIGNED); - offrange[1] += offset_int::from (min - 1, SIGNED); - } else { + /* Handle an anti-range the same as no range at all. */ gimple *stmt = SSA_NAME_DEF_STMT (offset); tree type; if (is_gimple_assign (stmt) @@ -702,6 +698,10 @@ builtin_access::builtin_access (gcall *call, builtin_memref &dst, offset_int bounds[2] = { maxobjsize, maxobjsize }; if (dstref->strbounded_p) { + unsigned nargs = gimple_call_num_args (call); + if (nargs <= sizeargno) + return; + tree size = gimple_call_arg (call, sizeargno); tree range[2]; if (get_size_range (size, range, true)) diff --git a/gcc/gimple.h b/gcc/gimple.h index 265e3e24398..224463b33d0 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -137,6 +137,7 @@ enum gimple_rhs_class enum gf_mask { GF_ASM_INPUT = 1 << 0, GF_ASM_VOLATILE = 1 << 1, + GF_ASM_INLINE = 1 << 2, GF_CALL_FROM_THUNK = 1 << 0, GF_CALL_RETURN_SLOT_OPT = 1 << 1, GF_CALL_TAILCALL = 1 << 2, @@ -3925,7 +3926,7 @@ gimple_asm_string (const gasm *asm_stmt) } -/* Return true ASM_STMT ASM_STMT is an asm statement marked volatile. */ +/* Return true if ASM_STMT is marked volatile. */ static inline bool gimple_asm_volatile_p (const gasm *asm_stmt) @@ -3934,7 +3935,7 @@ gimple_asm_volatile_p (const gasm *asm_stmt) } -/* If VOLATLE_P is true, mark asm statement ASM_STMT as volatile. */ +/* If VOLATILE_P is true, mark asm statement ASM_STMT as volatile. */ static inline void gimple_asm_set_volatile (gasm *asm_stmt, bool volatile_p) @@ -3946,6 +3947,27 @@ gimple_asm_set_volatile (gasm *asm_stmt, bool volatile_p) } +/* Return true if ASM_STMT is marked inline. */ + +static inline bool +gimple_asm_inline_p (const gasm *asm_stmt) +{ + return (asm_stmt->subcode & GF_ASM_INLINE) != 0; +} + + +/* If INLINE_P is true, mark asm statement ASM_STMT as inline. */ + +static inline void +gimple_asm_set_inline (gasm *asm_stmt, bool inline_p) +{ + if (inline_p) + asm_stmt->subcode |= GF_ASM_INLINE; + else + asm_stmt->subcode &= ~GF_ASM_INLINE; +} + + /* If INPUT_P is true, mark asm ASM_STMT as an ASM_INPUT. */ static inline void diff --git a/gcc/gimplify.c b/gcc/gimplify.c index d7145d3e579..3bfd0692103 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -191,6 +191,7 @@ struct gimplify_omp_ctx bool target_map_scalars_firstprivate; bool target_map_pointers_as_0len_arrays; bool target_firstprivatize_array_bases; + bool add_safelen1; }; static struct gimplify_ctx *gimplify_ctxp; @@ -1294,12 +1295,17 @@ gimplify_bind_expr (tree *expr_p, gimple_seq *pre_p) || splay_tree_lookup (ctx->variables, (splay_tree_key) t) == NULL)) { + int flag = GOVD_LOCAL; if (ctx->region_type == ORT_SIMD && TREE_ADDRESSABLE (t) && !TREE_STATIC (t)) - omp_add_variable (ctx, t, GOVD_PRIVATE | GOVD_SEEN); - else - omp_add_variable (ctx, t, GOVD_LOCAL | GOVD_SEEN); + { + if (TREE_CODE (DECL_SIZE_UNIT (t)) != INTEGER_CST) + ctx->add_safelen1 = true; + else + flag = GOVD_PRIVATE; + } + omp_add_variable (ctx, t, flag | GOVD_SEEN); } DECL_SEEN_IN_BIND_EXPR_P (t) = 1; @@ -4650,6 +4656,7 @@ gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p, otherwise we'd generate a new temporary, and we can as well just use the decl we already have. */ else if (!TREE_ADDRESSABLE (decl) + && !TREE_THIS_VOLATILE (decl) && init && (fallback & fb_lvalue) == 0 && gimple_test_f (init)) @@ -4773,7 +4780,15 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, { struct gimplify_init_ctor_preeval_data preeval_data; HOST_WIDE_INT num_ctor_elements, num_nonzero_elements; + HOST_WIDE_INT num_unique_nonzero_elements; bool cleared, complete_p, valid_const_initializer; + /* Use readonly data for initializers of this or smaller size + regardless of the num_nonzero_elements / num_unique_nonzero_elements + ratio. */ + const HOST_WIDE_INT min_unique_size = 64; + /* If num_nonzero_elements / num_unique_nonzero_elements ratio + is smaller than this, use readonly data. */ + const int unique_nonzero_ratio = 8; /* Aggregate types must lower constructors to initialization of individual elements. The exception is that a CONSTRUCTOR node @@ -4790,6 +4805,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, can only do so if it known to be a valid constant initializer. */ valid_const_initializer = categorize_ctor_elements (ctor, &num_nonzero_elements, + &num_unique_nonzero_elements, &num_ctor_elements, &complete_p); /* If a const aggregate variable is being initialized, then it @@ -4798,7 +4814,15 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, && num_nonzero_elements > 1 && TREE_READONLY (object) && VAR_P (object) - && (flag_merge_constants >= 2 || !TREE_ADDRESSABLE (object))) + && (flag_merge_constants >= 2 || !TREE_ADDRESSABLE (object)) + /* For ctors that have many repeated nonzero elements + represented through RANGE_EXPRs, prefer initializing + those through runtime loops over copies of large amounts + of data from readonly data section. */ + && (num_unique_nonzero_elements + > num_nonzero_elements / unique_nonzero_ratio + || ((unsigned HOST_WIDE_INT) int_size_in_bytes (type) + <= (unsigned HOST_WIDE_INT) min_unique_size))) { if (notify_temp_creation) return GS_ERROR; @@ -4899,6 +4923,13 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, is so large as to make individual moves inefficient. */ if (size > 0 && num_nonzero_elements > 1 + /* For ctors that have many repeated nonzero elements + represented through RANGE_EXPRs, prefer initializing + those through runtime loops over copies of large amounts + of data from readonly data section. */ + && (num_unique_nonzero_elements + > num_nonzero_elements / unique_nonzero_ratio + || size <= min_unique_size) && (size < num_nonzero_elements || !can_move_by_pieces (size, align))) { @@ -4922,7 +4953,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, one field to assign, initialize the target from a temporary. */ if (TREE_THIS_VOLATILE (object) && !TREE_ADDRESSABLE (type) - && num_nonzero_elements > 0 + && (num_nonzero_elements > 0 || !cleared) && vec_safe_length (elts) > 1) { tree temp = create_tmp_var (TYPE_MAIN_VARIANT (type)); @@ -6120,6 +6151,19 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) is_inout = false; } + /* If we can't make copies, we can only accept memory. */ + if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link)))) + { + if (allows_mem) + allows_reg = 0; + else + { + error ("impossible constraint in %"); + error ("non-memory output %d must stay in memory", i); + return GS_ERROR; + } + } + if (!allows_reg && allows_mem) mark_addressable (TREE_VALUE (link)); @@ -6360,6 +6404,7 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr) || noutputs == 0); gimple_asm_set_input (stmt, ASM_INPUT_P (expr)); + gimple_asm_set_inline (stmt, ASM_INLINE_P (expr)); gimplify_seq_add_stmt (pre_p, stmt); } @@ -6614,6 +6659,7 @@ gimplify_target_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) } if (asan_poisoned_variables && DECL_ALIGN (temp) <= MAX_SUPPORTED_STACK_ALIGNMENT + && !TREE_STATIC (temp) && dbg_cnt (asan_use_after_scope) && !gimplify_omp_ctxp) { @@ -8135,8 +8181,8 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p, break; if (scp) continue; - gcc_assert (offset == NULL_TREE - || poly_int_tree_p (offset)); + gcc_assert (offset2 == NULL_TREE + || poly_int_tree_p (offset2)); tree d1 = OMP_CLAUSE_DECL (*sc); tree d2 = OMP_CLAUSE_DECL (c); while (TREE_CODE (d1) == ARRAY_REF) @@ -8171,7 +8217,7 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p, o2 = 0; o2 += bits_to_bytes_round_down (bitpos2); if (maybe_lt (o1, o2) - || (known_eq (o1, 2) + || (known_eq (o1, o2) && maybe_lt (bitpos, bitpos2))) { if (ptr) @@ -8986,6 +9032,19 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gimple_seq body, tree *list_p, omp_find_stores_op, &wi); } } + + if (ctx->add_safelen1) + { + /* If there are VLAs in the body of simd loop, prevent + vectorization. */ + gcc_assert (ctx->region_type == ORT_SIMD); + c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_SAFELEN); + OMP_CLAUSE_SAFELEN_EXPR (c) = integer_one_node; + OMP_CLAUSE_CHAIN (c) = *list_p; + *list_p = c; + list_p = &OMP_CLAUSE_CHAIN (c); + } + while ((c = *list_p) != NULL) { splay_tree_node n; @@ -9734,9 +9793,26 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), i); if (!is_gimple_constant (TREE_OPERAND (t, 1))) { + tree type = TREE_TYPE (TREE_OPERAND (t, 0)); TREE_OPERAND (t, 1) = get_initialized_tmp_var (TREE_OPERAND (t, 1), - pre_p, NULL, false); + gimple_seq_empty_p (for_pre_body) + ? pre_p : &for_pre_body, NULL, + false); + /* Reference to pointer conversion is considered useless, + but is significant for firstprivate clause. Force it + here. */ + if (TREE_CODE (type) == POINTER_TYPE + && (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 1))) + == REFERENCE_TYPE)) + { + tree v = create_tmp_var (TYPE_MAIN_VARIANT (type)); + tree m = build2 (INIT_EXPR, TREE_TYPE (v), v, + TREE_OPERAND (t, 1)); + gimplify_and_add (m, gimple_seq_empty_p (for_pre_body) + ? pre_p : &for_pre_body); + TREE_OPERAND (t, 1) = v; + } tree c = build_omp_clause (input_location, OMP_CLAUSE_FIRSTPRIVATE); OMP_CLAUSE_DECL (c) = TREE_OPERAND (t, 1); @@ -9748,11 +9824,26 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) t = TREE_VEC_ELT (OMP_FOR_COND (for_stmt), i); if (!is_gimple_constant (TREE_OPERAND (t, 1))) { + tree type = TREE_TYPE (TREE_OPERAND (t, 0)); TREE_OPERAND (t, 1) = get_initialized_tmp_var (TREE_OPERAND (t, 1), gimple_seq_empty_p (for_pre_body) ? pre_p : &for_pre_body, NULL, false); + /* Reference to pointer conversion is considered useless, + but is significant for firstprivate clause. Force it + here. */ + if (TREE_CODE (type) == POINTER_TYPE + && (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 1))) + == REFERENCE_TYPE)) + { + tree v = create_tmp_var (TYPE_MAIN_VARIANT (type)); + tree m = build2 (INIT_EXPR, TREE_TYPE (v), v, + TREE_OPERAND (t, 1)); + gimplify_and_add (m, gimple_seq_empty_p (for_pre_body) + ? pre_p : &for_pre_body); + TREE_OPERAND (t, 1) = v; + } tree c = build_omp_clause (input_location, OMP_CLAUSE_FIRSTPRIVATE); OMP_CLAUSE_DECL (c) = TREE_OPERAND (t, 1); @@ -10257,8 +10348,17 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) seq = &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c); else seq = &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c); + push_gimplify_context (); gimplify_assign (decl, t, seq); - } + gimple *bind = NULL; + if (gimplify_ctxp->temps) + { + bind = gimple_build_bind (NULL_TREE, *seq, NULL_TREE); + *seq = NULL; + gimplify_seq_add_stmt (seq, bind); + } + pop_gimplify_context (bind); + } } } @@ -11000,9 +11100,36 @@ gimplify_omp_atomic (tree *expr_p, gimple_seq *pre_p) loadstmt = gimple_build_omp_atomic_load (tmp_load, addr); gimplify_seq_add_stmt (pre_p, loadstmt); - if (rhs && gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue) - != GS_ALL_DONE) - return GS_ERROR; + if (rhs) + { + /* BIT_INSERT_EXPR is not valid for non-integral bitfield + representatives. Use BIT_FIELD_REF on the lhs instead. */ + if (TREE_CODE (rhs) == BIT_INSERT_EXPR + && !INTEGRAL_TYPE_P (TREE_TYPE (tmp_load))) + { + tree bitpos = TREE_OPERAND (rhs, 2); + tree op1 = TREE_OPERAND (rhs, 1); + tree bitsize; + tree tmp_store = tmp_load; + if (TREE_CODE (*expr_p) == OMP_ATOMIC_CAPTURE_OLD) + tmp_store = get_initialized_tmp_var (tmp_load, pre_p, NULL); + if (INTEGRAL_TYPE_P (TREE_TYPE (op1))) + bitsize = bitsize_int (TYPE_PRECISION (TREE_TYPE (op1))); + else + bitsize = TYPE_SIZE (TREE_TYPE (op1)); + gcc_assert (TREE_OPERAND (rhs, 0) == tmp_load); + tree t = build2_loc (EXPR_LOCATION (rhs), + MODIFY_EXPR, void_type_node, + build3_loc (EXPR_LOCATION (rhs), BIT_FIELD_REF, + TREE_TYPE (op1), tmp_store, bitsize, + bitpos), op1); + gimplify_and_add (t, pre_p); + rhs = tmp_store; + } + if (gimplify_expr (&rhs, pre_p, NULL, is_gimple_val, fb_rvalue) + != GS_ALL_DONE) + return GS_ERROR; + } if (TREE_CODE (*expr_p) == OMP_ATOMIC_READ) rhs = tmp_load; diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index f1230b259c9..303e3306a42 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,7 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 109d6b46931..22cda703889 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -8166,7 +8166,7 @@ Builtin_call_expression::do_numeric_constant_value(Numeric_constant* nc) const if (arg_type->is_error()) return false; if (arg_type->is_abstract()) - return false; + arg_type = arg_type->make_non_abstract_type(); if (this->seen_) return false; diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 0dafc399521..fc717c5b242 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -555,8 +555,15 @@ scop_detection::can_represent_loop (loop_p loop, sese_l scop) tree niter; struct tree_niter_desc niter_desc; - return single_exit (loop) - && !(loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP) + /* We can only handle do {} while () style loops correctly. */ + edge exit = single_exit (loop); + if (!exit + || !single_pred_p (loop->latch) + || exit->src != single_pred (loop->latch) + || !empty_block_p (loop->latch)) + return false; + + return !(loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP) && number_of_iterations_exit (loop, single_exit (loop), &niter_desc, false) && niter_desc.control.no_overflow && (niter = number_of_latch_executions (loop)) @@ -1407,9 +1414,13 @@ build_alias_set (scop_p scop) int i, j; int *all_vertices; + struct loop *nest + = find_common_loop (scop->scop_info->region.entry->dest->loop_father, + scop->scop_info->region.exit->src->loop_father); + FOR_EACH_VEC_ELT (scop->drs, i, dr1) for (j = i+1; scop->drs.iterate (j, &dr2); j++) - if (dr_may_alias_p (dr1->dr, dr2->dr, true)) + if (dr_may_alias_p (dr1->dr, dr2->dr, nest)) { /* Dependences in the same alias set need to be handled by just looking at DR_ACCESS_FNs. */ diff --git a/gcc/graphite.h b/gcc/graphite.h index 4e0e58c60ab..be0a22b3894 100644 --- a/gcc/graphite.h +++ b/gcc/graphite.h @@ -37,6 +37,8 @@ along with GCC; see the file COPYING3. If not see #include #include #include +#include +#include typedef struct poly_dr *poly_dr_p; diff --git a/gcc/input.c b/gcc/input.c index b6675768722..26c2bf21d52 100644 --- a/gcc/input.c +++ b/gcc/input.c @@ -3538,6 +3538,34 @@ for_each_line_table_case (void (*testcase) (const line_table_case &)) ASSERT_EQ (num_cases_tested, 2 * 12); } +/* Verify that when presented with a consecutive pair of locations with + a very large line offset, we don't attempt to consolidate them into + a single ordinary linemap where the line offsets within the line map + would lead to overflow (PR lto/88147). */ + +static void +test_line_offset_overflow () +{ + line_table_test ltt (line_table_case (5, 0)); + + linemap_add (line_table, LC_ENTER, false, "foo.c", 0); + linemap_line_start (line_table, 1, 100); + location_t loc_a = linemap_line_start (line_table, 2578, 255); + assert_loceq ("foo.c", 2578, 0, loc_a); + + const line_map_ordinary *ordmap_a = LINEMAPS_LAST_ORDINARY_MAP (line_table); + ASSERT_EQ (ordmap_a->m_column_and_range_bits, 13); + ASSERT_EQ (ordmap_a->m_range_bits, 5); + + location_t loc_b = linemap_line_start (line_table, 404198, 512); + assert_loceq ("foo.c", 404198, 0, loc_b); + + /* We should have started a new linemap, rather than attempting to store + a very large line offset. */ + const line_map_ordinary *ordmap_b = LINEMAPS_LAST_ORDINARY_MAP (line_table); + ASSERT_NE (ordmap_a, ordmap_b); +} + /* Run all of the selftests within this file. */ void @@ -3577,6 +3605,8 @@ input_c_tests () for_each_line_table_case (test_lexer_char_constants); test_reading_source_line (); + + test_line_offset_overflow (); } } // namespace selftest diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index da205c9d68a..3b95cb6d258 100644 --- a/gcc/internal-fn.c +++ b/gcc/internal-fn.c @@ -1385,7 +1385,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, /* s1 * s2 -> ur */ if (!uns0_p && !uns1_p && unsr_p) { - rtx tem, tem2; + rtx tem; switch (pos_neg0 | pos_neg1) { case 1: /* Both operands known to be non-negative. */ @@ -1415,10 +1415,8 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, ops.op2 = NULL_TREE; ops.location = loc; res = expand_expr_real_2 (&ops, NULL_RTX, mode, EXPAND_NORMAL); - tem = expand_binop (mode, and_optab, op0, op1, NULL_RTX, false, - OPTAB_LIB_WIDEN); - do_compare_rtx_and_jump (tem, const0_rtx, EQ, true, mode, - NULL_RTX, NULL, done_label, + do_compare_rtx_and_jump (pos_neg0 == 1 ? op0 : op1, const0_rtx, EQ, + true, mode, NULL_RTX, NULL, done_label, profile_probability::very_likely ()); goto do_error_label; } @@ -1449,16 +1447,23 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, arg1 = error_mark_node; emit_jump (do_main_label); emit_label (after_negate_label); - tem2 = expand_binop (mode, xor_optab, op0, op1, NULL_RTX, false, - OPTAB_LIB_WIDEN); - do_compare_rtx_and_jump (tem2, const0_rtx, GE, false, mode, NULL_RTX, - NULL, do_main_label, profile_probability::very_likely ()); + tem = expand_binop (mode, xor_optab, op0, op1, NULL_RTX, false, + OPTAB_LIB_WIDEN); + do_compare_rtx_and_jump (tem, const0_rtx, GE, false, mode, NULL_RTX, + NULL, do_main_label, + profile_probability::very_likely ()); /* One argument is negative here, the other positive. This overflows always, unless one of the arguments is 0. But if e.g. s2 is 0, (U) s1 * 0 doesn't overflow, whatever s1 is, thus we can keep do_main code oring in overflow as is. */ - do_compare_rtx_and_jump (tem, const0_rtx, EQ, true, mode, NULL_RTX, - NULL, do_main_label, profile_probability::very_likely ()); + if (pos_neg0 != 2) + do_compare_rtx_and_jump (op0, const0_rtx, EQ, true, mode, NULL_RTX, + NULL, do_main_label, + profile_probability::very_unlikely ()); + if (pos_neg1 != 2) + do_compare_rtx_and_jump (op1, const0_rtx, EQ, true, mode, NULL_RTX, + NULL, do_main_label, + profile_probability::very_unlikely ()); expand_arith_set_overflow (lhs, target); emit_label (do_main_label); goto do_main; diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index e868b9c2623..c96ba106283 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -820,7 +820,7 @@ build_toporder_info (struct ipa_topo_info *topo) topo->stack = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count); gcc_checking_assert (topo->stack_top == 0); - topo->nnodes = ipa_reduced_postorder (topo->order, true, true, NULL); + topo->nnodes = ipa_reduced_postorder (topo->order, true, NULL); } /* Free information about strongly connected components and the arrays in @@ -1082,7 +1082,6 @@ ipcp_bits_lattice::meet_with (ipcp_bits_lattice& other, unsigned precision, if (TREE_CODE_CLASS (code) == tcc_binary) { tree type = TREE_TYPE (operand); - gcc_assert (INTEGRAL_TYPE_P (type)); widest_int o_value, o_mask; get_value_and_mask (operand, &o_value, &o_mask); @@ -2852,11 +2851,18 @@ perform_estimation_of_a_value (cgraph_node *node, vec known_csts, base_time -= time; if (base_time > 65535) base_time = 65535; - time_benefit = base_time.to_int () - + devirtualization_time_bonus (node, known_csts, known_contexts, - known_aggs_ptrs) - + hint_time_bonus (hints) - + removable_params_cost + est_move_cost; + + /* Extern inline functions have no cloning local time benefits because they + will be inlined anyway. The only reason to clone them is if it enables + optimization in any of the functions they call. */ + if (DECL_EXTERNAL (node->decl) && DECL_DECLARED_INLINE_P (node->decl)) + time_benefit = 0; + else + time_benefit = base_time.to_int () + + devirtualization_time_bonus (node, known_csts, known_contexts, + known_aggs_ptrs) + + hint_time_bonus (hints) + + removable_params_cost + est_move_cost; gcc_checking_assert (size >=0); /* The inliner-heuristics based estimates may think that in certain diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 308b6e6cdd5..5b6b130fa3a 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -2615,6 +2615,7 @@ struct polymorphic_call_target_d vec targets; tree decl_warning; int type_warning; + unsigned int n_odr_types; bool complete; bool speculative; }; @@ -2640,6 +2641,7 @@ polymorphic_call_target_hasher::hash (const polymorphic_call_target_d *odr_query hstate.add_hwi (odr_query->type->id); hstate.merge_hash (TYPE_UID (odr_query->context.outer_type)); hstate.add_hwi (odr_query->context.offset); + hstate.add_hwi (odr_query->n_odr_types); if (odr_query->context.speculative_outer_type) { @@ -2670,7 +2672,9 @@ polymorphic_call_target_hasher::equal (const polymorphic_call_target_d *t1, == t2->context.maybe_in_construction && t1->context.maybe_derived_type == t2->context.maybe_derived_type && (t1->context.speculative_maybe_derived_type - == t2->context.speculative_maybe_derived_type)); + == t2->context.speculative_maybe_derived_type) + /* Adding new type may affect outcome of target search. */ + && t1->n_odr_types == t2->n_odr_types); } /* Remove entry in polymorphic call target cache hash. */ @@ -3076,6 +3080,7 @@ possible_polymorphic_call_targets (tree otr_type, key.otr_token = otr_token; key.speculative = speculative; key.context = context; + key.n_odr_types = odr_types.length (); slot = polymorphic_call_target_hash->find_slot (&key, INSERT); if (cache_token) *cache_token = (void *)*slot; @@ -3292,6 +3297,7 @@ possible_polymorphic_call_targets (tree otr_type, (*slot)->targets = nodes; (*slot)->complete = complete; + (*slot)->n_odr_types = odr_types.length (); if (completep) *completep = complete; diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c index 161080c77bc..37b9fe73b0a 100644 --- a/gcc/ipa-icf-gimple.c +++ b/gcc/ipa-icf-gimple.c @@ -994,6 +994,9 @@ func_checker::compare_gimple_asm (const gasm *g1, const gasm *g2) if (gimple_asm_input_p (g1) != gimple_asm_input_p (g2)) return false; + if (gimple_asm_inline_p (g1) != gimple_asm_inline_p (g2)) + return false; + if (gimple_asm_ninputs (g1) != gimple_asm_ninputs (g2)) return false; diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index f974d9f769f..21027aa01c9 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -3160,6 +3160,22 @@ sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls, return true; } +/* Compare function for sorting pairs in do_congruence_step_f. */ + +int +sem_item_optimizer::sort_congruence_split (const void *a_, const void *b_) +{ + const std::pair *a + = (const std::pair *)a_; + const std::pair *b + = (const std::pair *)b_; + if (a->first->id < b->first->id) + return -1; + else if (a->first->id > b->first->id) + return 1; + return 0; +} + /* Tests if a class CLS used as INDEXth splits any congruence classes. Bitmap stack BMSTACK is used for bitmap allocation. */ @@ -3200,13 +3216,20 @@ sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls, } } + auto_vec > to_split; + to_split.reserve_exact (split_map.elements ()); + for (hash_map ::iterator i = split_map.begin (); + i != split_map.end (); ++i) + to_split.safe_push (*i); + to_split.qsort (sort_congruence_split); + traverse_split_pair pair; pair.optimizer = this; pair.cls = cls; splitter_class_removed = false; - split_map.traverse (&pair); + for (unsigned i = 0; i < to_split.length (); ++i) + traverse_congruence_split (to_split[i].first, to_split[i].second, &pair); /* Bitmap clean-up. */ split_map.traverse get (caller)->self_size + growth; badness = - numerator / denominator; @@ -1753,7 +1759,7 @@ inline_small_functions (void) metrics. */ max_count = profile_count::uninitialized (); - ipa_reduced_postorder (order, true, true, NULL); + ipa_reduced_postorder (order, true, NULL); free (order); FOR_EACH_DEFINED_FUNCTION (node) diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c index 13aca94dd00..d5e4a6a6f97 100644 --- a/gcc/ipa-polymorphic-call.c +++ b/gcc/ipa-polymorphic-call.c @@ -995,9 +995,22 @@ ipa_polymorphic_call_context::ipa_polymorphic_call_context (tree fndecl, { outer_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (base_pointer))); + cgraph_node *node = cgraph_node::get (current_function_decl); gcc_assert (TREE_CODE (outer_type) == RECORD_TYPE || TREE_CODE (outer_type) == UNION_TYPE); + /* Handle the case we inlined into a thunk. In this case + thunk has THIS pointer of type bar, but it really receives + address to its base type foo which sits in bar at + 0-thunk.fixed_offset. It starts with code that adds + think.fixed_offset to the pointer to compensate for this. + + Because we walked all the way to the begining of thunk, we now + see pointer &bar-thunk.fixed_offset and need to compensate + for it. */ + if (node->thunk.fixed_offset) + offset -= node->thunk.fixed_offset * BITS_PER_UNIT; + /* Dynamic casting has possibly upcasted the type in the hiearchy. In this case outer type is less informative than inner type and we should forget @@ -1005,7 +1018,11 @@ ipa_polymorphic_call_context::ipa_polymorphic_call_context (tree fndecl, if ((otr_type && !contains_type_p (outer_type, offset, otr_type)) - || !contains_polymorphic_type_p (outer_type)) + || !contains_polymorphic_type_p (outer_type) + /* If we compile thunk with virtual offset, the THIS pointer + is adjusted by unknown value. We can't thus use outer info + at all. */ + || node->thunk.virtual_offset_p) { outer_type = NULL; if (instance) @@ -1030,7 +1047,15 @@ ipa_polymorphic_call_context::ipa_polymorphic_call_context (tree fndecl, maybe_in_construction = false; } if (instance) - *instance = base_pointer; + { + /* If method is expanded thunk, we need to apply thunk offset + to instance pointer. */ + if (node->thunk.virtual_offset_p + || node->thunk.fixed_offset) + *instance = NULL; + else + *instance = base_pointer; + } return; } /* Non-PODs passed by value are really passed by invisible @@ -1547,6 +1572,9 @@ ipa_polymorphic_call_context::get_dynamic_type (tree instance, HOST_WIDE_INT instance_offset = offset; tree instance_outer_type = outer_type; + if (!instance) + return false; + if (otr_type) otr_type = TYPE_MAIN_VARIANT (otr_type); diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 38441cc49bc..7dacdbe2fb7 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -1569,7 +1569,8 @@ determine_locally_known_aggregate_parts (gcall *call, tree arg, if (TREE_CODE (arg) == SSA_NAME) { tree type_size; - if (!tree_fits_uhwi_p (TYPE_SIZE (TREE_TYPE (arg_type)))) + if (!tree_fits_uhwi_p (TYPE_SIZE (TREE_TYPE (arg_type))) + || !POINTER_TYPE_P (TREE_TYPE (arg))) return; check_ref = true; arg_base = arg; diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index a80b6845633..d36d1ba9b73 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -1443,7 +1443,7 @@ propagate_pure_const (void) bool remove_p = false; bool has_cdtor; - order_pos = ipa_reduced_postorder (order, true, false, + order_pos = ipa_reduced_postorder (order, true, ignore_edge_for_pure_const); if (dump_file) { @@ -1773,7 +1773,7 @@ propagate_nothrow (void) int i; struct ipa_dfs_info * w_info; - order_pos = ipa_reduced_postorder (order, true, false, + order_pos = ipa_reduced_postorder (order, true, ignore_edge_for_nothrow); if (dump_file) { diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index 6490c03f8d0..b9db61697d1 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -728,7 +728,7 @@ propagate (void) the global information. All the nodes within a cycle will have the same info so we collapse cycles first. Then we can do the propagation in one pass from the leaves to the roots. */ - order_pos = ipa_reduced_postorder (order, true, true, ignore_edge_p); + order_pos = ipa_reduced_postorder (order, true, ignore_edge_p); if (dump_file) ipa_print_order (dump_file, "reduced", order, order_pos); diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c index aa586f5feb2..106d3079391 100644 --- a/gcc/ipa-utils.c +++ b/gcc/ipa-utils.c @@ -63,7 +63,6 @@ struct searchc_env { int order_pos; splay_tree nodes_marked_new; bool reduce; - bool allow_overwritable; int count; }; @@ -105,7 +104,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v, if (w->aux && (avail > AVAIL_INTERPOSABLE - || (env->allow_overwritable && avail == AVAIL_INTERPOSABLE))) + || avail == AVAIL_INTERPOSABLE)) { w_info = (struct ipa_dfs_info *) w->aux; if (w_info->new_node) @@ -162,7 +161,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v, int ipa_reduced_postorder (struct cgraph_node **order, - bool reduce, bool allow_overwritable, + bool reduce, bool (*ignore_edge) (struct cgraph_edge *)) { struct cgraph_node *node; @@ -175,15 +174,13 @@ ipa_reduced_postorder (struct cgraph_node **order, env.nodes_marked_new = splay_tree_new (splay_tree_compare_ints, 0, 0); env.count = 1; env.reduce = reduce; - env.allow_overwritable = allow_overwritable; FOR_EACH_DEFINED_FUNCTION (node) { enum availability avail = node->get_availability (); if (avail > AVAIL_INTERPOSABLE - || (allow_overwritable - && (avail == AVAIL_INTERPOSABLE))) + || avail == AVAIL_INTERPOSABLE) { /* Reuse the info if it is already there. */ struct ipa_dfs_info *info = (struct ipa_dfs_info *) node->aux; @@ -375,6 +372,20 @@ get_base_var (tree t) return t; } +/* Scale function of calls in NODE by ratio ORIG_COUNT/NODE->count. */ + +void +scale_ipa_profile_for_fn (struct cgraph_node *node, profile_count orig_count) +{ + profile_count to = node->count; + profile_count::adjust_for_ipa_scaling (&to, &orig_count); + struct cgraph_edge *e; + + for (e = node->callees; e; e = e->next_callee) + e->count = e->count.apply_scale (to, orig_count); + for (e = node->indirect_calls; e; e = e->next_callee) + e->count = e->count.apply_scale (to, orig_count); +} /* SRC and DST are going to be merged. Take SRC's profile and merge it into DST so it is not going to be lost. Possibly destroy SRC's body on the way @@ -392,6 +403,7 @@ ipa_merge_profiles (struct cgraph_node *dst, if (!src->definition || !dst->definition) return; + if (src->frequency < dst->frequency) src->frequency = dst->frequency; @@ -402,6 +414,10 @@ ipa_merge_profiles (struct cgraph_node *dst, if (src->profile_id && !dst->profile_id) dst->profile_id = src->profile_id; + /* Merging zero profile to dst is no-op. */ + if (src->count.ipa () == profile_count::zero ()) + return; + /* FIXME when we merge in unknown profile, we ought to set counts as unsafe. */ if (!src->count.initialized_p () @@ -412,11 +428,21 @@ ipa_merge_profiles (struct cgraph_node *dst, fprintf (symtab->dump_file, "Merging profiles of %s to %s\n", src->dump_name (), dst->dump_name ()); } + profile_count orig_count = dst->count; + if (dst->count.initialized_p () && dst->count.ipa () == dst->count) dst->count += src->count.ipa (); else dst->count = src->count.ipa (); + /* First handle functions with no gimple body. */ + if (dst->thunk.thunk_p || dst->alias + || src->thunk.thunk_p || src->alias) + { + scale_ipa_profile_for_fn (dst, orig_count); + return; + } + /* This is ugly. We need to get both function bodies into memory. If declaration is merged, we need to duplicate it to be able to load body that is being replaced. This makes symbol table @@ -641,7 +667,10 @@ ipa_merge_profiles (struct cgraph_node *dst, src->release_body (); ipa_update_overall_fn_summary (dst); } - /* TODO: if there is no match, we can scale up. */ + /* We can't update CFG profile, but we can scale IPA profile. CFG + will be scaled according to dst->count after IPA passes. */ + else + scale_ipa_profile_for_fn (dst, orig_count); src->decl = oldsrcdecl; } diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h index 1609ac14d7f..e247d63fd7e 100644 --- a/gcc/ipa-utils.h +++ b/gcc/ipa-utils.h @@ -36,7 +36,7 @@ struct ipa_dfs_info { /* In ipa-utils.c */ void ipa_print_order (FILE*, const char *, struct cgraph_node**, int); -int ipa_reduced_postorder (struct cgraph_node **, bool, bool, +int ipa_reduced_postorder (struct cgraph_node **, bool, bool (*ignore_edge) (struct cgraph_edge *)); void ipa_free_postorder_info (void); vec ipa_get_nodes_in_cycle (struct cgraph_node *); diff --git a/gcc/ipa-visibility.c b/gcc/ipa-visibility.c index a82852b3ce4..1e89255e8f1 100644 --- a/gcc/ipa-visibility.c +++ b/gcc/ipa-visibility.c @@ -543,7 +543,8 @@ localize_node (bool whole_program, symtab_node *node) symbols. In this case we can privatize all hidden symbol but we need to keep non-hidden exported. */ if (node->same_comdat_group - && node->resolution == LDPR_PREVAILING_DEF_IRONLY) + && (node->resolution == LDPR_PREVAILING_DEF_IRONLY + || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)) { symtab_node *next; for (next = node->same_comdat_group; diff --git a/gcc/ipa.c b/gcc/ipa.c index 9330de59c72..2e6621ccc8f 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -854,7 +854,9 @@ ipa_discover_readonly_nonaddressable_vars (void) be produced. */ static void -cgraph_build_static_cdtor_1 (char which, tree body, int priority, bool final) +cgraph_build_static_cdtor_1 (char which, tree body, int priority, bool final, + tree optimization, + tree target) { static int counter = 0; char which_buf[16]; @@ -885,6 +887,8 @@ cgraph_build_static_cdtor_1 (char which, tree body, int priority, bool final) TREE_STATIC (decl) = 1; TREE_USED (decl) = 1; + DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl) = optimization; + DECL_FUNCTION_SPECIFIC_TARGET (decl) = target; DECL_ARTIFICIAL (decl) = 1; DECL_IGNORED_P (decl) = 1; DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1; @@ -949,7 +953,7 @@ cgraph_build_static_cdtor_1 (char which, tree body, int priority, bool final) void cgraph_build_static_cdtor (char which, tree body, int priority) { - cgraph_build_static_cdtor_1 (which, body, priority, false); + cgraph_build_static_cdtor_1 (which, body, priority, false, NULL, NULL); } /* When target does not have ctors and dtors, we call all constructor @@ -1031,7 +1035,9 @@ build_cdtor (bool ctor_p, const vec &cdtors) gcc_assert (body != NULL_TREE); /* Generate a function to call all the function of like priority. */ - cgraph_build_static_cdtor_1 (ctor_p ? 'I' : 'D', body, priority, true); + cgraph_build_static_cdtor_1 (ctor_p ? 'I' : 'D', body, priority, true, + DECL_FUNCTION_SPECIFIC_OPTIMIZATION (cdtors[0]), + DECL_FUNCTION_SPECIFIC_TARGET (cdtors[0])); } } diff --git a/gcc/ira.c b/gcc/ira.c index b7bcc15a15d..8d4361864d8 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -5147,6 +5147,8 @@ ira (FILE *f) int ira_max_point_before_emit; bool saved_flag_caller_saves = flag_caller_saves; enum ira_region saved_flag_ira_region = flag_ira_region; + unsigned int i; + int num_used_regs = 0; clear_bb_flags (); @@ -5162,12 +5164,17 @@ ira (FILE *f) ira_conflicts_p = optimize > 0; + /* Determine the number of pseudos actually requiring coloring. */ + for (i = FIRST_PSEUDO_REGISTER; i < DF_REG_SIZE (df); i++) + num_used_regs += !!(DF_REG_USE_COUNT (i) + DF_REG_DEF_COUNT (i)); + /* If there are too many pseudos and/or basic blocks (e.g. 10K pseudos and 10K blocks or 100K pseudos and 1K blocks), we will use simplified and faster algorithms in LRA. */ lra_simple_p = (ira_use_lra_p - && max_reg_num () >= (1 << 26) / last_basic_block_for_fn (cfun)); + && num_used_regs >= (1 << 26) / last_basic_block_for_fn (cfun)); + if (lra_simple_p) { /* It permits to skip live range splitting in LRA. */ diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog index 2c0c2771db3..60a2afe3df0 100644 --- a/gcc/jit/ChangeLog +++ b/gcc/jit/ChangeLog @@ -1,3 +1,7 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/langhooks.c b/gcc/langhooks.c index 3cd790105b8..b24c87a8a88 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -368,7 +368,7 @@ lhd_print_error_function (diagnostic_context *context, const char *file, { if (diagnostic_last_function_changed (context, diagnostic)) { - const char *old_prefix = context->printer->prefix; + char *old_prefix = pp_take_prefix (context->printer); tree abstract_origin = diagnostic_abstract_origin (diagnostic); char *new_prefix = (file && abstract_origin == NULL) ? file_name_as_prefix (context, file) : NULL; diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c index 5a0393224cb..e52e4c75bc6 100644 --- a/gcc/loop-unroll.c +++ b/gcc/loop-unroll.c @@ -399,7 +399,7 @@ decide_unroll_constant_iterations (struct loop *loop, int flags) { /* However we cannot unroll completely at the RTL level a loop with constant number of iterations; it should have been peeled instead. */ - if ((unsigned) loop->unroll - 1 > desc->niter - 2) + if (desc->niter == 0 || (unsigned) loop->unroll > desc->niter - 1) { if (dump_file) fprintf (dump_file, ";; Loop should have been peeled\n"); @@ -651,7 +651,7 @@ unroll_loop_constant_iterations (struct loop *loop) if (loop->any_likely_upper_bound) loop->nb_iterations_likely_upper_bound = wi::udiv_trunc (loop->nb_iterations_likely_upper_bound, max_unroll + 1); - desc->niter_expr = GEN_INT (desc->niter); + desc->niter_expr = gen_int_mode (desc->niter, desc->mode); /* Remove the edges. */ FOR_EACH_VEC_ELT (remove_edges, i, e) @@ -1019,9 +1019,9 @@ unroll_loop_runtime_iterations (struct loop *loop) preheader = split_edge (loop_preheader_edge (loop)); /* Add in count of edge from switch block. */ preheader->count += iter_count; - branch_code = compare_and_jump_seq (copy_rtx (niter), GEN_INT (j), EQ, - block_label (preheader), p, - NULL); + branch_code = compare_and_jump_seq (copy_rtx (niter), + gen_int_mode (j, desc->mode), EQ, + block_label (preheader), p, NULL); /* We rely on the fact that the compare and jump cannot be optimized out, and hence the cfg we create is correct. */ diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index 5405c4d2adb..1e98df48132 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -1774,14 +1774,24 @@ uses_hard_regs_p (rtx x, HARD_REG_SET set) return false; code = GET_CODE (x); mode = GET_MODE (x); + if (code == SUBREG) { + /* For all SUBREGs we want to check whether the full multi-register + overlaps the set. For normal SUBREGs this means 'get_hard_regno' of + the inner register, for paradoxical SUBREGs this means the + 'get_hard_regno' of the full SUBREG and for complete SUBREGs either is + fine. Use the wider mode for all cases. */ + rtx subreg = SUBREG_REG (x); mode = wider_subreg_mode (x); - x = SUBREG_REG (x); - code = GET_CODE (x); + if (mode == GET_MODE (subreg)) + { + x = subreg; + code = GET_CODE (x); + } } - if (REG_P (x)) + if (REG_P (x) || SUBREG_P (x)) { x_hard_regno = get_hard_regno (x, true); return (x_hard_regno >= 0 @@ -2315,6 +2325,8 @@ process_alt_operands (int only_alternative) break; reg: + if (mode == BLKmode) + break; this_alternative = reg_class_subunion[this_alternative][cl]; IOR_HARD_REG_SET (this_alternative_set, reg_class_contents[cl]); @@ -2325,8 +2337,6 @@ process_alt_operands (int only_alternative) IOR_HARD_REG_SET (this_costly_alternative_set, reg_class_contents[cl]); } - if (mode == BLKmode) - break; winreg = true; if (REG_P (op)) { @@ -5767,6 +5777,9 @@ invariant_p (const_rtx x) enum rtx_code code; int i, j; + if (side_effects_p (x)) + return false; + code = GET_CODE (x); mode = GET_MODE (x); if (code == SUBREG) @@ -6293,6 +6306,7 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail) add_to_hard_reg_set (&s, PSEUDO_REGNO_MODE (dst_regno), reg_renumber[dst_regno]); AND_COMPL_HARD_REG_SET (live_hard_regs, s); + AND_COMPL_HARD_REG_SET (potential_reload_hard_regs, s); } /* We should invalidate potential inheritance or splitting for the current insn usages to the next diff --git a/gcc/lra.c b/gcc/lra.c index b410b90f126..44af904787b 100644 --- a/gcc/lra.c +++ b/gcc/lra.c @@ -1692,10 +1692,12 @@ lra_rtx_hash (rtx x) case SCRATCH: case CONST_DOUBLE: - case CONST_INT: case CONST_VECTOR: return val; + case CONST_INT: + return val + UINTVAL (x); + default: break; } diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 40baf858ca5..305f22bd7e9 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -546,7 +546,11 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node, streamer_write_bitpack (&bp); streamer_write_data_stream (ob->main_stream, section, strlen (section) + 1); - if (node->thunk.thunk_p) + /* Stream thunk info always because we use it in + ipa_polymorphic_call_context::ipa_polymorphic_call_context + to properly interpret THIS pointers for thunks that has been converted + to Gimple. */ + if (node->definition) { streamer_write_uhwi_stream (ob->main_stream, @@ -1317,7 +1321,7 @@ input_node (struct lto_file_decl_data *file_data, if (section) node->set_section_for_node (section); - if (node->thunk.thunk_p) + if (node->definition) { int type = streamer_read_uhwi (ib); HOST_WIDE_INT fixed_offset = streamer_read_uhwi (ib); diff --git a/gcc/lto-opts.c b/gcc/lto-opts.c index ea336ad99bb..527045f74a3 100644 --- a/gcc/lto-opts.c +++ b/gcc/lto-opts.c @@ -78,6 +78,21 @@ lto_write_options (void) && !global_options.x_flag_openacc) append_to_collect_gcc_options (&temporary_obstack, &first_p, "-fno-openacc"); + /* Append PIC/PIE mode because its default depends on target and it is + subject of merging in lto-wrapper. */ + if (!global_options_set.x_flag_pic && !global_options_set.x_flag_pie) + { + append_to_collect_gcc_options (&temporary_obstack, &first_p, + global_options.x_flag_pic == 2 + ? "-fPIC" + : global_options.x_flag_pic == 1 + ? "-fpic" + : global_options.x_flag_pie == 2 + ? "-fPIE" + : global_options.x_flag_pie == 1 + ? "-fpie" + : "-fno-pie"); + } /* Append options from target hook and store them to offload_lto section. */ if (lto_stream_offload_p) diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index 8529c82376b..aa024ddfc3d 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -826,6 +826,7 @@ input_cfg (struct lto_input_block *ib, struct data_in *data_in, /* Read OMP SIMD related info. */ loop->safelen = streamer_read_hwi (ib); loop->unroll = streamer_read_hwi (ib); + loop->owned_clique = streamer_read_hwi (ib); loop->dont_vectorize = streamer_read_hwi (ib); loop->force_vectorize = streamer_read_hwi (ib); loop->simduid = stream_read_tree (ib, data_in); @@ -1131,6 +1132,14 @@ input_function (tree fn_decl, struct data_in *data_in, ? !MAY_HAVE_DEBUG_MARKER_STMTS : !MAY_HAVE_DEBUG_BIND_STMTS)) remove = true; + /* In case the linemap overflows locations can be dropped + to zero. Thus do not keep nonsensical inline entry markers + we'd later ICE on. */ + tree block; + if (gimple_debug_inline_entry_p (stmt) + && (block = gimple_block (stmt)) + && !inlined_function_outer_scope_p (block)) + remove = true; if (is_gimple_call (stmt) && gimple_call_internal_p (stmt)) { diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 1d2ab9757f1..b60707b2ae6 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -299,7 +299,6 @@ lto_is_streamable (tree expr) name version in lto_output_tree_ref (see output_ssa_names). */ return !is_lang_specific (expr) && code != SSA_NAME - && code != CALL_EXPR && code != LANG_TYPE && code != MODIFY_EXPR && code != INIT_EXPR @@ -1946,6 +1945,7 @@ output_cfg (struct output_block *ob, struct function *fn) /* Write OMP SIMD related info. */ streamer_write_hwi (ob, loop->safelen); streamer_write_hwi (ob, loop->unroll); + streamer_write_hwi (ob, loop->owned_clique); streamer_write_hwi (ob, loop->dont_vectorize); streamer_write_hwi (ob, loop->force_vectorize); stream_write_tree (ob, loop->simduid, true); diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h index d5873f7dabf..078320bf082 100644 --- a/gcc/lto-streamer.h +++ b/gcc/lto-streamer.h @@ -121,7 +121,7 @@ along with GCC; see the file COPYING3. If not see form followed by the data for the string. */ #define LTO_major_version 7 -#define LTO_minor_version 0 +#define LTO_minor_version 3 typedef unsigned char lto_decl_flags_t; diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index a61d5dd2e44..dada53d26d9 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -408,6 +408,11 @@ merge_and_complain (struct cl_decoded_option **decoded_options, It is a common mistake to mix few -fPIC compiled objects into otherwise non-PIC code. We do not want to build everything with PIC then. + Similarly we merge PIE options, however in addition we keep + -fPIC + -fPIE = -fPIE + -fpic + -fPIE = -fpie + -fPIC/-fpic + -fpie = -fpie + It would be good to warn on mismatches, but it is bit hard to do as we do not know what nothing translates to. */ @@ -415,11 +420,38 @@ merge_and_complain (struct cl_decoded_option **decoded_options, if ((*decoded_options)[j].opt_index == OPT_fPIC || (*decoded_options)[j].opt_index == OPT_fpic) { - if (!pic_option - || (pic_option->value > 0) != ((*decoded_options)[j].value > 0)) - remove_option (decoded_options, j, decoded_options_count); - else if (pic_option->opt_index == OPT_fPIC - && (*decoded_options)[j].opt_index == OPT_fpic) + /* -fno-pic in one unit implies -fno-pic everywhere. */ + if ((*decoded_options)[j].value == 0) + j++; + /* If we have no pic option or merge in -fno-pic, we still may turn + existing pic/PIC mode into pie/PIE if -fpie/-fPIE is present. */ + else if ((pic_option && pic_option->value == 0) + || !pic_option) + { + if (pie_option) + { + bool big = (*decoded_options)[j].opt_index == OPT_fPIC + && pie_option->opt_index == OPT_fPIE; + (*decoded_options)[j].opt_index = big ? OPT_fPIE : OPT_fpie; + if (pie_option->value) + (*decoded_options)[j].canonical_option[0] = big ? "-fPIE" : "-fpie"; + else + (*decoded_options)[j].canonical_option[0] = big ? "-fno-pie" : "-fno-pie"; + (*decoded_options)[j].value = pie_option->value; + j++; + } + else if (pic_option) + { + (*decoded_options)[j] = *pic_option; + j++; + } + /* We do not know if target defaults to pic or not, so just remove + option if it is missing in one unit but enabled in other. */ + else + remove_option (decoded_options, j, decoded_options_count); + } + else if (pic_option->opt_index == OPT_fpic + && (*decoded_options)[j].opt_index == OPT_fPIC) { (*decoded_options)[j] = *pic_option; j++; @@ -430,11 +462,42 @@ merge_and_complain (struct cl_decoded_option **decoded_options, else if ((*decoded_options)[j].opt_index == OPT_fPIE || (*decoded_options)[j].opt_index == OPT_fpie) { - if (!pie_option - || pie_option->value != (*decoded_options)[j].value) - remove_option (decoded_options, j, decoded_options_count); - else if (pie_option->opt_index == OPT_fPIE - && (*decoded_options)[j].opt_index == OPT_fpie) + /* -fno-pie in one unit implies -fno-pie everywhere. */ + if ((*decoded_options)[j].value == 0) + j++; + /* If we have no pie option or merge in -fno-pie, we still preserve + PIE/pie if pic/PIC is present. */ + else if ((pie_option && pie_option->value == 0) + || !pie_option) + { + /* If -fPIC/-fpic is given, merge it with -fPIE/-fpie. */ + if (pic_option) + { + if (pic_option->opt_index == OPT_fpic + && (*decoded_options)[j].opt_index == OPT_fPIE) + { + (*decoded_options)[j].opt_index = OPT_fpie; + (*decoded_options)[j].canonical_option[0] + = pic_option->value ? "-fpie" : "-fno-pie"; + } + else if (!pic_option->value) + (*decoded_options)[j].canonical_option[0] = "-fno-pie"; + (*decoded_options)[j].value = pic_option->value; + j++; + } + else if (pie_option) + { + (*decoded_options)[j] = *pie_option; + j++; + } + /* Because we always append pic/PIE options this code path should + not happen unless the LTO object was built by old lto1 which + did not contain that logic yet. */ + else + remove_option (decoded_options, j, decoded_options_count); + } + else if (pie_option->opt_index == OPT_fpie + && (*decoded_options)[j].opt_index == OPT_fPIE) { (*decoded_options)[j] = *pie_option; j++; @@ -1606,7 +1669,9 @@ run_gcc (unsigned argc, char *argv[]) struct pex_obj *pex; char jobs[32]; - fprintf (mstream, "all:"); + fprintf (mstream, + ".PHONY: all\n" + "all:"); for (i = 0; i < nr; ++i) { int j = ltrans_priorities[i*2 + 1]; diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 4827e8d6520..a7e59b7a56f 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,16 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + +2018-11-20 Martin Liska + + Backport from mainline + 2018-11-19 Martin Liska + + PR lto/88077 + * lto-symtab.c (lto_symtab_merge): Transform the + condition before r256989. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index 3663ab7a9b2..cec74894c02 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -388,8 +388,9 @@ lto_symtab_merge (symtab_node *prevailing, symtab_node *entry) int a[]={1,2,3}; here the first declaration is COMMON and sizeof(a) == sizeof (int). */ - else if (TREE_CODE (type) == ARRAY_TYPE) - return (TYPE_SIZE (decl) == TYPE_SIZE (TREE_TYPE (type))); + else if (TREE_CODE (type) != ARRAY_TYPE + || (TYPE_SIZE (type) != TYPE_SIZE (TREE_TYPE (type)))) + return false; } return true; diff --git a/gcc/match.pd b/gcc/match.pd index 2425e8307e3..8e0265b2b33 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1417,6 +1417,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (op:c (plus:c@2 @0 @1) @1) (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0)) && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)) + && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@0)) && (CONSTANT_CLASS_P (@0) || single_use (@2))) (op @0 { build_zero_cst (TREE_TYPE (@0)); })))) /* For equality, this is also true with wrapping overflow. */ @@ -2405,6 +2406,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && TYPE_UNSIGNED (TREE_TYPE (@1))))) (view_convert @1))) +/* Simplify a view-converted empty constructor. */ +(simplify + (view_convert CONSTRUCTOR@0) + (if (TREE_CODE (@0) != SSA_NAME + && CONSTRUCTOR_NELTS (@0) == 0) + { build_zero_cst (type); })) + /* Re-association barriers around constants and other re-association barriers can be removed. */ (simplify @@ -3462,8 +3470,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* Disable this optimization if we're casting a function pointer type on targets that require function pointer canonicalization. */ && !(targetm.have_canonicalize_funcptr_for_compare () - && TREE_CODE (TREE_TYPE (@00)) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (TREE_TYPE (@00))) == FUNCTION_TYPE) + && POINTER_TYPE_P (TREE_TYPE (@00)) + && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (@00)))) && single_use (@0)) (if (TYPE_PRECISION (TREE_TYPE (@00)) == TYPE_PRECISION (TREE_TYPE (@0)) && (TREE_CODE (@10) == INTEGER_CST diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index 9a27365bfbc..faa12b10605 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -1605,6 +1605,7 @@ sms_schedule (void) mii = 1; /* Need to pass some estimate of mii. */ rec_mii = sms_order_nodes (g, mii, node_order, &max_asap); mii = MAX (res_MII (g), rec_mii); + mii = MAX (mii, 1); maxii = MAX (max_asap, MAXII_FACTOR * mii); if (dump_file) @@ -3004,9 +3005,7 @@ ps_insn_find_column (partial_schedule_ptr ps, ps_insn_ptr ps_i, last_must_precede = next_ps_i; } /* The closing branch must be the last in the row. */ - if (must_precede - && bitmap_bit_p (must_precede, next_ps_i->id) - && JUMP_P (ps_rtl_insn (ps, next_ps_i->id))) + if (JUMP_P (ps_rtl_insn (ps, next_ps_i->id))) return false; last_in_row = next_ps_i; @@ -3210,7 +3209,7 @@ ps_add_node_check_conflicts (partial_schedule_ptr ps, int n, int c, sbitmap must_precede, sbitmap must_follow) { - int has_conflicts = 0; + int i, first, amount, has_conflicts = 0; ps_insn_ptr ps_i; /* First add the node to the PS, if this succeeds check for @@ -3218,23 +3217,32 @@ ps_add_node_check_conflicts (partial_schedule_ptr ps, int n, if (! (ps_i = add_node_to_ps (ps, n, c, must_precede, must_follow))) return NULL; /* Failed to insert the node at the given cycle. */ - has_conflicts = ps_has_conflicts (ps, c, c) - || (ps->history > 0 - && ps_has_conflicts (ps, - c - ps->history, - c + ps->history)); - - /* Try different issue slots to find one that the given node can be - scheduled in without conflicts. */ - while (has_conflicts) + while (1) { + has_conflicts = ps_has_conflicts (ps, c, c); + if (ps->history > 0 && !has_conflicts) + { + /* Check all 2h+1 intervals, starting from c-2h..c up to c..2h, + but not more than ii intervals. */ + first = c - ps->history; + amount = 2 * ps->history + 1; + if (amount > ps->ii) + amount = ps->ii; + for (i = first; i < first + amount; i++) + { + has_conflicts = ps_has_conflicts (ps, + i - ps->history, + i + ps->history); + if (has_conflicts) + break; + } + } + if (!has_conflicts) + break; + /* Try different issue slots to find one that the given node can be + scheduled in without conflicts. */ if (! ps_insn_advance_column (ps, ps_i, must_follow)) break; - has_conflicts = ps_has_conflicts (ps, c, c) - || (ps->history > 0 - && ps_has_conflicts (ps, - c - ps->history, - c + ps->history)); } if (has_conflicts) diff --git a/gcc/multiple_target.c b/gcc/multiple_target.c index a1fe09a5983..97d2268663f 100644 --- a/gcc/multiple_target.c +++ b/gcc/multiple_target.c @@ -103,10 +103,16 @@ create_dispatcher_calls (struct cgraph_node *node) inode->resolve_alias (cgraph_node::get (resolver_decl)); auto_vec edges_to_redirect; - auto_vec references_to_redirect; + /* We need to capture the references by value rather than just pointers to them + and remove them right away, as removing them later would invalidate what + some other reference pointers point to. */ + auto_vec references_to_redirect; - for (unsigned i = 0; node->iterate_referring (i, ref); i++) - references_to_redirect.safe_push (ref); + while (node->iterate_referring (0, ref)) + { + references_to_redirect.safe_push (*ref); + ref->remove_reference (); + } /* We need to remember NEXT_CALLER as it could be modified in the loop. */ for (cgraph_edge *e = node->callers; e ; e = e->next_caller) @@ -146,15 +152,14 @@ create_dispatcher_calls (struct cgraph_node *node) } symtab_node *source = ref->referring; - ref->remove_reference (); source->create_reference (inode, IPA_REF_ADDR); } else if (ref->use == IPA_REF_ALIAS) { symtab_node *source = ref->referring; - ref->remove_reference (); source->create_reference (inode, IPA_REF_ALIAS); - source->add_to_same_comdat_group (inode); + if (inode->get_comdat_group ()) + source->add_to_same_comdat_group (inode); } else gcc_unreachable (); @@ -294,7 +299,8 @@ create_new_asm_name (char *old_asm_name, char *new_asm_name) /* Creates target clone of NODE. */ static cgraph_node * -create_target_clone (cgraph_node *node, bool definition, char *name) +create_target_clone (cgraph_node *node, bool definition, char *name, + tree attributes) { cgraph_node *new_node; @@ -303,13 +309,16 @@ create_target_clone (cgraph_node *node, bool definition, char *name) new_node = node->create_version_clone_with_body (vNULL, NULL, NULL, false, NULL, NULL, - name); + name, attributes); + if (new_node == NULL) + return NULL; new_node->force_output = true; } else { tree new_decl = copy_node (node->decl); new_node = cgraph_node::get_create (new_decl); + DECL_ATTRIBUTES (new_decl) = attributes; /* Generate a new name for the new version. */ symtab->change_decl_assembler_name (new_node->decl, clone_function_name (node->decl, @@ -399,22 +408,16 @@ expand_target_clones (struct cgraph_node *node, bool definition) create_new_asm_name (attr, suffix); /* Create new target clone. */ - cgraph_node *new_node = create_target_clone (node, definition, suffix); - new_node->local.local = false; - XDELETEVEC (suffix); - - /* Set new attribute for the clone. */ tree attributes = make_attribute ("target", attr, - DECL_ATTRIBUTES (new_node->decl)); - DECL_ATTRIBUTES (new_node->decl) = attributes; - location_t saved_loc = input_location; - input_location = DECL_SOURCE_LOCATION (node->decl); - if (!targetm.target_option.valid_attribute_p (new_node->decl, NULL, - TREE_VALUE (attributes), - 0)) + DECL_ATTRIBUTES (node->decl)); + + cgraph_node *new_node = create_target_clone (node, definition, suffix, + attributes); + if (new_node == NULL) return false; + new_node->local.local = false; + XDELETEVEC (suffix); - input_location = saved_loc; decl2_v = new_node->function_version (); if (decl2_v != NULL) continue; @@ -441,13 +444,7 @@ expand_target_clones (struct cgraph_node *node, bool definition) DECL_ATTRIBUTES (node->decl)); DECL_ATTRIBUTES (node->decl) = attributes; node->local.local = false; - location_t saved_loc = input_location; - input_location = DECL_SOURCE_LOCATION (node->decl); - bool ret - = targetm.target_option.valid_attribute_p (node->decl, NULL, - TREE_VALUE (attributes), 0); - input_location = saved_loc; - return ret; + return true; } static unsigned int diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index ea3808c2c62..336539c8768 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,26 @@ +2019-08-29 Jakub Jelinek + + Backported from mainline + 2019-05-10 Jakub Jelinek + + PR pch/90326 + * config-lang.in (gtfiles): Add c-family/c-format.c. + +2019-08-28 Iain Sandoe + + Backport from mainline. + 2019-05-18 Iain Sandoe + + * objc/objc-act.h (OCTI_INSTANCE_TYPE, OCTI_INSTANCETYPE_NAME): New. + (objc_global_trees): Add instance type and name. + (INSTANCE_TYPEDEF_NAME): New. + * objc/objc-act.c (synth_module_prologue): Build decls for + objc_instancetype_type and objc_instancetype_name. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/objc/config-lang.in b/gcc/objc/config-lang.in index e38424584ad..e87e96bb0fd 100644 --- a/gcc/objc/config-lang.in +++ b/gcc/objc/config-lang.in @@ -35,4 +35,4 @@ lang_requires="c" # Order is important. If you change this list, make sure you test # building without C++ as well; that is, remove the gcc/cp directory, # and build with --enable-languages=c,objc. -gtfiles="\$(srcdir)/objc/objc-map.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/objc/objc-act.h \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-runtime-shared-support.c \$(srcdir)/objc/objc-gnu-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-02.c \$(srcdir)/c/c-parser.h \$(srcdir)/c/c-parser.c \$(srcdir)/c/c-tree.h \$(srcdir)/c/c-decl.c \$(srcdir)/c/c-lang.h \$(srcdir)/c/c-objc-common.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c" +gtfiles="\$(srcdir)/objc/objc-map.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/objc/objc-act.h \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-runtime-shared-support.c \$(srcdir)/objc/objc-gnu-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-02.c \$(srcdir)/c/c-parser.h \$(srcdir)/c/c-parser.c \$(srcdir)/c/c-tree.h \$(srcdir)/c/c-decl.c \$(srcdir)/c/c-lang.h \$(srcdir)/c/c-objc-common.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c \$(srcdir)/c-family/c-format.c" diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index d08693051ea..191d671a681 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -2944,18 +2944,26 @@ synth_module_prologue (void) objc_class_reference = xref_tag (RECORD_TYPE, objc_class_id); objc_object_type = build_pointer_type (objc_object_reference); + objc_instancetype_type = build_pointer_type (objc_object_reference); objc_class_type = build_pointer_type (objc_class_reference); objc_object_name = get_identifier (OBJECT_TYPEDEF_NAME); + objc_instancetype_name = get_identifier (INSTANCE_TYPEDEF_NAME); objc_class_name = get_identifier (CLASS_TYPEDEF_NAME); - /* Declare the 'id' and 'Class' typedefs. */ + /* Declare the 'id', 'instancetype' and 'Class' typedefs. */ type = lang_hooks.decls.pushdecl (build_decl (input_location, TYPE_DECL, objc_object_name, objc_object_type)); TREE_NO_WARNING (type) = 1; + type = lang_hooks.decls.pushdecl (build_decl (input_location, + TYPE_DECL, + objc_instancetype_name, + objc_instancetype_type)); + TREE_NO_WARNING (type) = 1; + type = lang_hooks.decls.pushdecl (build_decl (input_location, TYPE_DECL, objc_class_name, diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h index 4bae555e40a..2865485f852 100644 --- a/gcc/objc/objc-act.h +++ b/gcc/objc/objc-act.h @@ -313,6 +313,7 @@ enum objc_tree_index OCTI_SUPER_TYPE, OCTI_SEL_TYPE, OCTI_ID_TYPE, + OCTI_INSTANCE_TYPE, OCTI_CLS_TYPE, OCTI_NST_TYPE, OCTI_PROTO_TYPE, @@ -368,6 +369,7 @@ enum objc_tree_index OCTI_OBJ_ID, OCTI_CLS_ID, OCTI_ID_NAME, + OCTI_INSTANCETYPE_NAME, OCTI_CLASS_NAME, OCTI_CNST_STR_ID, OCTI_CNST_STR_TYPE, @@ -443,6 +445,7 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; #define objc_super_type objc_global_trees[OCTI_SUPER_TYPE] #define objc_selector_type objc_global_trees[OCTI_SEL_TYPE] #define objc_object_type objc_global_trees[OCTI_ID_TYPE] +#define objc_instancetype_type objc_global_trees[OCTI_INSTANCE_TYPE] #define objc_class_type objc_global_trees[OCTI_CLS_TYPE] #define objc_instance_type objc_global_trees[OCTI_NST_TYPE] #define objc_protocol_type objc_global_trees[OCTI_PROTO_TYPE] @@ -570,7 +573,8 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; #define objc_object_id objc_global_trees[OCTI_OBJ_ID] #define objc_class_id objc_global_trees[OCTI_CLS_ID] -#define objc_object_name objc_global_trees[OCTI_ID_NAME] +#define objc_object_name objc_global_trees[OCTI_ID_NAME] +#define objc_instancetype_name objc_global_trees[OCTI_INSTANCETYPE_NAME] #define objc_class_name objc_global_trees[OCTI_CLASS_NAME] /* Constant string classes. */ @@ -608,6 +612,7 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; /* Reserved tag definitions. */ #define OBJECT_TYPEDEF_NAME "id" +#define INSTANCE_TYPEDEF_NAME "instancetype" #define CLASS_TYPEDEF_NAME "Class" #define TAG_OBJECT "objc_object" diff --git a/gcc/objcp/ChangeLog b/gcc/objcp/ChangeLog index 6068938d16e..deb9a22c6b2 100644 --- a/gcc/objcp/ChangeLog +++ b/gcc/objcp/ChangeLog @@ -1,3 +1,15 @@ +2019-08-29 Jakub Jelinek + + Backported from mainline + 2019-05-10 Jakub Jelinek + + PR pch/90326 + * config-lang.in (gtfiles): Don't add c-family/c-cppbuiltin.c. + +2019-02-22 Release Manager + + * GCC 8.3.0 released. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/objcp/config-lang.in b/gcc/objcp/config-lang.in index 46dea14c7ae..b4e1c7005fd 100644 --- a/gcc/objcp/config-lang.in +++ b/gcc/objcp/config-lang.in @@ -52,7 +52,6 @@ gtfiles="$(. $srcdir/cp/config-lang.in ; \ gtfiles="$gtfiles \ \$(srcdir)/objc/objc-act.h \ \$(srcdir)/objc/objc-map.h \ -\$(srcdir)/c-family/c-cppbuiltin.c \ \$(srcdir)/objc/objc-act.c \ \$(srcdir)/objc/objc-gnu-runtime-abi-01.c \ \$(srcdir)/objc/objc-next-runtime-abi-01.c \ diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c index c7d30ea3964..4ea260e3f4a 100644 --- a/gcc/omp-expand.c +++ b/gcc/omp-expand.c @@ -56,7 +56,6 @@ along with GCC; see the file COPYING3. If not see #include "gomp-constants.h" #include "gimple-pretty-print.h" #include "hsa-common.h" -#include "debug.h" #include "stringpool.h" #include "attribs.h" @@ -507,27 +506,43 @@ parallel_needs_hsa_kernel_p (struct omp_region *region) function will be emitted with the correct lexical scope. */ static void -adjust_context_and_scope (tree entry_block, tree child_fndecl) +adjust_context_and_scope (struct omp_region *region, tree entry_block, + tree child_fndecl) { + tree parent_fndecl = NULL_TREE; + gimple *entry_stmt; + /* OMP expansion expands inner regions before outer ones, so if + we e.g. have explicit task region nested in parallel region, when + expanding the task region current_function_decl will be the original + source function, but we actually want to use as context the child + function of the parallel. */ + for (region = region->outer; + region && parent_fndecl == NULL_TREE; region = region->outer) + switch (region->type) + { + case GIMPLE_OMP_PARALLEL: + case GIMPLE_OMP_TASK: + entry_stmt = last_stmt (region->entry); + parent_fndecl = gimple_omp_taskreg_child_fn (entry_stmt); + break; + case GIMPLE_OMP_TARGET: + entry_stmt = last_stmt (region->entry); + parent_fndecl + = gimple_omp_target_child_fn (as_a (entry_stmt)); + break; + default: + break; + } + + if (parent_fndecl == NULL_TREE) + parent_fndecl = current_function_decl; + DECL_CONTEXT (child_fndecl) = parent_fndecl; + if (entry_block != NULL_TREE && TREE_CODE (entry_block) == BLOCK) { tree b = BLOCK_SUPERCONTEXT (entry_block); - if (TREE_CODE (b) == BLOCK) { - tree parent_fndecl; - - /* Follow supercontext chain until the parent fndecl - is found. */ - for (parent_fndecl = BLOCK_SUPERCONTEXT (b); - TREE_CODE (parent_fndecl) == BLOCK; - parent_fndecl = BLOCK_SUPERCONTEXT (parent_fndecl)) - ; - - gcc_assert (TREE_CODE (parent_fndecl) == FUNCTION_DECL); - - DECL_CONTEXT (child_fndecl) = parent_fndecl; - DECL_CHAIN (child_fndecl) = BLOCK_VARS (b); BLOCK_VARS (b) = child_fndecl; } @@ -703,8 +718,6 @@ expand_parallel_call (struct omp_region *region, basic_block bb, tree child_fndecl = gimple_omp_parallel_child_fn (entry_stmt); t2 = build_fold_addr_expr (child_fndecl); - adjust_context_and_scope (gimple_block (entry_stmt), child_fndecl); - vec_alloc (args, 4 + vec_safe_length (ws_args)); args->quick_push (t2); args->quick_push (t1); @@ -1294,11 +1307,6 @@ expand_omp_taskreg (struct omp_region *region) else block = gimple_block (entry_stmt); - /* Make sure to generate early debug for the function before - outlining anything. */ - if (! gimple_in_ssa_p (cfun)) - (*debug_hooks->early_global_decl) (cfun->decl); - new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb, block); if (exit_bb) single_succ_edge (new_bb)->flags = EDGE_FALLTHRU; @@ -1379,6 +1387,8 @@ expand_omp_taskreg (struct omp_region *region) } } + adjust_context_and_scope (region, gimple_block (entry_stmt), child_fn); + if (gimple_code (entry_stmt) == GIMPLE_OMP_PARALLEL) expand_parallel_call (region, new_bb, as_a (entry_stmt), ws_args); @@ -1947,6 +1957,11 @@ extract_omp_for_update_vars (struct omp_for_data *fd, basic_block cont_bb, t = fold_build2 (fd->loops[i].cond_code, boolean_type_node, v, t); stmt = gimple_build_cond_empty (t); gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING); + if (walk_tree (gimple_cond_lhs_ptr (as_a (stmt)), + expand_omp_regimplify_p, NULL, NULL) + || walk_tree (gimple_cond_rhs_ptr (as_a (stmt)), + expand_omp_regimplify_p, NULL, NULL)) + gimple_regimplify_operands (stmt, &gsi); e = make_edge (bb, body_bb, EDGE_TRUE_VALUE); e->probability = profile_probability::guessed_always ().apply_scale (7, 8); } @@ -3029,20 +3044,21 @@ expand_omp_for_generic (struct omp_region *region, if (fd->ordered && counts[fd->collapse - 1] == NULL_TREE) { + tree tem; if (fd->collapse > 1) - t = fd->loop.v; + tem = fd->loop.v; else { - t = fold_build2 (MINUS_EXPR, TREE_TYPE (fd->loops[0].v), - fd->loops[0].v, fd->loops[0].n1); - t = fold_convert (fd->iter_type, t); + tem = fold_build2 (MINUS_EXPR, TREE_TYPE (fd->loops[0].v), + fd->loops[0].v, fd->loops[0].n1); + tem = fold_convert (fd->iter_type, tem); } tree aref = build4 (ARRAY_REF, fd->iter_type, counts[fd->ordered], size_zero_node, NULL_TREE, NULL_TREE); - t = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE, - true, GSI_SAME_STMT); - expand_omp_build_assign (&gsi, aref, t); + tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, + true, GSI_SAME_STMT); + expand_omp_build_assign (&gsi, aref, tem); } t = build2 (fd->loop.cond_code, boolean_type_node, @@ -7042,11 +7058,6 @@ expand_omp_target (struct omp_region *region) gsi_remove (&gsi, true); } - /* Make sure to generate early debug for the function before - outlining anything. */ - if (! gimple_in_ssa_p (cfun)) - (*debug_hooks->early_global_decl) (cfun->decl); - /* Move the offloading region into CHILD_CFUN. */ block = gimple_block (entry_stmt); @@ -7123,6 +7134,8 @@ expand_omp_target (struct omp_region *region) dump_function_header (dump_file, child_fn, dump_flags); dump_function_to_file (child_fn, dump_file, dump_flags); } + + adjust_context_and_scope (region, gimple_block (entry_stmt), child_fn); } /* Emit a library call to launch the offloading region, or do data @@ -7619,11 +7632,6 @@ grid_expand_target_grid_body (struct omp_region *target) init_tree_ssa (cfun); pop_cfun (); - /* Make sure to generate early debug for the function before - outlining anything. */ - if (! gimple_in_ssa_p (cfun)) - (*debug_hooks->early_global_decl) (cfun->decl); - tree old_parm_decl = DECL_ARGUMENTS (kern_fndecl); gcc_assert (!DECL_CHAIN (old_parm_decl)); tree new_parm_decl = copy_node (DECL_ARGUMENTS (kern_fndecl)); diff --git a/gcc/omp-low.c b/gcc/omp-low.c index d8588b9faed..102a998146d 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -851,6 +851,7 @@ new_omp_context (gimple *stmt, omp_context *outer_ctx) ctx->cb.copy_decl = omp_copy_decl; ctx->cb.eh_lp_nr = 0; ctx->cb.transform_call_graph_edges = CB_CGE_MOVE; + ctx->cb.dont_remap_vla_if_no_change = true; ctx->depth = 1; } @@ -1190,13 +1191,16 @@ scan_sharing_clauses (tree clauses, omp_context *ctx, /* Global variables with "omp declare target" attribute don't need to be copied, the receiver side will use them directly. However, global variables with "omp declare target link" - attribute need to be copied. */ + attribute need to be copied. Or when ALWAYS modifier is used. */ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP && DECL_P (decl) && ((OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_FIRSTPRIVATE_POINTER && (OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_FIRSTPRIVATE_REFERENCE)) || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) + && OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_ALWAYS_TO + && OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_ALWAYS_FROM + && OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_ALWAYS_TOFROM && is_global_var (maybe_lookup_decl_in_outer_ctx (decl, ctx)) && varpool_node::get_create (decl)->offloadable && !lookup_attribute ("omp declare target link", @@ -2832,14 +2836,25 @@ check_omp_nesting_restrictions (gimple *stmt, omp_context *ctx) case GIMPLE_OMP_FOR: if (gimple_omp_for_kind (ctx->stmt) == GF_OMP_FOR_KIND_TASKLOOP) goto ordered_in_taskloop; - if (omp_find_clause (gimple_omp_for_clauses (ctx->stmt), - OMP_CLAUSE_ORDERED) == NULL) + tree o; + o = omp_find_clause (gimple_omp_for_clauses (ctx->stmt), + OMP_CLAUSE_ORDERED); + if (o == NULL) { error_at (gimple_location (stmt), "% region must be closely nested inside " "a loop region with an % clause"); return false; } + if (OMP_CLAUSE_ORDERED_EXPR (o) != NULL_TREE + && omp_find_clause (c, OMP_CLAUSE_DEPEND) == NULL_TREE) + { + error_at (gimple_location (stmt), + "% region without % clause may " + "not be closely nested inside a loop region with " + "an % clause with a parameter"); + return false; + } return true; case GIMPLE_OMP_TARGET: if (gimple_omp_target_kind (ctx->stmt) @@ -7099,6 +7114,7 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx) splay_tree_node n; struct omp_taskcopy_context tcctx; location_t loc = gimple_location (task_stmt); + size_t looptempno = 0; child_fn = gimple_omp_task_copy_fn (task_stmt); child_cfun = DECL_STRUCT_FUNCTION (child_fn); @@ -7212,6 +7228,15 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx) t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src); append_to_statement_list (t, &list); break; + case OMP_CLAUSE__LOOPTEMP_: + /* Fields for first two _looptemp_ clauses are initialized by + GOMP_taskloop*, the rest are handled like firstprivate. */ + if (looptempno < 2) + { + looptempno++; + break; + } + /* FALLTHRU */ case OMP_CLAUSE_FIRSTPRIVATE: decl = OMP_CLAUSE_DECL (c); if (is_variable_sized (decl)) @@ -7237,7 +7262,10 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx) src = decl; dst = build_simple_mem_ref_loc (loc, arg); dst = omp_build_component_ref (dst, f); - t = lang_hooks.decls.omp_clause_copy_ctor (c, dst, src); + if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE__LOOPTEMP_) + t = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src); + else + t = lang_hooks.decls.omp_clause_copy_ctor (c, dst, src); append_to_statement_list (t, &list); break; case OMP_CLAUSE_PRIVATE: diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c index b15adf0bada..c408f349b81 100644 --- a/gcc/omp-simd-clone.c +++ b/gcc/omp-simd-clone.c @@ -242,6 +242,10 @@ simd_clone_clauses_extract (struct cgraph_node *node, tree clauses, } case OMP_CLAUSE_ALIGNED: { + /* Ignore aligned (x) for declare simd, for the ABI we really + need an alignment specified. */ + if (OMP_CLAUSE_ALIGNED_ALIGNMENT (t) == NULL_TREE) + break; tree decl = OMP_CLAUSE_DECL (t); int argno = tree_to_uhwi (decl); clone_info->args[argno].alignment @@ -864,6 +868,18 @@ ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data) if (tp != orig_tp) { + if (gimple_code (info->stmt) == GIMPLE_PHI + && cand + && TREE_CODE (*orig_tp) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (*orig_tp, 0)) == PARM_DECL + && cand->alias_ptr_type) + { + gcc_assert (TREE_CODE (cand->alias_ptr_type) == SSA_NAME); + *orig_tp = cand->alias_ptr_type; + info->modified = true; + return NULL_TREE; + } + repl = build_fold_addr_expr (repl); gimple *stmt; if (is_gimple_debug (info->stmt)) @@ -880,7 +896,18 @@ ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data) stmt = gimple_build_assign (make_ssa_name (TREE_TYPE (repl)), repl); repl = gimple_assign_lhs (stmt); } - gimple_stmt_iterator gsi = gsi_for_stmt (info->stmt); + gimple_stmt_iterator gsi; + if (gimple_code (info->stmt) == GIMPLE_PHI) + { + gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun))); + /* Cache SSA_NAME for next time. */ + if (cand + && TREE_CODE (*orig_tp) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (*orig_tp, 0)) == PARM_DECL) + cand->alias_ptr_type = repl; + } + else + gsi = gsi_for_stmt (info->stmt); gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); *orig_tp = repl; } @@ -981,6 +1008,31 @@ ipa_simd_modify_function_body (struct cgraph_node *node, { gimple_stmt_iterator gsi; + for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gphi *phi = as_a (gsi_stmt (gsi)); + int i, n = gimple_phi_num_args (phi); + info.stmt = phi; + struct walk_stmt_info wi; + memset (&wi, 0, sizeof (wi)); + info.modified = false; + wi.info = &info; + for (i = 0; i < n; ++i) + { + int walk_subtrees = 1; + tree arg = gimple_phi_arg_def (phi, i); + tree op = arg; + ipa_simd_modify_stmt_ops (&op, &walk_subtrees, &wi); + if (op != arg) + { + SET_PHI_ARG_DEF (phi, i, op); + gcc_assert (TREE_CODE (op) == SSA_NAME); + if (gimple_phi_arg_edge (phi, i)->flags & EDGE_ABNORMAL) + SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op) = 1; + } + } + } + gsi = gsi_start_bb (bb); while (!gsi_end_p (gsi)) { @@ -996,6 +1048,8 @@ ipa_simd_modify_function_body (struct cgraph_node *node, if (greturn *return_stmt = dyn_cast (stmt)) { tree retval = gimple_return_retval (return_stmt); + edge e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun)); + e->flags |= EDGE_FALLTHRU; if (!retval) { gsi_remove (&gsi, true); @@ -1013,6 +1067,21 @@ ipa_simd_modify_function_body (struct cgraph_node *node, if (info.modified) { update_stmt (stmt); + /* If the above changed the var of a debug bind into something + different, remove the debug stmt. We could also for all the + replaced parameters add VAR_DECLs for debug info purposes, + add debug stmts for those to be the simd array accesses and + replace debug stmt var operand with that var. Debugging of + vectorized loops doesn't work too well, so don't bother for + now. */ + if ((gimple_debug_bind_p (stmt) + && !DECL_P (gimple_debug_bind_get_var (stmt))) + || (gimple_debug_source_bind_p (stmt) + && !DECL_P (gimple_debug_source_bind_get_var (stmt)))) + { + gsi_remove (&gsi, true); + continue; + } if (maybe_clean_eh_stmt (stmt)) gimple_purge_dead_eh_edges (gimple_bb (stmt)); } @@ -1137,14 +1206,9 @@ simd_clone_adjust (struct cgraph_node *node) incr_bb = create_empty_bb (orig_exit); incr_bb->count = profile_count::zero (); add_bb_to_loop (incr_bb, body_bb->loop_father); - /* The succ of orig_exit was EXIT_BLOCK_PTR_FOR_FN (cfun), with an empty - flag. Set it now to be a FALLTHRU_EDGE. */ - gcc_assert (EDGE_COUNT (orig_exit->succs) == 1); - EDGE_SUCC (orig_exit, 0)->flags |= EDGE_FALLTHRU; - for (unsigned i = 0; - i < EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds); ++i) + while (EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)) { - edge e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), i); + edge e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), 0); redirect_edge_succ (e, incr_bb); incr_bb->count += e->count (); } diff --git a/gcc/optabs.c b/gcc/optabs.c index 53a147c8ef6..a74d7be0d09 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -55,7 +55,7 @@ void debug_optab_libfuncs (void); /* Add a REG_EQUAL note to the last insn in INSNS. TARGET is being set to the result of operation CODE applied to OP0 (and OP1 if it is a binary - operation). + operation). OP0_MODE is OP0's mode. If the last insn does not set TARGET, don't do anything, but return 1. @@ -64,7 +64,8 @@ void debug_optab_libfuncs (void); try again, ensuring that TARGET is not one of the operands. */ static int -add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, rtx op1) +add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, + rtx op1, machine_mode op0_mode) { rtx_insn *last_insn; rtx set; @@ -136,16 +137,16 @@ add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, rtx op case POPCOUNT: case PARITY: case BSWAP: - if (GET_MODE (op0) != VOIDmode && GET_MODE (target) != GET_MODE (op0)) + if (op0_mode != VOIDmode && GET_MODE (target) != op0_mode) { - note = gen_rtx_fmt_e (code, GET_MODE (op0), copy_rtx (op0)); - if (GET_MODE_UNIT_SIZE (GET_MODE (op0)) + note = gen_rtx_fmt_e (code, op0_mode, copy_rtx (op0)); + if (GET_MODE_UNIT_SIZE (op0_mode) > GET_MODE_UNIT_SIZE (GET_MODE (target))) note = simplify_gen_unary (TRUNCATE, GET_MODE (target), - note, GET_MODE (op0)); + note, op0_mode); else note = simplify_gen_unary (ZERO_EXTEND, GET_MODE (target), - note, GET_MODE (op0)); + note, op0_mode); break; } /* FALLTHRU */ @@ -1095,7 +1096,7 @@ expand_binop_directly (enum insn_code icode, machine_mode mode, optab binoptab, if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX && ! add_equal_note (pat, ops[0].value, optab_to_code (binoptab), - ops[1].value, ops[2].value)) + ops[1].value, ops[2].value, mode0)) { delete_insns_since (last); return expand_binop (mode, binoptab, op0, op1, NULL_RTX, @@ -2260,7 +2261,7 @@ expand_doubleword_clz (scalar_int_mode mode, rtx op0, rtx target) seq = get_insns (); end_sequence (); - add_equal_note (seq, target, CLZ, xop0, 0); + add_equal_note (seq, target, CLZ, xop0, NULL_RTX, mode); emit_insn (seq); return target; @@ -2302,7 +2303,7 @@ expand_doubleword_popcount (scalar_int_mode mode, rtx op0, rtx target) seq = get_insns (); end_sequence (); - add_equal_note (seq, t, POPCOUNT, op0, 0); + add_equal_note (seq, t, POPCOUNT, op0, NULL_RTX, mode); emit_insn (seq); return t; } @@ -2473,7 +2474,7 @@ expand_ctz (scalar_int_mode mode, rtx op0, rtx target) seq = get_insns (); end_sequence (); - add_equal_note (seq, temp, CTZ, op0, 0); + add_equal_note (seq, temp, CTZ, op0, NULL_RTX, mode); emit_insn (seq); return temp; } @@ -2551,7 +2552,7 @@ expand_ffs (scalar_int_mode mode, rtx op0, rtx target) seq = get_insns (); end_sequence (); - add_equal_note (seq, temp, FFS, op0, 0); + add_equal_note (seq, temp, FFS, op0, NULL_RTX, mode); emit_insn (seq); return temp; @@ -2698,7 +2699,7 @@ expand_unop_direct (machine_mode mode, optab unoptab, rtx op0, rtx target, if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX && ! add_equal_note (pat, ops[0].value, optab_to_code (unoptab), - ops[1].value, NULL_RTX)) + ops[1].value, NULL_RTX, mode)) { delete_insns_since (last); return expand_unop (mode, unoptab, op0, NULL_RTX, unsignedp); @@ -3550,7 +3551,8 @@ maybe_emit_unop_insn (enum insn_code icode, rtx target, rtx op0, if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX && code != UNKNOWN) - add_equal_note (pat, ops[0].value, code, ops[1].value, NULL_RTX); + add_equal_note (pat, ops[0].value, code, ops[1].value, NULL_RTX, + GET_MODE (op0)); emit_insn (pat); @@ -3855,7 +3857,7 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size, /* Must make sure the size fits the insn's mode. */ if (CONST_INT_P (size) - ? INTVAL (size) >= (1 << GET_MODE_BITSIZE (cmp_mode)) + ? UINTVAL (size) > GET_MODE_MASK (cmp_mode) : (GET_MODE_BITSIZE (as_a (GET_MODE (size))) > GET_MODE_BITSIZE (cmp_mode))) continue; @@ -3874,7 +3876,7 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size, goto fail; /* Otherwise call a library function. */ - result = emit_block_comp_via_libcall (XEXP (x, 0), XEXP (y, 0), size); + result = emit_block_comp_via_libcall (x, y, size); x = result; y = const0_rtx; @@ -5776,6 +5778,25 @@ expand_vec_cond_expr (tree vec_cond_type, tree op0, tree op1, tree op2, icode = get_vcond_icode (mode, cmp_op_mode, unsignedp); if (icode == CODE_FOR_nothing) { + if (tcode == LT_EXPR + && op0a == op0 + && TREE_CODE (op0) == VECTOR_CST) + { + /* A VEC_COND_EXPR condition could be folded from EQ_EXPR/NE_EXPR + into a constant when only get_vcond_eq_icode is supported. + Verify < 0 and != 0 behave the same and change it to NE_EXPR. */ + unsigned HOST_WIDE_INT nelts; + if (!VECTOR_CST_NELTS (op0).is_constant (&nelts)) + { + if (VECTOR_CST_STEPPED_P (op0)) + return 0; + nelts = vector_cst_encoded_nelts (op0); + } + for (unsigned int i = 0; i < nelts; ++i) + if (tree_int_cst_sgn (vector_cst_elt (op0, i)) == 1) + return 0; + tcode = NE_EXPR; + } if (tcode == EQ_EXPR || tcode == NE_EXPR) icode = get_vcond_eq_icode (mode, cmp_op_mode); if (icode == CODE_FOR_nothing) diff --git a/gcc/optc-save-gen.awk b/gcc/optc-save-gen.awk index 1a365fc883c..7cf22232100 100644 --- a/gcc/optc-save-gen.awk +++ b/gcc/optc-save-gen.awk @@ -81,7 +81,7 @@ print "void"; print "cl_optimization_save (struct cl_optimization *ptr, struct gcc_options *opts)"; print "{"; -n_opt_char = 3; +n_opt_char = 4; n_opt_short = 0; n_opt_int = 0; n_opt_enum = 0; @@ -89,9 +89,11 @@ n_opt_other = 0; var_opt_char[0] = "optimize"; var_opt_char[1] = "optimize_size"; var_opt_char[2] = "optimize_debug"; +var_opt_char[3] = "optimize_fast"; var_opt_range["optimize"] = "0, 255"; var_opt_range["optimize_size"] = "0, 1"; var_opt_range["optimize_debug"] = "0, 1"; +var_opt_range["optimize_fast"] = "0, 1"; # Sort by size to mimic how the structure is laid out to be friendlier to the # cache. @@ -732,13 +734,15 @@ for (i = 0; i < n_target_val; i++) { print "}"; -n_opt_val = 3; +n_opt_val = 4; var_opt_val[0] = "x_optimize" var_opt_val_type[0] = "char " var_opt_val[1] = "x_optimize_size" -var_opt_val[2] = "x_optimize_debug" var_opt_val_type[1] = "char " +var_opt_val[2] = "x_optimize_debug" var_opt_val_type[2] = "char " +var_opt_val[3] = "x_optimize_fast" +var_opt_val_type[3] = "char " for (i = 0; i < n_opts; i++) { if (flag_set_p("(Optimization|PerFunction)", flags[i])) { name = var_name(flags[i]) diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk index fecd4b8a0b5..e490b397b6e 100644 --- a/gcc/opth-gen.awk +++ b/gcc/opth-gen.awk @@ -132,7 +132,7 @@ print "/* Structure to save/restore optimization and target specific options. * print "struct GTY(()) cl_optimization"; print "{"; -n_opt_char = 3; +n_opt_char = 4; n_opt_short = 0; n_opt_int = 0; n_opt_enum = 0; @@ -140,6 +140,7 @@ n_opt_other = 0; var_opt_char[0] = "unsigned char x_optimize"; var_opt_char[1] = "unsigned char x_optimize_size"; var_opt_char[2] = "unsigned char x_optimize_debug"; +var_opt_char[3] = "unsigned char x_optimize_fast"; for (i = 0; i < n_opts; i++) { if (flag_set_p("(Optimization|PerFunction)", flags[i])) { diff --git a/gcc/opts-common.c b/gcc/opts-common.c index c6b94188b40..ac3f9f789e6 100644 --- a/gcc/opts-common.c +++ b/gcc/opts-common.c @@ -463,7 +463,8 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, extra_args = 0; - opt_index = find_opt (argv[0] + 1, lang_mask); + const char *opt_value = argv[0] + 1; + opt_index = find_opt (opt_value, lang_mask); i = 0; while (opt_index == OPT_SPECIAL_unknown && i < ARRAY_SIZE (option_map)) @@ -666,6 +667,23 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, /* Check if this is a switch for a different front end. */ if (!option_ok_for_language (option, lang_mask)) errors |= CL_ERR_WRONG_LANG; + else if (strcmp (option->opt_text, "-Werror=") == 0 + && strchr (opt_value, ',') == NULL) + { + /* Verify that -Werror argument is a valid warning + for a language. */ + char *werror_arg = xstrdup (opt_value + 6); + werror_arg[0] = 'W'; + + size_t warning_index = find_opt (werror_arg, lang_mask); + if (warning_index != OPT_SPECIAL_unknown) + { + const struct cl_option *warning_option + = &cl_options[warning_index]; + if (!option_ok_for_language (warning_option, lang_mask)) + errors |= CL_ERR_WRONG_LANG; + } + } /* Convert the argument to lowercase if appropriate. */ if (arg && option->cl_tolower) diff --git a/gcc/opts-global.c b/gcc/opts-global.c index f33c9da4c3f..8bb45a26f83 100644 --- a/gcc/opts-global.c +++ b/gcc/opts-global.c @@ -103,10 +103,14 @@ complain_wrong_lang (const struct cl_decoded_option *decoded, text, bad_lang); else if (lang_mask == CL_DRIVER) gcc_unreachable (); - else + else if (ok_langs[0] != '\0') /* Eventually this should become a hard error IMO. */ warning (0, "command line option %qs is valid for %s but not for %s", text, ok_langs, bad_lang); + else + /* Happens for -Werror=warning_name. */ + warning (0, "%<-Werror=%> argument %qs is not valid for %s", + text, bad_lang); free (ok_langs); free (bad_lang); diff --git a/gcc/opts.c b/gcc/opts.c index 33efcc0d6e7..28030881e93 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -657,7 +657,16 @@ default_options_optimization (struct gcc_options *opts, /* For -O1 only do loop invariant motion for very small loops. */ maybe_set_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP, - opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) : 1000, + opt2 ? default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) + : default_param_value (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP) / 10, + opts->x_param_values, opts_set->x_param_values); + + /* For -O1 reduce the maximum number of active local stores for RTL DSE + since this can consume huge amounts of memory (PR89115). */ + maybe_set_param_value + (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES, + opt2 ? default_param_value (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES) + : default_param_value (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES) / 10, opts->x_param_values, opts_set->x_param_values); /* At -Ofast, allow store motion to introduce potential race conditions. */ @@ -913,6 +922,14 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, "linker plugin"); opts->x_flag_fat_lto_objects = 1; } + + /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */ + if (opts->x_dwarf_split_debug_info) + { + inform (loc, "%<-gsplit-dwarf%> is not supported with LTO," + " disabling"); + opts->x_dwarf_split_debug_info = 0; + } } /* We initialize opts->x_flag_split_stack to -1 so that targets can set a diff --git a/gcc/params.def b/gcc/params.def index dad47ec2b00..74215f24a4f 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -387,7 +387,7 @@ DEFPARAM(PARAM_SMS_MIN_SC, DEFPARAM(PARAM_SMS_DFA_HISTORY, "sms-dfa-history", "The number of cycles the swing modulo scheduler considers when checking conflicts using DFA.", - 0, 0, 0) + 0, 0, 16) DEFPARAM(PARAM_SMS_LOOP_AVERAGE_COUNT_THRESHOLD, "sms-loop-average-count-threshold", "A threshold on the average loop count considered by the swing modulo scheduler.", @@ -1331,6 +1331,11 @@ DEFPARAM(PARAM_AVOID_FMA_MAX_BITS, "Maximum number of bits for which we avoid creating FMAs.", 0, 0, 512) +DEFPARAM(PARAM_LOGICAL_OP_NON_SHORT_CIRCUIT, + "logical-op-non-short-circuit", + "True if a non-short-circuit operation is optimal.", + -1, -1, 1) + /* Local variables: diff --git a/gcc/passes.c b/gcc/passes.c index ad0a912e134..a6c118543e6 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -363,9 +363,9 @@ finish_optimization_passes (void) if (optimize > 0) { - dumps->dump_start (pass_profile_1->static_pass_number, NULL); + dumps->dump_start (pass_combine_1->static_pass_number, NULL); print_combine_total_stats (); - dumps->dump_finish (pass_profile_1->static_pass_number); + dumps->dump_finish (pass_combine_1->static_pass_number); } /* Do whatever is necessary to finish printing the graphs. */ @@ -1944,7 +1944,7 @@ execute_function_todo (function *fn, void *data) /* Always cleanup the CFG before trying to update SSA. */ if (flags & TODO_cleanup_cfg) { - cleanup_tree_cfg (); + cleanup_tree_cfg (flags & TODO_update_ssa_any); /* When cleanup_tree_cfg merges consecutive blocks, it may perform some simplistic propagation when removing single diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog index 5af589d15a8..43bd38e4609 100644 --- a/gcc/po/ChangeLog +++ b/gcc/po/ChangeLog @@ -1,3 +1,33 @@ +2019-02-22 Release Manager + + * GCC 8.3.0 released. + +2019-01-07 Joseph Myers + + * es.po: Update. + +2019-01-02 Joseph Myers + + * es.po: Update. + +2018-10-17 Joseph Myers + + * es.po: Update. + +2018-10-01 Joseph Myers + + * ru.po: Update. + +2018-07-30 Joseph Myers + + * de.po, sv.po: Update. + +2018-07-27 Joseph Myers + + * 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. + 2018-07-26 Release Manager * GCC 8.2.0 released. diff --git a/gcc/po/be.po b/gcc/po/be.po index 8a73bceea1b..0ddb871849f 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: 2018-05-01 20:30+0000\n" +"POT-Creation-Date: 2018-07-25 14:25+0000\n" "PO-Revision-Date: 2002-05-17 15:54+0200\n" "Last-Translator: Ales Nyakhaychyk \n" "Language-Team: Belarusian \n" @@ -37,13 +37,13 @@ msgstr "" msgid "[cannot find %s]" msgstr "[нельга знайсці %s]" -#: collect2.c:1557 +#: collect2.c:1585 #, fuzzy, c-format #| msgid "gcc version %s\n" msgid "collect2 version %s\n" msgstr "версія gcc %s\n" -#: collect2.c:1664 +#: collect2.c:1692 #, fuzzy, c-format #| msgid "%d constructor(s) found\n" msgid "%d constructor found\n" @@ -51,7 +51,7 @@ msgid_plural "%d constructors found\n" msgstr[0] "%d канструктар(аў) знойдзен(а)\n" msgstr[1] "%d канструктар(аў) знойдзен(а)\n" -#: collect2.c:1668 +#: collect2.c:1696 #, fuzzy, c-format #| msgid "%d destructor(s) found\n" msgid "%d destructor found\n" @@ -59,26 +59,26 @@ msgid_plural "%d destructors found\n" msgstr[0] "%d дэструктар(аў) знойдзен(а)\n" msgstr[1] "%d дэструктар(аў) знойдзен(а)\n" -#: collect2.c:1672 +#: collect2.c:1700 #, c-format msgid "%d frame table found\n" msgid_plural "%d frame tables found\n" msgstr[0] "" msgstr[1] "" -#: collect2.c:1836 +#: collect2.c:1864 #, c-format msgid "[Leaving %s]\n" msgstr "" -#: collect2.c:2068 +#: collect2.c:2094 #, c-format msgid "" "\n" "write_c_file - output name is %s, prefix is %s\n" msgstr "" -#: collect2.c:2584 +#: collect2.c:2610 #, c-format msgid "" "\n" @@ -99,7 +99,7 @@ msgstr "" msgid "%s: some warnings being treated as errors" msgstr "" -#: diagnostic.c:324 input.c:222 input.c:1834 c-family/c-opts.c:1377 +#: diagnostic.c:324 input.c:222 input.c:1834 c-family/c-opts.c:1392 #: fortran/cpp.c:576 fortran/error.c:1008 fortran/error.c:1028 msgid "" msgstr "" @@ -193,13 +193,13 @@ msgstr "" #. TARGET_PRINT_OPERAND must handle them. #. We can't handle floating point constants; #. PRINT_OPERAND must handle them. -#: final.c:4164 config/arc/arc.c:5784 config/i386/i386.c:17302 +#: final.c:4164 config/arc/arc.c:5775 config/i386/i386.c:17305 #: config/pdp11/pdp11.c:1715 #, c-format msgid "floating constant misused" msgstr "" -#: final.c:4222 config/arc/arc.c:5881 config/i386/i386.c:17393 +#: final.c:4222 config/arc/arc.c:5872 config/i386/i386.c:17396 #: config/pdp11/pdp11.c:1756 #, c-format msgid "invalid expression as operand" @@ -1100,7 +1100,7 @@ msgstr "" msgid "GCSE disabled" msgstr "" -#: gimple-ssa-isolate-paths.c:542 c/c-typeck.c:10240 +#: gimple-ssa-isolate-paths.c:542 c/c-typeck.c:10245 #, gcc-internal-format msgid "function returns address of local variable" msgstr "" @@ -1413,7 +1413,7 @@ msgstr "" msgid "options enabled: " msgstr "выбары ўключаны:" -#: tree-diagnostic.c:299 c/c-decl.c:5419 c/c-typeck.c:7259 cp/error.c:1042 +#: tree-diagnostic.c:299 c/c-decl.c:5439 c/c-typeck.c:7264 cp/error.c:1042 #: c-family/c-pretty-print.c:413 #, gcc-internal-format msgid "" @@ -2916,67 +2916,67 @@ msgid "length modifier in strfmon format" msgstr "" #. Handle deferred options from command-line. -#: c-family/c-opts.c:1402 fortran/cpp.c:590 +#: c-family/c-opts.c:1417 fortran/cpp.c:590 msgid "" msgstr "" -#: config/aarch64/aarch64.c:6613 +#: config/aarch64/aarch64.c:6629 #, fuzzy, c-format msgid "unsupported operand for code '%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/aarch64/aarch64.c:6624 config/aarch64/aarch64.c:6640 -#: config/aarch64/aarch64.c:6652 config/aarch64/aarch64.c:6663 -#: config/aarch64/aarch64.c:6673 config/aarch64/aarch64.c:6694 -#: config/aarch64/aarch64.c:6764 config/aarch64/aarch64.c:6775 -#: config/aarch64/aarch64.c:6789 config/aarch64/aarch64.c:7011 -#: config/aarch64/aarch64.c:7029 +#: config/aarch64/aarch64.c:6640 config/aarch64/aarch64.c:6656 +#: config/aarch64/aarch64.c:6668 config/aarch64/aarch64.c:6679 +#: config/aarch64/aarch64.c:6689 config/aarch64/aarch64.c:6710 +#: config/aarch64/aarch64.c:6780 config/aarch64/aarch64.c:6791 +#: config/aarch64/aarch64.c:6805 config/aarch64/aarch64.c:7027 +#: config/aarch64/aarch64.c:7045 #, fuzzy, c-format msgid "invalid operand for '%%%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/aarch64/aarch64.c:6709 config/aarch64/aarch64.c:6720 -#: config/aarch64/aarch64.c:6871 config/aarch64/aarch64.c:6882 +#: config/aarch64/aarch64.c:6725 config/aarch64/aarch64.c:6736 +#: config/aarch64/aarch64.c:6887 config/aarch64/aarch64.c:6898 #, fuzzy, c-format #| msgid "invalid string constant `%E'" msgid "invalid vector constant" msgstr "`%E' - нерэчаісная нязьменная тыпу string" -#: config/aarch64/aarch64.c:6732 config/aarch64/aarch64.c:6744 -#: config/aarch64/aarch64.c:6755 +#: config/aarch64/aarch64.c:6748 config/aarch64/aarch64.c:6760 +#: config/aarch64/aarch64.c:6771 #, c-format msgid "incompatible floating point / vector register operand for '%%%c'" msgstr "" -#: config/aarch64/aarch64.c:6823 config/arm/arm.c:22704 +#: config/aarch64/aarch64.c:6839 config/arm/arm.c:22704 #, fuzzy, c-format msgid "missing operand" msgstr "прапушчан ініцыялізатар" -#: config/aarch64/aarch64.c:6908 +#: config/aarch64/aarch64.c:6924 #, fuzzy, c-format msgid "invalid constant" msgstr "Нерэчаісны выбар %s" -#: config/aarch64/aarch64.c:6911 +#: config/aarch64/aarch64.c:6927 #, fuzzy, c-format #| msgid "invalid %%d operand" msgid "invalid operand" msgstr "нерэчаісны %%d аперанд" -#: config/aarch64/aarch64.c:7040 config/aarch64/aarch64.c:7045 +#: config/aarch64/aarch64.c:7056 config/aarch64/aarch64.c:7061 #, fuzzy, c-format msgid "invalid operand prefix '%%%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/aarch64/aarch64.c:7062 +#: config/aarch64/aarch64.c:7078 #, fuzzy, c-format #| msgid "invalid address" msgid "invalid address mode" msgstr "нерэчаісны адрас" -#: config/alpha/alpha.c:5125 config/i386/i386.c:18558 -#: config/powerpcspe/powerpcspe.c:24333 config/rs6000/rs6000.c:21798 +#: config/alpha/alpha.c:5125 config/i386/i386.c:18561 +#: config/powerpcspe/powerpcspe.c:24333 config/rs6000/rs6000.c:21875 #: config/sparc/sparc.c:9290 #, c-format msgid "'%%&' used without any local dynamic TLS references" @@ -2993,20 +2993,20 @@ msgid "invalid %%r value" msgstr "нерэчаіснае значэньне %%r" #: config/alpha/alpha.c:5223 config/ia64/ia64.c:5534 -#: config/powerpcspe/powerpcspe.c:24013 config/rs6000/rs6000.c:21506 +#: config/powerpcspe/powerpcspe.c:24013 config/rs6000/rs6000.c:21583 #: config/xtensa/xtensa.c:2429 #, c-format msgid "invalid %%R value" msgstr "нерэчаіснае значэньне %%R" #: config/alpha/alpha.c:5229 config/powerpcspe/powerpcspe.c:23933 -#: config/rs6000/rs6000.c:21426 config/xtensa/xtensa.c:2396 +#: config/rs6000/rs6000.c:21503 config/xtensa/xtensa.c:2396 #, c-format msgid "invalid %%N value" msgstr "нерэчаіснае значэньне %%N" #: config/alpha/alpha.c:5237 config/powerpcspe/powerpcspe.c:23961 -#: config/rs6000/rs6000.c:21454 +#: config/rs6000/rs6000.c:21531 #, c-format msgid "invalid %%P value" msgstr "нерэчаіснае значэньне %%P" @@ -3037,7 +3037,7 @@ msgid "invalid %%U value" msgstr "нерэчаіснае значэньне %%U" #: config/alpha/alpha.c:5323 config/powerpcspe/powerpcspe.c:24021 -#: config/rs6000/rs6000.c:21514 +#: config/rs6000/rs6000.c:21591 #, c-format msgid "invalid %%s value" msgstr "нерэчаіснае значэньне %%v" @@ -3048,7 +3048,7 @@ msgid "invalid %%C value" msgstr "нерэчаіснае значэньне %%C" #: config/alpha/alpha.c:5371 config/powerpcspe/powerpcspe.c:23797 -#: config/rs6000/rs6000.c:21290 +#: config/rs6000/rs6000.c:21367 #, c-format msgid "invalid %%E value" msgstr "нерэчаіснае значэньне %%E" @@ -3059,7 +3059,7 @@ msgid "unknown relocation unspec" msgstr "" #: config/alpha/alpha.c:5405 config/cr16/cr16.c:1569 -#: config/powerpcspe/powerpcspe.c:24338 config/rs6000/rs6000.c:21803 +#: config/powerpcspe/powerpcspe.c:24338 config/rs6000/rs6000.c:21880 #: config/spu/spu.c:1458 #, c-format msgid "invalid %%xn code" @@ -3071,75 +3071,75 @@ msgstr "нерэчаіснае значэньне %%xn" msgid "invalid operand address" msgstr "нерэчаісны адрас" -#: config/arc/arc.c:3810 +#: config/arc/arc.c:3808 #, fuzzy, c-format msgid "invalid operand to %%Z code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:3818 +#: config/arc/arc.c:3816 #, fuzzy, c-format msgid "invalid operand to %%z code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:3826 +#: config/arc/arc.c:3824 #, fuzzy, c-format msgid "invalid operands to %%c code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:3834 +#: config/arc/arc.c:3832 #, fuzzy, c-format msgid "invalid operand to %%M code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:3842 config/m32r/m32r.c:2100 +#: config/arc/arc.c:3840 config/m32r/m32r.c:2100 #, fuzzy, c-format msgid "invalid operand to %%p code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:3853 config/m32r/m32r.c:2093 +#: config/arc/arc.c:3851 config/m32r/m32r.c:2093 #, fuzzy, c-format msgid "invalid operand to %%s code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:4001 config/m32r/m32r.c:2126 +#: config/arc/arc.c:3999 config/m32r/m32r.c:2126 #, fuzzy, c-format msgid "invalid operand to %%R code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:4077 config/m32r/m32r.c:2149 +#: config/arc/arc.c:4075 config/m32r/m32r.c:2149 #, fuzzy, c-format msgid "invalid operand to %%H/%%L code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:4145 config/m32r/m32r.c:2220 +#: config/arc/arc.c:4143 config/m32r/m32r.c:2220 #, fuzzy, c-format msgid "invalid operand to %%U code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:4157 +#: config/arc/arc.c:4155 #, fuzzy, c-format msgid "invalid operand to %%V code" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:4214 +#: config/arc/arc.c:4212 #, fuzzy, c-format msgid "invalid operand to %%O code" msgstr "нерэчаісны %%-код" #. Unknown flag. #. Undocumented flag. -#: config/arc/arc.c:4240 config/epiphany/epiphany.c:1305 -#: config/m32r/m32r.c:2247 config/nds32/nds32.c:3079 config/sparc/sparc.c:9569 +#: config/arc/arc.c:4238 config/epiphany/epiphany.c:1305 +#: config/m32r/m32r.c:2247 config/nds32/nds32.c:3080 config/sparc/sparc.c:9569 #, c-format msgid "invalid operand output code" msgstr "" -#: config/arc/arc.c:5869 +#: config/arc/arc.c:5860 #, fuzzy, c-format msgid "invalid UNSPEC as operand: %d" msgstr "нерэчаісны %%-код" -#: config/arc/arc.c:6158 config/cris/cris.c:2568 +#: config/arc/arc.c:6149 config/cris/cris.c:2568 #, fuzzy msgid "unrecognized supposed constant" msgstr "нераспазнаны выбар \"-%s\"" @@ -3176,7 +3176,7 @@ msgstr "Нерэчаісны выбар \"%s\"" #: config/arm/arm.c:22685 config/arm/arm.c:22692 config/bfin/bfin.c:1441 #: config/bfin/bfin.c:1448 config/bfin/bfin.c:1455 config/bfin/bfin.c:1462 #: config/bfin/bfin.c:1471 config/bfin/bfin.c:1478 config/bfin/bfin.c:1485 -#: config/bfin/bfin.c:1492 config/nds32/nds32.c:3098 +#: config/bfin/bfin.c:1492 config/nds32/nds32.c:3099 #, fuzzy, c-format msgid "invalid operand for code '%c'" msgstr "Нерэчаісны выбар \"%s\"" @@ -3526,100 +3526,100 @@ msgstr "" msgid "bad output_condmove_single operand" msgstr "" -#: config/i386/i386.c:17387 +#: config/i386/i386.c:17390 #, c-format msgid "invalid UNSPEC as operand" msgstr "" -#: config/i386/i386.c:17925 +#: config/i386/i386.c:17928 #, fuzzy, c-format #| msgid "invalid use of `restrict'" msgid "invalid use of register '%s'" msgstr "нявернае выкарыстанне \"restict\"" -#: config/i386/i386.c:17930 +#: config/i386/i386.c:17933 #, fuzzy, c-format #| msgid "invalid use of `restrict'" msgid "invalid use of asm flag output" msgstr "нявернае выкарыстанне \"restict\"" -#: config/i386/i386.c:18160 +#: config/i386/i386.c:18163 #, fuzzy, c-format msgid "invalid operand size for operand code 'O'" msgstr "нерэчаісны %%-код" -#: config/i386/i386.c:18195 +#: config/i386/i386.c:18198 #, fuzzy, c-format msgid "invalid operand size for operand code 'z'" msgstr "нерэчаісны %%-код" -#: config/i386/i386.c:18264 +#: config/i386/i386.c:18267 #, fuzzy, c-format msgid "invalid operand type used with operand code 'Z'" msgstr "нерэчаісны %%-код" -#: config/i386/i386.c:18269 +#: config/i386/i386.c:18272 #, fuzzy, c-format msgid "invalid operand size for operand code 'Z'" msgstr "нерэчаісны %%-код" -#: config/i386/i386.c:18346 +#: config/i386/i386.c:18349 #, c-format msgid "operand is not a condition code, invalid operand code 'Y'" msgstr "" -#: config/i386/i386.c:18425 +#: config/i386/i386.c:18428 #, c-format msgid "operand is not a condition code, invalid operand code 'D'" msgstr "" -#: config/i386/i386.c:18443 +#: config/i386/i386.c:18446 #, c-format msgid "operand is not a condition code, invalid operand code '%c'" msgstr "" -#: config/i386/i386.c:18456 +#: config/i386/i386.c:18459 #, c-format msgid "operand is not an offsettable memory reference, invalid operand code 'H'" msgstr "" -#: config/i386/i386.c:18471 +#: config/i386/i386.c:18474 #, c-format msgid "operand is not an integer, invalid operand code 'K'" msgstr "" -#: config/i386/i386.c:18499 +#: config/i386/i386.c:18502 #, c-format msgid "operand is not a specific integer, invalid operand code 'r'" msgstr "" -#: config/i386/i386.c:18517 +#: config/i386/i386.c:18520 #, c-format msgid "operand is not an integer, invalid operand code 'R'" msgstr "" -#: config/i386/i386.c:18540 +#: config/i386/i386.c:18543 #, c-format msgid "operand is not a specific integer, invalid operand code 'R'" msgstr "" -#: config/i386/i386.c:18626 +#: config/i386/i386.c:18629 #, fuzzy, c-format msgid "invalid operand code '%c'" msgstr "Нерэчаісны выбар \"%s\"" -#: config/i386/i386.c:18688 +#: config/i386/i386.c:18691 #, fuzzy, c-format #| msgid "invalid %%c operand" msgid "invalid constraints for operand" msgstr "нерэчаісны %%c аперанд" -#: config/i386/i386.c:18738 +#: config/i386/i386.c:18741 #, fuzzy, c-format msgid "invalid vector immediate" msgstr "нерэчаісны ініцыялізатар" -#: config/i386/i386.c:29572 +#: config/i386/i386.c:29575 #, fuzzy msgid "unknown insn mode" msgstr "невядомы рэжым машыны \"%s\"" @@ -3663,7 +3663,7 @@ msgid "invalid %%P operand" msgstr "нерэчаісны %%-код" #: config/iq2000/iq2000.c:3185 config/powerpcspe/powerpcspe.c:23951 -#: config/rs6000/rs6000.c:21444 +#: config/rs6000/rs6000.c:21521 #, c-format msgid "invalid %%p value" msgstr "" @@ -3719,7 +3719,7 @@ msgid "post-increment address is not a register" msgstr "" #: config/m32r/m32r.c:2350 config/m32r/m32r.c:2365 -#: config/powerpcspe/powerpcspe.c:36090 config/rs6000/rs6000.c:33292 +#: config/powerpcspe/powerpcspe.c:36090 config/rs6000/rs6000.c:33348 msgid "bad address" msgstr "дрэнны адрас" @@ -3844,192 +3844,192 @@ msgstr "" msgid "Try running '%s' in the shell to raise its limit.\n" msgstr "" -#: config/powerpcspe/powerpcspe.c:4411 config/rs6000/rs6000.c:4258 +#: config/powerpcspe/powerpcspe.c:4411 config/rs6000/rs6000.c:4278 msgid "-maltivec=le not allowed for big-endian targets" msgstr "" -#: config/powerpcspe/powerpcspe.c:4423 config/rs6000/rs6000.c:4273 +#: config/powerpcspe/powerpcspe.c:4423 config/rs6000/rs6000.c:4293 #, fuzzy #| msgid "Use hardware floating point" msgid "-mvsx requires hardware floating point" msgstr "Выкарыстоўваць апаратную \"плаваючую кропку\"" -#: config/powerpcspe/powerpcspe.c:4431 config/rs6000/rs6000.c:4281 +#: config/powerpcspe/powerpcspe.c:4431 config/rs6000/rs6000.c:4301 msgid "-mvsx and -mpaired are incompatible" msgstr "" -#: config/powerpcspe/powerpcspe.c:4433 config/rs6000/rs6000.c:4283 +#: config/powerpcspe/powerpcspe.c:4433 config/rs6000/rs6000.c:4303 msgid "-mvsx needs indexed addressing" msgstr "" -#: config/powerpcspe/powerpcspe.c:4438 config/rs6000/rs6000.c:4288 +#: config/powerpcspe/powerpcspe.c:4438 config/rs6000/rs6000.c:4308 msgid "-mvsx and -mno-altivec are incompatible" msgstr "" -#: config/powerpcspe/powerpcspe.c:4440 config/rs6000/rs6000.c:4290 +#: config/powerpcspe/powerpcspe.c:4440 config/rs6000/rs6000.c:4310 msgid "-mno-altivec disables vsx" msgstr "" -#: config/powerpcspe/powerpcspe.c:4648 config/rs6000/rs6000.c:4416 +#: config/powerpcspe/powerpcspe.c:4648 config/rs6000/rs6000.c:4436 msgid "-mquad-memory requires 64-bit mode" msgstr "" -#: config/powerpcspe/powerpcspe.c:4651 config/rs6000/rs6000.c:4419 +#: config/powerpcspe/powerpcspe.c:4651 config/rs6000/rs6000.c:4439 msgid "-mquad-memory-atomic requires 64-bit mode" msgstr "" -#: config/powerpcspe/powerpcspe.c:4663 config/rs6000/rs6000.c:4431 +#: config/powerpcspe/powerpcspe.c:4663 config/rs6000/rs6000.c:4451 msgid "-mquad-memory is not available in little endian mode" msgstr "" -#: config/powerpcspe/powerpcspe.c:4735 config/rs6000/rs6000.c:4512 +#: config/powerpcspe/powerpcspe.c:4735 config/rs6000/rs6000.c:4532 msgid "-mtoc-fusion requires 64-bit" msgstr "" -#: config/powerpcspe/powerpcspe.c:4742 config/rs6000/rs6000.c:4519 +#: config/powerpcspe/powerpcspe.c:4742 config/rs6000/rs6000.c:4539 msgid "-mtoc-fusion requires medium/large code model" msgstr "" -#: config/powerpcspe/powerpcspe.c:11492 config/rs6000/rs6000.c:10915 +#: config/powerpcspe/powerpcspe.c:11492 config/rs6000/rs6000.c:10947 msgid "bad move" msgstr "" -#: config/powerpcspe/powerpcspe.c:23594 config/rs6000/rs6000.c:21087 +#: config/powerpcspe/powerpcspe.c:23594 config/rs6000/rs6000.c:21164 msgid "Bad 128-bit move" msgstr "" -#: config/powerpcspe/powerpcspe.c:23785 config/rs6000/rs6000.c:21278 +#: config/powerpcspe/powerpcspe.c:23785 config/rs6000/rs6000.c:21355 #, fuzzy, c-format #| msgid "invalid %%Q value" msgid "invalid %%e value" msgstr "дрэннае %%Q значэнне" -#: config/powerpcspe/powerpcspe.c:23806 config/rs6000/rs6000.c:21299 +#: config/powerpcspe/powerpcspe.c:23806 config/rs6000/rs6000.c:21376 #, c-format msgid "invalid %%f value" msgstr "" -#: config/powerpcspe/powerpcspe.c:23815 config/rs6000/rs6000.c:21308 +#: config/powerpcspe/powerpcspe.c:23815 config/rs6000/rs6000.c:21385 #, c-format msgid "invalid %%F value" msgstr "" -#: config/powerpcspe/powerpcspe.c:23824 config/rs6000/rs6000.c:21317 +#: config/powerpcspe/powerpcspe.c:23824 config/rs6000/rs6000.c:21394 #, c-format msgid "invalid %%G value" msgstr "" -#: config/powerpcspe/powerpcspe.c:23859 config/rs6000/rs6000.c:21352 +#: config/powerpcspe/powerpcspe.c:23859 config/rs6000/rs6000.c:21429 #, c-format msgid "invalid %%j code" msgstr "" -#: config/powerpcspe/powerpcspe.c:23869 config/rs6000/rs6000.c:21362 +#: config/powerpcspe/powerpcspe.c:23869 config/rs6000/rs6000.c:21439 #, c-format msgid "invalid %%J code" msgstr "" -#: config/powerpcspe/powerpcspe.c:23879 config/rs6000/rs6000.c:21372 +#: config/powerpcspe/powerpcspe.c:23879 config/rs6000/rs6000.c:21449 #, c-format msgid "invalid %%k value" msgstr "" -#: config/powerpcspe/powerpcspe.c:23894 config/rs6000/rs6000.c:21387 +#: config/powerpcspe/powerpcspe.c:23894 config/rs6000/rs6000.c:21464 #: config/xtensa/xtensa.c:2415 #, c-format msgid "invalid %%K value" msgstr "" -#: config/powerpcspe/powerpcspe.c:23941 config/rs6000/rs6000.c:21434 +#: config/powerpcspe/powerpcspe.c:23941 config/rs6000/rs6000.c:21511 #, c-format msgid "invalid %%O value" msgstr "нерэчаіснае значэньне %%O" -#: config/powerpcspe/powerpcspe.c:23988 config/rs6000/rs6000.c:21481 +#: config/powerpcspe/powerpcspe.c:23988 config/rs6000/rs6000.c:21558 #, c-format msgid "invalid %%q value" msgstr "" -#: config/powerpcspe/powerpcspe.c:24041 config/rs6000/rs6000.c:21534 +#: config/powerpcspe/powerpcspe.c:24041 config/rs6000/rs6000.c:21611 #, c-format msgid "invalid %%T value" msgstr "" -#: config/powerpcspe/powerpcspe.c:24053 config/rs6000/rs6000.c:21546 +#: config/powerpcspe/powerpcspe.c:24053 config/rs6000/rs6000.c:21623 #, c-format msgid "invalid %%u value" msgstr "" -#: config/powerpcspe/powerpcspe.c:24067 config/rs6000/rs6000.c:21560 +#: config/powerpcspe/powerpcspe.c:24067 config/rs6000/rs6000.c:21637 #: config/xtensa/xtensa.c:2384 #, c-format msgid "invalid %%v value" msgstr "" -#: config/powerpcspe/powerpcspe.c:24134 config/rs6000/rs6000.c:21627 +#: config/powerpcspe/powerpcspe.c:24134 config/rs6000/rs6000.c:21704 #: config/xtensa/xtensa.c:2436 #, fuzzy, c-format #| msgid "invalid %%x/X value" msgid "invalid %%x value" msgstr "нерэчаіснае значэньне %%x/X" -#: config/powerpcspe/powerpcspe.c:24282 config/rs6000/rs6000.c:21747 +#: config/powerpcspe/powerpcspe.c:24282 config/rs6000/rs6000.c:21824 #, fuzzy, c-format msgid "invalid %%y value, try using the 'Z' constraint" msgstr "нявернае выкарыстанне \"restict\"" -#: config/powerpcspe/powerpcspe.c:24996 config/rs6000/rs6000.c:22282 +#: config/powerpcspe/powerpcspe.c:24996 config/rs6000/rs6000.c:22359 msgid "__float128 and __ibm128 cannot be used in the same expression" msgstr "" -#: config/powerpcspe/powerpcspe.c:25002 config/rs6000/rs6000.c:22288 +#: config/powerpcspe/powerpcspe.c:25002 config/rs6000/rs6000.c:22365 msgid "__ibm128 and long double cannot be used in the same expression" msgstr "" -#: config/powerpcspe/powerpcspe.c:25008 config/rs6000/rs6000.c:22294 +#: config/powerpcspe/powerpcspe.c:25008 config/rs6000/rs6000.c:22371 msgid "__float128 and long double cannot be used in the same expression" msgstr "" -#: config/powerpcspe/powerpcspe.c:39380 config/rs6000/rs6000.c:36572 +#: config/powerpcspe/powerpcspe.c:39380 config/rs6000/rs6000.c:36628 #, fuzzy #| msgid "too few arguments to function" msgid "AltiVec argument passed to unprototyped function" msgstr "не хапае аргументаў у функцыі" -#: config/powerpcspe/powerpcspe.c:41186 config/rs6000/rs6000.c:38739 +#: config/powerpcspe/powerpcspe.c:41186 config/rs6000/rs6000.c:38795 #, fuzzy msgid "Could not generate addis value for fusion" msgstr "Стварыць код для DLL" -#: config/powerpcspe/powerpcspe.c:41258 config/rs6000/rs6000.c:38809 +#: config/powerpcspe/powerpcspe.c:41258 config/rs6000/rs6000.c:38865 msgid "Unable to generate load/store offset for fusion" msgstr "" -#: config/powerpcspe/powerpcspe.c:41362 config/rs6000/rs6000.c:38908 +#: config/powerpcspe/powerpcspe.c:41362 config/rs6000/rs6000.c:38964 msgid "Bad GPR fusion" msgstr "" -#: config/powerpcspe/powerpcspe.c:41580 config/rs6000/rs6000.c:39126 +#: config/powerpcspe/powerpcspe.c:41580 config/rs6000/rs6000.c:39182 msgid "emit_fusion_p9_load, bad reg #1" msgstr "" -#: config/powerpcspe/powerpcspe.c:41626 config/rs6000/rs6000.c:39172 +#: config/powerpcspe/powerpcspe.c:41626 config/rs6000/rs6000.c:39228 msgid "emit_fusion_p9_load, bad reg #2" msgstr "" -#: config/powerpcspe/powerpcspe.c:41629 config/rs6000/rs6000.c:39175 +#: config/powerpcspe/powerpcspe.c:41629 config/rs6000/rs6000.c:39231 msgid "emit_fusion_p9_load not MEM" msgstr "" -#: config/powerpcspe/powerpcspe.c:41667 config/rs6000/rs6000.c:39213 +#: config/powerpcspe/powerpcspe.c:41667 config/rs6000/rs6000.c:39269 msgid "emit_fusion_p9_store, bad reg #1" msgstr "" -#: config/powerpcspe/powerpcspe.c:41713 config/rs6000/rs6000.c:39259 +#: config/powerpcspe/powerpcspe.c:41713 config/rs6000/rs6000.c:39315 msgid "emit_fusion_p9_store, bad reg #2" msgstr "" -#: config/powerpcspe/powerpcspe.c:41716 config/rs6000/rs6000.c:39262 +#: config/powerpcspe/powerpcspe.c:41716 config/rs6000/rs6000.c:39318 msgid "emit_fusion_p9_store not MEM" msgstr "" @@ -4414,14 +4414,14 @@ msgstr "" #: c/gimple-parser.c:188 c/gimple-parser.c:197 c/gimple-parser.c:226 #: c/gimple-parser.c:1375 c/gimple-parser.c:1404 c/gimple-parser.c:1484 #: c/gimple-parser.c:1511 c/c-parser.c:3204 c/c-parser.c:9967 -#: c/gimple-parser.c:1278 c/gimple-parser.c:1317 cp/parser.c:27841 -#: cp/parser.c:28430 +#: c/gimple-parser.c:1278 c/gimple-parser.c:1317 cp/parser.c:27838 +#: cp/parser.c:28427 #, gcc-internal-format msgid "expected %<;%>" msgstr "" #: c/c-parser.c:2431 c/c-parser.c:7573 c/c-parser.c:8015 c/c-parser.c:8058 -#: c/c-parser.c:8196 c/c-parser.c:12669 cp/parser.c:27839 cp/parser.c:28448 +#: c/c-parser.c:8196 c/c-parser.c:12669 cp/parser.c:27836 cp/parser.c:28445 #, gcc-internal-format msgid "expected %<,%>" msgstr "" @@ -4436,7 +4436,7 @@ msgstr "" #: c/gimple-parser.c:821 c/gimple-parser.c:837 c/gimple-parser.c:853 #: c/gimple-parser.c:880 c/gimple-parser.c:915 c/gimple-parser.c:1038 #: c/gimple-parser.c:1209 c/gimple-parser.c:1220 c/gimple-parser.c:1342 -#: c/gimple-parser.c:1441 cp/parser.c:28478 +#: c/gimple-parser.c:1441 cp/parser.c:28475 #, gcc-internal-format msgid "expected %<)%>" msgstr "" @@ -4444,7 +4444,7 @@ msgstr "" #: c/c-parser.c:3824 c/c-parser.c:4733 c/c-parser.c:4769 c/c-parser.c:6441 #: c/c-parser.c:8125 c/c-parser.c:8983 c/c-parser.c:9127 c/c-parser.c:11588 #: c/c-parser.c:18220 c/c-parser.c:18222 c/gimple-parser.c:1015 -#: cp/parser.c:28442 +#: cp/parser.c:28439 #, gcc-internal-format msgid "expected %<]%>" msgstr "" @@ -4458,14 +4458,14 @@ msgstr "" #: c/c-parser.c:17792 c/gimple-parser.c:363 c/gimple-parser.c:811 #: c/gimple-parser.c:873 c/gimple-parser.c:911 c/gimple-parser.c:1198 #: c/gimple-parser.c:1339 c/gimple-parser.c:1438 c/c-parser.c:11911 -#: cp/parser.c:28433 +#: cp/parser.c:28430 #, gcc-internal-format msgid "expected %<(%>" msgstr "" #: c/c-parser.c:4903 c/c-parser.c:10310 c/c-parser.c:16212 c/c-parser.c:18449 #: c/gimple-parser.c:141 c/gimple-parser.c:1444 c/c-parser.c:3018 -#: c/c-parser.c:3225 c/c-parser.c:9862 cp/parser.c:18155 cp/parser.c:28439 +#: c/c-parser.c:3225 c/c-parser.c:9862 cp/parser.c:18152 cp/parser.c:28436 #, gcc-internal-format msgid "expected %<{%>" msgstr "" @@ -4475,13 +4475,13 @@ msgstr "" #: c/c-parser.c:12351 c/c-parser.c:12493 c/c-parser.c:12864 c/c-parser.c:12957 #: c/c-parser.c:13566 c/c-parser.c:17636 c/c-parser.c:17695 #: c/gimple-parser.c:431 c/gimple-parser.c:1492 c/gimple-parser.c:1519 -#: c/c-parser.c:6347 c/c-parser.c:12006 cp/parser.c:28472 cp/parser.c:29597 -#: cp/parser.c:32279 +#: c/c-parser.c:6347 c/c-parser.c:12006 cp/parser.c:28469 cp/parser.c:29594 +#: cp/parser.c:32276 #, gcc-internal-format msgid "expected %<:%>" msgstr "" -#: c/c-parser.c:5974 cp/parser.c:28365 +#: c/c-parser.c:5974 cp/parser.c:28362 #, gcc-internal-format msgid "expected %" msgstr "" @@ -4490,18 +4490,18 @@ msgstr "" msgid "expected %<.%>" msgstr "" -#: c/c-parser.c:9533 c/c-parser.c:9565 c/c-parser.c:9805 cp/parser.c:30172 -#: cp/parser.c:30246 +#: c/c-parser.c:9533 c/c-parser.c:9565 c/c-parser.c:9805 cp/parser.c:30169 +#: cp/parser.c:30243 #, gcc-internal-format msgid "expected %<@end%>" msgstr "" -#: c/c-parser.c:10223 c/gimple-parser.c:806 cp/parser.c:28457 +#: c/c-parser.c:10223 c/gimple-parser.c:806 cp/parser.c:28454 #, gcc-internal-format msgid "expected %<>%>" msgstr "" -#: c/c-parser.c:13049 c/c-parser.c:13787 cp/parser.c:28481 +#: c/c-parser.c:13049 c/c-parser.c:13787 cp/parser.c:28478 #, gcc-internal-format msgid "expected %<,%> or %<)%>" msgstr "" @@ -4509,32 +4509,32 @@ msgstr "" #. All following cases are statements with LHS. #: c/c-parser.c:15190 c/c-parser.c:15234 c/c-parser.c:15466 c/c-parser.c:15701 #: c/c-parser.c:17833 c/gimple-parser.c:286 c/c-parser.c:4792 -#: cp/parser.c:28460 +#: cp/parser.c:28457 #, gcc-internal-format msgid "expected %<=%>" msgstr "" -#: c/c-parser.c:15482 c/gimple-parser.c:1553 cp/parser.c:28436 -#: cp/parser.c:30389 +#: c/c-parser.c:15482 c/gimple-parser.c:1553 cp/parser.c:28433 +#: cp/parser.c:30386 #, gcc-internal-format msgid "expected %<}%>" msgstr "" -#: c/c-parser.c:16255 c/c-parser.c:16245 cp/parser.c:35674 +#: c/c-parser.c:16255 c/c-parser.c:16245 cp/parser.c:35671 #, gcc-internal-format msgid "expected %<#pragma omp section%> or %<}%>" msgstr "" -#: c/c-parser.c:18208 c/c-parser.c:11523 cp/parser.c:28445 cp/parser.c:31535 +#: c/c-parser.c:18208 c/c-parser.c:11523 cp/parser.c:28442 cp/parser.c:31532 #, gcc-internal-format msgid "expected %<[%>" msgstr "" -#: c/c-typeck.c:7847 +#: c/c-typeck.c:7852 msgid "(anonymous)" msgstr "" -#: c/gimple-parser.c:795 cp/parser.c:15791 cp/parser.c:28454 +#: c/gimple-parser.c:795 cp/parser.c:15788 cp/parser.c:28451 #, gcc-internal-format msgid "expected %<<%>" msgstr "" @@ -4808,11 +4808,11 @@ msgstr "" msgid "%r%s:%d:%R in % expansion of %qs" msgstr "" -#: cp/pt.c:1949 cp/semantics.c:5268 +#: cp/pt.c:1949 cp/semantics.c:5271 msgid "candidates are:" msgstr "" -#: cp/pt.c:1951 cp/pt.c:22975 +#: cp/pt.c:1951 cp/pt.c:23053 msgid "candidate is:" msgid_plural "candidates are:" msgstr[0] "" @@ -4863,27 +4863,27 @@ msgstr "" msgid "source type is not polymorphic" msgstr "" -#: cp/typeck.c:6083 c/c-typeck.c:4261 +#: cp/typeck.c:6083 c/c-typeck.c:4266 #, gcc-internal-format msgid "wrong type argument to unary minus" msgstr "" -#: cp/typeck.c:6084 c/c-typeck.c:4248 +#: cp/typeck.c:6084 c/c-typeck.c:4253 #, gcc-internal-format msgid "wrong type argument to unary plus" msgstr "" -#: cp/typeck.c:6111 c/c-typeck.c:4302 +#: cp/typeck.c:6111 c/c-typeck.c:4307 #, gcc-internal-format msgid "wrong type argument to bit-complement" msgstr "" -#: cp/typeck.c:6128 c/c-typeck.c:4310 +#: cp/typeck.c:6128 c/c-typeck.c:4315 #, gcc-internal-format msgid "wrong type argument to abs" msgstr "" -#: cp/typeck.c:6140 c/c-typeck.c:4322 +#: cp/typeck.c:6140 c/c-typeck.c:4327 #, gcc-internal-format msgid "wrong type argument to conjugation" msgstr "" @@ -5127,75 +5127,75 @@ msgstr "" msgid "Expected attribute bit name" msgstr "" -#: fortran/module.c:3223 +#: fortran/module.c:3225 msgid "Expected integer string" msgstr "" -#: fortran/module.c:3227 +#: fortran/module.c:3229 msgid "Error converting integer" msgstr "" -#: fortran/module.c:3249 +#: fortran/module.c:3251 msgid "Expected real string" msgstr "" -#: fortran/module.c:3474 +#: fortran/module.c:3476 msgid "Expected expression type" msgstr "" -#: fortran/module.c:3554 +#: fortran/module.c:3556 #, fuzzy #| msgid "invalid declarator" msgid "Bad operator" msgstr "нерэчаісны абвяшчальнік" -#: fortran/module.c:3671 +#: fortran/module.c:3673 msgid "Bad type in constant expression" msgstr "" -#: fortran/module.c:7038 +#: fortran/module.c:7040 msgid "Unexpected end of module" msgstr "" -#: fortran/parse.c:1757 +#: fortran/parse.c:1761 msgid "arithmetic IF" msgstr "" -#: fortran/parse.c:1766 +#: fortran/parse.c:1770 #, fuzzy #| msgid "Invalid declaration" msgid "attribute declaration" msgstr "Нерэчаіснае абвяшчэнне" -#: fortran/parse.c:1802 +#: fortran/parse.c:1806 #, fuzzy #| msgid "empty declaration" msgid "data declaration" msgstr "пустое абвяшчэньне" -#: fortran/parse.c:1820 +#: fortran/parse.c:1824 #, fuzzy #| msgid "empty declaration" msgid "derived type declaration" msgstr "пустое абвяшчэньне" -#: fortran/parse.c:1947 +#: fortran/parse.c:1951 msgid "block IF" msgstr "" -#: fortran/parse.c:1956 +#: fortran/parse.c:1960 msgid "implied END DO" msgstr "" -#: fortran/parse.c:2050 fortran/resolve.c:11199 +#: fortran/parse.c:2054 fortran/resolve.c:11219 msgid "assignment" msgstr "" -#: fortran/parse.c:2053 fortran/resolve.c:11250 fortran/resolve.c:11253 +#: fortran/parse.c:2057 fortran/resolve.c:11270 fortran/resolve.c:11273 msgid "pointer assignment" msgstr "" -#: fortran/parse.c:2071 +#: fortran/parse.c:2075 msgid "simple IF" msgstr "" @@ -5307,106 +5307,111 @@ msgstr "" msgid "Operand of unary numeric operator %%<%s%%> at %%L is %s" msgstr "" -#: fortran/resolve.c:3878 +#: fortran/resolve.c:3879 +#, c-format +msgid "Unexpected derived-type entities in binary intrinsic numeric operator %%<%s%%> at %%L" +msgstr "" + +#: fortran/resolve.c:3884 #, c-format msgid "Operands of binary numeric operator %%<%s%%> at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:3893 +#: fortran/resolve.c:3899 #, c-format msgid "Operands of string concatenation operator at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:3926 +#: fortran/resolve.c:3932 #, c-format msgid "Operands of logical operator %%<%s%%> at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:3949 +#: fortran/resolve.c:3955 #, c-format msgid "Operand of .not. operator at %%L is %s" msgstr "" -#: fortran/resolve.c:3963 +#: fortran/resolve.c:3969 msgid "COMPLEX quantities cannot be compared at %L" msgstr "" -#: fortran/resolve.c:4015 +#: fortran/resolve.c:4021 #, c-format msgid "Logicals at %%L must be compared with %s instead of %s" msgstr "" -#: fortran/resolve.c:4021 +#: fortran/resolve.c:4027 #, c-format msgid "Operands of comparison operator %%<%s%%> at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:4034 +#: fortran/resolve.c:4040 #, c-format msgid "Unknown operator %%<%s%%> at %%L; did you mean '%s'?" msgstr "" -#: fortran/resolve.c:4037 +#: fortran/resolve.c:4043 #, c-format msgid "Unknown operator %%<%s%%> at %%L" msgstr "" -#: fortran/resolve.c:4040 +#: fortran/resolve.c:4046 #, c-format msgid "Operand of user operator %%<%s%%> at %%L is %s" msgstr "" -#: fortran/resolve.c:4044 +#: fortran/resolve.c:4050 #, c-format msgid "Operands of user operator %%<%s%%> at %%L are %s/%s" msgstr "" -#: fortran/resolve.c:4132 +#: fortran/resolve.c:4138 #, c-format msgid "Inconsistent ranks for operator at %%L and %%L" msgstr "" -#: fortran/resolve.c:6849 +#: fortran/resolve.c:6855 msgid "Loop variable" msgstr "" -#: fortran/resolve.c:6853 +#: fortran/resolve.c:6859 msgid "iterator variable" msgstr "" -#: fortran/resolve.c:6857 +#: fortran/resolve.c:6863 msgid "Start expression in DO loop" msgstr "" -#: fortran/resolve.c:6861 +#: fortran/resolve.c:6867 msgid "End expression in DO loop" msgstr "" -#: fortran/resolve.c:6865 +#: fortran/resolve.c:6871 msgid "Step expression in DO loop" msgstr "" -#: fortran/resolve.c:7150 fortran/resolve.c:7153 +#: fortran/resolve.c:7156 fortran/resolve.c:7159 msgid "DEALLOCATE object" msgstr "" -#: fortran/resolve.c:7525 fortran/resolve.c:7528 +#: fortran/resolve.c:7531 fortran/resolve.c:7534 msgid "ALLOCATE object" msgstr "" -#: fortran/resolve.c:7720 fortran/resolve.c:9417 +#: fortran/resolve.c:7726 fortran/resolve.c:9428 msgid "STAT variable" msgstr "" -#: fortran/resolve.c:7764 fortran/resolve.c:9429 +#: fortran/resolve.c:7770 fortran/resolve.c:9440 msgid "ERRMSG variable" msgstr "" -#: fortran/resolve.c:9219 +#: fortran/resolve.c:9230 msgid "item in READ" msgstr "" -#: fortran/resolve.c:9441 +#: fortran/resolve.c:9452 msgid "ACQUIRED_LOCK variable" msgstr "" @@ -5439,7 +5444,7 @@ msgstr "" msgid "Target of rank remapping is too small (%ld < %ld)" msgstr "" -#: fortran/trans-expr.c:10154 +#: fortran/trans-expr.c:10157 msgid "Assignment of scalar to unallocated array" msgstr "" @@ -5448,12 +5453,12 @@ msgstr "" msgid "Unequal character lengths (%ld/%ld) in %s" msgstr "" -#: fortran/trans-intrinsic.c:8088 +#: fortran/trans-intrinsic.c:8090 #, c-format msgid "Argument NCOPIES of REPEAT intrinsic is negative (its value is %ld)" msgstr "" -#: fortran/trans-intrinsic.c:8120 +#: fortran/trans-intrinsic.c:8122 msgid "Argument NCOPIES of REPEAT intrinsic is too large" msgstr "" @@ -5474,15 +5479,15 @@ msgstr "" msgid "Invalid image number %d in SYNC IMAGES" msgstr "" -#: fortran/trans-stmt.c:2180 +#: fortran/trans-stmt.c:2177 msgid "Loop iterates infinitely" msgstr "" -#: fortran/trans-stmt.c:2200 fortran/trans-stmt.c:2456 +#: fortran/trans-stmt.c:2197 fortran/trans-stmt.c:2453 msgid "Loop variable has been modified" msgstr "" -#: fortran/trans-stmt.c:2309 +#: fortran/trans-stmt.c:2306 msgid "DO step value is zero" msgstr "" @@ -6084,10 +6089,10 @@ msgstr "" msgid "Allow dollar signs in entity names." msgstr "" -#: fortran/lang.opt:485 config/alpha/alpha.opt:31 common.opt:783 -#: common.opt:985 common.opt:989 common.opt:993 common.opt:997 common.opt:1532 -#: common.opt:1588 common.opt:1712 common.opt:1716 common.opt:1946 -#: common.opt:2116 common.opt:2792 +#: fortran/lang.opt:485 config/alpha/alpha.opt:31 common.opt:649 +#: common.opt:783 common.opt:989 common.opt:993 common.opt:997 common.opt:1001 +#: common.opt:1536 common.opt:1592 common.opt:1716 common.opt:1720 +#: common.opt:1950 common.opt:2120 common.opt:2796 msgid "Does nothing. Preserved for backward compatibility." msgstr "" @@ -6308,12 +6313,12 @@ msgid "Append underscores to externally visible names." msgstr "" #: fortran/lang.opt:751 c-family/c.opt:1356 c-family/c.opt:1384 -#: c-family/c.opt:1634 config/pa/pa.opt:42 config/pa/pa.opt:70 common.opt:1154 -#: common.opt:1333 common.opt:1408 common.opt:1676 common.opt:1799 -#: common.opt:2169 common.opt:2205 common.opt:2298 common.opt:2302 -#: common.opt:2407 common.opt:2498 common.opt:2506 common.opt:2514 -#: common.opt:2522 common.opt:2623 common.opt:2675 common.opt:2755 -#: common.opt:2893 common.opt:2897 common.opt:2901 common.opt:2905 +#: c-family/c.opt:1634 config/pa/pa.opt:42 config/pa/pa.opt:70 common.opt:1158 +#: common.opt:1337 common.opt:1412 common.opt:1680 common.opt:1803 +#: common.opt:2173 common.opt:2209 common.opt:2302 common.opt:2306 +#: common.opt:2411 common.opt:2502 common.opt:2510 common.opt:2518 +#: common.opt:2526 common.opt:2627 common.opt:2679 common.opt:2759 +#: common.opt:2897 common.opt:2901 common.opt:2905 common.opt:2909 msgid "Does nothing. Preserved for backward compatibility." msgstr "" @@ -6363,7 +6368,7 @@ msgstr "аргумент для \"%s\" прапушчан" #: c-family/c.opt:70 c-family/c.opt:73 c-family/c.opt:76 c-family/c.opt:79 #: c-family/c.opt:175 c-family/c.opt:178 c-family/c.opt:220 c-family/c.opt:224 #: c-family/c.opt:236 c-family/c.opt:1855 c-family/c.opt:1863 brig/lang.opt:39 -#: config/darwin.opt:56 common.opt:338 common.opt:341 common.opt:3046 +#: config/darwin.opt:56 common.opt:338 common.opt:341 common.opt:3050 #, fuzzy, c-format #| msgid "missing white space after number '%.*s'" msgid "missing filename after %qs" @@ -6957,7 +6962,7 @@ msgstr "" #: c-family/c.opt:1525 c-family/c.opt:1528 c-family/c.opt:1569 #: c-family/c.opt:1704 c-family/c.opt:1731 c-family/c.opt:1771 #: c-family/c.opt:1802 c-family/c.opt:1806 c-family/c.opt:1822 -#: config/ia64/ia64.opt:167 config/ia64/ia64.opt:170 c-family/c-opts.c:434 +#: config/ia64/ia64.opt:167 config/ia64/ia64.opt:170 c-family/c-opts.c:432 #, fuzzy, gcc-internal-format msgid "switch %qs is no longer supported" msgstr "-pipe не падтрымліваецца." @@ -14471,10 +14476,6 @@ msgstr "" msgid "Warn if dereferencing a NULL pointer may lead to erroneous or undefined behavior." msgstr "" -#: common.opt:649 -msgid "Warn if the loop cannot be optimized due to nontrivial assumptions." -msgstr "" - #: common.opt:656 msgid "Warn about some C++ One Definition Rule violations during link time optimization." msgstr "" @@ -14643,1731 +14644,1731 @@ msgstr "" msgid "-dumpdir \tSet the directory name to be used for dumps." msgstr "" -#: common.opt:946 +#: common.opt:950 msgid "The version of the C++ ABI in use." msgstr "" -#: common.opt:950 +#: common.opt:954 msgid "Aggressively optimize loops using language constraints." msgstr "" -#: common.opt:954 +#: common.opt:958 #, fuzzy msgid "Align the start of functions." msgstr "вельмі шмат аргументаў у функцыі" -#: common.opt:964 +#: common.opt:968 msgid "Align labels which are only reached by jumping." msgstr "" -#: common.opt:971 +#: common.opt:975 msgid "Align all labels." msgstr "" -#: common.opt:978 +#: common.opt:982 msgid "Align the start of loops." msgstr "" -#: common.opt:1001 +#: common.opt:1005 msgid "Select what to sanitize." msgstr "" -#: common.opt:1005 +#: common.opt:1009 msgid "Select type of coverage sanitization." msgstr "" -#: common.opt:1009 +#: common.opt:1013 msgid "-fasan-shadow-offset=\tUse custom shadow memory offset." msgstr "" -#: common.opt:1013 +#: common.opt:1017 msgid "-fsanitize-sections=\tSanitize global variables in user-defined sections." msgstr "" -#: common.opt:1018 +#: common.opt:1022 msgid "After diagnosing undefined behavior attempt to continue execution." msgstr "" -#: common.opt:1022 +#: common.opt:1026 msgid "This switch is deprecated; use -fsanitize-recover= instead." msgstr "" -#: common.opt:1029 +#: common.opt:1033 msgid "Use trap instead of a library function for undefined behavior sanitization." msgstr "" -#: common.opt:1033 +#: common.opt:1037 msgid "Generate unwind tables that are exact at each instruction boundary." msgstr "" -#: common.opt:1037 +#: common.opt:1041 #, fuzzy #| msgid "Do not generate char instructions" msgid "Generate auto-inc/dec instructions." msgstr "Не генерыраваць сімвальныя інструкцыі" -#: common.opt:1041 +#: common.opt:1045 msgid "Use sample profile information for call graph node weights. The default profile file is fbdata.afdo in 'pwd'." msgstr "" -#: common.opt:1046 +#: common.opt:1050 msgid "Use sample profile information for call graph node weights. The profile file is specified in the argument." msgstr "" -#: common.opt:1055 +#: common.opt:1059 msgid "Generate code to check bounds before indexing arrays." msgstr "" -#: common.opt:1059 +#: common.opt:1063 msgid "Replace add, compare, branch with branch on count register." msgstr "" -#: common.opt:1063 +#: common.opt:1067 msgid "Use profiling information for branch probabilities." msgstr "" -#: common.opt:1067 +#: common.opt:1071 msgid "Perform branch target load optimization before prologue / epilogue threading." msgstr "" -#: common.opt:1071 +#: common.opt:1075 msgid "Perform branch target load optimization after prologue / epilogue threading." msgstr "" -#: common.opt:1075 +#: common.opt:1079 msgid "Restrict target load migration not to re-use registers in any basic block." msgstr "" -#: common.opt:1079 +#: common.opt:1083 msgid "-fcall-saved-\tMark as being preserved across functions." msgstr "" -#: common.opt:1083 +#: common.opt:1087 msgid "-fcall-used-\tMark as being corrupted by function calls." msgstr "" -#: common.opt:1090 +#: common.opt:1094 msgid "Save registers around function calls." msgstr "" -#: common.opt:1094 +#: common.opt:1098 msgid "This switch is deprecated; do not use." msgstr "" -#: common.opt:1098 +#: common.opt:1102 msgid "Check the return value of new in C++." msgstr "" -#: common.opt:1102 common.opt:1106 +#: common.opt:1106 common.opt:1110 msgid "Perform internal consistency checkings." msgstr "" -#: common.opt:1110 +#: common.opt:1114 #, fuzzy #| msgid "Enable exception handling" msgid "Enable code hoisting." msgstr "Уключыць апрацоўку выключэньняў" -#: common.opt:1114 +#: common.opt:1118 msgid "Looks for opportunities to reduce stack adjustments and stack references." msgstr "" -#: common.opt:1118 +#: common.opt:1122 msgid "Do not put uninitialized globals in the common section." msgstr "" -#: common.opt:1126 +#: common.opt:1130 msgid "-fcompare-debug[=]\tCompile with and without e.g. -gtoggle, and compare the final-insns dump." msgstr "" -#: common.opt:1130 +#: common.opt:1134 msgid "Run only the second compilation of -fcompare-debug." msgstr "" -#: common.opt:1134 +#: common.opt:1138 msgid "Perform comparison elimination after register allocation has finished." msgstr "" -#: common.opt:1138 +#: common.opt:1142 msgid "Do not perform optimizations increasing noticeably stack usage." msgstr "" -#: common.opt:1142 +#: common.opt:1146 msgid "Perform a register copy-propagation optimization pass." msgstr "" -#: common.opt:1146 +#: common.opt:1150 msgid "Perform cross-jumping optimization." msgstr "" -#: common.opt:1150 +#: common.opt:1154 msgid "When running CSE, follow jumps to their targets." msgstr "" -#: common.opt:1158 +#: common.opt:1162 msgid "Omit range reduction step when performing complex division." msgstr "" -#: common.opt:1162 +#: common.opt:1166 msgid "Complex multiplication and division follow Fortran rules." msgstr "" -#: common.opt:1166 +#: common.opt:1170 msgid "Place data items into their own section." msgstr "" -#: common.opt:1170 +#: common.opt:1174 msgid "List all available debugging counters with their limits and counts." msgstr "" -#: common.opt:1174 +#: common.opt:1178 msgid "-fdbg-cnt=:[,:,...]\tSet the debug counter limit." msgstr "" -#: common.opt:1178 +#: common.opt:1182 msgid "-fdebug-prefix-map== Map one directory name to another in debug information." msgstr "" -#: common.opt:1182 +#: common.opt:1186 msgid "-ffile-prefix-map== Map one directory name to another in compilation result." msgstr "" -#: common.opt:1186 +#: common.opt:1190 msgid "Output .debug_types section when using DWARF v4 debuginfo." msgstr "" -#: common.opt:1192 +#: common.opt:1196 msgid "Defer popping functions args from stack until later." msgstr "" -#: common.opt:1196 +#: common.opt:1200 msgid "Attempt to fill delay slots of branch instructions." msgstr "" -#: common.opt:1200 +#: common.opt:1204 msgid "Delete dead instructions that may throw exceptions." msgstr "" -#: common.opt:1204 +#: common.opt:1208 msgid "Delete useless null pointer checks." msgstr "" -#: common.opt:1208 +#: common.opt:1212 msgid "Stream extra data to support more aggressive devirtualization in LTO local transformation mode." msgstr "" -#: common.opt:1212 +#: common.opt:1216 msgid "Perform speculative devirtualization." msgstr "" -#: common.opt:1216 +#: common.opt:1220 msgid "Try to convert virtual calls to direct ones." msgstr "" -#: common.opt:1220 +#: common.opt:1224 msgid "-fdiagnostics-show-location=[once|every-line]\tHow often to emit source location at the beginning of line-wrapped diagnostics." msgstr "" -#: common.opt:1237 +#: common.opt:1241 msgid "Show the source line with a caret indicating the column." msgstr "" -#: common.opt:1245 +#: common.opt:1249 msgid "-fdiagnostics-color=[never|always|auto]\tColorize diagnostics." msgstr "" -#: common.opt:1265 +#: common.opt:1269 msgid "Print fix-it hints in machine-readable form." msgstr "" -#: common.opt:1269 +#: common.opt:1273 msgid "Print fix-it hints to stderr in unified diff format." msgstr "" -#: common.opt:1273 +#: common.opt:1277 msgid "Amend appropriate diagnostic messages with the command line option that controls them." msgstr "" -#: common.opt:1277 +#: common.opt:1281 msgid "-fdisable-[tree|rtl|ipa]-=range1+range2 disables an optimization pass." msgstr "" -#: common.opt:1281 +#: common.opt:1285 msgid "-fenable-[tree|rtl|ipa]-=range1+range2 enables an optimization pass." msgstr "" -#: common.opt:1285 +#: common.opt:1289 msgid "-fdump-\tDump various compiler internals to a file." msgstr "" -#: common.opt:1292 +#: common.opt:1296 msgid "-fdump-final-insns=filename\tDump to filename the insns at the end of translation." msgstr "" -#: common.opt:1296 +#: common.opt:1300 msgid "-fdump-go-spec=filename\tWrite all declarations to file as Go code." msgstr "" -#: common.opt:1300 +#: common.opt:1304 msgid "Suppress output of addresses in debugging dumps." msgstr "" -#: common.opt:1304 +#: common.opt:1308 msgid "Collect and dump debug information into temporary file if ICE in C/C++ compiler occurred." msgstr "" -#: common.opt:1309 +#: common.opt:1313 msgid "Dump detailed information on GCC's internal representation of source code locations." msgstr "" -#: common.opt:1313 +#: common.opt:1317 msgid "Dump optimization passes." msgstr "" -#: common.opt:1317 +#: common.opt:1321 msgid "Suppress output of instruction numbers, line number notes and addresses in debugging dumps." msgstr "" -#: common.opt:1321 +#: common.opt:1325 msgid "Suppress output of previous and next insn numbers in debugging dumps." msgstr "" -#: common.opt:1325 +#: common.opt:1329 msgid "Enable CFI tables via GAS assembler directives." msgstr "" -#: common.opt:1329 +#: common.opt:1333 msgid "Perform early inlining." msgstr "" -#: common.opt:1337 +#: common.opt:1341 msgid "Perform interprocedural reduction of aggregates." msgstr "" -#: common.opt:1341 +#: common.opt:1345 msgid "Perform unused symbol elimination in debug info." msgstr "" -#: common.opt:1345 +#: common.opt:1349 msgid "Perform unused type elimination in debug info." msgstr "" -#: common.opt:1349 +#: common.opt:1353 msgid "Do not suppress C++ class debug information." msgstr "" -#: common.opt:1353 +#: common.opt:1357 #, fuzzy #| msgid "Enable exception handling" msgid "Enable exception handling." msgstr "Уключыць апрацоўку выключэньняў" -#: common.opt:1357 +#: common.opt:1361 msgid "Perform a number of minor, expensive optimizations." msgstr "" -#: common.opt:1361 +#: common.opt:1365 msgid "-fexcess-precision=[fast|standard]\tSpecify handling of excess floating-point precision." msgstr "" -#: common.opt:1364 +#: common.opt:1368 #, fuzzy, c-format msgid "unknown excess precision style %qs" msgstr "невядомая назва рэгістра: %s\n" -#: common.opt:1376 +#: common.opt:1380 msgid "-fpermitted-flt-eval-methods=[c11|ts-18661]\tSpecify which values of FLT_EVAL_METHOD are permitted." msgstr "" -#: common.opt:1379 +#: common.opt:1383 #, c-format msgid "unknown specification for the set of FLT_EVAL_METHOD values to permit %qs" msgstr "" -#: common.opt:1392 +#: common.opt:1396 msgid "Output lto objects containing both the intermediate language and binary output." msgstr "" -#: common.opt:1396 +#: common.opt:1400 msgid "Assume no NaNs or infinities are generated." msgstr "" -#: common.opt:1400 +#: common.opt:1404 msgid "-ffixed-\tMark as being unavailable to the compiler." msgstr "" -#: common.opt:1404 +#: common.opt:1408 msgid "Don't allocate floats and doubles in extended-precision registers." msgstr "" -#: common.opt:1412 +#: common.opt:1416 msgid "Perform a forward propagation pass on RTL." msgstr "" -#: common.opt:1416 +#: common.opt:1420 msgid "-ffp-contract=[off|on|fast]\tPerform floating-point expression contraction." msgstr "" -#: common.opt:1419 +#: common.opt:1423 #, c-format msgid "unknown floating point contraction style %qs" msgstr "" -#: common.opt:1433 +#: common.opt:1437 msgid "Allow built-in functions ceil, floor, round, trunc to raise \"inexact\" exceptions." msgstr "" -#: common.opt:1440 +#: common.opt:1444 msgid "Allow function addresses to be held in registers." msgstr "" -#: common.opt:1444 +#: common.opt:1448 #, fuzzy #| msgid "for each function it appears in.)" msgid "Place each function into its own section." msgstr "адзін раз для кожнай функцыі, дзе ён з'яўляецца.)" -#: common.opt:1448 +#: common.opt:1452 msgid "Perform global common subexpression elimination." msgstr "" -#: common.opt:1452 +#: common.opt:1456 msgid "Perform enhanced load motion during global common subexpression elimination." msgstr "" -#: common.opt:1456 +#: common.opt:1460 msgid "Perform store motion after global common subexpression elimination." msgstr "" -#: common.opt:1460 +#: common.opt:1464 msgid "Perform redundant load after store elimination in global common subexpression elimination." msgstr "" -#: common.opt:1465 +#: common.opt:1469 msgid "Perform global common subexpression elimination after register allocation has finished." msgstr "" -#: common.opt:1482 +#: common.opt:1486 msgid "-fgnat-encodings=[all|gdb|minimal]\tSelect the balance between GNAT encodings and standard DWARF emitted in the debug information" msgstr "" -#: common.opt:1487 +#: common.opt:1491 msgid "Enable in and out of Graphite representation." msgstr "" -#: common.opt:1491 +#: common.opt:1495 msgid "Enable Graphite Identity transformation." msgstr "" -#: common.opt:1495 +#: common.opt:1499 msgid "Enable hoisting adjacent loads to encourage generating conditional move instructions." msgstr "" -#: common.opt:1504 +#: common.opt:1508 msgid "Mark all loops as parallel." msgstr "" -#: common.opt:1508 common.opt:1516 common.opt:2587 +#: common.opt:1512 common.opt:1520 common.opt:2591 msgid "Enable loop nest transforms. Same as -floop-nest-optimize." msgstr "" -#: common.opt:1512 +#: common.opt:1516 msgid "Enable loop interchange on trees." msgstr "" -#: common.opt:1520 +#: common.opt:1524 msgid "Perform unroll-and-jam on loops." msgstr "" -#: common.opt:1524 +#: common.opt:1528 msgid "Enable support for GNU transactional memory." msgstr "" -#: common.opt:1528 +#: common.opt:1532 msgid "Use STB_GNU_UNIQUE if supported by the assembler." msgstr "" -#: common.opt:1536 +#: common.opt:1540 msgid "Enable the loop nest optimizer." msgstr "" -#: common.opt:1540 +#: common.opt:1544 msgid "Force bitfield accesses to match their type width." msgstr "" -#: common.opt:1544 +#: common.opt:1548 msgid "Merge adjacent stores." msgstr "" -#: common.opt:1548 +#: common.opt:1552 msgid "Enable guessing of branch probabilities." msgstr "" -#: common.opt:1556 +#: common.opt:1560 #, fuzzy msgid "Process #ident directives." msgstr "нерэчаісны ініцыялізатар" -#: common.opt:1560 +#: common.opt:1564 msgid "Perform conversion of conditional jumps to branchless equivalents." msgstr "" -#: common.opt:1564 +#: common.opt:1568 msgid "Perform conversion of conditional jumps to conditional execution." msgstr "" -#: common.opt:1568 +#: common.opt:1572 msgid "-fstack-reuse=[all|named_vars|none]\tSet stack reuse level for local variables." msgstr "" -#: common.opt:1571 +#: common.opt:1575 #, c-format msgid "unknown Stack Reuse Level %qs" msgstr "" -#: common.opt:1584 +#: common.opt:1588 msgid "Convert conditional jumps in innermost loops to branchless equivalents." msgstr "" -#: common.opt:1596 +#: common.opt:1600 #, fuzzy #| msgid "Do not generate char instructions" msgid "Do not generate .size directives." msgstr "Не генерыраваць сімвальныя інструкцыі" -#: common.opt:1600 +#: common.opt:1604 msgid "Perform indirect inlining." msgstr "" -#: common.opt:1606 +#: common.opt:1610 msgid "Enable inlining of function declared \"inline\", disabling disables all inlining." msgstr "" -#: common.opt:1610 +#: common.opt:1614 msgid "Integrate functions into their callers when code size is known not to grow." msgstr "" -#: common.opt:1614 +#: common.opt:1618 msgid "Integrate functions not declared \"inline\" into their callers when profitable." msgstr "" -#: common.opt:1618 +#: common.opt:1622 msgid "Integrate functions only required by their single caller." msgstr "" -#: common.opt:1625 +#: common.opt:1629 msgid "-finline-limit=\tLimit the size of inlined functions to ." msgstr "" -#: common.opt:1629 +#: common.opt:1633 msgid "Inline __atomic operations when a lock free instruction sequence is available." msgstr "" -#: common.opt:1636 +#: common.opt:1640 msgid "-fcf-protection=[full|branch|return|none]\tInstrument functions with checks to verify jump/call/return control-flow transfer instructions have valid targets." msgstr "" -#: common.opt:1640 +#: common.opt:1644 #, c-format msgid "unknown Control-Flow Protection Level %qs" msgstr "" -#: common.opt:1656 +#: common.opt:1660 msgid "Instrument function entry and exit with profiling calls." msgstr "" -#: common.opt:1660 +#: common.opt:1664 msgid "-finstrument-functions-exclude-function-list=name,... Do not instrument listed functions." msgstr "" -#: common.opt:1664 +#: common.opt:1668 msgid "-finstrument-functions-exclude-file-list=filename,... Do not instrument functions listed in files." msgstr "" -#: common.opt:1668 +#: common.opt:1672 msgid "Perform interprocedural constant propagation." msgstr "" -#: common.opt:1672 +#: common.opt:1676 msgid "Perform cloning to make Interprocedural constant propagation stronger." msgstr "" -#: common.opt:1680 +#: common.opt:1684 msgid "Perform interprocedural bitwise constant propagation." msgstr "" -#: common.opt:1684 +#: common.opt:1688 msgid "Perform interprocedural profile propagation." msgstr "" -#: common.opt:1688 +#: common.opt:1692 msgid "Perform interprocedural points-to analysis." msgstr "" -#: common.opt:1692 +#: common.opt:1696 msgid "Discover pure and const functions." msgstr "" -#: common.opt:1696 +#: common.opt:1700 msgid "Perform Identical Code Folding for functions and read-only variables." msgstr "" -#: common.opt:1700 +#: common.opt:1704 msgid "Perform Identical Code Folding for functions." msgstr "" -#: common.opt:1704 +#: common.opt:1708 msgid "Perform Identical Code Folding for variables." msgstr "" -#: common.opt:1708 +#: common.opt:1712 msgid "Discover readonly and non addressable static variables." msgstr "" -#: common.opt:1720 +#: common.opt:1724 msgid "Perform IPA Value Range Propagation." msgstr "" -#: common.opt:1724 +#: common.opt:1728 msgid "-fira-algorithm=[CB|priority]\tSet the used IRA algorithm." msgstr "" -#: common.opt:1727 +#: common.opt:1731 #, fuzzy, c-format #| msgid "unknown register name: %s" msgid "unknown IRA algorithm %qs" msgstr "невядомая назва рэгістра: %s" -#: common.opt:1737 +#: common.opt:1741 msgid "-fira-region=[one|all|mixed]\tSet regions for IRA." msgstr "" -#: common.opt:1740 +#: common.opt:1744 #, fuzzy, c-format #| msgid "unknown register name: %s" msgid "unknown IRA region %qs" msgstr "невядомая назва рэгістра: %s" -#: common.opt:1753 +#: common.opt:1757 msgid "Use IRA based register pressure calculation in RTL hoist optimizations." msgstr "" -#: common.opt:1758 +#: common.opt:1762 msgid "Use IRA based register pressure calculation in RTL loop optimizations." msgstr "" -#: common.opt:1763 +#: common.opt:1767 msgid "Share slots for saving different hard registers." msgstr "" -#: common.opt:1767 +#: common.opt:1771 msgid "Share stack slots for spilled pseudo-registers." msgstr "" -#: common.opt:1771 +#: common.opt:1775 msgid "-fira-verbose=\tControl IRA's level of diagnostic messages." msgstr "" -#: common.opt:1775 +#: common.opt:1779 msgid "Optimize induction variables on trees." msgstr "" -#: common.opt:1779 +#: common.opt:1783 msgid "Use jump tables for sufficiently large switch statements." msgstr "" -#: common.opt:1783 +#: common.opt:1787 msgid "Generate code for functions even if they are fully inlined." msgstr "" -#: common.opt:1787 +#: common.opt:1791 msgid "Generate code for static functions even if they are never called." msgstr "" -#: common.opt:1791 +#: common.opt:1795 msgid "Emit static const variables even if they are not used." msgstr "" -#: common.opt:1795 +#: common.opt:1799 msgid "Give external symbols a leading underscore." msgstr "" -#: common.opt:1803 +#: common.opt:1807 msgid "Do CFG-sensitive rematerialization in LRA." msgstr "" -#: common.opt:1807 +#: common.opt:1811 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable link-time optimization." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:1811 +#: common.opt:1815 msgid "Link-time optimization with number of parallel jobs or jobserver." msgstr "" -#: common.opt:1814 +#: common.opt:1818 #, fuzzy, c-format #| msgid "unknown machine mode `%s'" msgid "unknown LTO partitioning model %qs" msgstr "невядомы рэжым машыны \"%s\"" -#: common.opt:1833 +#: common.opt:1837 msgid "Specify the algorithm to partition symbols and vars at linktime." msgstr "" -#: common.opt:1838 +#: common.opt:1842 msgid "-flto-compression-level=\tUse zlib compression level for IL." msgstr "" -#: common.opt:1842 +#: common.opt:1846 msgid "Merge C++ types using One Definition Rule." msgstr "" -#: common.opt:1846 +#: common.opt:1850 msgid "Report various link-time optimization statistics." msgstr "" -#: common.opt:1850 +#: common.opt:1854 msgid "Report various link-time optimization statistics for WPA only." msgstr "" -#: common.opt:1854 +#: common.opt:1858 #, fuzzy msgid "Set errno after built-in math functions." msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: common.opt:1858 +#: common.opt:1862 msgid "-fmax-errors=\tMaximum number of errors to report." msgstr "" -#: common.opt:1862 +#: common.opt:1866 msgid "Report on permanent memory allocation." msgstr "" -#: common.opt:1866 +#: common.opt:1870 msgid "Report on permanent memory allocation in WPA only." msgstr "" -#: common.opt:1873 +#: common.opt:1877 msgid "Attempt to merge identical constants and constant variables." msgstr "" -#: common.opt:1877 +#: common.opt:1881 msgid "Attempt to merge identical constants across compilation units." msgstr "" -#: common.opt:1881 +#: common.opt:1885 msgid "Attempt to merge identical debug strings across compilation units." msgstr "" -#: common.opt:1885 +#: common.opt:1889 msgid "-fmessage-length=\tLimit diagnostics to characters per line. 0 suppresses line-wrapping." msgstr "" -#: common.opt:1889 +#: common.opt:1893 msgid "Perform SMS based modulo scheduling before the first scheduling pass." msgstr "" -#: common.opt:1893 +#: common.opt:1897 msgid "Perform SMS based modulo scheduling with register moves allowed." msgstr "" -#: common.opt:1897 +#: common.opt:1901 msgid "Move loop invariant computations out of loops." msgstr "" -#: common.opt:1901 +#: common.opt:1905 msgid "Use the RTL dead code elimination pass." msgstr "" -#: common.opt:1905 +#: common.opt:1909 msgid "Use the RTL dead store elimination pass." msgstr "" -#: common.opt:1909 +#: common.opt:1913 msgid "Enable/Disable the traditional scheduling in loops that already passed modulo scheduling." msgstr "" -#: common.opt:1913 +#: common.opt:1917 msgid "Support synchronous non-call exceptions." msgstr "" -#: common.opt:1916 +#: common.opt:1920 #, fuzzy, c-format msgid "options or targets missing after %qs" msgstr "аргумент для \"%s\" прапушчан" -#: common.opt:1917 +#: common.opt:1921 msgid "-foffload== Specify offloading targets and options for them." msgstr "" -#: common.opt:1921 +#: common.opt:1925 msgid "-foffload-abi=[lp64|ilp32] Set the ABI to use in an offload compiler." msgstr "" -#: common.opt:1924 +#: common.opt:1928 #, c-format msgid "unknown offload ABI %qs" msgstr "" -#: common.opt:1934 +#: common.opt:1938 msgid "When possible do not generate stack frames." msgstr "" -#: common.opt:1938 +#: common.opt:1942 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable all optimization info dumps on stderr." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:1942 +#: common.opt:1946 msgid "-fopt-info[-=filename]\tDump compiler optimization details." msgstr "" -#: common.opt:1950 +#: common.opt:1954 msgid "Optimize sibling and tail recursive calls." msgstr "" -#: common.opt:1954 +#: common.opt:1958 msgid "Perform partial inlining." msgstr "" -#: common.opt:1958 common.opt:1962 +#: common.opt:1962 common.opt:1966 msgid "Report on memory allocation before interprocedural optimization." msgstr "" -#: common.opt:1966 +#: common.opt:1970 msgid "Pack structure members together without holes." msgstr "" -#: common.opt:1970 +#: common.opt:1974 msgid "-fpack-struct=\tSet initial maximum structure member alignment." msgstr "" -#: common.opt:1974 +#: common.opt:1978 msgid "Return small aggregates in memory, not registers." msgstr "" -#: common.opt:1978 +#: common.opt:1982 msgid "Perform loop peeling." msgstr "" -#: common.opt:1982 +#: common.opt:1986 msgid "Enable machine specific peephole optimizations." msgstr "" -#: common.opt:1986 +#: common.opt:1990 msgid "Enable an RTL peephole pass before sched2." msgstr "" -#: common.opt:1990 +#: common.opt:1994 msgid "Generate position-independent code if possible (large mode)." msgstr "" -#: common.opt:1994 +#: common.opt:1998 msgid "Generate position-independent code for executables if possible (large mode)." msgstr "" -#: common.opt:1998 +#: common.opt:2002 msgid "Generate position-independent code if possible (small mode)." msgstr "" -#: common.opt:2002 +#: common.opt:2006 msgid "Generate position-independent code for executables if possible (small mode)." msgstr "" -#: common.opt:2006 +#: common.opt:2010 msgid "Use PLT for PIC calls (-fno-plt: load the address from GOT at call site)." msgstr "" -#: common.opt:2010 +#: common.opt:2014 msgid "Specify a plugin to load." msgstr "" -#: common.opt:2014 +#: common.opt:2018 msgid "-fplugin-arg--[=]\tSpecify argument = for plugin ." msgstr "" -#: common.opt:2018 +#: common.opt:2022 msgid "Run predictive commoning optimization." msgstr "" -#: common.opt:2022 +#: common.opt:2026 msgid "Generate prefetch instructions, if available, for arrays in loops." msgstr "" -#: common.opt:2026 +#: common.opt:2030 msgid "Enable basic program profiling code." msgstr "" -#: common.opt:2030 +#: common.opt:2034 msgid "Generate absolute source path names for gcov." msgstr "" -#: common.opt:2034 +#: common.opt:2038 msgid "Insert arc-based program profiling code." msgstr "" -#: common.opt:2038 +#: common.opt:2042 msgid "Set the top-level directory for storing the profile data. The default is 'pwd'." msgstr "" -#: common.opt:2043 +#: common.opt:2047 msgid "Enable correction of flow inconsistent profile data input." msgstr "" -#: common.opt:2047 +#: common.opt:2051 msgid "-fprofile-update=[single|atomic|prefer-atomic]\tSet the profile update method." msgstr "" -#: common.opt:2050 +#: common.opt:2054 #, fuzzy, c-format #| msgid "unknown register name: %s" msgid "unknown profile update method %qs" msgstr "невядомая назва рэгістра: %s" -#: common.opt:2063 +#: common.opt:2067 msgid "Enable common options for generating profile info for profile feedback directed optimizations." msgstr "" -#: common.opt:2067 +#: common.opt:2071 msgid "Enable common options for generating profile info for profile feedback directed optimizations, and set -fprofile-dir=." msgstr "" -#: common.opt:2071 +#: common.opt:2075 msgid "Enable common options for performing profile feedback directed optimizations." msgstr "" -#: common.opt:2075 +#: common.opt:2079 msgid "Enable common options for performing profile feedback directed optimizations, and set -fprofile-dir=." msgstr "" -#: common.opt:2079 +#: common.opt:2083 msgid "Insert code to profile values of expressions." msgstr "" -#: common.opt:2083 +#: common.opt:2087 msgid "Report on consistency of profile." msgstr "" -#: common.opt:2087 +#: common.opt:2091 msgid "Enable function reordering that improves code placement." msgstr "" -#: common.opt:2091 +#: common.opt:2095 msgid "Insert NOP instructions at each function entry." msgstr "" -#: common.opt:2098 +#: common.opt:2102 msgid "-frandom-seed=\tMake compile reproducible using ." msgstr "" -#: common.opt:2108 +#: common.opt:2112 msgid "Record gcc command line switches in the object file." msgstr "" -#: common.opt:2112 +#: common.opt:2116 #, fuzzy msgid "Return small aggregates in registers." msgstr "Не выкарыстоўваць рэгістра sb" -#: common.opt:2120 +#: common.opt:2124 msgid "Tell DSE that the storage for a C++ object is dead when the constructor starts and when the destructor finishes." msgstr "" -#: common.opt:2128 +#: common.opt:2132 msgid "Relief of register pressure through live range shrinkage." msgstr "" -#: common.opt:2132 +#: common.opt:2136 msgid "Perform a register renaming optimization pass." msgstr "" -#: common.opt:2136 +#: common.opt:2140 msgid "Perform a target dependent instruction fusion optimization pass." msgstr "" -#: common.opt:2140 +#: common.opt:2144 msgid "Reorder basic blocks to improve code placement." msgstr "" -#: common.opt:2144 +#: common.opt:2148 msgid "-freorder-blocks-algorithm=[simple|stc]\tSet the used basic block reordering algorithm." msgstr "" -#: common.opt:2147 +#: common.opt:2151 #, c-format msgid "unknown basic block reordering algorithm %qs" msgstr "" -#: common.opt:2157 +#: common.opt:2161 msgid "Reorder basic blocks and partition into hot and cold sections." msgstr "" -#: common.opt:2161 +#: common.opt:2165 msgid "Reorder functions to improve code placement." msgstr "" -#: common.opt:2165 +#: common.opt:2169 msgid "Add a common subexpression elimination pass after loop optimizations." msgstr "" -#: common.opt:2173 +#: common.opt:2177 msgid "Disable optimizations that assume default FP rounding behavior." msgstr "" -#: common.opt:2177 +#: common.opt:2181 msgid "Enable scheduling across basic blocks." msgstr "" -#: common.opt:2181 +#: common.opt:2185 msgid "Enable register pressure sensitive insn scheduling." msgstr "" -#: common.opt:2185 +#: common.opt:2189 msgid "Allow speculative motion of non-loads." msgstr "" -#: common.opt:2189 +#: common.opt:2193 msgid "Allow speculative motion of some loads." msgstr "" -#: common.opt:2193 +#: common.opt:2197 msgid "Allow speculative motion of more loads." msgstr "" -#: common.opt:2197 +#: common.opt:2201 msgid "-fsched-verbose=\tSet the verbosity level of the scheduler." msgstr "" -#: common.opt:2201 +#: common.opt:2205 msgid "If scheduling post reload, do superblock scheduling." msgstr "" -#: common.opt:2209 +#: common.opt:2213 msgid "Reschedule instructions before register allocation." msgstr "" -#: common.opt:2213 +#: common.opt:2217 msgid "Reschedule instructions after register allocation." msgstr "" -#: common.opt:2220 +#: common.opt:2224 msgid "Schedule instructions using selective scheduling algorithm." msgstr "" -#: common.opt:2224 +#: common.opt:2228 msgid "Run selective scheduling after reload." msgstr "" -#: common.opt:2228 +#: common.opt:2232 msgid "Run self-tests, using the given path to locate test files." msgstr "" -#: common.opt:2232 +#: common.opt:2236 msgid "Perform software pipelining of inner loops during selective scheduling." msgstr "" -#: common.opt:2236 +#: common.opt:2240 msgid "Perform software pipelining of outer loops during selective scheduling." msgstr "" -#: common.opt:2240 +#: common.opt:2244 msgid "Reschedule pipelined regions without pipelining." msgstr "" -#: common.opt:2244 +#: common.opt:2248 msgid "Allow interposing function (or variables) by ones with different semantics (or initializer) respectively by dynamic linker." msgstr "" -#: common.opt:2250 +#: common.opt:2254 msgid "Allow premature scheduling of queued insns." msgstr "" -#: common.opt:2254 +#: common.opt:2258 msgid "-fsched-stalled-insns=\tSet number of queued insns that can be prematurely scheduled." msgstr "" -#: common.opt:2262 +#: common.opt:2266 msgid "Set dependence distance checking in premature scheduling of queued insns." msgstr "" -#: common.opt:2266 +#: common.opt:2270 msgid "-fsched-stalled-insns-dep=\tSet dependence distance checking in premature scheduling of queued insns." msgstr "" -#: common.opt:2270 +#: common.opt:2274 msgid "Enable the group heuristic in the scheduler." msgstr "" -#: common.opt:2274 +#: common.opt:2278 msgid "Enable the critical path heuristic in the scheduler." msgstr "" -#: common.opt:2278 +#: common.opt:2282 msgid "Enable the speculative instruction heuristic in the scheduler." msgstr "" -#: common.opt:2282 +#: common.opt:2286 msgid "Enable the rank heuristic in the scheduler." msgstr "" -#: common.opt:2286 +#: common.opt:2290 msgid "Enable the last instruction heuristic in the scheduler." msgstr "" -#: common.opt:2290 +#: common.opt:2294 msgid "Enable the dependent count heuristic in the scheduler." msgstr "" -#: common.opt:2294 +#: common.opt:2298 msgid "Access data in the same section from shared anchor points." msgstr "" -#: common.opt:2306 +#: common.opt:2310 msgid "Turn on Redundant Extensions Elimination pass." msgstr "" -#: common.opt:2310 +#: common.opt:2314 msgid "Show column numbers in diagnostics, when available. Default on." msgstr "" -#: common.opt:2314 +#: common.opt:2318 msgid "Emit function prologues only before parts of the function that need it, rather than at the top of the function." msgstr "" -#: common.opt:2319 +#: common.opt:2323 msgid "Shrink-wrap parts of the prologue and epilogue separately." msgstr "" -#: common.opt:2323 +#: common.opt:2327 msgid "Disable optimizations observable by IEEE signaling NaNs." msgstr "" -#: common.opt:2327 +#: common.opt:2331 msgid "Disable floating point optimizations that ignore the IEEE signedness of zero." msgstr "" -#: common.opt:2331 +#: common.opt:2335 msgid "Convert floating point constants to single precision constants." msgstr "" -#: common.opt:2335 +#: common.opt:2339 msgid "Split lifetimes of induction variables when loops are unrolled." msgstr "" -#: common.opt:2339 +#: common.opt:2343 msgid "Generate discontiguous stack frames." msgstr "" -#: common.opt:2343 +#: common.opt:2347 msgid "Split wide types into independent registers." msgstr "" -#: common.opt:2347 +#: common.opt:2351 msgid "Enable backward propagation of use properties at the SSA level." msgstr "" -#: common.opt:2351 +#: common.opt:2355 msgid "Optimize conditional patterns using SSA PHI nodes." msgstr "" -#: common.opt:2355 +#: common.opt:2359 msgid "Optimize amount of stdarg registers saved to stack at start of function." msgstr "" -#: common.opt:2359 +#: common.opt:2363 msgid "Apply variable expansion when loops are unrolled." msgstr "" -#: common.opt:2363 +#: common.opt:2367 #, fuzzy #| msgid "Insert stack checking code into the program" msgid "-fstack-check=[no|generic|specific]\tInsert stack checking code into the program." msgstr "Уключаць код правэркі стэку ў праграму" -#: common.opt:2367 +#: common.opt:2371 #, fuzzy #| msgid "Insert stack checking code into the program" msgid "Insert stack checking code into the program. Same as -fstack-check=specific." msgstr "Уключаць код правэркі стэку ў праграму" -#: common.opt:2371 +#: common.opt:2375 msgid "Insert code to probe each page of stack space as it is allocated to protect from stack-clash style attacks." msgstr "" -#: common.opt:2379 +#: common.opt:2383 msgid "-fstack-limit-register=\tTrap if the stack goes past ." msgstr "" -#: common.opt:2383 +#: common.opt:2387 msgid "-fstack-limit-symbol=\tTrap if the stack goes past symbol ." msgstr "" -#: common.opt:2387 +#: common.opt:2391 msgid "Use propolice as a stack protection method." msgstr "" -#: common.opt:2391 +#: common.opt:2395 msgid "Use a stack protection method for every function." msgstr "" -#: common.opt:2395 +#: common.opt:2399 msgid "Use a smart stack protection method for certain functions." msgstr "" -#: common.opt:2399 +#: common.opt:2403 msgid "Use stack protection method only for functions with the stack_protect attribute." msgstr "" -#: common.opt:2403 +#: common.opt:2407 msgid "Output stack usage information on a per-function basis." msgstr "" -#: common.opt:2415 +#: common.opt:2419 msgid "Assume strict aliasing rules apply." msgstr "" -#: common.opt:2419 +#: common.opt:2423 msgid "Treat signed overflow as undefined. Negated as -fwrapv -fwrapv-pointer." msgstr "" -#: common.opt:2423 +#: common.opt:2427 msgid "Implement __atomic operations via libcalls to legacy __sync functions." msgstr "" -#: common.opt:2427 +#: common.opt:2431 msgid "Check for syntax errors, then stop." msgstr "" -#: common.opt:2431 +#: common.opt:2435 msgid "Create data files needed by \"gcov\"." msgstr "" -#: common.opt:2435 +#: common.opt:2439 msgid "Perform jump threading optimizations." msgstr "" -#: common.opt:2439 +#: common.opt:2443 msgid "Report the time taken by each compiler pass." msgstr "" -#: common.opt:2443 +#: common.opt:2447 msgid "Record times taken by sub-phases separately." msgstr "" -#: common.opt:2447 +#: common.opt:2451 msgid "-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec]\tSet the default thread-local storage code generation model." msgstr "" -#: common.opt:2450 +#: common.opt:2454 #, fuzzy, c-format #| msgid "unknown machine mode `%s'" msgid "unknown TLS model %qs" msgstr "невядомы рэжым машыны \"%s\"" -#: common.opt:2466 +#: common.opt:2470 msgid "Reorder top level functions, variables, and asms." msgstr "" -#: common.opt:2470 +#: common.opt:2474 msgid "Perform superblock formation via tail duplication." msgstr "" -#: common.opt:2474 +#: common.opt:2478 msgid "For targets that normally need trampolines for nested functions, always generate them instead of using descriptors." msgstr "" -#: common.opt:2482 +#: common.opt:2486 msgid "Assume floating-point operations can trap." msgstr "" -#: common.opt:2486 +#: common.opt:2490 msgid "Trap for signed overflow in addition, subtraction and multiplication." msgstr "" -#: common.opt:2490 +#: common.opt:2494 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable SSA-CCP optimization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2494 +#: common.opt:2498 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable SSA-BIT-CCP optimization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2502 +#: common.opt:2506 msgid "Enable loop header copying on trees." msgstr "" -#: common.opt:2510 +#: common.opt:2514 msgid "Enable SSA coalescing of user variables." msgstr "" -#: common.opt:2518 +#: common.opt:2522 msgid "Enable copy propagation on trees." msgstr "" -#: common.opt:2526 +#: common.opt:2530 msgid "Transform condition stores into unconditional ones." msgstr "" -#: common.opt:2530 +#: common.opt:2534 msgid "Perform conversions of switch initializations." msgstr "" -#: common.opt:2534 +#: common.opt:2538 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable SSA dead code elimination optimization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2538 +#: common.opt:2542 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable dominator optimizations." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2542 +#: common.opt:2546 msgid "Enable tail merging on trees." msgstr "" -#: common.opt:2546 +#: common.opt:2550 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable dead store elimination." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2550 +#: common.opt:2554 msgid "Enable forward propagation on trees." msgstr "" -#: common.opt:2554 +#: common.opt:2558 msgid "Enable Full Redundancy Elimination (FRE) on trees." msgstr "" -#: common.opt:2558 +#: common.opt:2562 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable string length optimizations on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2562 +#: common.opt:2566 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:2568 +#: common.opt:2572 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:2575 +#: common.opt:2579 msgid "Enable loop distribution on trees." msgstr "" -#: common.opt:2579 +#: common.opt:2583 msgid "Enable loop distribution for patterns transformed into a library call." msgstr "" -#: common.opt:2583 +#: common.opt:2587 msgid "Enable loop invariant motion on trees." msgstr "" -#: common.opt:2591 +#: common.opt:2595 msgid "Create canonical induction variables in loops." msgstr "" -#: common.opt:2595 +#: common.opt:2599 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable loop optimizations on tree level." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2599 +#: common.opt:2603 msgid "-ftree-parallelize-loops=\tEnable automatic parallelization of loops." msgstr "" -#: common.opt:2603 +#: common.opt:2607 msgid "Enable hoisting loads from conditional pointers." msgstr "" -#: common.opt:2607 +#: common.opt:2611 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable SSA-PRE optimization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2611 +#: common.opt:2615 msgid "In SSA-PRE optimization on trees, enable partial-partial redundancy elimination." msgstr "" -#: common.opt:2615 +#: common.opt:2619 msgid "Perform function-local points-to analysis on trees." msgstr "" -#: common.opt:2619 +#: common.opt:2623 msgid "Enable reassociation on tree level." msgstr "" -#: common.opt:2627 +#: common.opt:2631 msgid "Enable SSA code sinking on trees." msgstr "" -#: common.opt:2631 +#: common.opt:2635 msgid "Perform straight-line strength reduction." msgstr "" -#: common.opt:2635 +#: common.opt:2639 msgid "Perform scalar replacement of aggregates." msgstr "" -#: common.opt:2639 +#: common.opt:2643 msgid "Replace temporary expressions in the SSA->normal pass." msgstr "" -#: common.opt:2643 +#: common.opt:2647 msgid "Perform live range splitting during the SSA->normal pass." msgstr "" -#: common.opt:2647 +#: common.opt:2651 msgid "Perform Value Range Propagation on trees." msgstr "" -#: common.opt:2651 +#: common.opt:2655 msgid "Split paths leading to loop backedges." msgstr "" -#: common.opt:2655 +#: common.opt:2659 msgid "Assume common declarations may be overridden with ones with a larger trailing array." msgstr "" -#: common.opt:2660 +#: common.opt:2664 msgid "Compile whole compilation unit at a time." msgstr "" -#: common.opt:2664 +#: common.opt:2668 msgid "Perform loop unrolling when iteration count is known." msgstr "" -#: common.opt:2668 +#: common.opt:2672 msgid "Perform loop unrolling for all loops." msgstr "" -#: common.opt:2679 +#: common.opt:2683 msgid "Allow optimization for floating-point arithmetic which may change the result of the operation due to rounding." msgstr "" -#: common.opt:2684 +#: common.opt:2688 msgid "Same as -fassociative-math for expressions which include division." msgstr "" -#: common.opt:2692 +#: common.opt:2696 msgid "Allow math optimizations that may violate IEEE or ISO standards." msgstr "" -#: common.opt:2696 +#: common.opt:2700 msgid "Perform loop unswitching." msgstr "" -#: common.opt:2700 +#: common.opt:2704 msgid "Perform loop splitting." msgstr "" -#: common.opt:2704 +#: common.opt:2708 #, fuzzy #| msgid "Enable exception handling" msgid "Just generate unwind tables for exception handling." msgstr "Уключыць апрацоўку выключэньняў" -#: common.opt:2708 +#: common.opt:2712 msgid "Use the bfd linker instead of the default linker." msgstr "" -#: common.opt:2712 +#: common.opt:2716 msgid "Use the gold linker instead of the default linker." msgstr "" -#: common.opt:2724 +#: common.opt:2728 msgid "Perform variable tracking." msgstr "" -#: common.opt:2732 +#: common.opt:2736 msgid "Perform variable tracking by annotating assignments." msgstr "" -#: common.opt:2738 +#: common.opt:2742 msgid "Toggle -fvar-tracking-assignments." msgstr "" -#: common.opt:2746 +#: common.opt:2750 msgid "Perform variable tracking and also tag variables that are uninitialized." msgstr "" -#: common.opt:2751 +#: common.opt:2755 msgid "Enable vectorization on trees." msgstr "" -#: common.opt:2759 +#: common.opt:2763 #, fuzzy #| msgid "Enable SSA optimizations" msgid "Enable loop vectorization on trees." msgstr "Уключаць SSA аптымізацыю" -#: common.opt:2763 +#: common.opt:2767 msgid "Enable basic block vectorization (SLP) on trees." msgstr "" -#: common.opt:2767 +#: common.opt:2771 msgid "Specifies the cost model for vectorization. -fvect-cost-model=[unlimited|dynamic|cheap]\tSpecifies the cost model for vectorization." msgstr "" -#: common.opt:2772 +#: common.opt:2776 msgid "-fsimd-cost-model=[unlimited|dynamic|cheap]\tSpecifies the vectorization cost model for code marked with a simd directive." msgstr "" -#: common.opt:2775 +#: common.opt:2779 #, fuzzy, c-format #| msgid "unknown machine mode `%s'" msgid "unknown vectorizer cost model %qs" msgstr "невядомы рэжым машыны \"%s\"" -#: common.opt:2788 +#: common.opt:2792 msgid "Enables the dynamic vectorizer cost model. Preserved for backward compatibility." msgstr "" -#: common.opt:2796 +#: common.opt:2800 msgid "Enable copy propagation of scalar-evolution information." msgstr "" -#: common.opt:2806 +#: common.opt:2810 msgid "Add extra commentary to assembler output." msgstr "" -#: common.opt:2810 +#: common.opt:2814 msgid "-fvisibility=[default|internal|hidden|protected]\tSet the default symbol visibility." msgstr "" -#: common.opt:2813 +#: common.opt:2817 #, fuzzy, c-format #| msgid "unrecognized section name \"%s\"" msgid "unrecognized visibility value %qs" msgstr "нераспазнаная назва сэкцыі \"%s\"" -#: common.opt:2829 +#: common.opt:2833 msgid "Validate vtable pointers before using them." msgstr "" -#: common.opt:2832 +#: common.opt:2836 #, c-format msgid "unknown vtable verify initialization priority %qs" msgstr "" -#: common.opt:2845 +#: common.opt:2849 msgid "Output vtable verification counters." msgstr "" -#: common.opt:2849 +#: common.opt:2853 msgid "Output vtable verification pointer sets information." msgstr "" -#: common.opt:2853 +#: common.opt:2857 msgid "Use expression value profiles in optimizations." msgstr "" -#: common.opt:2857 +#: common.opt:2861 msgid "Construct webs and split unrelated uses of single variable." msgstr "" -#: common.opt:2861 +#: common.opt:2865 msgid "Enable conditional dead code elimination for builtin calls." msgstr "" -#: common.opt:2865 +#: common.opt:2869 msgid "Perform whole program optimizations." msgstr "" -#: common.opt:2869 +#: common.opt:2873 msgid "Assume pointer overflow wraps around." msgstr "" -#: common.opt:2873 +#: common.opt:2877 msgid "Assume signed arithmetic overflow wraps around." msgstr "" -#: common.opt:2877 +#: common.opt:2881 msgid "Put zero initialized data in the bss section." msgstr "" -#: common.opt:2881 +#: common.opt:2885 msgid "Generate debug information in default format." msgstr "" -#: common.opt:2885 +#: common.opt:2889 msgid "Assume assembler support for (DWARF2+) .loc directives" msgstr "" -#: common.opt:2889 +#: common.opt:2893 msgid "Assume assembler support for view in (DWARF2+) .loc directives" msgstr "" -#: common.opt:2892 common.opt:2896 common.opt:2900 common.opt:2904 +#: common.opt:2896 common.opt:2900 common.opt:2904 common.opt:2908 #, fuzzy, c-format msgid "switch %qs no longer supported" msgstr "-pipe не падтрымліваецца." -#: common.opt:2909 +#: common.opt:2913 msgid "Record DW_AT_decl_column and DW_AT_call_column in DWARF." msgstr "" -#: common.opt:2913 +#: common.opt:2917 msgid "Generate debug information in default version of DWARF format." msgstr "" -#: common.opt:2917 +#: common.opt:2921 msgid "Generate debug information in DWARF v2 (or later) format." msgstr "" -#: common.opt:2921 +#: common.opt:2925 msgid "Generate debug information in default extended format." msgstr "" -#: common.opt:2925 +#: common.opt:2929 msgid "Generate extended entry point information for inlined functions" msgstr "" -#: common.opt:2929 +#: common.opt:2933 msgid "Compute locview reset points based on insn length estimates" msgstr "" -#: common.opt:2937 +#: common.opt:2941 msgid "Don't generate DWARF pubnames and pubtypes sections." msgstr "" -#: common.opt:2941 +#: common.opt:2945 msgid "Generate DWARF pubnames and pubtypes sections." msgstr "" -#: common.opt:2945 +#: common.opt:2949 msgid "Generate DWARF pubnames and pubtypes sections with GNU extensions." msgstr "" -#: common.opt:2949 +#: common.opt:2953 msgid "Record gcc command line switches in DWARF DW_AT_producer." msgstr "" -#: common.opt:2953 +#: common.opt:2957 msgid "Generate debug information in separate .dwo files." msgstr "" -#: common.opt:2957 +#: common.opt:2961 #, fuzzy msgid "Generate debug information in STABS format." msgstr "Стварыць код для DLL" -#: common.opt:2961 +#: common.opt:2965 msgid "Generate debug information in extended STABS format." msgstr "" -#: common.opt:2965 +#: common.opt:2969 msgid "Emit progressive recommended breakpoint locations." msgstr "" -#: common.opt:2969 +#: common.opt:2973 msgid "Don't emit DWARF additions beyond selected version." msgstr "" -#: common.opt:2973 +#: common.opt:2977 msgid "Toggle debug information generation." msgstr "" -#: common.opt:2977 +#: common.opt:2981 msgid "Augment variable location lists with progressive views." msgstr "" -#: common.opt:2984 +#: common.opt:2988 #, fuzzy msgid "Generate debug information in VMS format." msgstr "Стварыць код для DLL" -#: common.opt:2988 +#: common.opt:2992 msgid "Generate debug information in XCOFF format." msgstr "" -#: common.opt:2992 +#: common.opt:2996 msgid "Generate debug information in extended XCOFF format." msgstr "" -#: common.opt:3010 +#: common.opt:3014 msgid "Generate compressed debug sections." msgstr "" -#: common.opt:3014 +#: common.opt:3018 msgid "-gz=\tGenerate compressed debug sections in format ." msgstr "" -#: common.opt:3021 +#: common.opt:3025 msgid "-iplugindir=\tSet to be the default plugin directory." msgstr "" -#: common.opt:3025 +#: common.opt:3029 msgid "-imultiarch \tSet to be the multiarch include subdirectory." msgstr "" -#: common.opt:3047 +#: common.opt:3051 #, fuzzy #| msgid " -o Place the output into \n" msgid "-o \tPlace output into ." msgstr " -o <файл> Памясціць вывад у <файл>\n" -#: common.opt:3051 +#: common.opt:3055 #, fuzzy #| msgid "Enable exception handling" msgid "Enable function profiling." msgstr "Уключыць апрацоўку выключэньняў" -#: common.opt:3061 +#: common.opt:3065 msgid "Like -pedantic but issue them as errors." msgstr "" -#: common.opt:3101 +#: common.opt:3105 msgid "Do not display functions compiled or elapsed time." msgstr "" -#: common.opt:3133 +#: common.opt:3137 msgid "Enable verbose output." msgstr "" -#: common.opt:3137 +#: common.opt:3141 msgid "Display the compiler's version." msgstr "" -#: common.opt:3141 +#: common.opt:3145 msgid "Suppress warnings." msgstr "" -#: common.opt:3151 +#: common.opt:3155 msgid "Create a shared library." msgstr "" -#: common.opt:3196 +#: common.opt:3200 msgid "Don't create a dynamically linked position independent executable." msgstr "" -#: common.opt:3200 +#: common.opt:3204 msgid "Create a dynamically linked position independent executable." msgstr "" -#: common.opt:3204 +#: common.opt:3208 msgid "Create a static position independent executable." msgstr "" -#: common.opt:3211 +#: common.opt:3215 msgid "Use caller save register across calls if possible." msgstr "" -#: go/gofrontend/expressions.cc:95 c-family/c-warn.c:598 cp/cvt.c:1308 +#: go/gofrontend/expressions.cc:95 c-family/c-warn.c:599 cp/cvt.c:1308 #: cp/cvt.c:1561 #, gcc-internal-format msgid "value computed is not used" @@ -16396,7 +16397,7 @@ msgid "expected boolean type" msgstr "" #: go/gofrontend/expressions.cc:4331 c/c-parser.c:13477 c/c-parser.c:13484 -#: cp/parser.c:33264 cp/parser.c:33271 +#: cp/parser.c:33261 cp/parser.c:33268 #, gcc-internal-format msgid "expected integer" msgstr "" @@ -16849,14 +16850,14 @@ msgstr "" msgid "ignoring attribute %qE because it conflicts with attribute %qs" msgstr "" -#: attribs.c:449 c-family/c-attribs.c:1894 cp/decl.c:13690 cp/friend.c:302 -#: cp/tree.c:4559 +#: attribs.c:449 c-family/c-attribs.c:1905 cp/decl.c:13714 cp/friend.c:302 +#: cp/tree.c:4607 #, fuzzy, gcc-internal-format msgid "previous declaration here" msgstr "няма папярэдняга аб'яўлення для \"%s\"" #. Warn about and ignore all others for now, but store them. -#: attribs.c:564 c-family/c-attribs.c:2717 objc/objc-act.c:4963 +#: attribs.c:564 c-family/c-attribs.c:2728 objc/objc-act.c:4963 #: objc/objc-act.c:6932 objc/objc-act.c:8119 objc/objc-act.c:8170 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" @@ -16877,18 +16878,18 @@ msgstr "памылковая колькасьць аргументаў, зада #. This is a c++11 attribute that appertains to a #. type-specifier, outside of the definition of, a class #. type. Ignore it. -#: attribs.c:590 cp/decl.c:10999 +#: attribs.c:590 cp/decl.c:11023 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "attribute ignored" msgstr "\"%s\" атрыбут ігнарыруецца" -#: attribs.c:592 cp/decl.c:11000 +#: attribs.c:592 cp/decl.c:11024 #, gcc-internal-format msgid "an attribute that appertains to a type-specifier is ignored" msgstr "" -#: attribs.c:610 c-family/c-attribs.c:3219 +#: attribs.c:610 c-family/c-attribs.c:3230 #, fuzzy, gcc-internal-format msgid "%qE attribute does not apply to types" msgstr "\"%s\" звычайна функцыя" @@ -16904,40 +16905,40 @@ msgid "type attributes ignored after type is already defined" msgstr "" #: attribs.c:691 attribs.c:1622 attribs.c:1632 attribs.c:1642 -#: c-family/c-attribs.c:540 c-family/c-attribs.c:559 c-family/c-attribs.c:577 -#: c-family/c-attribs.c:607 c-family/c-attribs.c:628 c-family/c-attribs.c:649 -#: c-family/c-attribs.c:690 c-family/c-attribs.c:717 c-family/c-attribs.c:733 -#: c-family/c-attribs.c:750 c-family/c-attribs.c:766 c-family/c-attribs.c:792 -#: c-family/c-attribs.c:807 c-family/c-attribs.c:835 c-family/c-attribs.c:852 -#: c-family/c-attribs.c:870 c-family/c-attribs.c:893 c-family/c-attribs.c:931 -#: c-family/c-attribs.c:954 c-family/c-attribs.c:971 c-family/c-attribs.c:1000 -#: c-family/c-attribs.c:1021 c-family/c-attribs.c:1042 -#: c-family/c-attribs.c:1069 c-family/c-attribs.c:1099 -#: c-family/c-attribs.c:1136 c-family/c-attribs.c:1189 -#: c-family/c-attribs.c:1255 c-family/c-attribs.c:1313 -#: c-family/c-attribs.c:1402 c-family/c-attribs.c:1432 -#: c-family/c-attribs.c:1483 c-family/c-attribs.c:1998 -#: c-family/c-attribs.c:2035 c-family/c-attribs.c:2096 -#: c-family/c-attribs.c:2152 c-family/c-attribs.c:2230 -#: c-family/c-attribs.c:2312 c-family/c-attribs.c:2371 -#: c-family/c-attribs.c:2390 c-family/c-attribs.c:2498 -#: c-family/c-attribs.c:2514 c-family/c-attribs.c:2530 -#: c-family/c-attribs.c:2551 c-family/c-attribs.c:2608 -#: c-family/c-attribs.c:2635 c-family/c-attribs.c:2690 -#: c-family/c-attribs.c:2870 c-family/c-attribs.c:2891 -#: c-family/c-attribs.c:3004 c-family/c-attribs.c:3031 -#: c-family/c-attribs.c:3221 c-family/c-attribs.c:3239 -#: c-family/c-attribs.c:3262 c-family/c-attribs.c:3301 -#: c-family/c-attribs.c:3383 c-family/c-attribs.c:3439 -#: c-family/c-attribs.c:3455 c-family/c-attribs.c:3549 -#: c-family/c-common.c:5600 config/darwin.c:2072 config/arm/arm.c:6868 +#: c-family/c-attribs.c:547 c-family/c-attribs.c:566 c-family/c-attribs.c:584 +#: c-family/c-attribs.c:614 c-family/c-attribs.c:635 c-family/c-attribs.c:656 +#: c-family/c-attribs.c:697 c-family/c-attribs.c:728 c-family/c-attribs.c:744 +#: c-family/c-attribs.c:761 c-family/c-attribs.c:777 c-family/c-attribs.c:803 +#: c-family/c-attribs.c:818 c-family/c-attribs.c:846 c-family/c-attribs.c:863 +#: c-family/c-attribs.c:881 c-family/c-attribs.c:904 c-family/c-attribs.c:942 +#: c-family/c-attribs.c:965 c-family/c-attribs.c:982 c-family/c-attribs.c:1011 +#: c-family/c-attribs.c:1032 c-family/c-attribs.c:1053 +#: c-family/c-attribs.c:1080 c-family/c-attribs.c:1110 +#: c-family/c-attribs.c:1147 c-family/c-attribs.c:1200 +#: c-family/c-attribs.c:1266 c-family/c-attribs.c:1324 +#: c-family/c-attribs.c:1413 c-family/c-attribs.c:1443 +#: c-family/c-attribs.c:1494 c-family/c-attribs.c:2009 +#: c-family/c-attribs.c:2046 c-family/c-attribs.c:2107 +#: c-family/c-attribs.c:2163 c-family/c-attribs.c:2241 +#: c-family/c-attribs.c:2323 c-family/c-attribs.c:2382 +#: c-family/c-attribs.c:2401 c-family/c-attribs.c:2509 +#: c-family/c-attribs.c:2525 c-family/c-attribs.c:2541 +#: c-family/c-attribs.c:2562 c-family/c-attribs.c:2619 +#: c-family/c-attribs.c:2646 c-family/c-attribs.c:2701 +#: c-family/c-attribs.c:2881 c-family/c-attribs.c:2902 +#: c-family/c-attribs.c:3015 c-family/c-attribs.c:3042 +#: c-family/c-attribs.c:3232 c-family/c-attribs.c:3250 +#: c-family/c-attribs.c:3273 c-family/c-attribs.c:3312 +#: c-family/c-attribs.c:3394 c-family/c-attribs.c:3450 +#: c-family/c-attribs.c:3466 c-family/c-attribs.c:3560 +#: c-family/c-common.c:5598 config/darwin.c:2072 config/arm/arm.c:6868 #: config/arm/arm.c:6896 config/arm/arm.c:6913 config/avr/avr.c:9698 -#: config/h8300/h8300.c:5483 config/h8300/h8300.c:5507 config/i386/i386.c:6497 -#: config/i386/i386.c:41520 config/ia64/ia64.c:788 -#: config/powerpcspe/powerpcspe.c:35859 config/rs6000/rs6000.c:33056 -#: config/spu/spu.c:3743 ada/gcc-interface/utils.c:6244 -#: ada/gcc-interface/utils.c:6261 ada/gcc-interface/utils.c:6277 -#: ada/gcc-interface/utils.c:6303 brig/brig-lang.c:476 lto/lto-lang.c:283 +#: config/h8300/h8300.c:5483 config/h8300/h8300.c:5507 config/i386/i386.c:6500 +#: config/i386/i386.c:41514 config/ia64/ia64.c:788 +#: config/powerpcspe/powerpcspe.c:35859 config/rs6000/rs6000.c:33112 +#: config/spu/spu.c:3743 ada/gcc-interface/utils.c:6249 +#: ada/gcc-interface/utils.c:6266 ada/gcc-interface/utils.c:6282 +#: ada/gcc-interface/utils.c:6308 brig/brig-lang.c:476 lto/lto-lang.c:283 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "%qE attribute ignored" @@ -17321,88 +17322,103 @@ msgstr "" msgid "%Kattempt to free a non-heap object" msgstr "" -#: calls.c:1434 +#: calls.c:1291 file-prefix-map.c:50 +#, fuzzy, gcc-internal-format +msgid "invalid argument %qs to %qs" +msgstr "нявернае выкарыстанне \"restict\"" + +#: calls.c:1452 #, gcc-internal-format msgid "%Kargument %i value %qE is negative" msgstr "" -#: calls.c:1452 +#: calls.c:1470 #, gcc-internal-format msgid "%Kargument %i value is zero" msgstr "" -#: calls.c:1469 +#: calls.c:1487 #, gcc-internal-format msgid "%Kargument %i value %qE exceeds maximum object size %E" msgstr "" -#: calls.c:1483 +#: calls.c:1501 #, gcc-internal-format msgid "%Kargument %i range [%E, %E] is negative" msgstr "" -#: calls.c:1490 +#: calls.c:1508 #, gcc-internal-format msgid "%Kargument %i range [%E, %E] exceeds maximum object size %E" msgstr "" -#: calls.c:1520 +#: calls.c:1538 #, gcc-internal-format msgid "%Kproduct %<%E * %E%> of arguments %i and %i exceeds %" msgstr "" -#: calls.c:1526 +#: calls.c:1544 #, gcc-internal-format msgid "%Kproduct %<%E * %E%> of arguments %i and %i exceeds maximum object size %E" msgstr "" -#: calls.c:1537 calls.c:1540 +#: calls.c:1555 calls.c:1558 #, fuzzy, gcc-internal-format msgid "argument %i in the range [%E, %E]" msgstr "аргумент для \"%s\" прапушчан" -#: calls.c:1551 +#: calls.c:1569 #, gcc-internal-format msgid "in a call to built-in allocation function %qD" msgstr "" -#: calls.c:1554 +#: calls.c:1572 #, gcc-internal-format msgid "in a call to allocation function %qD declared here" msgstr "" -#: calls.c:1711 +#: calls.c:1835 +#, gcc-internal-format +msgid "%qD argument %i declared attribute % is smaller than the specified bound %wu" +msgstr "" + +#: calls.c:1841 +#, gcc-internal-format +msgid "%qD argument %i declared attribute % is smaller than the specified bound [%E, %E]" +msgstr "" + +#: calls.c:1847 #, gcc-internal-format -msgid "%qD argument %i declared attribute % is smaller than the specified bound %E" +msgid "%qD argument %i declared attribute % may be smaller than the specified bound [%E, %E]" msgstr "" -#: calls.c:1716 +#: calls.c:1857 #, gcc-internal-format msgid "%qD argument %i declared attribute %" msgstr "" -#: calls.c:1721 +#: calls.c:1862 #, fuzzy, gcc-internal-format msgid "argument %qD declared here" msgstr "тып параметра \"%s\" не аб'яўлены" -#: calls.c:1735 +#: calls.c:1876 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "cannot find class `%s'" msgid "cannot tail-call: %s" msgstr "немагчыма знайсьці кляс `%s'" -#: calls.c:3365 +#: calls.c:3506 #, gcc-internal-format msgid "function call has aggregate value" msgstr "" -#: calls.c:4059 +#: calls.c:4200 #, gcc-internal-format msgid "passing too large argument on stack" msgstr "" -#: cfgexpand.c:1665 function.c:1002 varasm.c:2231 +#: cfgexpand.c:1665 function.c:1002 varasm.c:2242 #, fuzzy, gcc-internal-format #| msgid "size of array `%s' is too large" msgid "size of variable %q+D is too large" @@ -17995,238 +18011,238 @@ msgstr "" msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)" msgstr "" -#: cgraph.c:3051 +#: cgraph.c:3056 #, gcc-internal-format msgid "caller edge count invalid" msgstr "" -#: cgraph.c:3135 +#: cgraph.c:3140 #, gcc-internal-format, gfc-internal-format msgid "aux field set for edge %s->%s" msgstr "" -#: cgraph.c:3142 +#: cgraph.c:3147 #, gcc-internal-format msgid "cgraph count invalid" msgstr "" -#: cgraph.c:3147 +#: cgraph.c:3152 #, gcc-internal-format msgid "inline clone in same comdat group list" msgstr "" -#: cgraph.c:3152 +#: cgraph.c:3157 #, fuzzy, gcc-internal-format #| msgid "label `%s' used but not defined" msgid "local symbols must be defined" msgstr "адмеціна `%s' выкарыстоўвываецца, але ня вызначана" -#: cgraph.c:3157 +#: cgraph.c:3162 #, gcc-internal-format msgid "externally visible inline clone" msgstr "" -#: cgraph.c:3162 +#: cgraph.c:3167 #, gcc-internal-format msgid "inline clone with address taken" msgstr "" -#: cgraph.c:3167 +#: cgraph.c:3172 #, gcc-internal-format msgid "inline clone is forced to output" msgstr "" -#: cgraph.c:3174 +#: cgraph.c:3179 #, gcc-internal-format, gfc-internal-format msgid "aux field set for indirect edge from %s" msgstr "" -#: cgraph.c:3181 +#: cgraph.c:3186 #, 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:3196 +#: cgraph.c:3201 #, gcc-internal-format, gfc-internal-format msgid "comdat-local function called by %s outside its comdat" msgstr "" -#: cgraph.c:3206 +#: cgraph.c:3211 #, gcc-internal-format msgid "inlined_to pointer is wrong" msgstr "" -#: cgraph.c:3211 +#: cgraph.c:3216 #, gcc-internal-format msgid "multiple inline callers" msgstr "" -#: cgraph.c:3218 +#: cgraph.c:3223 #, gcc-internal-format msgid "inlined_to pointer set for noninline callers" msgstr "" -#: cgraph.c:3239 +#: cgraph.c:3244 #, gcc-internal-format msgid "caller edge count does not match BB count" msgstr "" -#: cgraph.c:3261 +#: cgraph.c:3266 #, gcc-internal-format msgid "indirect call count does not match BB count" msgstr "" -#: cgraph.c:3272 +#: cgraph.c:3277 #, gcc-internal-format msgid "inlined_to pointer is set but no predecessors found" msgstr "" -#: cgraph.c:3277 +#: cgraph.c:3282 #, gcc-internal-format msgid "inlined_to pointer refers to itself" msgstr "" -#: cgraph.c:3289 +#: cgraph.c:3294 #, gcc-internal-format msgid "cgraph_node has wrong clone_of" msgstr "" -#: cgraph.c:3301 +#: cgraph.c:3306 #, gcc-internal-format msgid "cgraph_node has wrong clone list" msgstr "" -#: cgraph.c:3307 +#: cgraph.c:3312 #, gcc-internal-format msgid "cgraph_node is in clone list but it is not clone" msgstr "" -#: cgraph.c:3312 +#: cgraph.c:3317 #, gcc-internal-format msgid "cgraph_node has wrong prev_clone pointer" msgstr "" -#: cgraph.c:3317 +#: cgraph.c:3322 #, gcc-internal-format msgid "double linked list of clones corrupted" msgstr "" -#: cgraph.c:3329 +#: cgraph.c:3334 #, gcc-internal-format msgid "Alias has call edges" msgstr "" -#: cgraph.c:3337 +#: cgraph.c:3342 #, gcc-internal-format msgid "Alias has non-alias reference" msgstr "" -#: cgraph.c:3342 +#: cgraph.c:3347 #, gcc-internal-format msgid "Alias has more than one alias reference" msgstr "" -#: cgraph.c:3349 +#: cgraph.c:3354 #, gcc-internal-format msgid "Analyzed alias has no reference" msgstr "" -#: cgraph.c:3358 +#: cgraph.c:3363 #, gcc-internal-format msgid "Instrumentation clone does not reference original node" msgstr "" -#: cgraph.c:3365 +#: cgraph.c:3370 #, gcc-internal-format msgid "Not instrumented node has non-NULL original declaration" msgstr "" -#: cgraph.c:3375 +#: cgraph.c:3380 #, gcc-internal-format msgid "Instrumented node has wrong original declaration" msgstr "" -#: cgraph.c:3393 +#: cgraph.c:3398 #, gcc-internal-format msgid "Node has more than one chkp reference" msgstr "" -#: cgraph.c:3398 +#: cgraph.c:3403 #, gcc-internal-format msgid "Wrong node is referenced with chkp reference" msgstr "" -#: cgraph.c:3406 +#: cgraph.c:3411 #, gcc-internal-format msgid "Analyzed node has no reference to instrumented version" msgstr "" -#: cgraph.c:3420 +#: cgraph.c:3425 #, gcc-internal-format msgid "Alias chain for instrumented node is broken" msgstr "" -#: cgraph.c:3429 +#: cgraph.c:3434 #, gcc-internal-format msgid "No edge out of thunk node" msgstr "" -#: cgraph.c:3434 +#: cgraph.c:3439 #, gcc-internal-format msgid "More than one edge out of thunk node" msgstr "" -#: cgraph.c:3439 +#: cgraph.c:3444 #, gcc-internal-format msgid "Thunk is not supposed to have body" msgstr "" -#: cgraph.c:3445 +#: cgraph.c:3450 #, gcc-internal-format msgid "Instrumentation thunk has wrong edge callee" msgstr "" -#: cgraph.c:3481 +#: cgraph.c:3486 #, gcc-internal-format msgid "shared call_stmt:" msgstr "" -#: cgraph.c:3489 +#: cgraph.c:3494 #, fuzzy, gcc-internal-format msgid "edge points to wrong declaration:" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cgraph.c:3498 +#: cgraph.c:3503 #, gcc-internal-format msgid "an indirect edge with unknown callee corresponding to a call_stmt with a known declaration:" msgstr "" -#: cgraph.c:3508 +#: cgraph.c:3513 #, gcc-internal-format msgid "missing callgraph edge for call stmt:" msgstr "" -#: cgraph.c:3518 +#: cgraph.c:3523 #, gcc-internal-format msgid "reference to dead statement" msgstr "" -#: cgraph.c:3531 +#: cgraph.c:3536 #, gcc-internal-format, gfc-internal-format msgid "edge %s->%s has no corresponding call_stmt" msgstr "" -#: cgraph.c:3543 +#: cgraph.c:3548 #, gcc-internal-format, gfc-internal-format msgid "an indirect edge from %s has no corresponding call_stmt" msgstr "" -#: cgraph.c:3554 +#: cgraph.c:3559 #, gcc-internal-format msgid "verify_cgraph_node failed" msgstr "" -#: cgraph.c:3661 varpool.c:306 +#: cgraph.c:3666 varpool.c:306 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "argument to `-%s' is missing" msgid "%s: section %s is missing" @@ -18258,13 +18274,13 @@ msgid "% attribute ignored because variable is initialized" msgstr "" #. include_self= -#: cgraphunit.c:981 c/c-decl.c:11282 +#: cgraphunit.c:981 c/c-decl.c:11302 #, fuzzy, gcc-internal-format #| msgid "label `%s' used but not defined" msgid "%q+F used but never defined" msgstr "адмеціна `%s' выкарыстоўвываецца, але ня вызначана" -#: cgraphunit.c:983 c/c-decl.c:11291 +#: cgraphunit.c:983 c/c-decl.c:11311 #, gcc-internal-format msgid "%q+F declared % but never defined" msgstr "" @@ -18384,12 +18400,12 @@ msgstr "не магу знайсці крыніцу %s\n" msgid "cannot find '%s'" msgstr "нельга знайсці \"%s\"" -#: collect-utils.c:183 collect2.c:2361 collect2.c:2560 gcc.c:3080 gcc.c:6856 +#: collect-utils.c:183 collect2.c:2387 collect2.c:2586 gcc.c:3080 gcc.c:6856 #, gcc-internal-format msgid "pex_init failed: %m" msgstr "" -#: collect-utils.c:192 collect2.c:2370 collect2.c:2568 gcc.c:8498 +#: collect-utils.c:192 collect2.c:2396 collect2.c:2594 gcc.c:8498 #, fuzzy, gcc-internal-format #| msgid "%s: %s: " msgid "%s: %m" @@ -18400,99 +18416,99 @@ msgstr "%s: %s: " msgid "COLLECT_LTO_WRAPPER must be set" msgstr "" -#: collect2.c:966 gcc.c:7382 lto-wrapper.c:1666 +#: collect2.c:969 gcc.c:7382 lto-wrapper.c:1692 #: config/i386/intelmic-mkoffload.c:556 config/nvptx/mkoffload.c:405 #, gcc-internal-format msgid "atexit failed" msgstr "" -#: collect2.c:1064 +#: collect2.c:1067 #, gcc-internal-format msgid "no arguments" msgstr "няма аргументаў" -#: collect2.c:1303 opts.c:904 +#: collect2.c:1311 opts.c:904 #, gcc-internal-format msgid "LTO support has not been enabled in this configuration" msgstr "" -#: collect2.c:1344 +#: collect2.c:1352 #, fuzzy, gcc-internal-format #| msgid "can't open %s" msgid "can't open %s: %m" msgstr "немагчыма адчыніць %s" -#: collect2.c:1450 +#: collect2.c:1472 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "unknown machine mode `%s'" msgid "unknown demangling style '%s'" msgstr "невядомы рэжым машыны \"%s\"" -#: collect2.c:1546 collect2.c:1729 collect2.c:1769 +#: collect2.c:1574 collect2.c:1757 collect2.c:1797 #, gcc-internal-format msgid "fopen %s: %m" msgstr "" -#: collect2.c:1549 collect2.c:1734 collect2.c:1772 +#: collect2.c:1577 collect2.c:1762 collect2.c:1800 #, gcc-internal-format msgid "fclose %s: %m" msgstr "" -#: collect2.c:2335 +#: collect2.c:2361 #, fuzzy, gcc-internal-format #| msgid "cannot find `nm'" msgid "cannot find 'nm'" msgstr "нельга знайсці \"nm\"" -#: collect2.c:2383 +#: collect2.c:2409 #, fuzzy, gcc-internal-format #| msgid "can't open output file `%s'" msgid "can't open nm output: %m" msgstr "немагчыма адчыніць файл уводу `%s'" -#: collect2.c:2467 +#: collect2.c:2493 #, gcc-internal-format, gfc-internal-format msgid "init function found in object %s" msgstr "" -#: collect2.c:2478 +#: collect2.c:2504 #, gcc-internal-format, gfc-internal-format msgid "fini function found in object %s" msgstr "" -#: collect2.c:2535 +#: collect2.c:2561 #, fuzzy, gcc-internal-format #| msgid "cannot find `ldd'" msgid "cannot find 'ldd'" msgstr "не магу знайсці \"ldd\"" -#: collect2.c:2581 +#: collect2.c:2607 #, fuzzy, gcc-internal-format #| msgid "can't open output file `%s'" msgid "can't open ldd output: %m" msgstr "немагчыма адчыніць файл уводу `%s'" -#: collect2.c:2599 +#: collect2.c:2625 #, gcc-internal-format, gfc-internal-format msgid "dynamic dependency %s not found" msgstr "" -#: collect2.c:2611 +#: collect2.c:2637 #, gcc-internal-format, gfc-internal-format msgid "unable to open dynamic dependency '%s'" msgstr "" -#: collect2.c:2765 +#: collect2.c:2791 #, gcc-internal-format, gfc-internal-format msgid "%s: not a COFF file" msgstr "" -#: collect2.c:2930 +#: collect2.c:2961 #, gcc-internal-format, gfc-internal-format msgid "%s: cannot open as COFF file" msgstr "" -#: collect2.c:2989 +#: collect2.c:3020 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "library lib%s not found" msgstr "Бібліятэка lib%s не знойдзена" @@ -18707,12 +18723,12 @@ msgstr "" msgid "multiple EH personalities are supported only with assemblers supporting .cfi_personality directive" msgstr "" -#: dwarf2out.c:10901 +#: dwarf2out.c:10909 #, gcc-internal-format msgid "-gdwarf-6 is output as version 5 with incompatibilities" msgstr "" -#: dwarf2out.c:14415 +#: dwarf2out.c:14423 #, gcc-internal-format, gfc-internal-format msgid "non-delegitimized UNSPEC %s (%d) found in variable location" msgstr "" @@ -18833,11 +18849,6 @@ msgstr "" msgid "%Kcall to %qs declared with attribute warning: %s" msgstr "" -#: file-prefix-map.c:50 -#, fuzzy, gcc-internal-format -msgid "invalid argument %qs to %qs" -msgstr "нявернае выкарыстанне \"restict\"" - #: final.c:1868 #, fuzzy, gcc-internal-format #| msgid "size of `%s' is larger than %d bytes" @@ -18859,42 +18870,42 @@ msgstr "не магу знайсці крыніцу %s\n" msgid "large fixed-point constant implicitly truncated to fixed-point type" msgstr "" -#: fold-const.c:4151 fold-const.c:4161 +#: fold-const.c:4157 fold-const.c:4167 #, gcc-internal-format, gfc-internal-format msgid "comparison is always %d due to width of bit-field" msgstr "" -#: fold-const.c:5478 tree-ssa-reassoc.c:2374 tree-ssa-reassoc.c:3214 +#: fold-const.c:5484 tree-ssa-reassoc.c:2379 tree-ssa-reassoc.c:3219 #, gcc-internal-format msgid "assuming signed overflow does not occur when simplifying range test" msgstr "" -#: fold-const.c:5928 fold-const.c:5942 +#: fold-const.c:5934 fold-const.c:5948 #, gcc-internal-format, gfc-internal-format msgid "comparison is always %d" msgstr "" -#: fold-const.c:6085 +#: fold-const.c:6091 #, gcc-internal-format msgid "% of unmatched not-equal tests is always 1" msgstr "" -#: fold-const.c:6090 +#: fold-const.c:6096 #, gcc-internal-format msgid "% of mutually exclusive equal-tests is always 0" msgstr "" -#: fold-const.c:8310 +#: fold-const.c:8316 #, gcc-internal-format msgid "assuming signed overflow does not occur when reducing constant in comparison" msgstr "" -#: fold-const.c:8710 +#: fold-const.c:8716 #, gcc-internal-format msgid "assuming signed overflow does not occur when combining constants around a comparison" msgstr "" -#: fold-const.c:12063 +#: fold-const.c:12069 #, gcc-internal-format msgid "fold check: original tree changed by fold" msgstr "" @@ -18905,7 +18916,7 @@ msgstr "" msgid "total size of local objects too large" msgstr "памер масіва \"%s\" вельмі вялікі" -#: function.c:1776 gimplify.c:6270 +#: function.c:1776 gimplify.c:6273 #, fuzzy, gcc-internal-format #| msgid "impossible operator '%s'" msgid "impossible constraint in %" @@ -19218,7 +19229,7 @@ msgstr "Бібліятэка lib%s не знойдзена" msgid "%s: linker input file unused because linking not done" msgstr "" -#: gcc.c:8420 c-family/c-opts.c:770 +#: gcc.c:8420 c-family/c-opts.c:768 #, gcc-internal-format msgid "cannot use %<-%> as input filename for a precompiled header" msgstr "" @@ -19466,7 +19477,7 @@ msgstr "" msgid "%G%qD destination unchanged after copying no bytes" msgstr "" -#: gimple-fold.c:2052 tree-ssa-strlen.c:2050 +#: gimple-fold.c:2052 tree-ssa-strlen.c:2074 msgid "%G%qD specified bound %E equals destination size" msgstr "" @@ -19488,12 +19499,12 @@ msgstr "" msgid "null pointer dereference" msgstr "" -#: gimple-ssa-isolate-paths.c:429 gimple-ssa-isolate-paths.c:549 tree.c:12451 -#: tree.c:12488 c/c-typeck.c:2908 c/c-typeck.c:2994 c/c-typeck.c:10147 -#: c/c-typeck.c:10164 c/gimple-parser.c:1616 c/gimple-parser.c:1624 +#: gimple-ssa-isolate-paths.c:429 gimple-ssa-isolate-paths.c:549 tree.c:12455 +#: tree.c:12492 c/c-typeck.c:2908 c/c-typeck.c:2994 c/c-typeck.c:10152 +#: c/c-typeck.c:10169 c/gimple-parser.c:1616 c/gimple-parser.c:1624 #: cp/call.c:6493 cp/call.c:8098 cp/constexpr.c:820 cp/constexpr.c:2309 -#: cp/cvt.c:1015 cp/cvt.c:1042 cp/decl.c:7334 cp/decl2.c:5256 cp/pt.c:8334 -#: cp/semantics.c:1836 cp/semantics.c:4053 cp/typeck.c:1700 cp/typeck.c:1895 +#: cp/cvt.c:1015 cp/cvt.c:1042 cp/decl.c:7355 cp/decl2.c:5246 cp/pt.c:8348 +#: cp/semantics.c:1836 cp/semantics.c:4056 cp/typeck.c:1700 cp/typeck.c:1895 #: cp/typeck.c:3837 #, fuzzy, gcc-internal-format #| msgid "called from here" @@ -19505,301 +19516,301 @@ msgstr "выклікана адсюль" msgid "nonnull argument %qD compared to NULL" msgstr "" -#: gimple-ssa-sprintf.c:2517 gimple-ssa-sprintf.c:2637 +#: gimple-ssa-sprintf.c:2555 gimple-ssa-sprintf.c:2675 #, gcc-internal-format msgid "%qE output may be truncated before the last format character" msgstr "" -#: gimple-ssa-sprintf.c:2519 gimple-ssa-sprintf.c:2639 +#: gimple-ssa-sprintf.c:2557 gimple-ssa-sprintf.c:2677 #, gcc-internal-format msgid "%qE output truncated before the last format character" msgstr "" -#: gimple-ssa-sprintf.c:2522 gimple-ssa-sprintf.c:2642 +#: gimple-ssa-sprintf.c:2560 gimple-ssa-sprintf.c:2680 #, gcc-internal-format msgid "%qE may write a terminating nul past the end of the destination" msgstr "" -#: gimple-ssa-sprintf.c:2524 gimple-ssa-sprintf.c:2644 +#: gimple-ssa-sprintf.c:2562 gimple-ssa-sprintf.c:2682 #, gcc-internal-format msgid "%qE writing a terminating nul past the end of the destination" msgstr "" -#: gimple-ssa-sprintf.c:2534 +#: gimple-ssa-sprintf.c:2572 #, gcc-internal-format msgid "%<%.*s%> directive writing %wu byte into a region of size %wu" msgid_plural "%<%.*s%> directive writing %wu bytes into a region of size %wu" msgstr[0] "" msgstr[1] "" -#: gimple-ssa-sprintf.c:2541 +#: gimple-ssa-sprintf.c:2579 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing %wu byte into a region of size %wu" msgid_plural "%<%.*s%> directive output may be truncated writing %wu bytes into a region of size %wu" msgstr[0] "" msgstr[1] "" -#: gimple-ssa-sprintf.c:2548 +#: gimple-ssa-sprintf.c:2586 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing %wu byte into a region of size %wu" msgid_plural "%<%.*s%> directive output truncated writing %wu bytes into a region of size %wu" msgstr[0] "" msgstr[1] "" -#: gimple-ssa-sprintf.c:2559 +#: gimple-ssa-sprintf.c:2597 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing up to %wu bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2562 +#: gimple-ssa-sprintf.c:2600 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing up to %wu bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2564 +#: gimple-ssa-sprintf.c:2602 #, gcc-internal-format msgid "%<%.*s%> directive writing up to %wu bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2576 +#: gimple-ssa-sprintf.c:2614 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing likely %wu or more bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2579 +#: gimple-ssa-sprintf.c:2617 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing likely %wu or more bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2582 +#: gimple-ssa-sprintf.c:2620 #, gcc-internal-format msgid "%<%.*s%> directive writing likely %wu or more bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2591 +#: gimple-ssa-sprintf.c:2629 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing between %wu and %wu bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2594 +#: gimple-ssa-sprintf.c:2632 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing between %wu and %wu bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2597 +#: gimple-ssa-sprintf.c:2635 #, gcc-internal-format msgid "%<%.*s%> directive writing between %wu and %wu bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2606 +#: gimple-ssa-sprintf.c:2644 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing %wu or more bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2609 +#: gimple-ssa-sprintf.c:2647 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing %wu or more bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2611 +#: gimple-ssa-sprintf.c:2649 #, gcc-internal-format msgid "%<%.*s%> directive writing %wu or more bytes into a region of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2653 +#: gimple-ssa-sprintf.c:2691 #, gcc-internal-format msgid "%<%.*s%> directive writing %wu byte into a region of size between %wu and %wu" msgid_plural "%<%.*s%> directive writing %wu bytes into a region of size between %wu and %wu" msgstr[0] "" msgstr[1] "" -#: gimple-ssa-sprintf.c:2660 +#: gimple-ssa-sprintf.c:2698 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing %wu byte into a region of size between %wu and %wu" msgid_plural "%<%.*s%> directive output may be truncated writing %wu bytes into a region of size between %wu and %wu" msgstr[0] "" msgstr[1] "" -#: gimple-ssa-sprintf.c:2668 +#: gimple-ssa-sprintf.c:2706 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing %wu byte into a region of size between %wu and %wu" msgid_plural "%<%.*s%> directive output truncated writing %wu bytes into a region of size between %wu and %wu" msgstr[0] "" msgstr[1] "" -#: gimple-ssa-sprintf.c:2680 +#: gimple-ssa-sprintf.c:2718 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing up to %wu bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2683 +#: gimple-ssa-sprintf.c:2721 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing up to %wu bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2686 +#: gimple-ssa-sprintf.c:2724 #, gcc-internal-format msgid "%<%.*s%> directive writing up to %wu bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2699 +#: gimple-ssa-sprintf.c:2737 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing likely %wu or more bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2702 +#: gimple-ssa-sprintf.c:2740 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing likely %wu or more bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2705 +#: gimple-ssa-sprintf.c:2743 #, gcc-internal-format msgid "%<%.*s%> directive writing likely %wu or more bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2715 +#: gimple-ssa-sprintf.c:2753 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing between %wu and %wu bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2718 +#: gimple-ssa-sprintf.c:2756 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing between %wu and %wu bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2721 +#: gimple-ssa-sprintf.c:2759 #, gcc-internal-format msgid "%<%.*s%> directive writing between %wu and %wu bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2730 +#: gimple-ssa-sprintf.c:2768 #, gcc-internal-format msgid "%<%.*s%> directive output may be truncated writing %wu or more bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2733 +#: gimple-ssa-sprintf.c:2771 #, gcc-internal-format msgid "%<%.*s%> directive output truncated writing %wu or more bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2736 +#: gimple-ssa-sprintf.c:2774 #, gcc-internal-format msgid "%<%.*s%> directive writing %wu or more bytes into a region of size between %wu and %wu" msgstr "" -#: gimple-ssa-sprintf.c:2825 +#: gimple-ssa-sprintf.c:2863 #, gcc-internal-format msgid "%<%.*s%> directive argument is null" msgstr "" -#: gimple-ssa-sprintf.c:2890 +#: gimple-ssa-sprintf.c:2928 #, gcc-internal-format msgid "%<%.*s%> directive output of %wu bytes exceeds minimum required size of 4095" msgstr "" -#: gimple-ssa-sprintf.c:2897 +#: gimple-ssa-sprintf.c:2935 #, gcc-internal-format msgid "%<%.*s%> directive output between %wu and %wu bytes may exceed minimum required size of 4095" msgstr "" -#: gimple-ssa-sprintf.c:2900 +#: gimple-ssa-sprintf.c:2938 #, gcc-internal-format msgid "%<%.*s%> directive output between %wu and %wu bytes exceeds minimum required size of 4095" msgstr "" -#: gimple-ssa-sprintf.c:2929 +#: gimple-ssa-sprintf.c:2967 #, gcc-internal-format msgid "%<%.*s%> directive output of %wu bytes causes result to exceed %" msgstr "" -#: gimple-ssa-sprintf.c:2936 +#: gimple-ssa-sprintf.c:2974 #, gcc-internal-format msgid "%<%.*s%> directive output between %wu and %wu bytes causes result to exceed %" msgstr "" -#: gimple-ssa-sprintf.c:2939 +#: gimple-ssa-sprintf.c:2977 #, gcc-internal-format msgid "%<%.*s%> directive output between %wu and %wu bytes may cause result to exceed %" msgstr "" -#: gimple-ssa-sprintf.c:2949 +#: gimple-ssa-sprintf.c:2987 #, gcc-internal-format msgid "assuming directive output of %wu byte" msgid_plural "assuming directive output of %wu bytes" msgstr[0] "" msgstr[1] "" -#: gimple-ssa-sprintf.c:2956 +#: gimple-ssa-sprintf.c:2994 #, gcc-internal-format msgid "directive argument %qE" msgstr "" -#: gimple-ssa-sprintf.c:2958 +#: gimple-ssa-sprintf.c:2996 #, gcc-internal-format msgid "directive argument in the range [%E, %E]" msgstr "" -#: gimple-ssa-sprintf.c:2962 +#: gimple-ssa-sprintf.c:3000 #, gcc-internal-format msgid "using the range [%E, %E] for directive argument" msgstr "" -#: gimple-ssa-sprintf.c:2982 +#: gimple-ssa-sprintf.c:3020 #, gcc-internal-format msgid "%qE output %wu byte into a destination of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2983 +#: gimple-ssa-sprintf.c:3021 #, gcc-internal-format msgid "%qE output %wu bytes into a destination of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2987 +#: gimple-ssa-sprintf.c:3025 #, gcc-internal-format msgid "%qE output between %wu and %wu bytes into a destination of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2992 +#: gimple-ssa-sprintf.c:3030 #, gcc-internal-format msgid "%qE output %wu or more bytes (assuming %wu) into a destination of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:2997 +#: gimple-ssa-sprintf.c:3035 #, gcc-internal-format msgid "%qE output %wu or more bytes into a destination of size %wu" msgstr "" -#: gimple-ssa-sprintf.c:3368 +#: gimple-ssa-sprintf.c:3406 #, gcc-internal-format msgid "%<%.*s%> directive width out of range" msgstr "" -#: gimple-ssa-sprintf.c:3402 +#: gimple-ssa-sprintf.c:3440 #, gcc-internal-format msgid "%<%.*s%> directive precision out of range" msgstr "" -#: gimple-ssa-sprintf.c:3893 +#: gimple-ssa-sprintf.c:3931 #, gcc-internal-format msgid "specified bound %wu exceeds maximum object size %wu" msgstr "" -#: gimple-ssa-sprintf.c:3899 +#: gimple-ssa-sprintf.c:3937 #, gcc-internal-format msgid "specified bound %wu exceeds %" msgstr "" -#: gimple-ssa-sprintf.c:3949 +#: gimple-ssa-sprintf.c:3987 #, gcc-internal-format msgid "null destination pointer" msgstr "" -#: gimple-ssa-sprintf.c:3966 +#: gimple-ssa-sprintf.c:4004 #, gcc-internal-format msgid "specified bound %wu exceeds the size %wu of the destination object" msgstr "" -#: gimple-ssa-sprintf.c:3978 +#: gimple-ssa-sprintf.c:4016 #, gcc-internal-format msgid "null format string" msgstr "" @@ -20013,10 +20024,10 @@ msgid "%G%qD offset %s is out of the bounds of object %qD with type %qT" msgstr "" #: gimple-ssa-warn-restrict.c:1678 c/c-decl.c:3603 c/c-decl.c:3874 -#: c/c-typeck.c:8345 cp/class.c:1346 cp/class.c:3098 cp/decl.c:3979 -#: cp/decl.c:10753 cp/decl.c:11151 cp/decl.c:11160 cp/friend.c:384 +#: c/c-typeck.c:8350 cp/class.c:1346 cp/class.c:3102 cp/decl.c:3979 +#: cp/decl.c:10777 cp/decl.c:11175 cp/decl.c:11184 cp/friend.c:384 #: cp/friend.c:393 cp/parser.c:3275 cp/parser.c:3372 cp/parser.c:3422 -#: cp/parser.c:6327 cp/parser.c:21027 +#: cp/parser.c:6330 cp/parser.c:21024 #, fuzzy, gcc-internal-format msgid "%qD declared here" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" @@ -20084,217 +20095,217 @@ msgstr "" msgid "using result of function returning %" msgstr "" -#: gimplify.c:6128 +#: gimplify.c:6131 #, gcc-internal-format, gfc-internal-format msgid "invalid lvalue in asm output %d" msgstr "" -#: gimplify.c:6271 +#: gimplify.c:6274 #, gcc-internal-format, gfc-internal-format msgid "non-memory input %d must stay in memory" msgstr "" -#: gimplify.c:6311 gimplify.c:6320 +#: gimplify.c:6314 gimplify.c:6323 #, gcc-internal-format, gfc-internal-format msgid "memory input %d is not directly addressable" msgstr "" -#: gimplify.c:6928 +#: gimplify.c:6931 #, gcc-internal-format msgid "threadprivate variable %qE used in target region" msgstr "" -#: gimplify.c:6930 +#: gimplify.c:6933 #, gcc-internal-format msgid "enclosing target region" msgstr "" -#: gimplify.c:6942 +#: gimplify.c:6945 #, gcc-internal-format msgid "threadprivate variable %qE used in untied task" msgstr "" -#: gimplify.c:6944 +#: gimplify.c:6947 #, gcc-internal-format msgid "enclosing task" msgstr "" -#: gimplify.c:7016 +#: gimplify.c:7019 #, gcc-internal-format msgid "%qE not specified in enclosing %qs" msgstr "" -#: gimplify.c:7018 +#: gimplify.c:7021 #, gcc-internal-format msgid "enclosing %qs" msgstr "" -#: gimplify.c:7143 +#: gimplify.c:7146 #, gcc-internal-format msgid "%qE not specified in enclosing OpenACC %qs construct" msgstr "" -#: gimplify.c:7145 +#: gimplify.c:7148 #, gcc-internal-format msgid "enclosing OpenACC %qs construct" msgstr "" -#: gimplify.c:7198 +#: gimplify.c:7201 #, gcc-internal-format msgid "%qE with % clause used in % function" msgstr "" -#: gimplify.c:7206 +#: gimplify.c:7209 #, gcc-internal-format msgid "%qE requires a % directive for use in a % function" msgstr "" -#: gimplify.c:7272 gimplify.c:7872 +#: gimplify.c:7275 gimplify.c:7875 #, gcc-internal-format msgid "variable %qE declared in enclosing % region" msgstr "" -#: gimplify.c:7293 +#: gimplify.c:7296 #, gcc-internal-format msgid "%qD referenced in target region does not have a mappable type" msgstr "" -#: gimplify.c:7411 gimplify.c:7443 +#: gimplify.c:7414 gimplify.c:7446 #, gcc-internal-format msgid "iteration variable %qE is predetermined linear" msgstr "" -#: gimplify.c:7414 +#: gimplify.c:7417 #, gcc-internal-format msgid "iteration variable %qE should be private" msgstr "" -#: gimplify.c:7428 +#: gimplify.c:7431 #, gcc-internal-format msgid "iteration variable %qE should not be firstprivate" msgstr "" -#: gimplify.c:7431 +#: gimplify.c:7434 #, gcc-internal-format msgid "iteration variable %qE should not be reduction" msgstr "" -#: gimplify.c:7434 +#: gimplify.c:7437 #, gcc-internal-format msgid "iteration variable %qE should not be linear" msgstr "" -#: gimplify.c:7437 +#: gimplify.c:7440 #, gcc-internal-format msgid "iteration variable %qE should not be lastprivate" msgstr "" -#: gimplify.c:7440 +#: gimplify.c:7443 #, gcc-internal-format msgid "iteration variable %qE should not be private" msgstr "" -#: gimplify.c:7742 +#: gimplify.c:7745 #, gcc-internal-format msgid "% clause for variable other than loop iterator specified on construct combined with %" msgstr "" -#: gimplify.c:7949 +#: gimplify.c:7952 #, gcc-internal-format msgid "mapping field %qE of variable length structure" msgstr "" -#: gimplify.c:8160 +#: gimplify.c:8163 #, gcc-internal-format msgid "%qE appears more than once in map clauses" msgstr "" -#: gimplify.c:8464 +#: gimplify.c:8467 #, gcc-internal-format msgid "copyprivate variable %qE is not threadprivate or private in outer context" msgstr "" -#: gimplify.c:8484 +#: gimplify.c:8487 #, gcc-internal-format msgid "%s variable %qE is private in outer context" msgstr "" -#: gimplify.c:8510 +#: gimplify.c:8513 #, gcc-internal-format msgid "expected %qs % clause modifier rather than %qs" msgstr "" -#: gimplify.c:8775 +#: gimplify.c:8778 #, gcc-internal-format msgid "%<_Atomic%> %qD in implicit % clause" msgstr "" -#: gimplify.c:8808 +#: gimplify.c:8811 #, gcc-internal-format msgid "%<_Atomic%> %qD in implicit % clause on % construct" msgstr "" -#: gimplify.c:9000 +#: gimplify.c:9003 #, gcc-internal-format msgid "%<_Atomic%> %qD in % clause on % construct" msgstr "" -#: gimplify.c:9051 +#: gimplify.c:9054 #, gcc-internal-format msgid "same variable used in % and % clauses on % construct" msgstr "" -#: gimplify.c:9133 +#: gimplify.c:9136 #, gcc-internal-format msgid "incompatible data clause with reduction on %qE; promoting to present_or_copy" msgstr "" -#: gimplify.c:9278 +#: gimplify.c:9281 #, fuzzy, gcc-internal-format msgid "invalid private reduction on %qE" msgstr "Нерэчаіснае абвяшчэнне" -#: gimplify.c:11103 omp-low.c:2791 +#: gimplify.c:11106 omp-low.c:2791 #, gcc-internal-format msgid "% construct with % clause must be closely nested inside a loop with % clause with a parameter" msgstr "" -#: gimplify.c:11121 +#: gimplify.c:11124 #, gcc-internal-format msgid "variable %qE is not an iteration of outermost loop %d, expected %qE" msgstr "" -#: gimplify.c:11134 +#: gimplify.c:11137 #, gcc-internal-format msgid "number of variables in % clause does not match number of iteration variables" msgstr "" -#: gimplify.c:11147 +#: gimplify.c:11150 #, gcc-internal-format msgid "more than one % clause on an % construct" msgstr "" -#: gimplify.c:11158 +#: gimplify.c:11161 #, gcc-internal-format msgid "% clause specified together with % clauses on the same construct" msgstr "" -#: gimplify.c:12393 +#: gimplify.c:12396 #, gcc-internal-format msgid "gimplification failed" msgstr "" -#: gimplify.c:12936 +#: gimplify.c:12939 #, gcc-internal-format msgid "%qT is promoted to %qT when passed through %<...%>" msgstr "" -#: gimplify.c:12941 +#: gimplify.c:12944 #, gcc-internal-format msgid "(so you should pass %qT not %qT to %)" msgstr "" -#: gimplify.c:12948 +#: gimplify.c:12951 #, gcc-internal-format msgid "if this code is reached, the program will abort" msgstr "" @@ -20771,49 +20782,49 @@ msgstr "" msgid "Max. number of generated reload insns per insn is achieved (%d)\n" msgstr "" -#: lto-cgraph.c:1294 +#: lto-cgraph.c:1296 #, gcc-internal-format, gfc-internal-format msgid "bytecode stream: found multiple instances of cgraph node with uid %d" msgstr "" -#: lto-cgraph.c:1472 +#: lto-cgraph.c:1474 #, gcc-internal-format msgid "bytecode stream: no caller found while reading edge" msgstr "" -#: lto-cgraph.c:1478 +#: lto-cgraph.c:1480 #, gcc-internal-format msgid "bytecode stream: no callee found while reading edge" msgstr "" -#: lto-cgraph.c:1552 +#: lto-cgraph.c:1554 #, gcc-internal-format msgid "bytecode stream: found empty cgraph node" msgstr "" -#: lto-cgraph.c:1730 +#: lto-cgraph.c:1732 #, gcc-internal-format, gfc-internal-format msgid "At most %i profile runs is supported. Perhaps corrupted profile?" msgstr "" -#: lto-cgraph.c:1817 +#: lto-cgraph.c:1819 #, gcc-internal-format, gfc-internal-format msgid "Profile information in %s corrupted" msgstr "" -#: lto-cgraph.c:1855 +#: lto-cgraph.c:1857 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "cannot find class `%s'" msgid "cannot find LTO cgraph in %s" msgstr "немагчыма знайсьці кляс `%s'" -#: lto-cgraph.c:1865 +#: lto-cgraph.c:1867 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "cannot find source %s" msgid "cannot find LTO section refs in %s" msgstr "не магу знайсці крыніцу %s" -#: lto-cgraph.c:1946 +#: lto-cgraph.c:1948 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "invalid offload table in %s" msgstr "Нерэчаісны выбар %s" @@ -20885,83 +20896,89 @@ msgstr "" msgid "bytecode stream in file %qs generated with LTO version %d.%d instead of the expected %d.%d" msgstr "" -#: lto-wrapper.c:117 +#: lto-wrapper.c:118 #, gcc-internal-format msgid "deleting LTRANS file %s: %m" msgstr "" -#: lto-wrapper.c:154 +#: lto-wrapper.c:155 #, gcc-internal-format msgid "malformed COLLECT_GCC_OPTIONS" msgstr "" -#: lto-wrapper.c:308 +#: lto-wrapper.c:309 #, gcc-internal-format, gfc-internal-format msgid "Option %s with different values" msgstr "" -#: lto-wrapper.c:392 +#: lto-wrapper.c:393 #, gcc-internal-format, gfc-internal-format msgid "Option %s not used consistently in all LTO input files" msgstr "" -#: lto-wrapper.c:832 +#: lto-wrapper.c:833 #, gcc-internal-format, gfc-internal-format msgid "problem with building target image for %s\n" msgstr "" -#: lto-wrapper.c:852 +#: lto-wrapper.c:853 #, fuzzy, gcc-internal-format msgid "reading input file" msgstr "няма ўваходзячых файлаў" -#: lto-wrapper.c:857 +#: lto-wrapper.c:858 #, fuzzy, gcc-internal-format msgid "writing output file" msgstr "не магу запісаць ў %s" -#: lto-wrapper.c:889 +#: lto-wrapper.c:890 #, gcc-internal-format msgid "installation error, can't find crtoffloadtable.o" msgstr "" -#: lto-wrapper.c:1000 lto-wrapper.c:1012 +#: lto-wrapper.c:1001 lto-wrapper.c:1013 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "%s: %s: " msgid "%s: %s\n" msgstr "%s: %s: " -#: lto-wrapper.c:1056 +#: lto-wrapper.c:1064 #, gcc-internal-format msgid "environment variable COLLECT_GCC must be set" msgstr "" -#: lto-wrapper.c:1060 config/nvptx/mkoffload.c:363 +#: lto-wrapper.c:1068 config/nvptx/mkoffload.c:363 #, gcc-internal-format msgid "environment variable COLLECT_GCC_OPTIONS must be set" msgstr "" -#: lto-wrapper.c:1229 lto-wrapper.c:1285 +#: lto-wrapper.c:1237 lto-wrapper.c:1293 #, fuzzy, gcc-internal-format #| msgid "can't open %s" msgid "cannot open %s: %m" msgstr "немагчыма адчыніць %s" -#: lto-wrapper.c:1232 lto-wrapper.c:1291 +#: lto-wrapper.c:1240 lto-wrapper.c:1299 #, fuzzy, gcc-internal-format msgid "cannot read %s: %m" msgstr "не магу прачытаць з %s" -#: lto-wrapper.c:1259 +#: lto-wrapper.c:1267 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "invalid format of %s" msgstr "Нерэчаісны выбар %s" -#: lto-wrapper.c:1482 +#: lto-wrapper.c:1491 #, gcc-internal-format msgid "fopen: %s: %m" msgstr "" +#: lto-wrapper.c:1508 +#, fuzzy, gcc-internal-format, gfc-internal-format +#| msgid "can't open output file `%s'" +msgid "Corrupted ltrans output file %s" +msgstr "немагчыма адчыніць файл уводу `%s'" + #: multiple_target.c:76 #, fuzzy, gcc-internal-format msgid "the call requires ifunc, which is not supported by this target" @@ -21317,12 +21334,12 @@ msgstr "памер \"%s\" больш чам %d байт" msgid "unrecognized argument in option %qs" msgstr "нераспазнаны выбар \"-%s\"" -#: opts-common.c:1198 config/i386/i386.c:3206 +#: opts-common.c:1198 config/i386/i386.c:3209 #, fuzzy, gcc-internal-format msgid "valid arguments to %qs are: %s; did you mean %qs?" msgstr "нявернае выкарыстанне \"restict\"" -#: opts-common.c:1201 config/i386/i386.c:3209 +#: opts-common.c:1201 config/i386/i386.c:3212 #, fuzzy, gcc-internal-format msgid "valid arguments to %qs are: %s" msgstr "нявернае выкарыстанне \"restict\"" @@ -21929,22 +21946,22 @@ msgstr "" msgid "output operand %d must use %<&%> constraint" msgstr "" -#: regcprop.c:1187 +#: regcprop.c:1193 #, gcc-internal-format, gfc-internal-format msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)" msgstr "" -#: regcprop.c:1199 +#: regcprop.c:1205 #, gcc-internal-format, gfc-internal-format msgid "validate_value_data: Loop in regno chain (%u)" msgstr "" -#: regcprop.c:1202 +#: regcprop.c:1208 #, gcc-internal-format, gfc-internal-format msgid "validate_value_data: [%u] Bad oldest_regno (%u)" msgstr "" -#: regcprop.c:1214 +#: regcprop.c:1220 #, gcc-internal-format, gfc-internal-format msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)" msgstr "" @@ -21988,7 +22005,7 @@ msgid "register of %qD used for multiple global register variables" msgstr "" #: reginfo.c:789 config/powerpcspe/powerpcspe.c:32259 -#: config/rs6000/rs6000.c:29453 +#: config/rs6000/rs6000.c:29530 #, gcc-internal-format msgid "conflicts with %qD" msgstr "" @@ -22237,153 +22254,158 @@ msgstr "" msgid "function symbol is not function" msgstr "функцыя не вяртае тып string" -#: symtab.c:1006 +#: symtab.c:1005 +#, gcc-internal-format +msgid "inconsistent `ifunc' attribute" +msgstr "" + +#: symtab.c:1013 #, fuzzy, gcc-internal-format msgid "variable symbol is not variable" msgstr "\"%s\" атрыбут ігнарыруецца" -#: symtab.c:1012 +#: symtab.c:1019 #, gcc-internal-format msgid "node has unknown type" msgstr "" -#: symtab.c:1021 +#: symtab.c:1028 #, gcc-internal-format msgid "node not found node->decl->decl_with_vis.symtab_node" msgstr "" -#: symtab.c:1029 +#: symtab.c:1036 #, gcc-internal-format msgid "node differs from node->decl->decl_with_vis.symtab_node" msgstr "" -#: symtab.c:1038 +#: symtab.c:1045 #, gcc-internal-format msgid "assembler name hash list corrupted" msgstr "" -#: symtab.c:1051 +#: symtab.c:1058 #, gcc-internal-format msgid "node not found in symtab assembler name hash" msgstr "" -#: symtab.c:1058 +#: symtab.c:1065 #, gcc-internal-format msgid "double linked list of assembler names corrupted" msgstr "" -#: symtab.c:1063 +#: symtab.c:1070 #, gcc-internal-format msgid "node has body_removed but is definition" msgstr "" -#: symtab.c:1068 +#: symtab.c:1075 #, gcc-internal-format msgid "node is analyzed but it is not a definition" msgstr "" -#: symtab.c:1073 +#: symtab.c:1080 #, gcc-internal-format msgid "node is alias but not implicit alias" msgstr "" -#: symtab.c:1078 +#: symtab.c:1085 #, fuzzy, gcc-internal-format #| msgid "label `%s' used but not defined" msgid "node is alias but not definition" msgstr "адмеціна `%s' выкарыстоўвываецца, але ня вызначана" -#: symtab.c:1083 +#: symtab.c:1090 #, gcc-internal-format msgid "node is weakref but not an transparent_alias" msgstr "" -#: symtab.c:1088 +#: symtab.c:1095 #, gcc-internal-format msgid "node is transparent_alias but not an alias" msgstr "" -#: symtab.c:1097 +#: symtab.c:1104 #, gcc-internal-format msgid "node is in same_comdat_group list but has no comdat_group" msgstr "" -#: symtab.c:1102 +#: symtab.c:1109 #, gcc-internal-format msgid "same_comdat_group list across different groups" msgstr "" -#: symtab.c:1107 +#: symtab.c:1114 #, gcc-internal-format msgid "mixing different types of symbol in same comdat groups is not supported" msgstr "" -#: symtab.c:1112 +#: symtab.c:1119 #, gcc-internal-format msgid "node is alone in a comdat group" msgstr "" -#: symtab.c:1119 +#: symtab.c:1126 #, gcc-internal-format msgid "same_comdat_group is not a circular list" msgstr "" -#: symtab.c:1134 +#: symtab.c:1141 #, gcc-internal-format, gfc-internal-format msgid "comdat-local symbol referred to by %s outside its comdat" msgstr "" -#: symtab.c:1144 +#: symtab.c:1151 #, gcc-internal-format msgid "implicit_section flag is set but section isn't" msgstr "" -#: symtab.c:1151 +#: symtab.c:1158 #, gcc-internal-format msgid "Both section and comdat group is set" msgstr "" -#: symtab.c:1163 +#: symtab.c:1170 #, gcc-internal-format msgid "Alias and target's section differs" msgstr "" -#: symtab.c:1170 +#: symtab.c:1177 #, gcc-internal-format msgid "Alias and target's comdat groups differs" msgstr "" -#: symtab.c:1185 +#: symtab.c:1192 #, gcc-internal-format msgid "Transparent alias and target's assembler names differs" msgstr "" -#: symtab.c:1193 +#: symtab.c:1200 #, gcc-internal-format msgid "Chained transparent aliases" msgstr "" -#: symtab.c:1216 symtab.c:1253 +#: symtab.c:1223 symtab.c:1260 #, gcc-internal-format msgid "symtab_node::verify failed" msgstr "" -#: symtab.c:1249 +#: symtab.c:1256 #, gcc-internal-format msgid "Two symbols with same comdat_group are not linked by the same_comdat_group list." msgstr "" -#: symtab.c:1658 +#: symtab.c:1665 #, gcc-internal-format msgid "function %q+D part of alias cycle" msgstr "" -#: symtab.c:1660 +#: symtab.c:1667 #, gcc-internal-format msgid "variable %q+D part of alias cycle" msgstr "" -#: symtab.c:1688 +#: symtab.c:1695 #, gcc-internal-format msgid "section of alias %q+D must match section of its target" msgstr "" @@ -23199,7 +23221,7 @@ msgstr "" msgid "the first argument of a VEC_COND_EXPR must be of a boolean vector type of the same number of elements as the result" msgstr "" -#: tree-cfg.c:4395 c/c-typeck.c:5212 +#: tree-cfg.c:4395 c/c-typeck.c:5217 #, gcc-internal-format msgid "type mismatch in conditional expression" msgstr "" @@ -23555,22 +23577,22 @@ msgstr "" msgid "missing edge %i->%i" msgstr "прапушчана поле '%s' у '%s'" -#: tree-cfg.c:9379 +#: tree-cfg.c:9388 #, gcc-internal-format msgid "% function does return" msgstr "" -#: tree-cfg.c:9400 tree-cfg.c:9432 +#: tree-cfg.c:9409 tree-cfg.c:9441 #, gcc-internal-format msgid "control reaches end of non-void function" msgstr "" -#: tree-cfg.c:9498 cp/cvt.c:1039 +#: tree-cfg.c:9507 cp/cvt.c:1039 #, gcc-internal-format msgid "ignoring return value of %qD, declared with attribute warn_unused_result" msgstr "" -#: tree-cfg.c:9503 cp/cvt.c:1046 +#: tree-cfg.c:9512 cp/cvt.c:1046 #, gcc-internal-format msgid "ignoring return value of function declared with attribute warn_unused_result" msgstr "" @@ -23835,46 +23857,46 @@ msgstr "аргумент для \"%s\" прапушчан" msgid "stmt volatile flag not up-to-date" msgstr "" -#: tree-ssa-strlen.c:1975 +#: tree-ssa-strlen.c:1999 msgid "%G%qD output truncated before terminating nul copying %E byte from a string of the same length" msgid_plural "%G%qD output truncated before terminating nul copying %E bytes from a string of the same length" msgstr[0] "" msgstr[1] "" -#: tree-ssa-strlen.c:1989 +#: tree-ssa-strlen.c:2013 msgid "%G%qD output truncated copying %E byte from a string of length %wu" msgid_plural "%G%qD output truncated copying %E bytes from a string of length %wu" msgstr[0] "" msgstr[1] "" -#: tree-ssa-strlen.c:1996 +#: tree-ssa-strlen.c:2020 msgid "%G%qD output truncated copying between %wu and %wu bytes from a string of length %wu" msgstr "" -#: tree-ssa-strlen.c:2008 +#: tree-ssa-strlen.c:2032 msgid "%G%qD output may be truncated copying %E byte from a string of length %wu" msgid_plural "%G%qD output may be truncated copying %E bytes from a string of length %wu" msgstr[0] "" msgstr[1] "" -#: tree-ssa-strlen.c:2015 tree-ssa-strlen.c:2029 +#: tree-ssa-strlen.c:2039 tree-ssa-strlen.c:2053 msgid "%G%qD output may be truncated copying between %wu and %wu bytes from a string of length %wu" msgstr "" -#: tree-ssa-strlen.c:2150 +#: tree-ssa-strlen.c:2174 msgid "%G%qD output truncated before terminating nul copying as many bytes from a string as its length" msgstr "" -#: tree-ssa-strlen.c:2156 +#: tree-ssa-strlen.c:2180 msgid "%G%qD specified bound depends on the length of the source argument" msgstr "" -#: tree-ssa-strlen.c:2163 +#: tree-ssa-strlen.c:2187 #, gcc-internal-format msgid "length computed here" msgstr "" -#: tree-ssa-uninit.c:191 varasm.c:331 +#: tree-ssa-uninit.c:191 varasm.c:342 #, fuzzy, gcc-internal-format msgid "%qD was declared here" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" @@ -24053,27 +24075,27 @@ msgstr "" msgid "target specific builtin not available" msgstr "" -#: tree-vect-generic.c:287 +#: tree-vect-generic.c:283 #, gcc-internal-format msgid "vector operation will be expanded piecewise" msgstr "" -#: tree-vect-generic.c:290 +#: tree-vect-generic.c:286 #, gcc-internal-format msgid "vector operation will be expanded in parallel" msgstr "" -#: tree-vect-generic.c:341 +#: tree-vect-generic.c:337 #, gcc-internal-format msgid "vector operation will be expanded with a single scalar operation" msgstr "" -#: tree-vect-generic.c:941 +#: tree-vect-generic.c:937 #, gcc-internal-format msgid "vector condition will be expanded piecewise" msgstr "" -#: tree-vect-generic.c:1373 +#: tree-vect-generic.c:1369 #, gcc-internal-format msgid "vector shuffling operation will be expanded piecewise" msgstr "" @@ -24083,27 +24105,27 @@ msgstr "" msgid "vectorization did not happen for a simd loop" msgstr "" -#: tree-vrp.c:4930 tree-vrp.c:4974 +#: tree-vrp.c:4931 tree-vrp.c:4975 #, gcc-internal-format msgid "array subscript %E is above array bounds of %qT" msgstr "" -#: tree-vrp.c:4956 +#: tree-vrp.c:4957 #, gcc-internal-format msgid "array subscript [%E, %E] is outside array bounds of %qT" msgstr "" -#: tree-vrp.c:4988 +#: tree-vrp.c:4989 #, gcc-internal-format msgid "array subscript %E is below array bounds of %qT" msgstr "" -#: tree-vrp.c:5046 +#: tree-vrp.c:5047 #, gcc-internal-format msgid "array subscript %wi is below array bounds of %qT" msgstr "" -#: tree-vrp.c:5060 +#: tree-vrp.c:5061 #, gcc-internal-format msgid "array subscript %wu is above array bounds of %qT" msgstr "" @@ -24118,92 +24140,92 @@ msgstr "" msgid "side-effects element in no-side-effects CONSTRUCTOR" msgstr "" -#: tree.c:7852 +#: tree.c:7856 #, gcc-internal-format msgid "arrays of functions are not meaningful" msgstr "" -#: tree.c:8019 +#: tree.c:8023 #, gcc-internal-format msgid "function return type cannot be function" msgstr "" -#: tree.c:9327 tree.c:9412 tree.c:9473 +#: tree.c:9331 tree.c:9416 tree.c:9477 #, gcc-internal-format, gfc-internal-format msgid "tree check: %s, have %s in %s, at %s:%d" msgstr "" -#: tree.c:9364 +#: tree.c:9368 #, gcc-internal-format, gfc-internal-format msgid "tree check: expected none of %s, have %s in %s, at %s:%d" msgstr "" -#: tree.c:9377 +#: tree.c:9381 #, gcc-internal-format msgid "tree check: expected class %qs, have %qs (%s) in %s, at %s:%d" msgstr "" -#: tree.c:9426 +#: tree.c:9430 #, gcc-internal-format msgid "tree check: did not expect class %qs, have %qs (%s) in %s, at %s:%d" msgstr "" -#: tree.c:9439 +#: tree.c:9443 #, gcc-internal-format, gfc-internal-format msgid "tree check: expected omp_clause %s, have %s in %s, at %s:%d" msgstr "" -#: tree.c:9499 +#: tree.c:9503 #, gcc-internal-format msgid "tree check: expected tree that contains %qs structure, have %qs in %s, at %s:%d" msgstr "" -#: tree.c:9513 +#: tree.c:9517 #, gcc-internal-format, gfc-internal-format msgid "tree check: accessed elt %d of tree_int_cst with %d elts in %s, at %s:%d" msgstr "" -#: tree.c:9525 +#: tree.c:9529 #, gcc-internal-format, gfc-internal-format msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d" msgstr "" -#: tree.c:9538 +#: tree.c:9542 #, gcc-internal-format, gfc-internal-format msgid "tree check: accessed operand %d of %s with %d operands in %s, at %s:%d" msgstr "" -#: tree.c:9551 +#: tree.c:9555 #, gcc-internal-format, gfc-internal-format msgid "tree check: accessed operand %d of omp_clause %s with %d operands in %s, at %s:%d" msgstr "" -#: tree.c:12446 +#: tree.c:12450 #, gcc-internal-format msgid "%qD is deprecated: %s" msgstr "" -#: tree.c:12449 +#: tree.c:12453 #, gcc-internal-format msgid "%qD is deprecated" msgstr "" -#: tree.c:12473 tree.c:12495 +#: tree.c:12477 tree.c:12499 #, gcc-internal-format msgid "%qE is deprecated: %s" msgstr "" -#: tree.c:12476 tree.c:12498 +#: tree.c:12480 tree.c:12502 #, gcc-internal-format msgid "%qE is deprecated" msgstr "" -#: tree.c:12482 tree.c:12503 +#: tree.c:12486 tree.c:12507 #, gcc-internal-format, gfc-internal-format msgid "type is deprecated: %s" msgstr "" -#: tree.c:12485 tree.c:12506 +#: tree.c:12489 tree.c:12510 #, gcc-internal-format msgid "type is deprecated" msgstr "" @@ -24228,243 +24250,243 @@ msgstr "" #. - vector types may differ by TYPE_VECTOR_OPAQUE #. #. Convenience macro for matching individual fields. -#: tree.c:13043 +#: tree.c:13047 #, gcc-internal-format, gfc-internal-format msgid "type variant differs by %s" msgstr "" -#: tree.c:13084 +#: tree.c:13088 #, gcc-internal-format msgid "type variant has different TYPE_SIZE_UNIT" msgstr "" -#: tree.c:13086 +#: tree.c:13090 #, gcc-internal-format msgid "type variant's TYPE_SIZE_UNIT" msgstr "" -#: tree.c:13088 +#: tree.c:13092 #, gcc-internal-format msgid "type's TYPE_SIZE_UNIT" msgstr "" -#: tree.c:13108 +#: tree.c:13112 #, gcc-internal-format msgid "type variant with TYPE_ALIAS_SET_KNOWN_P" msgstr "" -#: tree.c:13121 +#: tree.c:13125 #, gcc-internal-format msgid "type variant has different TYPE_VFIELD" msgstr "" -#: tree.c:13157 +#: tree.c:13161 #, gcc-internal-format msgid "type variant has different TYPE_BINFO" msgstr "" -#: tree.c:13159 +#: tree.c:13163 #, gcc-internal-format msgid "type variant's TYPE_BINFO" msgstr "" -#: tree.c:13161 +#: tree.c:13165 #, gcc-internal-format msgid "type's TYPE_BINFO" msgstr "" -#: tree.c:13199 +#: tree.c:13203 #, gcc-internal-format msgid "type variant has different TYPE_FIELDS" msgstr "" -#: tree.c:13201 +#: tree.c:13205 #, gcc-internal-format msgid "first mismatch is field" msgstr "" -#: tree.c:13203 +#: tree.c:13207 #, gcc-internal-format msgid "and field" msgstr "" -#: tree.c:13220 +#: tree.c:13224 #, gcc-internal-format msgid "type variant has different TREE_TYPE" msgstr "" -#: tree.c:13222 tree.c:13233 +#: tree.c:13226 tree.c:13237 #, gcc-internal-format msgid "type variant's TREE_TYPE" msgstr "" -#: tree.c:13224 tree.c:13235 +#: tree.c:13228 tree.c:13239 #, gcc-internal-format msgid "type's TREE_TYPE" msgstr "" -#: tree.c:13231 +#: tree.c:13235 #, gcc-internal-format msgid "type is not compatible with its variant" msgstr "" -#: tree.c:13534 +#: tree.c:13538 #, gcc-internal-format msgid "Main variant is not defined" msgstr "" -#: tree.c:13539 +#: tree.c:13543 #, gcc-internal-format msgid "TYPE_MAIN_VARIANT has different TYPE_MAIN_VARIANT" msgstr "" -#: tree.c:13551 +#: tree.c:13555 #, gcc-internal-format msgid "TYPE_CANONICAL has different TYPE_CANONICAL" msgstr "" -#: tree.c:13569 +#: tree.c:13573 #, gcc-internal-format msgid "TYPE_CANONICAL is not compatible" msgstr "" -#: tree.c:13577 +#: tree.c:13581 #, gcc-internal-format msgid "TYPE_MODE of TYPE_CANONICAL is not compatible" msgstr "" -#: tree.c:13583 +#: tree.c:13587 #, gcc-internal-format msgid "TYPE_CANONICAL of main variant is not main variant" msgstr "" -#: tree.c:13599 +#: tree.c:13603 #, gcc-internal-format msgid "TYPE_VFIELD is not FIELD_DECL nor TREE_LIST" msgstr "" -#: tree.c:13609 +#: tree.c:13613 #, gcc-internal-format msgid "TYPE_NEXT_PTR_TO is not POINTER_TYPE" msgstr "" -#: tree.c:13619 +#: tree.c:13623 #, gcc-internal-format msgid "TYPE_NEXT_REF_TO is not REFERENCE_TYPE" msgstr "" -#: tree.c:13640 +#: tree.c:13644 #, gcc-internal-format msgid "TYPE_BINFO is not TREE_BINFO" msgstr "" -#: tree.c:13646 +#: tree.c:13650 #, gcc-internal-format msgid "TYPE_BINFO type is not TYPE_MAIN_VARIANT" msgstr "" -#: tree.c:13657 +#: tree.c:13661 #, gcc-internal-format msgid "TYPE_METHOD_BASETYPE is not record nor union" msgstr "" -#: tree.c:13668 +#: tree.c:13672 #, gcc-internal-format msgid "TYPE_OFFSET_BASETYPE is not record nor union" msgstr "" -#: tree.c:13686 +#: tree.c:13690 #, gcc-internal-format msgid "TYPE_ARRAY_MAX_SIZE not INTEGER_CST" msgstr "" -#: tree.c:13693 +#: tree.c:13697 #, gcc-internal-format msgid "TYPE_MAX_VALUE_RAW non-NULL" msgstr "" -#: tree.c:13700 +#: tree.c:13704 #, gcc-internal-format msgid "TYPE_LANG_SLOT_1 (binfo) field is non-NULL" msgstr "" -#: tree.c:13716 +#: tree.c:13720 #, gcc-internal-format msgid "Enum value is not CONST_DECL or INTEGER_CST" msgstr "" -#: tree.c:13724 +#: tree.c:13728 #, gcc-internal-format msgid "Enum value type is not INTEGER_TYPE nor convertible to the enum" msgstr "" -#: tree.c:13731 +#: tree.c:13735 #, gcc-internal-format msgid "Enum value name is not IDENTIFIER_NODE" msgstr "" -#: tree.c:13741 +#: tree.c:13745 #, fuzzy, gcc-internal-format #| msgid "size of array `%D' has non-integer type" msgid "Array TYPE_DOMAIN is not integer type" msgstr "памер масіва `%D' не цэлалікавы тып" -#: tree.c:13750 +#: tree.c:13754 #, fuzzy, gcc-internal-format msgid "TYPE_FIELDS defined in incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: tree.c:13772 +#: tree.c:13776 #, gcc-internal-format msgid "Wrong tree in TYPE_FIELDS list" msgstr "" -#: tree.c:13787 +#: tree.c:13791 #, gcc-internal-format msgid "TYPE_CACHED_VALUES_P is %i while TYPE_CACHED_VALUES is %p" msgstr "" -#: tree.c:13793 +#: tree.c:13797 #, gcc-internal-format msgid "TYPE_CACHED_VALUES is not TREE_VEC" msgstr "" -#: tree.c:13806 +#: tree.c:13810 #, gcc-internal-format msgid "wrong TYPE_CACHED_VALUES entry" msgstr "" -#: tree.c:13819 +#: tree.c:13823 #, gcc-internal-format msgid "TREE_PURPOSE is non-NULL in TYPE_ARG_TYPES list" msgstr "" -#: tree.c:13825 +#: tree.c:13829 #, gcc-internal-format msgid "Wrong entry in TYPE_ARG_TYPES list" msgstr "" -#: tree.c:13832 +#: tree.c:13836 #, gcc-internal-format msgid "TYPE_VALUES_RAW field is non-NULL" msgstr "" -#: tree.c:13844 +#: tree.c:13848 #, gcc-internal-format msgid "TYPE_CACHED_VALUES_P is set while it should not" msgstr "" -#: tree.c:13850 +#: tree.c:13854 #, gcc-internal-format msgid "TYPE_STRING_FLAG is set on wrong type code" msgstr "" -#: tree.c:13860 +#: tree.c:13864 #, gcc-internal-format msgid "TYPE_METHOD_BASETYPE is not main variant" msgstr "" -#: tree.c:13867 +#: tree.c:13871 #, gcc-internal-format msgid "verify_type failed" msgstr "" @@ -24489,184 +24511,184 @@ msgstr "" msgid "corrupted value profile: %s profile counter (%d out of %d) inconsistent with basic-block count (%d)" msgstr "" -#: var-tracking.c:7166 +#: var-tracking.c:7184 #, gcc-internal-format msgid "variable tracking size limit exceeded with -fvar-tracking-assignments, retrying without" msgstr "" -#: var-tracking.c:7170 +#: var-tracking.c:7188 #, gcc-internal-format msgid "variable tracking size limit exceeded" msgstr "" -#: varasm.c:326 +#: varasm.c:337 #, gcc-internal-format msgid "%+qD causes a section type conflict with %qD" msgstr "" -#: varasm.c:329 +#: varasm.c:340 #, gcc-internal-format msgid "section type conflict with %qD" msgstr "" -#: varasm.c:334 +#: varasm.c:345 #, gcc-internal-format msgid "%+qD causes a section type conflict" msgstr "" -#: varasm.c:336 +#: varasm.c:347 #, gcc-internal-format msgid "section type conflict" msgstr "" -#: varasm.c:1019 +#: varasm.c:1030 #, gcc-internal-format msgid "alignment of %q+D is greater than maximum object file alignment %d" msgstr "" -#: varasm.c:1172 +#: varasm.c:1183 #, fuzzy, gcc-internal-format #| msgid "can't initialize friend function `%s'" msgid "only zero initializers are allowed in section %qs" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: varasm.c:1378 varasm.c:1387 +#: varasm.c:1389 varasm.c:1398 #, gcc-internal-format msgid "register name not specified for %q+D" msgstr "" -#: varasm.c:1389 +#: varasm.c:1400 #, fuzzy, gcc-internal-format #| msgid "invalid register name for `%s'" msgid "invalid register name for %q+D" msgstr "нерэчаісная назва рэгістра `%s'" -#: varasm.c:1391 +#: varasm.c:1402 #, gcc-internal-format msgid "data type of %q+D isn%'t suitable for a register" msgstr "" -#: varasm.c:1394 +#: varasm.c:1405 #, gcc-internal-format msgid "the register specified for %q+D cannot be accessed by the current target" msgstr "" -#: varasm.c:1397 +#: varasm.c:1408 #, gcc-internal-format msgid "the register specified for %q+D is not general enough to be used as a register variable" msgstr "" -#: varasm.c:1400 +#: varasm.c:1411 #, gcc-internal-format msgid "register specified for %q+D isn%'t suitable for data type" msgstr "" -#: varasm.c:1410 +#: varasm.c:1421 #, gcc-internal-format msgid "global register variable has initial value" msgstr "" -#: varasm.c:1414 +#: varasm.c:1425 #, gcc-internal-format msgid "optimization may eliminate reads and/or writes to register variables" msgstr "" -#: varasm.c:1460 +#: varasm.c:1471 #, gcc-internal-format msgid "register name given for non-register variable %q+D" msgstr "" -#: varasm.c:1870 +#: varasm.c:1881 #, gcc-internal-format msgid "Patchable function entry > size" msgstr "" -#: varasm.c:2069 +#: varasm.c:2080 #, gcc-internal-format msgid "thread-local COMMON data not implemented" msgstr "" -#: varasm.c:2102 +#: varasm.c:2113 #, gcc-internal-format msgid "requested alignment for %q+D is greater than implemented alignment of %wu" msgstr "" -#: varasm.c:2205 c/c-decl.c:5027 c/c-parser.c:1534 +#: varasm.c:2216 c/c-decl.c:5027 c/c-parser.c:1534 #, gcc-internal-format msgid "storage size of %q+D isn%'t known" msgstr "" -#: varasm.c:4910 +#: varasm.c:4921 #, gcc-internal-format msgid "initializer for integer/fixed-point value is too complicated" msgstr "" -#: varasm.c:4915 +#: varasm.c:4926 #, gcc-internal-format msgid "initializer for floating value is not a floating constant" msgstr "" -#: varasm.c:5227 +#: varasm.c:5238 #, fuzzy, gcc-internal-format msgid "invalid initial value for member %qE" msgstr "нявернае выкарыстанне \"restict\"" -#: varasm.c:5487 +#: varasm.c:5498 #, gcc-internal-format msgid "%+qD declared weak after being used" msgstr "" -#: varasm.c:5539 +#: varasm.c:5550 #, gcc-internal-format msgid "weak declaration of %q+D being applied to a already existing, static definition" msgstr "" -#: varasm.c:5575 +#: varasm.c:5586 #, gcc-internal-format msgid "weak declaration of %q+D must be public" msgstr "" -#: varasm.c:5579 +#: varasm.c:5590 #, gcc-internal-format msgid "weak declaration of %q+D not supported" msgstr "" -#: varasm.c:5608 varasm.c:5912 +#: varasm.c:5619 varasm.c:5926 #, gcc-internal-format msgid "only weak aliases are supported in this configuration" msgstr "" -#: varasm.c:5802 +#: varasm.c:5813 #, fuzzy, gcc-internal-format msgid "weakref is not supported in this configuration" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: varasm.c:5834 +#: varasm.c:5846 #, fuzzy, gcc-internal-format msgid "ifunc is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: varasm.c:5892 +#: varasm.c:5904 #, gcc-internal-format msgid "weakref %q+D ultimately targets itself" msgstr "" -#: varasm.c:5894 +#: varasm.c:5906 #, gcc-internal-format msgid "weakref %q+D must have static linkage" msgstr "" -#: varasm.c:5901 +#: varasm.c:5913 #, fuzzy, gcc-internal-format msgid "alias definitions not supported in this configuration" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: varasm.c:5909 +#: varasm.c:5923 #, fuzzy, gcc-internal-format msgid "ifunc is not supported in this configuration" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: varasm.c:6127 config/sol2.c:159 config/i386/winnt.c:265 +#: varasm.c:6141 config/sol2.c:159 config/i386/winnt.c:265 #, fuzzy, gcc-internal-format msgid "visibility attribute not supported in this configuration; ignored" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" @@ -24742,477 +24764,482 @@ msgstr "" msgid "bytecode stream: tag %s is not in the expected range [%s, %s]" msgstr "" -#: c-family/c-attribs.c:529 +#: c-family/c-attribs.c:524 +#, fuzzy, gcc-internal-format +msgid "%qE attribute ignored for type %qT" +msgstr "\"%s\" атрыбут ігнарыруецца" + +#: c-family/c-attribs.c:536 #, fuzzy, gcc-internal-format msgid "%qE attribute ignored for field of type %qT" msgstr "\"%s\" атрыбут ігнарыруецца" -#: c-family/c-attribs.c:696 +#: c-family/c-attribs.c:706 #, gcc-internal-format msgid "no_sanitize argument not a string" msgstr "" -#: c-family/c-attribs.c:826 ada/gcc-interface/utils.c:6235 +#: c-family/c-attribs.c:837 ada/gcc-interface/utils.c:6240 #, gcc-internal-format msgid "%qE attribute ignored due to conflict with attribute %qs" msgstr "" -#: c-family/c-attribs.c:875 +#: c-family/c-attribs.c:886 #, gcc-internal-format msgid "%qE attribute ignored. Use -fcf-protection option to enable it" msgstr "" -#: c-family/c-attribs.c:914 c-family/c-attribs.c:920 c-family/c-attribs.c:3388 -#: c-family/c-attribs.c:3423 c-family/c-attribs.c:3429 +#: c-family/c-attribs.c:925 c-family/c-attribs.c:931 c-family/c-attribs.c:3399 +#: c-family/c-attribs.c:3434 c-family/c-attribs.c:3440 #, gcc-internal-format msgid "%qE attribute ignored due to conflict with %qs attribute" msgstr "" -#: c-family/c-attribs.c:976 brig/brig-lang.c:482 lto/lto-lang.c:288 +#: c-family/c-attribs.c:987 brig/brig-lang.c:482 lto/lto-lang.c:288 #, fuzzy, gcc-internal-format msgid "%qE attribute has no effect on unit local functions" msgstr "\"%s\" звычайна функцыя" -#: c-family/c-attribs.c:1130 +#: c-family/c-attribs.c:1141 #, gcc-internal-format msgid "%qE attribute have effect only on public objects" msgstr "" -#: c-family/c-attribs.c:1159 +#: c-family/c-attribs.c:1170 #, fuzzy, gcc-internal-format msgid "%qE attribute only affects top level objects" msgstr "\"%s\" атрыбут ігнарыруецца" -#: c-family/c-attribs.c:1198 c-family/c-attribs.c:2682 +#: c-family/c-attribs.c:1209 c-family/c-attribs.c:2693 #, gcc-internal-format msgid "%qE attribute on function returning %" msgstr "" -#: c-family/c-attribs.c:1221 c-family/c-pragma.c:419 +#: c-family/c-attribs.c:1232 c-family/c-pragma.c:419 #, gcc-internal-format msgid "scalar_storage_order is not supported because endianness is not uniform" msgstr "" -#: c-family/c-attribs.c:1238 +#: c-family/c-attribs.c:1249 #, gcc-internal-format msgid "scalar_storage_order argument must be one of \"big-endian\" or \"little-endian\"" msgstr "" -#: c-family/c-attribs.c:1334 +#: c-family/c-attribs.c:1345 #, fuzzy, gcc-internal-format #| msgid "section attributes are not supported for this target" msgid "destructor priorities are not supported" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: c-family/c-attribs.c:1336 +#: c-family/c-attribs.c:1347 #, fuzzy, gcc-internal-format #| msgid "section attributes are not supported for this target" msgid "constructor priorities are not supported" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: c-family/c-attribs.c:1358 +#: c-family/c-attribs.c:1369 #, gcc-internal-format, gfc-internal-format msgid "destructor priorities from 0 to %d are reserved for the implementation" msgstr "" -#: c-family/c-attribs.c:1363 +#: c-family/c-attribs.c:1374 #, gcc-internal-format, gfc-internal-format msgid "constructor priorities from 0 to %d are reserved for the implementation" msgstr "" -#: c-family/c-attribs.c:1371 +#: c-family/c-attribs.c:1382 #, gcc-internal-format, gfc-internal-format msgid "destructor priorities must be integers from 0 to %d inclusive" msgstr "" -#: c-family/c-attribs.c:1374 +#: c-family/c-attribs.c:1385 #, gcc-internal-format, gfc-internal-format msgid "constructor priorities must be integers from 0 to %d inclusive" msgstr "" -#: c-family/c-attribs.c:1527 +#: c-family/c-attribs.c:1538 #, fuzzy, gcc-internal-format #| msgid "unknown machine mode `%s'" msgid "unknown machine mode %qE" msgstr "невядомы рэжым машыны \"%s\"" -#: c-family/c-attribs.c:1557 +#: c-family/c-attribs.c:1568 #, gcc-internal-format msgid "specifying vector types with __attribute__ ((mode)) is deprecated" msgstr "" -#: c-family/c-attribs.c:1560 +#: c-family/c-attribs.c:1571 #, gcc-internal-format msgid "use __attribute__ ((vector_size)) instead" msgstr "" -#: c-family/c-attribs.c:1569 +#: c-family/c-attribs.c:1580 #, fuzzy, gcc-internal-format #| msgid "unable to open file '%s'" msgid "unable to emulate %qs" msgstr "немагу адчыніць файл \"%s\"" -#: c-family/c-attribs.c:1582 +#: c-family/c-attribs.c:1593 #, fuzzy, gcc-internal-format msgid "invalid pointer mode %qs" msgstr "Нерэчаісны выбар \"%s\"" -#: c-family/c-attribs.c:1599 +#: c-family/c-attribs.c:1610 #, gcc-internal-format msgid "signedness of type and machine mode %qs don%'t match" msgstr "" -#: c-family/c-attribs.c:1610 +#: c-family/c-attribs.c:1621 #, fuzzy, gcc-internal-format #| msgid "no data type for mode `%s'" msgid "no data type for mode %qs" msgstr "няма тыпа дадзеных для рэжыма \"%s\"" -#: c-family/c-attribs.c:1620 +#: c-family/c-attribs.c:1631 #, gcc-internal-format msgid "cannot use mode %qs for enumeral types" msgstr "" -#: c-family/c-attribs.c:1647 +#: c-family/c-attribs.c:1658 #, fuzzy, gcc-internal-format msgid "mode %qs applied to inappropriate type" msgstr "\"%s\" мае незавершаны тып" -#: c-family/c-attribs.c:1669 +#: c-family/c-attribs.c:1680 #, gcc-internal-format msgid "section attributes are not supported for this target" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: c-family/c-attribs.c:1675 +#: c-family/c-attribs.c:1686 #, fuzzy, gcc-internal-format #| msgid "section attributes are not supported for this target" msgid "section attribute not allowed for %q+D" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: c-family/c-attribs.c:1681 +#: c-family/c-attribs.c:1692 #, fuzzy, gcc-internal-format msgid "section attribute argument not a string constant" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: c-family/c-attribs.c:1690 +#: c-family/c-attribs.c:1701 #, gcc-internal-format msgid "section attribute cannot be specified for local variables" msgstr "" -#: c-family/c-attribs.c:1700 config/bfin/bfin.c:4806 config/bfin/bfin.c:4857 +#: c-family/c-attribs.c:1711 config/bfin/bfin.c:4806 config/bfin/bfin.c:4857 #: config/bfin/bfin.c:4883 config/bfin/bfin.c:4896 #, fuzzy, gcc-internal-format #| msgid "section of `%s' conflicts with previous declaration" msgid "section of %q+D conflicts with previous declaration" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: c-family/c-attribs.c:1708 +#: c-family/c-attribs.c:1719 #, fuzzy, gcc-internal-format msgid "section of %q+D cannot be overridden" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: c-family/c-attribs.c:1773 +#: c-family/c-attribs.c:1784 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "requested alignment %d is larger than %d" msgstr "памер \"%s\" больш чам %d байт" -#: c-family/c-attribs.c:1866 +#: c-family/c-attribs.c:1877 #, gcc-internal-format msgid "alignment may not be specified for %q+D" msgstr "" -#: c-family/c-attribs.c:1886 +#: c-family/c-attribs.c:1897 #, gcc-internal-format msgid "ignoring attribute %<%E (%u)%> because it conflicts with attribute %<%E (%u)%>" msgstr "" #. Do not error out for attribute warn_if_not_aligned. -#: c-family/c-attribs.c:1891 c-family/c-attribs.c:1920 +#: c-family/c-attribs.c:1902 c-family/c-attribs.c:1931 #, fuzzy, gcc-internal-format msgid "alignment for %q+D must be at least %d" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: c-family/c-attribs.c:1916 +#: c-family/c-attribs.c:1927 #, gcc-internal-format msgid "alignment for %q+D was previously specified as %d and may not be decreased" msgstr "" -#: c-family/c-attribs.c:1943 +#: c-family/c-attribs.c:1954 #, gcc-internal-format msgid "% may not be specified for %q+D" msgstr "" -#: c-family/c-attribs.c:1986 +#: c-family/c-attribs.c:1997 #, fuzzy, gcc-internal-format msgid "inline function %q+D declared weak" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: c-family/c-attribs.c:1991 +#: c-family/c-attribs.c:2002 #, fuzzy, gcc-internal-format msgid "indirect function %q+D cannot be declared weak" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: c-family/c-attribs.c:2015 +#: c-family/c-attribs.c:2026 #, fuzzy, gcc-internal-format msgid "%qE attribute is only applicable on functions" msgstr "\"%s\" звычайна функцыя" -#: c-family/c-attribs.c:2046 +#: c-family/c-attribs.c:2057 #, gcc-internal-format msgid "%q+D defined both normally and as %qE attribute" msgstr "" -#: c-family/c-attribs.c:2054 +#: c-family/c-attribs.c:2065 #, gcc-internal-format msgid "weak %q+D cannot be defined %qE" msgstr "" -#: c-family/c-attribs.c:2071 c-family/c-attribs.c:2582 +#: c-family/c-attribs.c:2082 c-family/c-attribs.c:2593 #, gcc-internal-format msgid "attribute %qE argument not a string" msgstr "" -#: c-family/c-attribs.c:2106 +#: c-family/c-attribs.c:2117 #, gcc-internal-format msgid "%+qD declared alias after being used" msgstr "" -#: c-family/c-attribs.c:2108 +#: c-family/c-attribs.c:2119 #, gcc-internal-format msgid "%+qD declared ifunc after being used" msgstr "" -#: c-family/c-attribs.c:2159 +#: c-family/c-attribs.c:2170 #, fuzzy, gcc-internal-format msgid "indirect function %q+D cannot be declared weakref" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: c-family/c-attribs.c:2181 +#: c-family/c-attribs.c:2192 #, gcc-internal-format msgid "weakref attribute must appear before alias attribute" msgstr "" -#: c-family/c-attribs.c:2193 +#: c-family/c-attribs.c:2204 #, gcc-internal-format msgid "%+qD declared weakref after being used" msgstr "" -#: c-family/c-attribs.c:2217 +#: c-family/c-attribs.c:2228 #, fuzzy, gcc-internal-format msgid "%qE attribute ignored on non-class types" msgstr "\"%s\" атрыбут ігнарыруецца" -#: c-family/c-attribs.c:2223 +#: c-family/c-attribs.c:2234 #, gcc-internal-format msgid "%qE attribute ignored because %qT is already defined" msgstr "" -#: c-family/c-attribs.c:2236 +#: c-family/c-attribs.c:2247 #, fuzzy, gcc-internal-format msgid "visibility argument not a string" msgstr "аргумент для \"%s\" прапушчан" -#: c-family/c-attribs.c:2248 +#: c-family/c-attribs.c:2259 #, fuzzy, gcc-internal-format msgid "%qE attribute ignored on types" msgstr "\"%s\" атрыбут ігнарыруецца" -#: c-family/c-attribs.c:2264 +#: c-family/c-attribs.c:2275 #, gcc-internal-format msgid "visibility argument must be one of \"default\", \"hidden\", \"protected\" or \"internal\"" msgstr "" -#: c-family/c-attribs.c:2275 +#: c-family/c-attribs.c:2286 #, gcc-internal-format msgid "%qD redeclared with different visibility" msgstr "" -#: c-family/c-attribs.c:2278 c-family/c-attribs.c:2282 +#: c-family/c-attribs.c:2289 c-family/c-attribs.c:2293 #, gcc-internal-format msgid "%qD was declared %qs which implies default visibility" msgstr "" -#: c-family/c-attribs.c:2320 +#: c-family/c-attribs.c:2331 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function" msgid "tls_model argument not a string" msgstr "не хапае аргументаў у функцыі" -#: c-family/c-attribs.c:2333 +#: c-family/c-attribs.c:2344 #, gcc-internal-format msgid "tls_model argument must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"" msgstr "" -#: c-family/c-attribs.c:2353 c-family/c-attribs.c:2656 -#: c-family/c-attribs.c:3497 config/m32c/m32c.c:2944 +#: c-family/c-attribs.c:2364 c-family/c-attribs.c:2667 +#: c-family/c-attribs.c:3508 config/m32c/m32c.c:2944 #, fuzzy, gcc-internal-format msgid "%qE attribute applies only to functions" msgstr "\"%s\" звычайна функцыя" -#: c-family/c-attribs.c:2417 +#: c-family/c-attribs.c:2428 #, gcc-internal-format msgid "alloc_size parameter outside range" msgstr "" -#: c-family/c-attribs.c:2443 +#: c-family/c-attribs.c:2454 #, gcc-internal-format msgid "alloc_align parameter outside range" msgstr "" -#: c-family/c-attribs.c:2467 +#: c-family/c-attribs.c:2478 #, gcc-internal-format msgid "assume_aligned parameter not integer constant" msgstr "" -#: c-family/c-attribs.c:2595 +#: c-family/c-attribs.c:2606 #, gcc-internal-format msgid "only % and % flags are allowed for %<__simd__%> attribute" msgstr "" -#: c-family/c-attribs.c:2662 c-family/c-attribs.c:3503 +#: c-family/c-attribs.c:2673 c-family/c-attribs.c:3514 #, gcc-internal-format msgid "can%'t set %qE attribute after definition" msgstr "" -#: c-family/c-attribs.c:2727 +#: c-family/c-attribs.c:2738 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "%qE attribute duplicated" msgstr "\"%s\" атрыбут ігнарыруецца" -#: c-family/c-attribs.c:2729 +#: c-family/c-attribs.c:2740 #, gcc-internal-format msgid "%qE attribute follows %qE" msgstr "" -#: c-family/c-attribs.c:2828 +#: c-family/c-attribs.c:2839 #, fuzzy, gcc-internal-format msgid "type was previously declared %qE" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-attribs.c:2841 cp/class.c:4397 +#: c-family/c-attribs.c:2852 cp/class.c:4401 #, gcc-internal-format msgid "% may only be specified for a virtual function" msgstr "" -#: c-family/c-attribs.c:2899 +#: c-family/c-attribs.c:2910 #, gcc-internal-format msgid "%qE argument not an identifier" msgstr "" -#: c-family/c-attribs.c:2910 +#: c-family/c-attribs.c:2921 #, gcc-internal-format msgid "%qD is not compatible with %qD" msgstr "" -#: c-family/c-attribs.c:2913 +#: c-family/c-attribs.c:2924 #, fuzzy, gcc-internal-format #| msgid "`%D' is not a function," msgid "%qE argument is not a function" msgstr "`%D' - гэта ня функцыя," -#: c-family/c-attribs.c:2961 +#: c-family/c-attribs.c:2972 #, gcc-internal-format msgid "deprecated message is not a string" msgstr "" -#: c-family/c-attribs.c:3002 +#: c-family/c-attribs.c:3013 #, fuzzy, gcc-internal-format msgid "%qE attribute ignored for %qE" msgstr "\"%s\" атрыбут ігнарыруецца" -#: c-family/c-attribs.c:3065 +#: c-family/c-attribs.c:3076 #, fuzzy, gcc-internal-format msgid "invalid vector type for attribute %qE" msgstr "нявернае выкарыстанне \"restict\"" -#: c-family/c-attribs.c:3071 ada/gcc-interface/utils.c:3896 +#: c-family/c-attribs.c:3082 ada/gcc-interface/utils.c:3899 #, gcc-internal-format msgid "vector size not an integral multiple of component size" msgstr "" -#: c-family/c-attribs.c:3077 ada/gcc-interface/utils.c:3903 +#: c-family/c-attribs.c:3088 ada/gcc-interface/utils.c:3906 #, gcc-internal-format msgid "zero vector size" msgstr "" -#: c-family/c-attribs.c:3085 +#: c-family/c-attribs.c:3096 #, gcc-internal-format msgid "number of components of the vector not a power of two" msgstr "" -#: c-family/c-attribs.c:3118 ada/gcc-interface/utils.c:6092 +#: c-family/c-attribs.c:3129 ada/gcc-interface/utils.c:6098 #, gcc-internal-format msgid "nonnull attribute without arguments on a non-prototype" msgstr "" -#: c-family/c-attribs.c:3137 ada/gcc-interface/utils.c:6106 +#: c-family/c-attribs.c:3148 ada/gcc-interface/utils.c:6112 #, gcc-internal-format, gfc-internal-format msgid "nonnull argument has invalid operand number (argument %lu)" msgstr "" -#: c-family/c-attribs.c:3159 ada/gcc-interface/utils.c:6128 +#: c-family/c-attribs.c:3170 ada/gcc-interface/utils.c:6134 #, gcc-internal-format, gfc-internal-format msgid "nonnull argument with out-of-range operand number (argument %lu, operand %lu)" msgstr "" -#: c-family/c-attribs.c:3168 ada/gcc-interface/utils.c:6137 +#: c-family/c-attribs.c:3179 ada/gcc-interface/utils.c:6143 #, gcc-internal-format, gfc-internal-format msgid "nonnull argument references non-pointer operand (argument %lu, operand %lu)" msgstr "" -#: c-family/c-attribs.c:3208 +#: c-family/c-attribs.c:3219 #, fuzzy, gcc-internal-format msgid "%qE attribute ignored on objects of type %qT" msgstr "\"%s\" атрыбут ігнарыруецца" -#: c-family/c-attribs.c:3216 +#: c-family/c-attribs.c:3227 #, fuzzy, gcc-internal-format msgid "%qE attribute does not apply to functions" msgstr "\"%s\" звычайна функцыя" -#: c-family/c-attribs.c:3273 +#: c-family/c-attribs.c:3284 #, gcc-internal-format msgid "cleanup argument not an identifier" msgstr "" -#: c-family/c-attribs.c:3280 +#: c-family/c-attribs.c:3291 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function" msgid "cleanup argument not a function" msgstr "вельмі шмат аргументаў у функцыі" -#: c-family/c-attribs.c:3317 +#: c-family/c-attribs.c:3328 #, gcc-internal-format msgid "%qE attribute requires prototypes with named arguments" msgstr "" -#: c-family/c-attribs.c:3325 +#: c-family/c-attribs.c:3336 #, fuzzy, gcc-internal-format msgid "%qE attribute only applies to variadic functions" msgstr "\"%s\" звычайна функцыя" -#: c-family/c-attribs.c:3341 ada/gcc-interface/utils.c:6179 +#: c-family/c-attribs.c:3352 ada/gcc-interface/utils.c:6185 #, fuzzy, gcc-internal-format msgid "requested position is not an integer constant" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: c-family/c-attribs.c:3349 ada/gcc-interface/utils.c:6186 +#: c-family/c-attribs.c:3360 ada/gcc-interface/utils.c:6192 #, gcc-internal-format msgid "requested position is less than zero" msgstr "" -#: c-family/c-attribs.c:3404 +#: c-family/c-attribs.c:3415 #, gcc-internal-format msgid "empty string in attribute %" msgstr "" -#: c-family/c-attribs.c:3520 +#: c-family/c-attribs.c:3531 #, gcc-internal-format msgid "returns_nonnull attribute on a function not returning a pointer" msgstr "" -#: c-family/c-attribs.c:3535 +#: c-family/c-attribs.c:3546 #, fuzzy, gcc-internal-format msgid "%qE attribute is only valid on % type" msgstr "\"%s\" звычайна функцыя" @@ -25257,12 +25284,12 @@ msgstr "" msgid "__builtin_shuffle argument vector(s) inner type must have the same size as inner type of the mask" msgstr "" -#: c-family/c-common.c:1262 c-family/c-warn.c:1194 +#: c-family/c-common.c:1262 c-family/c-warn.c:1202 #, gcc-internal-format msgid "unsigned conversion from %qT to %qT changes value from %qE to %qE" msgstr "" -#: c-family/c-common.c:1267 c-family/c-warn.c:1202 +#: c-family/c-common.c:1267 c-family/c-warn.c:1210 #, gcc-internal-format msgid "unsigned conversion from %qT to %qT changes the value of %qE" msgstr "" @@ -25392,7 +25419,7 @@ msgstr "" msgid "suggest parentheses around assignment used as truth value" msgstr "" -#: c-family/c-common.c:3518 c/c-decl.c:4325 c/c-decl.c:6430 c/c-typeck.c:14177 +#: c-family/c-common.c:3518 c/c-decl.c:4325 c/c-decl.c:6450 c/c-typeck.c:14182 #, fuzzy, gcc-internal-format #| msgid "invalid use of `restrict'" msgid "invalid use of %" @@ -25473,7 +25500,7 @@ msgstr "" msgid "duplicate case value" msgstr "" -#: c-family/c-common.c:4867 c-family/c-warn.c:2216 +#: c-family/c-common.c:4867 c-family/c-warn.c:2225 #, gcc-internal-format msgid "previously used here" msgstr "" @@ -25519,225 +25546,225 @@ msgstr "не хапае аргументаў у функцыі" msgid "missing sentinel in function call" msgstr "" -#: c-family/c-common.c:5411 +#: c-family/c-common.c:5409 #, gcc-internal-format, gfc-internal-format msgid "null argument where non-null required (argument %lu)" msgstr "" -#: c-family/c-common.c:5506 c-family/c-common.c:5553 +#: c-family/c-common.c:5504 c-family/c-common.c:5551 #, gcc-internal-format msgid "bad option %qs to attribute %" msgstr "" -#: c-family/c-common.c:5509 c-family/c-common.c:5557 +#: c-family/c-common.c:5507 c-family/c-common.c:5555 #, gcc-internal-format msgid "bad option %qs to pragma %" msgstr "" -#: c-family/c-common.c:5589 +#: c-family/c-common.c:5587 #, gcc-internal-format msgid "% attribute specified multiple times" msgstr "" -#: c-family/c-common.c:5593 +#: c-family/c-common.c:5591 #, gcc-internal-format msgid "% attribute specified with a parameter" msgstr "" -#: c-family/c-common.c:5733 c-family/c-common.c:6485 c-family/c-common.c:6558 +#: c-family/c-common.c:5731 c-family/c-common.c:6477 c-family/c-common.c:6550 #: c/c-typeck.c:3555 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function" msgid "too few arguments to function %qE" msgstr "не хапае аргументаў у функцыі" -#: c-family/c-common.c:5738 c-family/c-common.c:6584 c/c-typeck.c:3284 +#: c-family/c-common.c:5736 c-family/c-common.c:6576 c/c-typeck.c:3284 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function" msgid "too many arguments to function %qE" msgstr "вельмі шмат аргументаў у функцыі" -#: c-family/c-common.c:5769 +#: c-family/c-common.c:5767 #, fuzzy, gcc-internal-format msgid "third argument to function %qE must be a constant integer" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: c-family/c-common.c:5794 +#: c-family/c-common.c:5792 #, gcc-internal-format msgid "second argument to function %qE must be a constant integer power of 2 between %qi and %qu bits" msgstr "" -#: c-family/c-common.c:5815 c-family/c-common.c:5859 +#: c-family/c-common.c:5813 c-family/c-common.c:5857 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function `%s'" msgid "non-floating-point argument in call to function %qE" msgstr "вельмі шмат аргумэнтаў у функцыі `%s'" -#: c-family/c-common.c:5838 +#: c-family/c-common.c:5836 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function `%s'" msgid "non-floating-point arguments in call to function %qE" msgstr "вельмі шмат аргумэнтаў у функцыі `%s'" -#: c-family/c-common.c:5852 +#: c-family/c-common.c:5850 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function `%s'" msgid "non-const integer argument %u in call to function %qE" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: c-family/c-common.c:5872 +#: c-family/c-common.c:5870 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function `%s'" msgid "non-integer argument 3 in call to function %qE" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: c-family/c-common.c:5889 c-family/c-common.c:5925 +#: c-family/c-common.c:5887 c-family/c-common.c:5923 #, gcc-internal-format msgid "argument %u in call to function %qE does not have integral type" msgstr "" -#: c-family/c-common.c:5896 +#: c-family/c-common.c:5894 #, gcc-internal-format msgid "argument 3 in call to function %qE does not have pointer to integral type" msgstr "" -#: c-family/c-common.c:5902 +#: c-family/c-common.c:5900 #, gcc-internal-format msgid "argument 3 in call to function %qE has pointer to enumerated type" msgstr "" -#: c-family/c-common.c:5908 +#: c-family/c-common.c:5906 #, gcc-internal-format msgid "argument 3 in call to function %qE has pointer to boolean type" msgstr "" -#: c-family/c-common.c:5931 +#: c-family/c-common.c:5929 #, gcc-internal-format msgid "argument 3 in call to function %qE has enumerated type" msgstr "" -#: c-family/c-common.c:5937 +#: c-family/c-common.c:5935 #, gcc-internal-format msgid "argument 3 in call to function %qE has boolean type" msgstr "" -#: c-family/c-common.c:6184 +#: c-family/c-common.c:6183 #, gcc-internal-format msgid "cannot apply % to static data member %qD" msgstr "" -#: c-family/c-common.c:6189 +#: c-family/c-common.c:6188 #, gcc-internal-format msgid "cannot apply % when % is overloaded" msgstr "" -#: c-family/c-common.c:6196 +#: c-family/c-common.c:6195 #, gcc-internal-format msgid "cannot apply % to a non constant address" msgstr "" -#: c-family/c-common.c:6209 +#: c-family/c-common.c:6208 #, fuzzy, gcc-internal-format msgid "attempt to take address of bit-field structure member %qD" msgstr "не магу атрымаць адрас бітавага поля \"%s\"" -#: c-family/c-common.c:6261 +#: c-family/c-common.c:6260 #, gcc-internal-format msgid "index %E denotes an offset greater than size of %qT" msgstr "" -#: c-family/c-common.c:6427 cp/init.c:3004 cp/init.c:3023 +#: c-family/c-common.c:6419 cp/init.c:3020 cp/init.c:3039 #, fuzzy, gcc-internal-format #| msgid "size of array `%s' is too large" msgid "size of array is too large" msgstr "памер масіва \"%s\" вельмі вялікі" -#: c-family/c-common.c:6517 +#: c-family/c-common.c:6509 #, gcc-internal-format msgid "operand type %qT is incompatible with argument %d of %qE" msgstr "" -#: c-family/c-common.c:6651 +#: c-family/c-common.c:6643 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function `%s'" msgid "incorrect number of arguments to function %qE" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: c-family/c-common.c:6665 +#: c-family/c-common.c:6657 #, fuzzy, gcc-internal-format msgid "argument 1 of %qE must be a non-void pointer type" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: c-family/c-common.c:6674 +#: c-family/c-common.c:6666 #, fuzzy, gcc-internal-format msgid "argument 1 of %qE must be a pointer to a constant size type" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: c-family/c-common.c:6685 +#: c-family/c-common.c:6677 #, fuzzy, gcc-internal-format msgid "argument 1 of %qE must be a pointer to a nonzero size object" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: c-family/c-common.c:6706 +#: c-family/c-common.c:6698 #, fuzzy, gcc-internal-format msgid "argument %d of %qE must be a pointer type" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: c-family/c-common.c:6714 +#: c-family/c-common.c:6706 #, fuzzy, gcc-internal-format msgid "argument %d of %qE must be a pointer to a constant size type" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: c-family/c-common.c:6720 +#: c-family/c-common.c:6712 #, fuzzy, gcc-internal-format msgid "argument %d of %qE must not be a pointer to a function" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: c-family/c-common.c:6728 +#: c-family/c-common.c:6720 #, gcc-internal-format msgid "size mismatch in argument %d of %qE" msgstr "" -#: c-family/c-common.c:6740 +#: c-family/c-common.c:6732 #, gcc-internal-format msgid "non-integer memory model argument %d of %qE" msgstr "" -#: c-family/c-common.c:6753 +#: c-family/c-common.c:6745 #, gcc-internal-format msgid "invalid memory model argument %d of %qE" msgstr "" -#: c-family/c-common.c:7672 +#: c-family/c-common.c:7664 #, gcc-internal-format msgid "index value is out of bound" msgstr "" -#: c-family/c-common.c:7714 c-family/c-common.c:7763 c-family/c-common.c:7779 +#: c-family/c-common.c:7706 c-family/c-common.c:7755 c-family/c-common.c:7771 #, gcc-internal-format msgid "conversion of scalar %qT to vector %qT involves truncation" msgstr "" #. Reject arguments that are built-in functions with #. no library fallback. -#: c-family/c-common.c:7867 +#: c-family/c-common.c:7859 #, gcc-internal-format msgid "built-in function %qE must be directly called" msgstr "" -#: c-family/c-common.c:7889 c/c-decl.c:6177 +#: c-family/c-common.c:7881 c/c-decl.c:6197 #, fuzzy, gcc-internal-format #| msgid "size of array `%s' is too large" msgid "size of array %qE is too large" msgstr "памер масіва \"%s\" вельмі вялікі" -#: c-family/c-common.c:7891 c/c-decl.c:6180 +#: c-family/c-common.c:7883 c/c-decl.c:6200 #, fuzzy, gcc-internal-format #| msgid "size of array `%s' is too large" msgid "size of unnamed array is too large" msgstr "памер масіва \"%s\" вельмі вялікі" -#: c-family/c-common.c:7921 +#: c-family/c-common.c:7913 #, gcc-internal-format msgid "environment variable SOURCE_DATE_EPOCH must expand to a non-negative integer less than or equal to %wd" msgstr "" @@ -26268,7 +26295,7 @@ msgstr "" msgid "%<#pragma omp atomic capture%> uses two different variables for memory" msgstr "" -#: c-family/c-omp.c:557 cp/semantics.c:8186 +#: c-family/c-omp.c:557 cp/semantics.c:8189 #, gcc-internal-format msgid "invalid type for iteration variable %qE" msgstr "" @@ -26284,22 +26311,22 @@ msgstr "" msgid "%qE is not initialized" msgstr "прапушчан ініцыялізатар" -#: c-family/c-omp.c:599 cp/semantics.c:8076 +#: c-family/c-omp.c:599 cp/semantics.c:8079 #, gcc-internal-format msgid "missing controlling predicate" msgstr "" -#: c-family/c-omp.c:704 cp/semantics.c:7732 +#: c-family/c-omp.c:704 cp/semantics.c:7735 #, fuzzy, gcc-internal-format msgid "invalid controlling predicate" msgstr "нерэчаісны ініцыялізатар" -#: c-family/c-omp.c:711 cp/semantics.c:8082 +#: c-family/c-omp.c:711 cp/semantics.c:8085 #, fuzzy, gcc-internal-format msgid "missing increment expression" msgstr "аргумент для \"%s\" прапушчан" -#: c-family/c-omp.c:775 cp/semantics.c:7847 +#: c-family/c-omp.c:775 cp/semantics.c:7850 #, fuzzy, gcc-internal-format msgid "invalid increment expression" msgstr "нерэчаісны ініцыялізатар" @@ -26355,114 +26382,129 @@ msgstr "" msgid "%<-Wabi=1%> is not supported, using =2" msgstr "-pipe не падтрымліваецца" -#: c-family/c-opts.c:612 fortran/cpp.c:350 +#: c-family/c-opts.c:610 fortran/cpp.c:350 #, fuzzy, gcc-internal-format msgid "output filename specified twice" msgstr "не зададзены ўваходзячыя файлы" -#: c-family/c-opts.c:799 +#: c-family/c-opts.c:797 #, gcc-internal-format msgid "-fexcess-precision=standard for C++" msgstr "" -#: c-family/c-opts.c:834 +#: c-family/c-opts.c:832 #, gcc-internal-format msgid "-fno-gnu89-inline is only supported in GNU99 or C99 mode" msgstr "" -#: c-family/c-opts.c:880 +#: c-family/c-opts.c:878 #, gcc-internal-format msgid "-Wformat-y2k ignored without -Wformat" msgstr "" -#: c-family/c-opts.c:882 +#: c-family/c-opts.c:880 #, gcc-internal-format msgid "-Wformat-extra-args ignored without -Wformat" msgstr "" -#: c-family/c-opts.c:884 +#: c-family/c-opts.c:882 #, gcc-internal-format msgid "-Wformat-zero-length ignored without -Wformat" msgstr "" -#: c-family/c-opts.c:886 +#: c-family/c-opts.c:884 #, gcc-internal-format msgid "-Wformat-nonliteral ignored without -Wformat" msgstr "" -#: c-family/c-opts.c:888 +#: c-family/c-opts.c:886 #, gcc-internal-format msgid "-Wformat-contains-nul ignored without -Wformat" msgstr "" -#: c-family/c-opts.c:890 +#: c-family/c-opts.c:888 #, gcc-internal-format msgid "-Wformat-security ignored without -Wformat" msgstr "" -#: c-family/c-opts.c:928 +#: c-family/c-opts.c:918 #, gcc-internal-format msgid "%<-fabi-compat-version=1%> is not supported, using =2" msgstr "" -#: c-family/c-opts.c:988 +#: c-family/c-opts.c:944 +#, gcc-internal-format +msgid "-Wabi won't warn about anything" +msgstr "" + +#: c-family/c-opts.c:946 +#, gcc-internal-format +msgid "-Wabi warns about differences from the most up-to-date ABI, which is also used by default" +msgstr "" + +#: c-family/c-opts.c:949 +#, gcc-internal-format +msgid "use e.g. -Wabi=11 to warn about changes from GCC 7" +msgstr "" + +#: c-family/c-opts.c:1003 #, fuzzy, gcc-internal-format msgid "external TLS initialization functions not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: c-family/c-opts.c:1001 +#: c-family/c-opts.c:1016 #, gcc-internal-format, gfc-internal-format msgid "too many filenames given. Type %s --help for usage" msgstr "" -#: c-family/c-opts.c:1016 +#: c-family/c-opts.c:1031 #, fuzzy, gcc-internal-format #| msgid "can't open output file `%s'" msgid "opening output file %s: %m" msgstr "немагчыма адчыніць файл уводу `%s'" -#: c-family/c-opts.c:1036 +#: c-family/c-opts.c:1051 #, gcc-internal-format, gfc-internal-format msgid "the \"%s\" debug format cannot be used with pre-compiled headers" msgstr "" -#: c-family/c-opts.c:1190 +#: c-family/c-opts.c:1205 #, gcc-internal-format msgid "opening dependency file %s: %m" msgstr "" -#: c-family/c-opts.c:1201 +#: c-family/c-opts.c:1216 #, gcc-internal-format msgid "closing dependency file %s: %m" msgstr "" -#: c-family/c-opts.c:1204 +#: c-family/c-opts.c:1219 #, fuzzy, gcc-internal-format #| msgid "error writing to %s" msgid "when writing output to %s: %m" msgstr "памылка запісу ў %s" -#: c-family/c-opts.c:1284 +#: c-family/c-opts.c:1299 #, gcc-internal-format msgid "to generate dependencies you must specify either -M or -MM" msgstr "" -#: c-family/c-opts.c:1307 +#: c-family/c-opts.c:1322 #, gcc-internal-format msgid "-MG may only be used with -M or -MM" msgstr "" -#: c-family/c-opts.c:1340 +#: c-family/c-opts.c:1355 #, gcc-internal-format msgid "-fdirectives-only is incompatible with -Wunused_macros" msgstr "" -#: c-family/c-opts.c:1342 +#: c-family/c-opts.c:1357 #, gcc-internal-format msgid "-fdirectives-only is incompatible with -traditional" msgstr "" -#: c-family/c-opts.c:1534 +#: c-family/c-opts.c:1549 #, gcc-internal-format msgid "too late for # directive to set debug directory" msgstr "" @@ -26854,738 +26896,738 @@ msgstr "вяртанне" msgid "wrong type argument to %s" msgstr "не хапае аргументаў у функцыі" -#: c-family/c-warn.c:53 c-family/c-warn.c:66 cp/constexpr.c:1847 +#: c-family/c-warn.c:54 c-family/c-warn.c:67 cp/constexpr.c:1847 #: cp/constexpr.c:4099 #, gcc-internal-format msgid "overflow in constant expression" msgstr "" -#: c-family/c-warn.c:93 +#: c-family/c-warn.c:94 #, gcc-internal-format msgid "integer overflow in expression %qE of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:95 +#: c-family/c-warn.c:96 #, gcc-internal-format msgid "integer overflow in expression of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:101 +#: c-family/c-warn.c:102 #, gcc-internal-format msgid "floating point overflow in expression %qE of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:103 +#: c-family/c-warn.c:104 #, gcc-internal-format msgid "floating point overflow in expression of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:109 +#: c-family/c-warn.c:110 #, gcc-internal-format msgid "fixed-point overflow in expression %qE of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:111 +#: c-family/c-warn.c:112 #, gcc-internal-format msgid "fixed-point overflow in expression of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:117 +#: c-family/c-warn.c:118 #, gcc-internal-format msgid "vector overflow in expression %qE of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:119 +#: c-family/c-warn.c:120 #, gcc-internal-format msgid "vector overflow in expression of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:126 +#: c-family/c-warn.c:127 #, gcc-internal-format msgid "complex integer overflow in expression %qE of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:128 +#: c-family/c-warn.c:129 #, gcc-internal-format msgid "complex integer overflow in expression of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:132 +#: c-family/c-warn.c:133 #, gcc-internal-format msgid "complex floating point overflow in expression %qE of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:134 +#: c-family/c-warn.c:135 #, gcc-internal-format msgid "complex floating point overflow in expression of type %qT results in %qE" msgstr "" -#: c-family/c-warn.c:216 +#: c-family/c-warn.c:217 #, gcc-internal-format msgid "logical % applied to non-boolean constant" msgstr "" -#: c-family/c-warn.c:219 +#: c-family/c-warn.c:220 #, gcc-internal-format msgid "logical % applied to non-boolean constant" msgstr "" -#: c-family/c-warn.c:289 +#: c-family/c-warn.c:290 #, gcc-internal-format msgid "logical % of collectively exhaustive tests is always true" msgstr "" -#: c-family/c-warn.c:293 +#: c-family/c-warn.c:294 #, gcc-internal-format msgid "logical % of mutually exclusive tests is always false" msgstr "" -#: c-family/c-warn.c:303 +#: c-family/c-warn.c:304 #, gcc-internal-format msgid "logical % of equal expressions" msgstr "" -#: c-family/c-warn.c:306 +#: c-family/c-warn.c:307 #, gcc-internal-format msgid "logical % of equal expressions" msgstr "" -#: c-family/c-warn.c:384 +#: c-family/c-warn.c:385 #, gcc-internal-format msgid "bitwise comparison always evaluates to false" msgstr "" -#: c-family/c-warn.c:387 +#: c-family/c-warn.c:388 #, gcc-internal-format msgid "bitwise comparison always evaluates to true" msgstr "" -#: c-family/c-warn.c:441 +#: c-family/c-warn.c:442 #, gcc-internal-format msgid "self-comparison always evaluates to true" msgstr "" -#: c-family/c-warn.c:444 +#: c-family/c-warn.c:445 #, gcc-internal-format msgid "self-comparison always evaluates to false" msgstr "" -#: c-family/c-warn.c:494 +#: c-family/c-warn.c:495 #, gcc-internal-format msgid "logical not is only applied to the left hand side of comparison" msgstr "" -#: c-family/c-warn.c:502 +#: c-family/c-warn.c:503 #, gcc-internal-format msgid "add parentheses around left hand side expression to silence this warning" msgstr "" -#: c-family/c-warn.c:636 +#: c-family/c-warn.c:637 #, gcc-internal-format msgid "type-punning to incomplete type might break strict-aliasing rules" msgstr "" -#: c-family/c-warn.c:654 +#: c-family/c-warn.c:655 #, gcc-internal-format msgid "dereferencing type-punned pointer will break strict-aliasing rules" msgstr "" -#: c-family/c-warn.c:662 c-family/c-warn.c:680 +#: c-family/c-warn.c:663 c-family/c-warn.c:681 #, gcc-internal-format msgid "dereferencing type-punned pointer might break strict-aliasing rules" msgstr "" -#: c-family/c-warn.c:803 +#: c-family/c-warn.c:811 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the source; did you mean to use the size of the destination?" msgstr "" -#: c-family/c-warn.c:834 +#: c-family/c-warn.c:842 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the destination; did you mean to remove the addressof?" msgstr "" -#: c-family/c-warn.c:841 +#: c-family/c-warn.c:849 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the destination; did you mean to provide an explicit length?" msgstr "" -#: c-family/c-warn.c:846 +#: c-family/c-warn.c:854 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the destination; did you mean to dereference it?" msgstr "" -#: c-family/c-warn.c:858 +#: c-family/c-warn.c:866 #, gcc-internal-format msgid "argument to % in %qD call is the same pointer type %qT as the destination; expected %qT or an explicit length" msgstr "" -#: c-family/c-warn.c:874 +#: c-family/c-warn.c:882 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the source; did you mean to remove the addressof?" msgstr "" -#: c-family/c-warn.c:881 +#: c-family/c-warn.c:889 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the source; did you mean to provide an explicit length?" msgstr "" -#: c-family/c-warn.c:886 +#: c-family/c-warn.c:894 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the source; did you mean to dereference it?" msgstr "" -#: c-family/c-warn.c:898 +#: c-family/c-warn.c:906 #, gcc-internal-format msgid "argument to % in %qD call is the same pointer type %qT as the source; expected %qT or an explicit length" msgstr "" -#: c-family/c-warn.c:914 +#: c-family/c-warn.c:922 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the first source; did you mean to remove the addressof?" msgstr "" -#: c-family/c-warn.c:921 +#: c-family/c-warn.c:929 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the first source; did you mean to provide an explicit length?" msgstr "" -#: c-family/c-warn.c:926 +#: c-family/c-warn.c:934 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the first source; did you mean to dereference it?" msgstr "" -#: c-family/c-warn.c:938 +#: c-family/c-warn.c:946 #, gcc-internal-format msgid "argument to % in %qD call is the same pointer type %qT as the first source; expected %qT or an explicit length" msgstr "" -#: c-family/c-warn.c:954 +#: c-family/c-warn.c:962 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the second source; did you mean to remove the addressof?" msgstr "" -#: c-family/c-warn.c:961 +#: c-family/c-warn.c:969 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the second source; did you mean to provide an explicit length?" msgstr "" -#: c-family/c-warn.c:966 +#: c-family/c-warn.c:974 #, gcc-internal-format msgid "argument to % in %qD call is the same expression as the second source; did you mean to dereference it?" msgstr "" -#: c-family/c-warn.c:978 +#: c-family/c-warn.c:986 #, gcc-internal-format msgid "argument to % in %qD call is the same pointer type %qT as the second source; expected %qT or an explicit length" msgstr "" -#: c-family/c-warn.c:1007 c-family/c-warn.c:1014 +#: c-family/c-warn.c:1015 c-family/c-warn.c:1022 #, fuzzy, gcc-internal-format #| msgid "invalid parameter type `%T'" msgid "%<_Atomic%>-qualified parameter type %qT of %q+D" msgstr "нерэчаісны тып парамэтра `%T'" -#: c-family/c-warn.c:1024 +#: c-family/c-warn.c:1032 #, fuzzy, gcc-internal-format #| msgid "first argument of `%s' should be `int'" msgid "first argument of %q+D should be %" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: c-family/c-warn.c:1033 +#: c-family/c-warn.c:1041 #, fuzzy, gcc-internal-format #| msgid "second argument of `%s' should be `char **'" msgid "second argument of %q+D should be %" msgstr "другім аргументам \"%s\" павінен быць \"char **\"" -#: c-family/c-warn.c:1042 +#: c-family/c-warn.c:1050 #, fuzzy, gcc-internal-format #| msgid "second argument of `%s' should be `char **'" msgid "third argument of %q+D should probably be %" msgstr "другім аргументам \"%s\" павінен быць \"char **\"" -#: c-family/c-warn.c:1053 +#: c-family/c-warn.c:1061 #, gcc-internal-format msgid "%q+D takes only zero or two arguments" msgstr "" -#: c-family/c-warn.c:1057 +#: c-family/c-warn.c:1065 #, fuzzy, gcc-internal-format msgid "%q+D declared as variadic function" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c-family/c-warn.c:1099 +#: c-family/c-warn.c:1107 #, gcc-internal-format msgid "conversion to %qT from boolean expression" msgstr "" -#: c-family/c-warn.c:1117 c-family/c-warn.c:1192 +#: c-family/c-warn.c:1125 c-family/c-warn.c:1200 #, gcc-internal-format msgid "conversion from %qT to %qT changes value from %qE to %qE" msgstr "" -#: c-family/c-warn.c:1121 c-family/c-warn.c:1200 +#: c-family/c-warn.c:1129 c-family/c-warn.c:1208 #, gcc-internal-format msgid "conversion from %qT to %qT changes the value of %qE" msgstr "" -#: c-family/c-warn.c:1141 +#: c-family/c-warn.c:1149 #, gcc-internal-format msgid "conversion from %qT to %qT discards imaginary component" msgstr "" -#: c-family/c-warn.c:1153 +#: c-family/c-warn.c:1161 #, fuzzy, gcc-internal-format #| msgid "converting from `%T' to `%T'" msgid "conversion from %qT to %qT may change value" msgstr "пераўтварэньне з `%T' у `%T'" -#: c-family/c-warn.c:1213 c-family/c-warn.c:1230 c-family/c-warn.c:1247 +#: c-family/c-warn.c:1221 c-family/c-warn.c:1238 c-family/c-warn.c:1255 #, gcc-internal-format msgid "overflow in conversion from %qT to %qT changes value from %qE to %qE" msgstr "" -#: c-family/c-warn.c:1218 c-family/c-warn.c:1235 c-family/c-warn.c:1252 +#: c-family/c-warn.c:1226 c-family/c-warn.c:1243 c-family/c-warn.c:1260 #, gcc-internal-format msgid "overflow in conversion from %qT to %qT changes the value of %qE" msgstr "" -#: c-family/c-warn.c:1282 +#: c-family/c-warn.c:1290 #, gcc-internal-format msgid "case value %qs not in enumerated type" msgstr "" -#: c-family/c-warn.c:1287 +#: c-family/c-warn.c:1295 #, gcc-internal-format msgid "case value %qs not in enumerated type %qT" msgstr "" -#: c-family/c-warn.c:1348 +#: c-family/c-warn.c:1356 #, gcc-internal-format msgid "switch missing default case" msgstr "" -#: c-family/c-warn.c:1393 +#: c-family/c-warn.c:1401 #, gcc-internal-format msgid "switch condition has boolean value" msgstr "" -#: c-family/c-warn.c:1466 +#: c-family/c-warn.c:1474 #, gcc-internal-format msgid "enumeration value %qE not handled in switch" msgstr "" -#: c-family/c-warn.c:1494 +#: c-family/c-warn.c:1502 #, gcc-internal-format msgid "the omitted middle operand in ?: will always be %, suggest explicit middle operand" msgstr "" -#: c-family/c-warn.c:1515 +#: c-family/c-warn.c:1523 #, gcc-internal-format msgid "assignment of member %qD in read-only object" msgstr "" -#: c-family/c-warn.c:1517 +#: c-family/c-warn.c:1525 #, gcc-internal-format msgid "increment of member %qD in read-only object" msgstr "" -#: c-family/c-warn.c:1519 +#: c-family/c-warn.c:1527 #, gcc-internal-format msgid "decrement of member %qD in read-only object" msgstr "" -#: c-family/c-warn.c:1521 +#: c-family/c-warn.c:1529 #, gcc-internal-format msgid "member %qD in read-only object used as % output" msgstr "" -#: c-family/c-warn.c:1525 +#: c-family/c-warn.c:1533 #, gcc-internal-format msgid "assignment of read-only member %qD" msgstr "" -#: c-family/c-warn.c:1526 +#: c-family/c-warn.c:1534 #, gcc-internal-format msgid "increment of read-only member %qD" msgstr "" -#: c-family/c-warn.c:1527 +#: c-family/c-warn.c:1535 #, gcc-internal-format msgid "decrement of read-only member %qD" msgstr "" -#: c-family/c-warn.c:1528 +#: c-family/c-warn.c:1536 #, gcc-internal-format msgid "read-only member %qD used as % output" msgstr "" -#: c-family/c-warn.c:1532 +#: c-family/c-warn.c:1540 #, gcc-internal-format msgid "assignment of read-only variable %qD" msgstr "" -#: c-family/c-warn.c:1533 +#: c-family/c-warn.c:1541 #, gcc-internal-format msgid "increment of read-only variable %qD" msgstr "" -#: c-family/c-warn.c:1534 +#: c-family/c-warn.c:1542 #, gcc-internal-format msgid "decrement of read-only variable %qD" msgstr "" -#: c-family/c-warn.c:1535 +#: c-family/c-warn.c:1543 #, gcc-internal-format msgid "read-only variable %qD used as % output" msgstr "" -#: c-family/c-warn.c:1538 +#: c-family/c-warn.c:1546 #, gcc-internal-format msgid "assignment of read-only parameter %qD" msgstr "" -#: c-family/c-warn.c:1539 +#: c-family/c-warn.c:1547 #, gcc-internal-format msgid "increment of read-only parameter %qD" msgstr "" -#: c-family/c-warn.c:1540 +#: c-family/c-warn.c:1548 #, gcc-internal-format msgid "decrement of read-only parameter %qD" msgstr "" -#: c-family/c-warn.c:1541 +#: c-family/c-warn.c:1549 #, gcc-internal-format msgid "read-only parameter %qD use as % output" msgstr "" -#: c-family/c-warn.c:1546 +#: c-family/c-warn.c:1554 #, gcc-internal-format msgid "assignment of read-only named return value %qD" msgstr "" -#: c-family/c-warn.c:1548 +#: c-family/c-warn.c:1556 #, gcc-internal-format msgid "increment of read-only named return value %qD" msgstr "" -#: c-family/c-warn.c:1550 +#: c-family/c-warn.c:1558 #, gcc-internal-format msgid "decrement of read-only named return value %qD" msgstr "" -#: c-family/c-warn.c:1552 +#: c-family/c-warn.c:1560 #, gcc-internal-format msgid "read-only named return value %qD used as %output" msgstr "" -#: c-family/c-warn.c:1557 +#: c-family/c-warn.c:1565 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function `%s'" msgid "assignment of function %qD" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: c-family/c-warn.c:1558 +#: c-family/c-warn.c:1566 #, fuzzy, gcc-internal-format msgid "increment of function %qD" msgstr "вельмі шмат аргументаў у функцыі" -#: c-family/c-warn.c:1559 +#: c-family/c-warn.c:1567 #, fuzzy, gcc-internal-format #| msgid "too few arguments to function `%s'" msgid "decrement of function %qD" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: c-family/c-warn.c:1560 +#: c-family/c-warn.c:1568 #, gcc-internal-format msgid "function %qD used as % output" msgstr "" -#: c-family/c-warn.c:1563 c/c-typeck.c:4762 +#: c-family/c-warn.c:1571 c/c-typeck.c:4767 #, gcc-internal-format msgid "assignment of read-only location %qE" msgstr "" -#: c-family/c-warn.c:1564 c/c-typeck.c:4765 +#: c-family/c-warn.c:1572 c/c-typeck.c:4770 #, gcc-internal-format msgid "increment of read-only location %qE" msgstr "" -#: c-family/c-warn.c:1565 c/c-typeck.c:4768 +#: c-family/c-warn.c:1573 c/c-typeck.c:4773 #, gcc-internal-format msgid "decrement of read-only location %qE" msgstr "" -#: c-family/c-warn.c:1566 +#: c-family/c-warn.c:1574 #, gcc-internal-format msgid "read-only location %qE used as % output" msgstr "" -#: c-family/c-warn.c:1580 +#: c-family/c-warn.c:1588 #, gcc-internal-format msgid "lvalue required as left operand of assignment" msgstr "" -#: c-family/c-warn.c:1583 +#: c-family/c-warn.c:1591 #, gcc-internal-format msgid "lvalue required as increment operand" msgstr "" -#: c-family/c-warn.c:1586 +#: c-family/c-warn.c:1594 #, gcc-internal-format msgid "lvalue required as decrement operand" msgstr "" -#: c-family/c-warn.c:1589 +#: c-family/c-warn.c:1597 #, gcc-internal-format msgid "lvalue required as unary %<&%> operand" msgstr "" -#: c-family/c-warn.c:1592 +#: c-family/c-warn.c:1600 #, gcc-internal-format msgid "lvalue required in asm statement" msgstr "" -#: c-family/c-warn.c:1609 +#: c-family/c-warn.c:1617 #, fuzzy, gcc-internal-format #| msgid "invalid parameter type `%T'" msgid "invalid type argument (have %qT)" msgstr "нерэчаісны тып парамэтра `%T'" -#: c-family/c-warn.c:1613 +#: c-family/c-warn.c:1621 #, gcc-internal-format msgid "invalid type argument of array indexing (have %qT)" msgstr "" -#: c-family/c-warn.c:1618 +#: c-family/c-warn.c:1626 #, gcc-internal-format msgid "invalid type argument of unary %<*%> (have %qT)" msgstr "" -#: c-family/c-warn.c:1623 +#: c-family/c-warn.c:1631 #, fuzzy, gcc-internal-format msgid "invalid type argument of %<->%> (have %qT)" msgstr "нявернае выкарыстанне \"restict\"" -#: c-family/c-warn.c:1628 +#: c-family/c-warn.c:1636 #, fuzzy, gcc-internal-format msgid "invalid type argument of %<->*%> (have %qT)" msgstr "нявернае выкарыстанне \"restict\"" -#: c-family/c-warn.c:1633 +#: c-family/c-warn.c:1641 #, gcc-internal-format msgid "invalid type argument of implicit conversion (have %qT)" msgstr "" -#: c-family/c-warn.c:1654 +#: c-family/c-warn.c:1662 #, gcc-internal-format msgid "array subscript has type %" msgstr "" -#: c-family/c-warn.c:1689 c-family/c-warn.c:1692 +#: c-family/c-warn.c:1697 c-family/c-warn.c:1700 #, gcc-internal-format msgid "suggest parentheses around %<+%> inside %<<<%>" msgstr "" -#: c-family/c-warn.c:1695 c-family/c-warn.c:1698 +#: c-family/c-warn.c:1703 c-family/c-warn.c:1706 #, gcc-internal-format msgid "suggest parentheses around %<-%> inside %<<<%>" msgstr "" -#: c-family/c-warn.c:1704 c-family/c-warn.c:1707 +#: c-family/c-warn.c:1712 c-family/c-warn.c:1715 #, gcc-internal-format msgid "suggest parentheses around %<+%> inside %<>>%>" msgstr "" -#: c-family/c-warn.c:1710 c-family/c-warn.c:1713 +#: c-family/c-warn.c:1718 c-family/c-warn.c:1721 #, gcc-internal-format msgid "suggest parentheses around %<-%> inside %<>>%>" msgstr "" -#: c-family/c-warn.c:1719 c-family/c-warn.c:1722 +#: c-family/c-warn.c:1727 c-family/c-warn.c:1730 #, gcc-internal-format msgid "suggest parentheses around %<&&%> within %<||%>" msgstr "" -#: c-family/c-warn.c:1729 c-family/c-warn.c:1733 +#: c-family/c-warn.c:1737 c-family/c-warn.c:1741 #, gcc-internal-format msgid "suggest parentheses around arithmetic in operand of %<|%>" msgstr "" -#: c-family/c-warn.c:1737 c-family/c-warn.c:1740 +#: c-family/c-warn.c:1745 c-family/c-warn.c:1748 #, gcc-internal-format msgid "suggest parentheses around comparison in operand of %<|%>" msgstr "" -#: c-family/c-warn.c:1745 +#: c-family/c-warn.c:1753 #, gcc-internal-format msgid "suggest parentheses around operand of % or change %<|%> to %<||%> or % to %<~%>" msgstr "" -#: c-family/c-warn.c:1753 c-family/c-warn.c:1757 +#: c-family/c-warn.c:1761 c-family/c-warn.c:1765 #, gcc-internal-format msgid "suggest parentheses around arithmetic in operand of %<^%>" msgstr "" -#: c-family/c-warn.c:1761 c-family/c-warn.c:1764 +#: c-family/c-warn.c:1769 c-family/c-warn.c:1772 #, gcc-internal-format msgid "suggest parentheses around comparison in operand of %<^%>" msgstr "" -#: c-family/c-warn.c:1770 c-family/c-warn.c:1773 +#: c-family/c-warn.c:1778 c-family/c-warn.c:1781 #, gcc-internal-format msgid "suggest parentheses around %<+%> in operand of %<&%>" msgstr "" -#: c-family/c-warn.c:1776 c-family/c-warn.c:1779 +#: c-family/c-warn.c:1784 c-family/c-warn.c:1787 #, gcc-internal-format msgid "suggest parentheses around %<-%> in operand of %<&%>" msgstr "" -#: c-family/c-warn.c:1783 c-family/c-warn.c:1786 +#: c-family/c-warn.c:1791 c-family/c-warn.c:1794 #, gcc-internal-format msgid "suggest parentheses around comparison in operand of %<&%>" msgstr "" -#: c-family/c-warn.c:1791 +#: c-family/c-warn.c:1799 #, gcc-internal-format msgid "suggest parentheses around operand of % or change %<&%> to %<&&%> or % to %<~%>" msgstr "" -#: c-family/c-warn.c:1798 c-family/c-warn.c:1801 +#: c-family/c-warn.c:1806 c-family/c-warn.c:1809 #, gcc-internal-format msgid "suggest parentheses around comparison in operand of %<==%>" msgstr "" -#: c-family/c-warn.c:1806 c-family/c-warn.c:1809 +#: c-family/c-warn.c:1814 c-family/c-warn.c:1817 #, gcc-internal-format msgid "suggest parentheses around comparison in operand of %" msgstr "" -#: c-family/c-warn.c:1819 c-family/c-warn.c:1825 +#: c-family/c-warn.c:1827 c-family/c-warn.c:1833 #, gcc-internal-format msgid "comparisons like % do not have their mathematical meaning" msgstr "" -#: c-family/c-warn.c:1841 +#: c-family/c-warn.c:1849 #, fuzzy, gcc-internal-format #| msgid "label `%D' defined but not used" msgid "label %q+D defined but not used" msgstr "адмеціна `%D' вызначана, але не выкарыстоўваецца" -#: c-family/c-warn.c:1843 +#: c-family/c-warn.c:1851 #, fuzzy, gcc-internal-format #| msgid "label `%D' used but not defined" msgid "label %q+D declared but not defined" msgstr "адмеціна `%D' выкарыстоўвываецца, але ня вызначана" -#: c-family/c-warn.c:1866 +#: c-family/c-warn.c:1874 #, gcc-internal-format msgid "division by zero" msgstr "" -#: c-family/c-warn.c:1886 +#: c-family/c-warn.c:1894 #, gcc-internal-format msgid "% used with constant zero length parameter; this could be due to transposed parameters" msgstr "" -#: c-family/c-warn.c:1909 +#: c-family/c-warn.c:1918 #, gcc-internal-format msgid "% used with length equal to number of elements without multiplication by element size" msgstr "" -#: c-family/c-warn.c:1948 c/c-typeck.c:11499 c/c-typeck.c:11667 +#: c-family/c-warn.c:1957 c/c-typeck.c:11504 c/c-typeck.c:11672 #: cp/typeck.c:5048 #, gcc-internal-format msgid "comparison between types %qT and %qT" msgstr "" -#: c-family/c-warn.c:1998 +#: c-family/c-warn.c:2007 #, gcc-internal-format msgid "comparison of integer expressions of different signedness: %qT and %qT" msgstr "" -#: c-family/c-warn.c:2051 +#: c-family/c-warn.c:2060 #, gcc-internal-format msgid "promoted ~unsigned is always non-zero" msgstr "" -#: c-family/c-warn.c:2054 +#: c-family/c-warn.c:2063 #, gcc-internal-format msgid "comparison of promoted ~unsigned with constant" msgstr "" -#: c-family/c-warn.c:2064 +#: c-family/c-warn.c:2073 #, gcc-internal-format msgid "comparison of promoted ~unsigned with unsigned" msgstr "" -#: c-family/c-warn.c:2118 +#: c-family/c-warn.c:2127 #, fuzzy, gcc-internal-format #| msgid "unused parameter `%s'" msgid "unused parameter %qD" msgstr "невыкарыстаемы параметр \"%s\"" -#: c-family/c-warn.c:2180 +#: c-family/c-warn.c:2189 #, fuzzy, gcc-internal-format #| msgid "label `%D' defined but not used" msgid "typedef %qD locally defined but not used" msgstr "адмеціна `%D' вызначана, але не выкарыстоўваецца" -#: c-family/c-warn.c:2215 +#: c-family/c-warn.c:2224 #, fuzzy, gcc-internal-format #| msgid "duplicate `const'" msgid "duplicated % condition" msgstr "паўтарэнне \"const\"" -#: c-family/c-warn.c:2244 +#: c-family/c-warn.c:2253 #, gcc-internal-format msgid "optimization attribute on %qD follows definition but the attribute doesn%'t match" msgstr "" -#: c-family/c-warn.c:2254 +#: c-family/c-warn.c:2261 #, fuzzy, gcc-internal-format msgid "inline declaration of %qD follows declaration with attribute %qs" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-warn.c:2259 +#: c-family/c-warn.c:2266 #, fuzzy, gcc-internal-format msgid "declaration of %q+D with attribute %qs follows inline declaration" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c-family/c-warn.c:2306 +#: c-family/c-warn.c:2313 #, gcc-internal-format msgid "result of %qE requires %u bits to represent, but %qT only has %u bits" msgstr "" -#: c-family/c-warn.c:2344 c-family/c-warn.c:2368 +#: c-family/c-warn.c:2351 c-family/c-warn.c:2375 #, gcc-internal-format msgid "comparison of constant %qE with boolean expression is always false" msgstr "" -#: c-family/c-warn.c:2347 c-family/c-warn.c:2365 +#: c-family/c-warn.c:2354 c-family/c-warn.c:2372 #, gcc-internal-format msgid "comparison of constant %qE with boolean expression is always true" msgstr "" -#: c-family/c-warn.c:2415 +#: c-family/c-warn.c:2422 msgid "passing argument %i to restrict-qualified parameter aliases with argument %Z" msgid_plural "passing argument %i to restrict-qualified parameter aliases with arguments %Z" msgstr[0] "" msgstr[1] "" -#: c-family/c-warn.c:2480 c/c-typeck.c:5288 cp/call.c:5365 +#: c-family/c-warn.c:2487 c/c-typeck.c:5293 cp/call.c:5365 #, gcc-internal-format msgid "this condition has identical branches" msgstr "" -#: c-family/c-warn.c:2586 +#: c-family/c-warn.c:2593 #, gcc-internal-format msgid "macro expands to multiple statements" msgstr "" -#: c-family/c-warn.c:2587 +#: c-family/c-warn.c:2594 #, gcc-internal-format msgid "some parts of macro expansion are not guarded by this %qs clause" msgstr "" @@ -27600,7 +27642,7 @@ msgstr "" msgid "too many input files" msgstr "вельмі шмат уваходзячых файлаў" -#: common/config/aarch64/aarch64-common.c:319 config/aarch64/aarch64.c:10686 +#: common/config/aarch64/aarch64-common.c:319 config/aarch64/aarch64.c:10702 #, gcc-internal-format msgid "unknown value %qs for -mcpu" msgstr "" @@ -27632,13 +27674,13 @@ msgid "unrecognized option passed to %%:target_mode_check" msgstr "" #: common/config/arm/arm-common.c:322 common/config/arm/arm-common.c:376 -#: common/config/arm/arm-common.c:423 config/aarch64/aarch64.c:10639 +#: common/config/arm/arm-common.c:423 config/aarch64/aarch64.c:10655 #, gcc-internal-format msgid "valid arguments are: %s; did you mean %qs?" msgstr "" #: common/config/arm/arm-common.c:325 common/config/arm/arm-common.c:379 -#: common/config/arm/arm-common.c:426 config/aarch64/aarch64.c:10642 +#: common/config/arm/arm-common.c:426 config/aarch64/aarch64.c:10658 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "valid arguments are: %s" msgstr "нявернае выкарыстанне \"restict\"" @@ -28119,12 +28161,12 @@ msgstr "-pipe не падтрымліваецца" msgid "profiler support for VxWorks" msgstr "" -#: config/aarch64/aarch64-builtins.c:1109 config/arm/arm-builtins.c:2262 +#: config/aarch64/aarch64-builtins.c:1109 config/arm/arm-builtins.c:2272 #, fuzzy, gcc-internal-format msgid "%Kargument %d must be a constant immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/aarch64/aarch64-builtins.c:1180 config/arm/arm-builtins.c:2492 +#: config/aarch64/aarch64-builtins.c:1180 config/arm/arm-builtins.c:2502 #, gcc-internal-format msgid "%Klane index must be a constant immediate" msgstr "" @@ -28134,176 +28176,176 @@ msgstr "" msgid "%Ktotal size and element size must be a non-zero constant immediate" msgstr "" -#: config/aarch64/aarch64.c:1053 +#: config/aarch64/aarch64.c:1069 #, gcc-internal-format msgid "%qs is incompatible with %s %s" msgstr "" -#: config/aarch64/aarch64.c:1055 +#: config/aarch64/aarch64.c:1071 #, gcc-internal-format msgid "%qs feature modifier is incompatible with %s %s" msgstr "" -#: config/aarch64/aarch64.c:3772 +#: config/aarch64/aarch64.c:3788 #, gcc-internal-format msgid "stack probes for SVE frames" msgstr "" -#: config/aarch64/aarch64.c:10287 +#: config/aarch64/aarch64.c:10303 #, gcc-internal-format, gfc-internal-format msgid "unknown flag passed in -moverride=%s (%s)" msgstr "" -#: config/aarch64/aarch64.c:10331 +#: config/aarch64/aarch64.c:10347 #, gcc-internal-format, gfc-internal-format msgid "%s string ill-formed\n" msgstr "" -#: config/aarch64/aarch64.c:10388 +#: config/aarch64/aarch64.c:10404 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "tuning string missing in option (%s)" msgstr "Нераспазнаны выбар \"%s\"" -#: config/aarch64/aarch64.c:10406 +#: config/aarch64/aarch64.c:10422 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "unknown tuning option (%s)" msgstr "невядомая назва рэгістра: %s\n" -#: config/aarch64/aarch64.c:10683 +#: config/aarch64/aarch64.c:10699 #, gcc-internal-format msgid "missing cpu name in %<-mcpu=%s%>" msgstr "" -#: config/aarch64/aarch64.c:10690 +#: config/aarch64/aarch64.c:10706 #, gcc-internal-format msgid "invalid feature modifier in %<-mcpu=%s%>" msgstr "" -#: config/aarch64/aarch64.c:10717 +#: config/aarch64/aarch64.c:10733 #, gcc-internal-format msgid "missing arch name in %<-march=%s%>" msgstr "" -#: config/aarch64/aarch64.c:10720 +#: config/aarch64/aarch64.c:10736 #, gcc-internal-format msgid "unknown value %qs for -march" msgstr "" -#: config/aarch64/aarch64.c:10724 +#: config/aarch64/aarch64.c:10740 #, gcc-internal-format msgid "invalid feature modifier in %<-march=%s%>" msgstr "" -#: config/aarch64/aarch64.c:10750 +#: config/aarch64/aarch64.c:10766 #, gcc-internal-format msgid "missing cpu name in %<-mtune=%s%>" msgstr "" -#: config/aarch64/aarch64.c:10753 +#: config/aarch64/aarch64.c:10769 #, gcc-internal-format msgid "unknown value %qs for -mtune" msgstr "" -#: config/aarch64/aarch64.c:10871 config/arm/arm.c:3173 +#: config/aarch64/aarch64.c:10887 config/arm/arm.c:3173 #, gcc-internal-format, gfc-internal-format msgid "switch -mcpu=%s conflicts with -march=%s switch" msgstr "" -#: config/aarch64/aarch64.c:10906 +#: config/aarch64/aarch64.c:10922 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "assembler does not support -mabi=ilp32" msgstr "%s не падтрымлівае %s" -#: config/aarch64/aarch64.c:10913 +#: config/aarch64/aarch64.c:10929 #, gcc-internal-format msgid "return address signing is only supported for -mabi=lp64" msgstr "" -#: config/aarch64/aarch64.c:10975 +#: config/aarch64/aarch64.c:10991 #, gcc-internal-format msgid "code model %qs with -f%s" msgstr "" -#: config/aarch64/aarch64.c:11138 +#: config/aarch64/aarch64.c:11154 #, gcc-internal-format msgid "missing name in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:11141 +#: config/aarch64/aarch64.c:11157 #, gcc-internal-format msgid "invalid name (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:11145 config/aarch64/aarch64.c:11184 -#: config/aarch64/aarch64.c:11257 +#: config/aarch64/aarch64.c:11161 config/aarch64/aarch64.c:11200 +#: config/aarch64/aarch64.c:11273 #, gcc-internal-format msgid "invalid value (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:11177 +#: config/aarch64/aarch64.c:11193 #, gcc-internal-format msgid "missing name in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:11180 +#: config/aarch64/aarch64.c:11196 #, gcc-internal-format msgid "invalid name (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:11213 +#: config/aarch64/aarch64.c:11229 #, gcc-internal-format msgid "invalid name (\"%s\") in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:11253 +#: config/aarch64/aarch64.c:11269 #, gcc-internal-format msgid "missing value in % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:11306 config/aarch64/aarch64.c:11483 +#: config/aarch64/aarch64.c:11322 config/aarch64/aarch64.c:11499 #, gcc-internal-format msgid "malformed % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:11354 +#: config/aarch64/aarch64.c:11370 #, gcc-internal-format msgid "pragma or attribute % does not accept an argument" msgstr "" -#: config/aarch64/aarch64.c:11362 +#: config/aarch64/aarch64.c:11378 #, gcc-internal-format msgid "pragma or attribute % does not allow a negated form" msgstr "" -#: config/aarch64/aarch64.c:11416 +#: config/aarch64/aarch64.c:11432 #, gcc-internal-format msgid "pragma or attribute % is not valid" msgstr "" -#: config/aarch64/aarch64.c:11473 config/arm/arm.c:30742 -#: config/i386/i386.c:5440 config/powerpcspe/powerpcspe.c:39760 -#: config/rs6000/rs6000.c:36904 config/s390/s390.c:15746 +#: config/aarch64/aarch64.c:11489 config/arm/arm.c:30742 +#: config/i386/i386.c:5443 config/powerpcspe/powerpcspe.c:39760 +#: config/rs6000/rs6000.c:36960 config/s390/s390.c:15746 #, gcc-internal-format msgid "attribute % argument not a string" msgstr "" -#: config/aarch64/aarch64.c:11500 +#: config/aarch64/aarch64.c:11516 #, gcc-internal-format msgid "pragma or attribute % is not valid" msgstr "" -#: config/aarch64/aarch64.c:11509 +#: config/aarch64/aarch64.c:11525 #, gcc-internal-format msgid "malformed % pragma or attribute" msgstr "" -#: config/aarch64/aarch64.c:13571 +#: config/aarch64/aarch64.c:13587 #, gcc-internal-format msgid "%Klane %wd out of range %wd - %wd" msgstr "" -#: config/aarch64/aarch64.c:13573 +#: config/aarch64/aarch64.c:13589 #, gcc-internal-format msgid "lane %wd out of range %wd - %wd" msgstr "" @@ -28363,8 +28405,8 @@ msgstr "" msgid "bad value %qs for -mmemory-latency" msgstr "" -#: config/alpha/alpha.c:6683 config/alpha/alpha.c:6686 config/arc/arc.c:6526 -#: config/arc/arc.c:6800 config/s390/s390.c:847 config/tilegx/tilegx.c:3544 +#: config/alpha/alpha.c:6683 config/alpha/alpha.c:6686 config/arc/arc.c:6517 +#: config/arc/arc.c:6791 config/s390/s390.c:847 config/tilegx/tilegx.c:3544 #: config/tilepro/tilepro.c:3108 #, gcc-internal-format msgid "bad builtin fcode" @@ -28473,11 +28515,11 @@ msgstr "аргумент `__builtin_args_info' павінен быць канс #: config/arm/arm.c:7029 config/avr/avr.c:9718 config/avr/avr.c:9734 #: config/bfin/bfin.c:4705 config/bfin/bfin.c:4766 config/bfin/bfin.c:4795 #: config/epiphany/epiphany.c:491 config/h8300/h8300.c:5459 -#: config/i386/i386.c:6452 config/i386/i386.c:12479 config/i386/i386.c:41424 -#: config/i386/i386.c:41474 config/i386/i386.c:41544 config/m68k/m68k.c:780 +#: config/i386/i386.c:6455 config/i386/i386.c:12482 config/i386/i386.c:41418 +#: config/i386/i386.c:41468 config/i386/i386.c:41538 config/m68k/m68k.c:780 #: config/mcore/mcore.c:3070 config/nvptx/nvptx.c:4611 #: config/powerpcspe/powerpcspe.c:35785 config/riscv/riscv.c:2698 -#: config/rl78/rl78.c:815 config/rl78/rl78.c:884 config/rs6000/rs6000.c:32982 +#: config/rl78/rl78.c:815 config/rl78/rl78.c:884 config/rs6000/rs6000.c:33038 #: config/rx/rx.c:2719 config/rx/rx.c:2745 config/s390/s390.c:1056 #: config/s390/s390.c:1143 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 @@ -28487,313 +28529,313 @@ msgstr "аргумент `__builtin_args_info' павінен быць канс msgid "%qE attribute only applies to functions" msgstr "\"%s\" звычайна функцыя" -#: config/arc/arc.c:6425 +#: config/arc/arc.c:6416 #, fuzzy, gcc-internal-format #| msgid "`__builtin_next_arg' called without an argument" msgid "__builtin_arc_aligned with non-constant alignment" msgstr "\"__buitin_next_arg\" выклікаецца без аргумента" -#: config/arc/arc.c:6433 +#: config/arc/arc.c:6424 #, gcc-internal-format msgid "invalid alignment value for __builtin_arc_aligned" msgstr "" -#: config/arc/arc.c:6596 +#: config/arc/arc.c:6587 #, gcc-internal-format msgid "operand 1 should be an unsigned 3-bit immediate" msgstr "" -#: config/arc/arc.c:6637 config/arc/arc.c:6734 +#: config/arc/arc.c:6628 config/arc/arc.c:6725 #, gcc-internal-format msgid "operand 2 should be an unsigned 3-bit value (I0-I7)" msgstr "" -#: config/arc/arc.c:6670 config/arc/arc.c:6702 +#: config/arc/arc.c:6661 config/arc/arc.c:6693 #, gcc-internal-format msgid "operand 1 should be an unsigned 3-bit value (I0-I7)" msgstr "" -#: config/arc/arc.c:6674 config/arc/arc.c:6706 +#: config/arc/arc.c:6665 config/arc/arc.c:6697 #, gcc-internal-format msgid "operand 2 should be an unsigned 8-bit value" msgstr "" -#: config/arc/arc.c:6738 +#: config/arc/arc.c:6729 #, gcc-internal-format msgid "operand 3 should be an unsigned 8-bit value" msgstr "" -#: config/arc/arc.c:6771 +#: config/arc/arc.c:6762 #, gcc-internal-format msgid "operand 4 should be an unsigned 8-bit value (0-255)" msgstr "" -#: config/arc/arc.c:6775 +#: config/arc/arc.c:6766 #, gcc-internal-format msgid "operand 3 should be an unsigned 3-bit value (I0-I7)" msgstr "" -#: config/arc/arc.c:6782 +#: config/arc/arc.c:6773 #, gcc-internal-format msgid "operand 2 should be an unsigned 3-bit value (subreg 0-7)" msgstr "" -#: config/arc/arc.c:6785 +#: config/arc/arc.c:6776 #, gcc-internal-format msgid "operand 2 should be an even 3-bit value (subreg 0,2,4,6)" msgstr "" -#: config/arc/arc.c:6832 +#: config/arc/arc.c:6823 #, gcc-internal-format, gfc-internal-format msgid "builtin requires an immediate for operand %d" msgstr "" -#: config/arc/arc.c:6837 +#: config/arc/arc.c:6828 #, gcc-internal-format, gfc-internal-format msgid "operand %d should be a 6 bit unsigned immediate" msgstr "" -#: config/arc/arc.c:6841 +#: config/arc/arc.c:6832 #, gcc-internal-format, gfc-internal-format msgid "operand %d should be a 8 bit unsigned immediate" msgstr "" -#: config/arc/arc.c:6845 +#: config/arc/arc.c:6836 #, gcc-internal-format, gfc-internal-format msgid "operand %d should be a 3 bit unsigned immediate" msgstr "" -#: config/arc/arc.c:6848 +#: config/arc/arc.c:6839 #, gcc-internal-format, gfc-internal-format msgid "unknown builtin immediate operand type for operand %d" msgstr "" -#: config/arc/arc.c:6899 +#: config/arc/arc.c:6890 #, gcc-internal-format msgid "register number must be a compile-time constant. Try giving higher optimization levels" msgstr "" -#: config/arc/arc.c:7685 +#: config/arc/arc.c:7747 #, gcc-internal-format msgid "Insn addresses not set after shorten_branches" msgstr "" -#: config/arc/arc.c:7894 +#: config/arc/arc.c:7956 #, gcc-internal-format msgid "insn addresses not freed" msgstr "" -#: config/arc/arc.c:10682 +#: config/arc/arc.c:10670 #, fuzzy, gcc-internal-format msgid "%qE attribute only valid for ARCv2 architecture" msgstr "\"%s\" атрыбут ігнарыруецца" -#: config/arc/arc.c:10690 config/arc/arc.c:10729 +#: config/arc/arc.c:10678 config/arc/arc.c:10717 #, fuzzy, gcc-internal-format #| msgid "argument to `-%s' is missing" msgid "argument of %qE attribute is missing" msgstr "аргумент для \"-%s\" прапушчан" -#: config/arc/arc.c:10701 config/arc/arc.c:10740 config/arc/arc.c:10842 +#: config/arc/arc.c:10689 config/arc/arc.c:10728 config/arc/arc.c:10830 #: config/avr/avr.c:9790 #, gcc-internal-format msgid "%qE attribute allows only an integer constant argument" msgstr "" -#: config/arc/arc.c:10721 +#: config/arc/arc.c:10709 #, fuzzy, gcc-internal-format msgid "%qE attribute only valid for ARC EM architecture" msgstr "\"%s\" атрыбут ігнарыруецца" -#: config/arc/arc.c:10776 +#: config/arc/arc.c:10764 #, fuzzy, gcc-internal-format msgid "%qE attribute only applies to types" msgstr "\"%s\" звычайна функцыя" -#: config/arc/arc.c:10782 +#: config/arc/arc.c:10770 #, fuzzy, gcc-internal-format msgid "argument of %qE attribute ignored" msgstr "памер \"%s\" больш чам %d байт" -#: config/arc/arc.c:10832 config/avr/avr.c:9777 config/bfin/bfin.c:4827 +#: config/arc/arc.c:10820 config/avr/avr.c:9777 config/bfin/bfin.c:4827 #: config/i386/winnt.c:63 config/msp430/msp430.c:2018 #: config/nvptx/nvptx.c:4634 #, fuzzy, gcc-internal-format msgid "%qE attribute only applies to variables" msgstr "\"%s\" атрыбут ігнарыруецца" -#: config/arm/arm-builtins.c:2370 +#: config/arm/arm-builtins.c:2380 #, fuzzy, gcc-internal-format msgid "this builtin is not supported for this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: config/arm/arm-builtins.c:2475 +#: config/arm/arm-builtins.c:2485 #, gcc-internal-format msgid "You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) to use these intrinsics." msgstr "" -#: config/arm/arm-builtins.c:2513 +#: config/arm/arm-builtins.c:2523 #, gcc-internal-format msgid "You must enable VFP instructions to use these intrinsics." msgstr "" -#: config/arm/arm-builtins.c:2573 +#: config/arm/arm-builtins.c:2583 #, gcc-internal-format msgid "You must enable crypto instructions (e.g. include -mfloat-abi=softfp -mfpu=crypto-neon...) to use these intrinsics." msgstr "" #. @@@ better error message -#: config/arm/arm-builtins.c:2633 config/arm/arm-builtins.c:2737 +#: config/arm/arm-builtins.c:2643 config/arm/arm-builtins.c:2747 #, gcc-internal-format msgid "selector must be an immediate" msgstr "" -#: config/arm/arm-builtins.c:2641 config/arm/arm-builtins.c:2686 -#: config/arm/arm-builtins.c:2744 config/arm/arm-builtins.c:2753 +#: config/arm/arm-builtins.c:2651 config/arm/arm-builtins.c:2696 +#: config/arm/arm-builtins.c:2754 config/arm/arm-builtins.c:2763 #, fuzzy, gcc-internal-format #| msgid "first argument of `%s' should be `int'" msgid "the range of selector should be in 0 to 7" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/arm/arm-builtins.c:2646 config/arm/arm-builtins.c:2755 +#: config/arm/arm-builtins.c:2656 config/arm/arm-builtins.c:2765 #, fuzzy, gcc-internal-format #| msgid "first argument of `%s' should be `int'" msgid "the range of selector should be in 0 to 3" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/arm/arm-builtins.c:2651 config/arm/arm-builtins.c:2757 +#: config/arm/arm-builtins.c:2661 config/arm/arm-builtins.c:2767 #, fuzzy, gcc-internal-format #| msgid "first argument of `%s' should be `int'" msgid "the range of selector should be in 0 to 1" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/arm/arm-builtins.c:2823 +#: config/arm/arm-builtins.c:2833 #, gcc-internal-format msgid "mask must be an immediate" msgstr "" -#: config/arm/arm-builtins.c:2828 +#: config/arm/arm-builtins.c:2838 #, fuzzy, gcc-internal-format #| msgid "first argument of `%s' should be `int'" msgid "the range of mask should be in 0 to 255" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/arm/arm-builtins.c:3016 +#: config/arm/arm-builtins.c:3026 #, gcc-internal-format msgid "the range of count should be in 0 to 32. please check the intrinsic _mm_rori_pi16 in code." msgstr "" -#: config/arm/arm-builtins.c:3018 +#: config/arm/arm-builtins.c:3028 #, gcc-internal-format msgid "the range of count should be in 0 to 32. please check the intrinsic _mm_rori_pi32 in code." msgstr "" -#: config/arm/arm-builtins.c:3020 +#: config/arm/arm-builtins.c:3030 #, gcc-internal-format msgid "the range of count should be in 0 to 32. please check the intrinsic _mm_ror_pi16 in code." msgstr "" -#: config/arm/arm-builtins.c:3022 +#: config/arm/arm-builtins.c:3032 #, gcc-internal-format msgid "the range of count should be in 0 to 32. please check the intrinsic _mm_ror_pi32 in code." msgstr "" -#: config/arm/arm-builtins.c:3028 +#: config/arm/arm-builtins.c:3038 #, gcc-internal-format msgid "the range of count should be in 0 to 64. please check the intrinsic _mm_rori_si64 in code." msgstr "" -#: config/arm/arm-builtins.c:3030 +#: config/arm/arm-builtins.c:3040 #, gcc-internal-format msgid "the range of count should be in 0 to 64. please check the intrinsic _mm_ror_si64 in code." msgstr "" -#: config/arm/arm-builtins.c:3035 +#: config/arm/arm-builtins.c:3045 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srli_pi16 in code." msgstr "" -#: config/arm/arm-builtins.c:3037 +#: config/arm/arm-builtins.c:3047 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srli_pi32 in code." msgstr "" -#: config/arm/arm-builtins.c:3039 +#: config/arm/arm-builtins.c:3049 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srli_si64 in code." msgstr "" -#: config/arm/arm-builtins.c:3041 +#: config/arm/arm-builtins.c:3051 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_slli_pi16 in code." msgstr "" -#: config/arm/arm-builtins.c:3043 +#: config/arm/arm-builtins.c:3053 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_slli_pi32 in code." msgstr "" -#: config/arm/arm-builtins.c:3045 +#: config/arm/arm-builtins.c:3055 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_slli_si64 in code." msgstr "" -#: config/arm/arm-builtins.c:3047 +#: config/arm/arm-builtins.c:3057 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srai_pi16 in code." msgstr "" -#: config/arm/arm-builtins.c:3049 +#: config/arm/arm-builtins.c:3059 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srai_pi32 in code." msgstr "" -#: config/arm/arm-builtins.c:3051 +#: config/arm/arm-builtins.c:3061 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srai_si64 in code." msgstr "" -#: config/arm/arm-builtins.c:3053 +#: config/arm/arm-builtins.c:3063 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srl_pi16 in code." msgstr "" -#: config/arm/arm-builtins.c:3055 +#: config/arm/arm-builtins.c:3065 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srl_pi32 in code." msgstr "" -#: config/arm/arm-builtins.c:3057 +#: config/arm/arm-builtins.c:3067 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_srl_si64 in code." msgstr "" -#: config/arm/arm-builtins.c:3059 +#: config/arm/arm-builtins.c:3069 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_sll_pi16 in code." msgstr "" -#: config/arm/arm-builtins.c:3061 +#: config/arm/arm-builtins.c:3071 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_sll_pi32 in code." msgstr "" -#: config/arm/arm-builtins.c:3063 +#: config/arm/arm-builtins.c:3073 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_sll_si64 in code." msgstr "" -#: config/arm/arm-builtins.c:3065 +#: config/arm/arm-builtins.c:3075 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_sra_pi16 in code." msgstr "" -#: config/arm/arm-builtins.c:3067 +#: config/arm/arm-builtins.c:3077 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_sra_pi32 in code." msgstr "" -#: config/arm/arm-builtins.c:3069 +#: config/arm/arm-builtins.c:3079 #, gcc-internal-format msgid "the count should be no less than 0. please check the intrinsic _mm_sra_si64 in code." msgstr "" @@ -29711,869 +29753,869 @@ msgstr "немагчыма стварыць часовы файл" msgid "can%'t set position in PCH file: %m" msgstr "немагчыма зачыніць уваходзячы файл %s" -#: config/i386/i386.c:3177 +#: config/i386/i386.c:3180 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function `%s'" msgid "wrong argument %qs to option %qs" msgstr "вельмі шмат аргумэнтаў у функцыі `%s'" -#: config/i386/i386.c:3183 +#: config/i386/i386.c:3186 #, gcc-internal-format msgid "size ranges of option %qs should be increasing" msgstr "" -#: config/i386/i386.c:3193 +#: config/i386/i386.c:3196 #, 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.c:3219 +#: config/i386/i386.c:3222 #, gcc-internal-format msgid "strategy name %qs specified for option %qs not supported for 32-bit code" msgstr "" -#: config/i386/i386.c:3232 +#: config/i386/i386.c:3235 #, gcc-internal-format msgid "unknown alignment %qs specified for option %qs" msgstr "" -#: config/i386/i386.c:3242 +#: config/i386/i386.c:3245 #, gcc-internal-format msgid "the max value for the last size range should be -1 for option %qs" msgstr "" -#: config/i386/i386.c:3249 +#: config/i386/i386.c:3252 #, gcc-internal-format msgid "too many size ranges specified in option %qs" msgstr "" -#: config/i386/i386.c:3302 +#: config/i386/i386.c:3305 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "unknown register name: %s" msgid "unknown parameter to option -mtune-ctrl: %s" msgstr "невядомая назва рэгістра: %s" -#: config/i386/i386.c:3726 +#: config/i386/i386.c:3729 #, gcc-internal-format msgid "Intel MCU psABI isn%'t supported in %s mode" msgstr "" -#: config/i386/i386.c:3775 +#: config/i386/i386.c:3778 #, gcc-internal-format msgid "%<-mtune=x86-64%> is deprecated; use %<-mtune=k8%> or %<-mtune=generic%> instead as appropriate" msgstr "" -#: config/i386/i386.c:3777 +#: config/i386/i386.c:3780 #, gcc-internal-format msgid "% is deprecated; use % or % instead as appropriate" msgstr "" #. rep; movq isn't available in 32-bit code. -#: config/i386/i386.c:3804 +#: config/i386/i386.c:3807 #, gcc-internal-format msgid "-mstringop-strategy=rep_8byte not supported for 32-bit code" msgstr "" -#: config/i386/i386.c:3821 +#: config/i386/i386.c:3824 #, gcc-internal-format msgid "address mode %qs not supported in the %s bit mode" msgstr "" -#: config/i386/i386.c:3833 +#: config/i386/i386.c:3836 #, gcc-internal-format msgid "-mabi=ms not supported with X32 ABI" msgstr "" -#: config/i386/i386.c:3851 config/i386/i386.c:3860 config/i386/i386.c:3872 -#: config/i386/i386.c:3883 config/i386/i386.c:3894 +#: config/i386/i386.c:3854 config/i386/i386.c:3863 config/i386/i386.c:3875 +#: config/i386/i386.c:3886 config/i386/i386.c:3897 #, fuzzy, gcc-internal-format msgid "code model %qs not supported in the %s bit mode" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: config/i386/i386.c:3863 config/i386/i386.c:3875 +#: config/i386/i386.c:3866 config/i386/i386.c:3878 #, fuzzy, gcc-internal-format msgid "code model %qs not supported in x32 mode" msgstr "-pipe не падтрымліваецца" -#: config/i386/i386.c:3881 config/i386/i386.c:3890 config/i386/i386.c:5213 +#: config/i386/i386.c:3884 config/i386/i386.c:3893 config/i386/i386.c:5216 #, 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.c:3918 +#: config/i386/i386.c:3921 #, fuzzy, gcc-internal-format msgid "-masm=intel not supported in this configuration" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/i386/i386.c:3923 +#: config/i386/i386.c:3926 #, gcc-internal-format, gfc-internal-format msgid "%i-bit mode not compiled in" msgstr "" -#: config/i386/i386.c:3932 +#: config/i386/i386.c:3935 #, gcc-internal-format msgid "% CPU can be used only for %<-mtune=%> switch" msgstr "" -#: config/i386/i386.c:3934 +#: config/i386/i386.c:3937 #, gcc-internal-format msgid "% CPU can be used only for % attribute" msgstr "" -#: config/i386/i386.c:3941 +#: config/i386/i386.c:3944 #, gcc-internal-format msgid "% CPU can be used only for %<-mtune=%> switch" msgstr "" -#: config/i386/i386.c:3943 +#: config/i386/i386.c:3946 #, gcc-internal-format msgid "% CPU can be used only for % attribute" msgstr "" -#: config/i386/i386.c:3951 config/i386/i386.c:4265 +#: config/i386/i386.c:3954 config/i386/i386.c:4268 #, fuzzy, gcc-internal-format msgid "CPU you selected does not support x86-64 instruction set" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: config/i386/i386.c:4197 config/i386/i386.c:4200 +#: config/i386/i386.c:4200 config/i386/i386.c:4203 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "Intel MPX does not support x32" msgstr "%s не падтрымлівае %s" -#: config/i386/i386.c:4205 +#: config/i386/i386.c:4208 #, gcc-internal-format msgid "bad value (%qs) for %<-march=%> switch" msgstr "" -#: config/i386/i386.c:4206 +#: config/i386/i386.c:4209 #, gcc-internal-format msgid "bad value (%qs) for % attribute" msgstr "" -#: config/i386/i386.c:4228 +#: config/i386/i386.c:4231 #, gcc-internal-format msgid "valid arguments to %<-march=%> switch are: %s; did you mean %qs?" msgstr "" -#: config/i386/i386.c:4230 +#: config/i386/i386.c:4233 #, gcc-internal-format msgid "valid arguments to % attribute are: %s; did you mean %qs?" msgstr "" -#: config/i386/i386.c:4235 +#: config/i386/i386.c:4238 #, gcc-internal-format msgid "valid arguments to %<-march=%> switch are: %s" msgstr "" -#: config/i386/i386.c:4236 +#: config/i386/i386.c:4239 #, fuzzy, gcc-internal-format msgid "valid arguments to % attribute are: %s" msgstr "нявернае выкарыстанне \"restict\"" -#: config/i386/i386.c:4284 +#: config/i386/i386.c:4287 #, gcc-internal-format msgid "bad value (%qs) for %<-mtune=%> switch" msgstr "" -#: config/i386/i386.c:4285 +#: config/i386/i386.c:4288 #, gcc-internal-format msgid "bad value (%qs) for % attribute" msgstr "" -#: config/i386/i386.c:4305 +#: config/i386/i386.c:4308 #, gcc-internal-format msgid "valid arguments to %<-mtune=%> switch are: %s; did you mean %qs?" msgstr "" -#: config/i386/i386.c:4307 +#: config/i386/i386.c:4310 #, gcc-internal-format msgid "valid arguments to % attribute are: %s; did you mean %qs?" msgstr "" -#: config/i386/i386.c:4312 +#: config/i386/i386.c:4315 #, gcc-internal-format msgid "valid arguments to %<-mtune=%> switch are: %s" msgstr "" -#: config/i386/i386.c:4313 +#: config/i386/i386.c:4316 #, fuzzy, gcc-internal-format msgid "valid arguments to % attribute are: %s" msgstr "нявернае выкарыстанне \"restict\"" -#: config/i386/i386.c:4379 +#: config/i386/i386.c:4382 #, gcc-internal-format msgid "-mregparm is ignored in 64-bit mode" msgstr "" -#: config/i386/i386.c:4381 +#: config/i386/i386.c:4384 #, gcc-internal-format msgid "-mregparm is ignored for Intel MCU psABI" msgstr "" -#: config/i386/i386.c:4384 +#: config/i386/i386.c:4387 #, gcc-internal-format, gfc-internal-format msgid "-mregparm=%d is not between 0 and %d" msgstr "" -#: config/i386/i386.c:4417 +#: config/i386/i386.c:4420 #, gcc-internal-format msgid "%<-mrtd%> is ignored in 64bit mode" msgstr "" -#: config/i386/i386.c:4418 +#: config/i386/i386.c:4421 #, gcc-internal-format msgid "% is ignored in 64bit mode" msgstr "" -#: config/i386/i386.c:4497 +#: config/i386/i386.c:4500 #, fuzzy, gcc-internal-format msgid "-mpreferred-stack-boundary is not supported for this target" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/i386/i386.c:4500 +#: config/i386/i386.c:4503 #, gcc-internal-format, gfc-internal-format msgid "-mpreferred-stack-boundary=%d is not between %d and %d" msgstr "" -#: config/i386/i386.c:4523 +#: config/i386/i386.c:4526 #, gcc-internal-format, gfc-internal-format msgid "-mincoming-stack-boundary=%d is not between %d and 12" msgstr "" -#: config/i386/i386.c:4536 +#: config/i386/i386.c:4539 #, fuzzy, gcc-internal-format msgid "-mnop-mcount is not compatible with this target" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/i386/i386.c:4539 +#: config/i386/i386.c:4542 #, gcc-internal-format msgid "-mnop-mcount is not implemented for -fPIC" msgstr "" -#: config/i386/i386.c:4545 +#: config/i386/i386.c:4548 #, gcc-internal-format msgid "%<-msseregparm%> used without SSE enabled" msgstr "" -#: config/i386/i386.c:4546 +#: config/i386/i386.c:4549 #, gcc-internal-format msgid "% used without SSE enabled" msgstr "" -#: config/i386/i386.c:4556 +#: config/i386/i386.c:4559 #, gcc-internal-format msgid "SSE instruction set disabled, using 387 arithmetics" msgstr "" -#: config/i386/i386.c:4563 +#: config/i386/i386.c:4566 #, gcc-internal-format msgid "387 instruction set disabled, using SSE arithmetics" msgstr "" -#: config/i386/i386.c:4613 +#: config/i386/i386.c:4616 #, gcc-internal-format msgid "stack probing requires %<-maccumulate-outgoing-args%> for correctness" msgstr "" -#: config/i386/i386.c:4615 +#: config/i386/i386.c:4618 #, gcc-internal-format msgid "stack probing requires % for correctness" msgstr "" -#: config/i386/i386.c:4629 +#: config/i386/i386.c:4632 #, gcc-internal-format msgid "fixed ebp register requires %<-maccumulate-outgoing-args%>" msgstr "" -#: config/i386/i386.c:4631 +#: config/i386/i386.c:4634 #, gcc-internal-format msgid "fixed ebp register requires %" msgstr "" -#: config/i386/i386.c:4741 +#: config/i386/i386.c:4744 #, gcc-internal-format msgid "-mfentry isn%'t supported for 32-bit in combination with -fpic" msgstr "" -#: config/i386/i386.c:4744 +#: config/i386/i386.c:4747 #, gcc-internal-format msgid "-mno-fentry isn%'t compatible with SEH" msgstr "" -#: config/i386/i386.c:4748 +#: config/i386/i386.c:4751 #, gcc-internal-format msgid "-mcall-ms2sysv-xlogues isn%'t currently supported with SEH" msgstr "" -#: config/i386/i386.c:4813 config/powerpcspe/powerpcspe.c:5663 +#: config/i386/i386.c:4816 config/powerpcspe/powerpcspe.c:5663 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "unknown option for -mrecip=%s" msgstr "невядомая назва рэгістра: %s\n" -#: config/i386/i386.c:4870 config/powerpcspe/powerpcspe.c:5339 +#: config/i386/i386.c:4873 config/powerpcspe/powerpcspe.c:5339 #, gcc-internal-format msgid "%qs is not a valid number in -mstack-protector-guard-offset=" msgstr "" -#: config/i386/i386.c:4875 config/powerpcspe/powerpcspe.c:5344 +#: config/i386/i386.c:4878 config/powerpcspe/powerpcspe.c:5344 #, gcc-internal-format msgid "%qs is not a valid offset in -mstack-protector-guard-offset=" msgstr "" -#: config/i386/i386.c:4907 config/powerpcspe/powerpcspe.c:5356 +#: config/i386/i386.c:4910 config/powerpcspe/powerpcspe.c:5356 #, gcc-internal-format msgid "%qs is not a valid base register in -mstack-protector-guard-reg=" msgstr "" -#: config/i386/i386.c:5506 config/i386/i386.c:5553 config/s390/s390.c:15812 +#: config/i386/i386.c:5509 config/i386/i386.c:5556 config/s390/s390.c:15812 #: config/s390/s390.c:15862 config/s390/s390.c:15879 #, gcc-internal-format, gfc-internal-format msgid "attribute(target(\"%s\")) is unknown" msgstr "" -#: config/i386/i386.c:5534 +#: config/i386/i386.c:5537 #, gcc-internal-format, gfc-internal-format msgid "option(\"%s\") was already specified" msgstr "" -#: config/i386/i386.c:5837 +#: config/i386/i386.c:5840 #, gcc-internal-format msgid "interrupt and naked attributes are not compatible" msgstr "" -#: config/i386/i386.c:5852 +#: config/i386/i386.c:5855 #, gcc-internal-format msgid "Only DWARF debug format is supported for interrupt service routine." msgstr "" -#: config/i386/i386.c:5901 +#: config/i386/i386.c:5904 #, gcc-internal-format msgid "%<-mindirect-branch=%s%> and %<-mcmodel=large%> are not compatible" msgstr "" -#: config/i386/i386.c:5913 +#: config/i386/i386.c:5916 #, gcc-internal-format msgid "%<-mindirect-branch=thunk-extern%>, %<-fcf-protection=branch%> and %<-fcheck-pointer-bounds%> are not compatible" msgstr "" -#: config/i386/i386.c:5949 +#: config/i386/i386.c:5952 #, gcc-internal-format msgid "%<-mfunction-return=%s%> and %<-mcmodel=large%> are not compatible" msgstr "" -#: config/i386/i386.c:6047 +#: config/i386/i386.c:6050 #, gcc-internal-format, gfc-internal-format msgid "%s instructions aren't allowed in %s service routine" msgstr "" -#: config/i386/i386.c:6051 +#: config/i386/i386.c:6054 #, gcc-internal-format, gfc-internal-format msgid "%s instructions aren't allowed in function with no_caller_saved_registers attribute" msgstr "" -#: config/i386/i386.c:6465 config/i386/i386.c:6516 +#: config/i386/i386.c:6468 config/i386/i386.c:6519 #, gcc-internal-format msgid "fastcall and regparm attributes are not compatible" msgstr "" -#: config/i386/i386.c:6470 +#: config/i386/i386.c:6473 #, gcc-internal-format msgid "regparam and thiscall attributes are not compatible" msgstr "" -#: config/i386/i386.c:6477 config/i386/i386.c:41444 +#: config/i386/i386.c:6480 config/i386/i386.c:41438 #, gcc-internal-format msgid "%qE attribute requires an integer constant argument" msgstr "" -#: config/i386/i386.c:6483 +#: config/i386/i386.c:6486 #, fuzzy, gcc-internal-format msgid "argument to %qE attribute larger than %d" msgstr "памер \"%s\" больш чам %d байт" -#: config/i386/i386.c:6508 config/i386/i386.c:6551 +#: config/i386/i386.c:6511 config/i386/i386.c:6554 #, gcc-internal-format msgid "fastcall and cdecl attributes are not compatible" msgstr "" -#: config/i386/i386.c:6512 +#: config/i386/i386.c:6515 #, gcc-internal-format msgid "fastcall and stdcall attributes are not compatible" msgstr "" -#: config/i386/i386.c:6520 config/i386/i386.c:6569 +#: config/i386/i386.c:6523 config/i386/i386.c:6572 #, gcc-internal-format msgid "fastcall and thiscall attributes are not compatible" msgstr "" -#: config/i386/i386.c:6530 config/i386/i386.c:6547 +#: config/i386/i386.c:6533 config/i386/i386.c:6550 #, gcc-internal-format msgid "stdcall and cdecl attributes are not compatible" msgstr "" -#: config/i386/i386.c:6534 +#: config/i386/i386.c:6537 #, gcc-internal-format msgid "stdcall and fastcall attributes are not compatible" msgstr "" -#: config/i386/i386.c:6538 config/i386/i386.c:6565 +#: config/i386/i386.c:6541 config/i386/i386.c:6568 #, gcc-internal-format msgid "stdcall and thiscall attributes are not compatible" msgstr "" -#: config/i386/i386.c:6555 config/i386/i386.c:6573 +#: config/i386/i386.c:6558 config/i386/i386.c:6576 #, gcc-internal-format msgid "cdecl and thiscall attributes are not compatible" msgstr "" -#: config/i386/i386.c:6561 +#: config/i386/i386.c:6564 #, gcc-internal-format msgid "%qE attribute is used for non-class method" msgstr "" -#: config/i386/i386.c:6805 +#: config/i386/i386.c:6808 #, gcc-internal-format msgid "calling %qD with attribute sseregparm without SSE/SSE2 enabled" msgstr "" -#: config/i386/i386.c:6808 +#: config/i386/i386.c:6811 #, gcc-internal-format msgid "calling %qT with attribute sseregparm without SSE/SSE2 enabled" msgstr "" -#: config/i386/i386.c:7126 +#: config/i386/i386.c:7129 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "X32 does not support ms_abi attribute" msgstr "%s не падтрымлівае %s" -#: config/i386/i386.c:7160 +#: config/i386/i386.c:7163 #, gcc-internal-format msgid "ms_hook_prologue is not compatible with nested function" msgstr "" -#: config/i386/i386.c:7502 +#: config/i386/i386.c:7505 #, gcc-internal-format msgid "AVX512F vector argument without AVX512F enabled changes the ABI" msgstr "" -#: config/i386/i386.c:7508 +#: config/i386/i386.c:7511 #, gcc-internal-format msgid "AVX512F vector return without AVX512F enabled changes the ABI" msgstr "" -#: config/i386/i386.c:7522 +#: config/i386/i386.c:7525 #, gcc-internal-format msgid "AVX vector argument without AVX enabled changes the ABI" msgstr "" -#: config/i386/i386.c:7528 +#: config/i386/i386.c:7531 #, gcc-internal-format msgid "AVX vector return without AVX enabled changes the ABI" msgstr "" -#: config/i386/i386.c:7544 +#: config/i386/i386.c:7547 #, gcc-internal-format msgid "SSE vector argument without SSE enabled changes the ABI" msgstr "" -#: config/i386/i386.c:7550 +#: config/i386/i386.c:7553 #, gcc-internal-format msgid "SSE vector return without SSE enabled changes the ABI" msgstr "" -#: config/i386/i386.c:7566 +#: config/i386/i386.c:7569 #, gcc-internal-format msgid "MMX vector argument without MMX enabled changes the ABI" msgstr "" -#: config/i386/i386.c:7572 +#: config/i386/i386.c:7575 #, gcc-internal-format msgid "MMX vector return without MMX enabled changes the ABI" msgstr "" -#: config/i386/i386.c:7754 +#: config/i386/i386.c:7757 #, gcc-internal-format msgid "the ABI of passing struct with a flexible array member has changed in GCC 4.4" msgstr "" -#: config/i386/i386.c:7871 +#: config/i386/i386.c:7874 #, gcc-internal-format msgid "the ABI of passing union with long double has changed in GCC 4.4" msgstr "" -#: config/i386/i386.c:7989 +#: config/i386/i386.c:7992 #, gcc-internal-format msgid "the ABI of passing structure with complex float member has changed in GCC 4.4" msgstr "" -#: config/i386/i386.c:8152 +#: config/i386/i386.c:8155 #, gcc-internal-format msgid "SSE register return with SSE disabled" msgstr "" -#: config/i386/i386.c:8158 +#: config/i386/i386.c:8161 #, gcc-internal-format msgid "SSE register argument with SSE disabled" msgstr "" -#: config/i386/i386.c:8174 +#: config/i386/i386.c:8177 #, gcc-internal-format msgid "x87 register return with x87 disabled" msgstr "" -#: config/i386/i386.c:8471 config/i386/i386.c:8750 config/i386/i386.c:9276 +#: config/i386/i386.c:8474 config/i386/i386.c:8753 config/i386/i386.c:9279 #, gcc-internal-format msgid "calling %qD with SSE calling convention without SSE/SSE2 enabled" msgstr "" -#: config/i386/i386.c:8473 config/i386/i386.c:8752 config/i386/i386.c:9278 +#: config/i386/i386.c:8476 config/i386/i386.c:8755 config/i386/i386.c:9281 #, gcc-internal-format msgid "this is a GCC bug that can be worked around by adding attribute used to function called" msgstr "" -#: config/i386/i386.c:9178 +#: config/i386/i386.c:9181 #, gcc-internal-format, gfc-internal-format msgid "The ABI for passing parameters with %d-byte alignment has changed in GCC 4.6" msgstr "" -#: config/i386/i386.c:11601 +#: config/i386/i386.c:11604 #, gcc-internal-format, gfc-internal-format msgid "-mcall-ms2sysv-xlogues is not compatible with %s" msgstr "" -#: config/i386/i386.c:13593 +#: config/i386/i386.c:13596 #, gcc-internal-format msgid "ms_hook_prologue attribute isn%'t compatible with -mfentry for 32-bit" msgstr "" -#: config/i386/i386.c:13683 +#: config/i386/i386.c:13686 #, gcc-internal-format msgid "Dynamic Realign Argument Pointer (DRAP) not supported in interrupt service routine. This may be worked around by avoiding functions with aggregate return." msgstr "" -#: config/i386/i386.c:14970 +#: config/i386/i386.c:14973 #, gcc-internal-format msgid "-fsplit-stack does not support fastcall with nested function" msgstr "" -#: config/i386/i386.c:14990 +#: config/i386/i386.c:14993 #, gcc-internal-format msgid "-fsplit-stack does not support 2 register parameters for a nested function" msgstr "" #. FIXME: We could make this work by pushing a register #. around the addition and comparison. -#: config/i386/i386.c:15001 +#: config/i386/i386.c:15004 #, gcc-internal-format msgid "-fsplit-stack does not support 3 register parameters" msgstr "" -#: config/i386/i386.c:17939 +#: config/i386/i386.c:17942 #, gcc-internal-format msgid "'V' modifier on non-integer register" msgstr "" -#: config/i386/i386.c:17950 config/i386/i386.c:17964 +#: config/i386/i386.c:17953 config/i386/i386.c:17967 #, gcc-internal-format msgid "unsupported size for integer register" msgstr "" -#: config/i386/i386.c:17996 +#: config/i386/i386.c:17999 #, gcc-internal-format msgid "extended registers have no high halves" msgstr "" -#: config/i386/i386.c:18011 +#: config/i386/i386.c:18014 #, gcc-internal-format msgid "unsupported operand size for extended register" msgstr "" -#: config/i386/i386.c:18202 +#: config/i386/i386.c:18205 #, gcc-internal-format msgid "non-integer operand used with operand code 'z'" msgstr "" -#: config/i386/i386.c:28467 +#: config/i386/i386.c:28470 #, gcc-internal-format msgid "interrupt service routine can't be called directly" msgstr "" -#: config/i386/i386.c:29995 +#: config/i386/i386.c:29998 #, gcc-internal-format msgid "empty class %qT parameter passing ABI changes in -fabi-version=12 (GCC 8)" msgstr "" -#: config/i386/i386.c:32435 +#: config/i386/i386.c:32438 #, gcc-internal-format msgid "No dispatcher found for the versioning attributes" msgstr "" -#: config/i386/i386.c:32485 +#: config/i386/i386.c:32488 #, gcc-internal-format, gfc-internal-format msgid "No dispatcher found for %s" msgstr "" -#: config/i386/i386.c:32495 +#: config/i386/i386.c:32498 #, gcc-internal-format, gfc-internal-format msgid "No dispatcher found for the versioning attributes : %s" msgstr "" -#: config/i386/i386.c:32657 +#: config/i386/i386.c:32660 #, gcc-internal-format msgid "Function versions cannot be marked as gnu_inline, bodies have to be generated" msgstr "" -#: config/i386/i386.c:32662 config/i386/i386.c:32938 -#: config/rs6000/rs6000.c:37850 +#: config/i386/i386.c:32665 config/i386/i386.c:32941 +#: config/rs6000/rs6000.c:37906 #, gcc-internal-format msgid "Virtual function multiversioning not supported" msgstr "" -#: config/i386/i386.c:32795 config/rs6000/rs6000.c:37607 +#: config/i386/i386.c:32798 config/rs6000/rs6000.c:37663 #, fuzzy, gcc-internal-format msgid "multiversioning needs ifunc which is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: config/i386/i386.c:33207 +#: config/i386/i386.c:33210 #, fuzzy, gcc-internal-format msgid "Parameter to builtin must be a string constant or literal" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386.c:33232 config/i386/i386.c:33282 +#: config/i386/i386.c:33235 config/i386/i386.c:33285 #, gcc-internal-format, gfc-internal-format msgid "Parameter to builtin not valid: %s" msgstr "" -#: config/i386/i386.c:33975 config/i386/i386.c:35415 +#: config/i386/i386.c:33978 config/i386/i386.c:35418 #, fuzzy, gcc-internal-format msgid "the last argument must be a 2-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:34370 +#: config/i386/i386.c:34373 #, fuzzy, gcc-internal-format msgid "the fifth argument must be an 8-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:34465 +#: config/i386/i386.c:34468 #, fuzzy, gcc-internal-format msgid "the third argument must be an 8-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35346 +#: config/i386/i386.c:35349 #, fuzzy, gcc-internal-format msgid "the last argument must be an 1-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35361 +#: config/i386/i386.c:35364 #, fuzzy, gcc-internal-format msgid "the last argument must be a 3-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35394 +#: config/i386/i386.c:35397 #, fuzzy, gcc-internal-format msgid "the last argument must be a 4-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35434 +#: config/i386/i386.c:35437 #, fuzzy, gcc-internal-format msgid "the last argument must be a 1-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35447 +#: config/i386/i386.c:35450 #, fuzzy, gcc-internal-format msgid "the last argument must be a 5-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35457 +#: config/i386/i386.c:35460 #, gcc-internal-format msgid "the next to last argument must be an 8-bit immediate" msgstr "" -#: config/i386/i386.c:35462 config/i386/i386.c:36249 +#: config/i386/i386.c:35465 config/i386/i386.c:36252 #, fuzzy, gcc-internal-format msgid "the last argument must be an 8-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35596 +#: config/i386/i386.c:35599 #, fuzzy, gcc-internal-format msgid "the third argument must be comparison constant" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386.c:35601 +#: config/i386/i386.c:35604 #, gcc-internal-format msgid "incorrect comparison mode" msgstr "" -#: config/i386/i386.c:35607 config/i386/i386.c:35814 +#: config/i386/i386.c:35610 config/i386/i386.c:35817 #, gcc-internal-format msgid "incorrect rounding operand" msgstr "" -#: config/i386/i386.c:35796 +#: config/i386/i386.c:35799 #, fuzzy, gcc-internal-format msgid "the immediate argument must be a 4-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35802 +#: config/i386/i386.c:35805 #, fuzzy, gcc-internal-format msgid "the immediate argument must be a 5-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:35805 +#: config/i386/i386.c:35808 #, gcc-internal-format msgid "the immediate argument must be an 8-bit immediate" msgstr "" -#: config/i386/i386.c:36247 +#: config/i386/i386.c:36250 #, fuzzy, gcc-internal-format msgid "the last argument must be a 32-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:36329 config/powerpcspe/powerpcspe.c:16219 -#: config/rs6000/rs6000.c:15304 +#: config/i386/i386.c:36332 config/powerpcspe/powerpcspe.c:16219 +#: config/rs6000/rs6000.c:15348 #, gcc-internal-format msgid "selector must be an integer constant in the range 0..%wi" msgstr "" -#: config/i386/i386.c:36539 +#: config/i386/i386.c:36542 #, gcc-internal-format msgid "%qE needs unknown isa option" msgstr "" -#: config/i386/i386.c:36543 +#: config/i386/i386.c:36546 #, fuzzy, gcc-internal-format msgid "%qE needs isa option %s" msgstr "Нерэчаісны выбар %s" -#: config/i386/i386.c:37381 +#: config/i386/i386.c:37375 #, fuzzy, gcc-internal-format msgid "last argument must be an immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:38108 config/i386/i386.c:38290 +#: config/i386/i386.c:38102 config/i386/i386.c:38284 #, gcc-internal-format msgid "the last argument must be scale 1, 2, 4, 8" msgstr "" -#: config/i386/i386.c:38343 +#: config/i386/i386.c:38337 #, gcc-internal-format msgid "the forth argument must be scale 1, 2, 4, 8" msgstr "" -#: config/i386/i386.c:38349 +#: config/i386/i386.c:38343 #, gcc-internal-format msgid "incorrect hint operand" msgstr "" -#: config/i386/i386.c:38368 +#: config/i386/i386.c:38362 #, fuzzy, gcc-internal-format msgid "the xabort's argument must be an 8-bit immediate" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/i386/i386.c:41431 +#: config/i386/i386.c:41425 #, fuzzy, gcc-internal-format msgid "%qE attribute only available for 32-bit" msgstr "\"%s\" атрыбут ігнарыруецца" -#: config/i386/i386.c:41452 +#: config/i386/i386.c:41446 #, fuzzy, gcc-internal-format msgid "argument to %qE attribute is neither zero, nor one" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386.c:41485 config/i386/i386.c:41494 +#: config/i386/i386.c:41479 config/i386/i386.c:41488 #, gcc-internal-format msgid "ms_abi and sysv_abi attributes are not compatible" msgstr "" -#: config/i386/i386.c:41530 config/powerpcspe/powerpcspe.c:35868 -#: config/rs6000/rs6000.c:33065 +#: config/i386/i386.c:41524 config/powerpcspe/powerpcspe.c:35868 +#: config/rs6000/rs6000.c:33121 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "%qE incompatible attribute ignored" msgstr "\"%s\" атрыбут ігнарыруецца" -#: config/i386/i386.c:41555 config/i386/i386.c:41577 config/ia64/ia64.c:815 +#: config/i386/i386.c:41549 config/i386/i386.c:41571 config/ia64/ia64.c:815 #: config/s390/s390.c:1153 #, fuzzy, gcc-internal-format msgid "%qE attribute requires a string constant argument" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386.c:41565 config/i386/i386.c:41587 config/s390/s390.c:1182 +#: config/i386/i386.c:41559 config/i386/i386.c:41581 config/s390/s390.c:1182 #, fuzzy, gcc-internal-format msgid "argument to %qE attribute is not (keep|thunk|thunk-inline|thunk-extern)" msgstr "аргумент `__builtin_args_info' павінен быць канстантай" -#: config/i386/i386.c:41619 +#: config/i386/i386.c:41613 #, gcc-internal-format msgid "interrupt service routine should have a pointer as the first argument" msgstr "" -#: config/i386/i386.c:41626 +#: config/i386/i386.c:41620 #, gcc-internal-format, gfc-internal-format msgid "interrupt service routine should have unsigned %sint as the second argument" msgstr "" -#: config/i386/i386.c:41636 +#: config/i386/i386.c:41630 #, gcc-internal-format msgid "interrupt service routine can only have a pointer argument and an optional integer argument" msgstr "" -#: config/i386/i386.c:41639 +#: config/i386/i386.c:41633 #, gcc-internal-format msgid "interrupt service routine can't have non-void return value" msgstr "" -#: config/i386/i386.c:44676 +#: config/i386/i386.c:44670 #, gcc-internal-format msgid "alternatives not allowed in asm flag output" msgstr "" -#: config/i386/i386.c:44740 +#: config/i386/i386.c:44734 #, gcc-internal-format msgid "unknown asm flag output %qs" msgstr "" -#: config/i386/i386.c:44769 +#: config/i386/i386.c:44763 #, gcc-internal-format msgid "invalid type for asm flag output" msgstr "" -#: config/i386/i386.c:50634 +#: config/i386/i386.c:50628 #, gcc-internal-format msgid "unknown architecture specific memory model" msgstr "" -#: config/i386/i386.c:50641 +#: config/i386/i386.c:50635 #, gcc-internal-format msgid "HLE_ACQUIRE not used with ACQUIRE or stronger memory model" msgstr "" -#: config/i386/i386.c:50647 +#: config/i386/i386.c:50641 #, gcc-internal-format msgid "HLE_RELEASE not used with RELEASE or stronger memory model" msgstr "" -#: config/i386/i386.c:50671 config/i386/i386.c:50787 +#: config/i386/i386.c:50665 config/i386/i386.c:50781 #, fuzzy, gcc-internal-format, gfc-internal-format #| msgid "unsupported version" msgid "unsupported simdlen %d" msgstr "непадтрымліваемая версія" -#: config/i386/i386.c:50690 +#: config/i386/i386.c:50684 #, gcc-internal-format msgid "unsupported return type %qT for simd" msgstr "" -#: config/i386/i386.c:50712 +#: config/i386/i386.c:50706 #, gcc-internal-format msgid "unsupported argument type %qT for simd" msgstr "" -#: config/i386/i386.c:51033 +#: config/i386/i386.c:51027 #, gcc-internal-format msgid "Pointer Checker requires MPX support on this target. Use -mmpx options to enable MPX." msgstr "" @@ -30802,7 +30844,7 @@ msgid "interrupt_thread is available only on fido" msgstr "" #: config/m68k/m68k.c:1128 config/powerpcspe/powerpcspe.c:28512 -#: config/rs6000/rs6000.c:25791 +#: config/rs6000/rs6000.c:25868 #, gcc-internal-format msgid "stack limit expression is not supported" msgstr "" @@ -31386,58 +31428,58 @@ msgstr "" #. Trampoline is not supported on reduced-set registers yet. #: config/nds32/nds32.c:2327 config/nds32/nds32.c:2381 -#: config/nds32/nds32.c:3127 config/nds32/nds32.c:3201 -#: config/nds32/nds32.c:3216 config/nds32/nds32.c:3222 -#: config/nds32/nds32.c:3284 config/nds32/nds32.c:3290 -#: config/nds32/nds32.c:3322 +#: config/nds32/nds32.c:3128 config/nds32/nds32.c:3202 +#: config/nds32/nds32.c:3217 config/nds32/nds32.c:3223 +#: config/nds32/nds32.c:3285 config/nds32/nds32.c:3291 +#: config/nds32/nds32.c:3323 #, fuzzy, gcc-internal-format msgid "a nested function is not supported for reduced registers" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" #. The enum index value for array size is out of range. -#: config/nds32/nds32.c:3025 +#: config/nds32/nds32.c:3026 #, fuzzy, gcc-internal-format msgid "intrinsic register index is out of range" msgstr "нявернае выкарыстанне \"restict\"" -#: config/nds32/nds32.c:3041 config/nds32/nds32.c:3048 -#: config/nds32/nds32.c:3055 config/nds32/nds32.c:3062 -#: config/nds32/nds32.c:3069 +#: config/nds32/nds32.c:3042 config/nds32/nds32.c:3049 +#: config/nds32/nds32.c:3056 config/nds32/nds32.c:3063 +#: config/nds32/nds32.c:3070 #, gcc-internal-format msgid "CCTL intrinsic function subtype out of range!" msgstr "" -#: config/nds32/nds32.c:3508 +#: config/nds32/nds32.c:3509 #, gcc-internal-format msgid "invalid id value for interrupt/exception attribute" msgstr "" -#: config/nds32/nds32.c:3536 +#: config/nds32/nds32.c:3537 #, fuzzy, gcc-internal-format msgid "invalid id value for reset attribute" msgstr "нявернае выкарыстанне \"restict\"" -#: config/nds32/nds32.c:3552 +#: config/nds32/nds32.c:3553 #, fuzzy, gcc-internal-format msgid "invalid nmi function for reset attribute" msgstr "нявернае выкарыстанне \"restict\"" -#: config/nds32/nds32.c:3565 +#: config/nds32/nds32.c:3566 #, fuzzy, gcc-internal-format msgid "invalid warm function for reset attribute" msgstr "нявернае выкарыстанне \"restict\"" -#: config/nds32/nds32.c:3638 +#: config/nds32/nds32.c:3639 #, gcc-internal-format msgid "Disable FPU ISA, the ABI option must be enable '-mfloat-abi=soft'" msgstr "" -#: config/nds32/nds32.c:3641 +#: config/nds32/nds32.c:3642 #, gcc-internal-format msgid "'-mabi=2fp+' option only support when FPU available, must be enable '-mext-fpu-sp' or '-mext-fpu-dp'" msgstr "" -#: config/nds32/nds32.c:3647 +#: config/nds32/nds32.c:3648 #, fuzzy, gcc-internal-format #| msgid "-pipe is not supported" msgid "position-independent code not supported" @@ -31777,12 +31819,12 @@ msgstr "" msgid "junk at end of #pragma longcall" msgstr "" -#: config/powerpcspe/powerpcspe-c.c:5661 config/rs6000/rs6000-c.c:6154 +#: config/powerpcspe/powerpcspe-c.c:5661 config/rs6000/rs6000-c.c:6152 #, gcc-internal-format msgid "vec_lvsl is deprecated for little endian; use assignment for unaligned loads and stores" msgstr "" -#: config/powerpcspe/powerpcspe-c.c:5665 config/rs6000/rs6000-c.c:6158 +#: config/powerpcspe/powerpcspe-c.c:5665 config/rs6000/rs6000-c.c:6156 #, gcc-internal-format msgid "vec_lvsr is deprecated for little endian; use assignment for unaligned loads and stores" msgstr "" @@ -31832,7 +31874,7 @@ msgstr "" msgid "vec_insert only accepts 3 arguments" msgstr "" -#: config/powerpcspe/powerpcspe-c.c:6468 config/rs6000/rs6000-c.c:6868 +#: config/powerpcspe/powerpcspe-c.c:6468 config/rs6000/rs6000-c.c:6866 #, gcc-internal-format msgid "passing arg %d of %qE discards qualifiers from pointer target type" msgstr "" @@ -31918,7 +31960,7 @@ msgstr "Не генерыраваць сімвальныя інструкцыі" msgid "target attribute or pragma changes SPE ABI" msgstr "" -#: config/powerpcspe/powerpcspe.c:4351 config/rs6000/rs6000.c:4223 +#: config/powerpcspe/powerpcspe.c:4351 config/rs6000/rs6000.c:4243 #, fuzzy, gcc-internal-format msgid "AltiVec not supported in this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" @@ -32064,7 +32106,7 @@ msgstr "" msgid "-mvsx-small-integer requires -mpower8-vector, -mupper-regs-di, and -mdirect-move" msgstr "" -#: config/powerpcspe/powerpcspe.c:4959 config/rs6000/rs6000.c:4601 +#: config/powerpcspe/powerpcspe.c:4959 config/rs6000/rs6000.c:4628 #, gcc-internal-format msgid "target attribute or pragma changes long double size" msgstr "" @@ -32105,22 +32147,22 @@ msgid "unknown vectorization library ABI type (%s) for -mveclibabi= switch" msgstr "" #: config/powerpcspe/powerpcspe.c:5140 config/powerpcspe/powerpcspe.c:5155 -#: config/rs6000/rs6000.c:4766 config/rs6000/rs6000.c:4781 +#: config/rs6000/rs6000.c:4791 config/rs6000/rs6000.c:4806 #, gcc-internal-format msgid "target attribute or pragma changes AltiVec ABI" msgstr "" -#: config/powerpcspe/powerpcspe.c:5168 config/rs6000/rs6000.c:4794 +#: config/powerpcspe/powerpcspe.c:5168 config/rs6000/rs6000.c:4819 #, gcc-internal-format msgid "target attribute or pragma changes darwin64 ABI" msgstr "" -#: config/powerpcspe/powerpcspe.c:5234 config/rs6000/rs6000.c:4828 +#: config/powerpcspe/powerpcspe.c:5234 config/rs6000/rs6000.c:4853 #, gcc-internal-format msgid "target attribute or pragma changes single precision floating point" msgstr "" -#: config/powerpcspe/powerpcspe.c:5237 config/rs6000/rs6000.c:4831 +#: config/powerpcspe/powerpcspe.c:5237 config/rs6000/rs6000.c:4856 #, gcc-internal-format msgid "target attribute or pragma changes double precision floating point" msgstr "" @@ -32130,12 +32172,12 @@ msgstr "" msgid "-mstack-protector-guard=tls needs a valid base register" msgstr "" -#: config/powerpcspe/powerpcspe.c:8415 config/rs6000/rs6000.c:7925 +#: config/powerpcspe/powerpcspe.c:8415 config/rs6000/rs6000.c:7950 #, gcc-internal-format, gfc-internal-format msgid "the layout of aggregates containing vectors with %d-byte alignment has changed in GCC 5" msgstr "" -#: config/powerpcspe/powerpcspe.c:11834 config/rs6000/rs6000.c:11237 +#: config/powerpcspe/powerpcspe.c:11834 config/rs6000/rs6000.c:11269 #, gcc-internal-format msgid "GCC vector returned by reference: non-standard ABI extension with no compatibility guarantee" msgstr "" @@ -32145,7 +32187,7 @@ msgstr "" msgid "cannot return value in vector register because altivec instructions are disabled, use -maltivec to enable them" msgstr "" -#: config/powerpcspe/powerpcspe.c:12193 config/rs6000/rs6000.c:11595 +#: config/powerpcspe/powerpcspe.c:12193 config/rs6000/rs6000.c:11633 #, gcc-internal-format, gfc-internal-format msgid "the ABI of passing aggregates with %d-byte alignment has changed in GCC 5" msgstr "" @@ -32155,12 +32197,12 @@ msgstr "" msgid "cannot pass argument in vector register because altivec instructions are disabled, use -maltivec to enable them" msgstr "" -#: config/powerpcspe/powerpcspe.c:13311 config/rs6000/rs6000.c:12604 +#: config/powerpcspe/powerpcspe.c:13311 config/rs6000/rs6000.c:12648 #, gcc-internal-format msgid "the ABI of passing homogeneous float aggregates has changed in GCC 5" msgstr "" -#: config/powerpcspe/powerpcspe.c:13486 config/rs6000/rs6000.c:12779 +#: config/powerpcspe/powerpcspe.c:13486 config/rs6000/rs6000.c:12823 #, gcc-internal-format msgid "GCC vector passed by reference: non-standard ABI extension with no compatibility guarantee" msgstr "" @@ -32170,28 +32212,28 @@ msgstr "" msgid "internal error: builtin function %s already processed" msgstr "" -#: config/powerpcspe/powerpcspe.c:14785 config/rs6000/rs6000.c:13971 +#: config/powerpcspe/powerpcspe.c:14785 config/rs6000/rs6000.c:14015 #, fuzzy, gcc-internal-format msgid "argument 1 must be an 8-bit field value" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:14831 config/rs6000/rs6000.c:14015 +#: config/powerpcspe/powerpcspe.c:14831 config/rs6000/rs6000.c:14059 #, fuzzy, gcc-internal-format msgid "argument 1 must be a 5-bit signed literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" #: config/powerpcspe/powerpcspe.c:14934 config/powerpcspe/powerpcspe.c:16803 -#: config/rs6000/rs6000.c:14101 +#: config/rs6000/rs6000.c:14145 #, fuzzy, gcc-internal-format msgid "argument 2 must be a 5-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:14952 config/rs6000/rs6000.c:14119 +#: config/powerpcspe/powerpcspe.c:14952 config/rs6000/rs6000.c:14163 #, fuzzy, gcc-internal-format msgid "argument 1 must be a 6-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:14966 config/rs6000/rs6000.c:14135 +#: config/powerpcspe/powerpcspe.c:14966 config/rs6000/rs6000.c:14179 #, fuzzy, gcc-internal-format msgid "argument 2 must be a 7-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" @@ -32211,12 +32253,12 @@ msgstr "аргумент `__builtin_args_info' выйшаў за межы" msgid "builtin %s is only valid in 64-bit mode" msgstr "" -#: config/powerpcspe/powerpcspe.c:15599 config/rs6000/rs6000.c:14791 +#: config/powerpcspe/powerpcspe.c:15599 config/rs6000/rs6000.c:14835 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "argument %d must be an unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:15601 config/rs6000/rs6000.c:14793 +#: config/powerpcspe/powerpcspe.c:15601 config/rs6000/rs6000.c:14837 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "argument %d is an unsigned literal that is out of range" msgstr "аргумент `__builtin_args_info' выйшаў за межы" @@ -32238,53 +32280,53 @@ msgstr "" msgid "hwcap %s is an invalid argument to builtin %s" msgstr "" -#: config/powerpcspe/powerpcspe.c:15860 config/rs6000/rs6000.c:15065 +#: config/powerpcspe/powerpcspe.c:15860 config/rs6000/rs6000.c:15109 #, fuzzy, gcc-internal-format msgid "argument 3 must be a 4-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:15885 config/rs6000/rs6000.c:15090 +#: config/powerpcspe/powerpcspe.c:15885 config/rs6000/rs6000.c:15134 #, fuzzy, gcc-internal-format msgid "argument 3 must be a 2-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:15905 config/rs6000/rs6000.c:15110 +#: config/powerpcspe/powerpcspe.c:15905 config/rs6000/rs6000.c:15154 #, fuzzy, gcc-internal-format msgid "argument 3 must be a 1-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:15917 config/rs6000/rs6000.c:15122 +#: config/powerpcspe/powerpcspe.c:15917 config/rs6000/rs6000.c:15166 #, fuzzy, gcc-internal-format msgid "argument 1 must be 0 or 2" msgstr "аргумент для \"%s\" прапушчан" -#: config/powerpcspe/powerpcspe.c:15929 config/rs6000/rs6000.c:15134 +#: config/powerpcspe/powerpcspe.c:15929 config/rs6000/rs6000.c:15178 #, fuzzy, gcc-internal-format msgid "argument 1 must be a 1-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:15943 config/rs6000/rs6000.c:15148 +#: config/powerpcspe/powerpcspe.c:15943 config/rs6000/rs6000.c:15192 #, fuzzy, gcc-internal-format msgid "argument 2 must be a 6-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:15955 config/rs6000/rs6000.c:15160 +#: config/powerpcspe/powerpcspe.c:15955 config/rs6000/rs6000.c:15204 #, fuzzy, gcc-internal-format msgid "argument 2 must be 0 or 1" msgstr "аргумент для \"%s\" прапушчан" -#: config/powerpcspe/powerpcspe.c:15963 config/rs6000/rs6000.c:15168 +#: config/powerpcspe/powerpcspe.c:15963 config/rs6000/rs6000.c:15212 #, fuzzy, gcc-internal-format msgid "argument 3 must be in the range 0..15" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:16152 config/rs6000/rs6000.c:15237 -#: config/rs6000/rs6000.c:15569 +#: config/powerpcspe/powerpcspe.c:16152 config/rs6000/rs6000.c:15281 +#: config/rs6000/rs6000.c:15613 #, fuzzy, gcc-internal-format msgid "argument to %qs must be a 2-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/powerpcspe/powerpcspe.c:16309 config/rs6000/rs6000.c:15394 +#: config/powerpcspe/powerpcspe.c:16309 config/rs6000/rs6000.c:15438 #, gcc-internal-format msgid "unresolved overload for Altivec builtin %qF" msgstr "" @@ -32409,7 +32451,7 @@ msgstr "" msgid "internal error: builtin function %s, argument %d had unexpected argument type %s" msgstr "" -#: config/powerpcspe/powerpcspe.c:28481 config/rs6000/rs6000.c:25758 +#: config/powerpcspe/powerpcspe.c:28481 config/rs6000/rs6000.c:25835 #, fuzzy, gcc-internal-format #| msgid "%s is too large" msgid "stack frame too large" @@ -32420,12 +32462,12 @@ msgstr "%s - вельмі вялікі" msgid "-fsplit-stack uses register r29" msgstr "" -#: config/powerpcspe/powerpcspe.c:32265 config/rs6000/rs6000.c:29459 +#: config/powerpcspe/powerpcspe.c:32265 config/rs6000/rs6000.c:29536 #, gcc-internal-format msgid "Stack frame larger than 2G is not supported for -fsplit-stack" msgstr "" -#: config/powerpcspe/powerpcspe.c:33252 config/rs6000/rs6000.c:30447 +#: config/powerpcspe/powerpcspe.c:33252 config/rs6000/rs6000.c:30524 #, gcc-internal-format msgid "no profiling of 64-bit code for this ABI" msgstr "" @@ -32435,22 +32477,22 @@ msgstr "" msgid "You cannot take the address of a nested function if you use the -mno-pointers-to-nested-functions option." msgstr "" -#: config/powerpcspe/powerpcspe.c:35637 config/rs6000/rs6000.c:32830 +#: config/powerpcspe/powerpcspe.c:35637 config/rs6000/rs6000.c:32907 #, gcc-internal-format msgid "use of % in AltiVec types is invalid" msgstr "" -#: config/powerpcspe/powerpcspe.c:35639 config/rs6000/rs6000.c:32832 +#: config/powerpcspe/powerpcspe.c:35639 config/rs6000/rs6000.c:32909 #, gcc-internal-format msgid "use of boolean types in AltiVec types is invalid" msgstr "" -#: config/powerpcspe/powerpcspe.c:35641 config/rs6000/rs6000.c:32834 +#: config/powerpcspe/powerpcspe.c:35641 config/rs6000/rs6000.c:32911 #, gcc-internal-format msgid "use of % in AltiVec types is invalid" msgstr "" -#: config/powerpcspe/powerpcspe.c:35643 config/rs6000/rs6000.c:32836 +#: config/powerpcspe/powerpcspe.c:35643 config/rs6000/rs6000.c:32913 #, gcc-internal-format msgid "use of decimal floating point types in AltiVec types is invalid" msgstr "" @@ -32460,7 +32502,7 @@ msgstr "" msgid "use of % in AltiVec types is invalid for 64-bit code without -mvsx" msgstr "" -#: config/powerpcspe/powerpcspe.c:35652 config/rs6000/rs6000.c:32845 +#: config/powerpcspe/powerpcspe.c:35652 config/rs6000/rs6000.c:32922 #, gcc-internal-format msgid "use of % in AltiVec types is deprecated; use %" msgstr "" @@ -33004,78 +33046,78 @@ msgid "" "Please use an explicit cpu name. Valid cpu names are: %s" msgstr "" -#: config/rs6000/rs6000-c.c:6168 config/rs6000/rs6000-c.c:6219 -#: config/rs6000/rs6000-c.c:6489 config/rs6000/rs6000-c.c:6555 -#: config/rs6000/rs6000-c.c:6916 config/rs6000/rs6000-c.c:6963 +#: config/rs6000/rs6000-c.c:6166 config/rs6000/rs6000-c.c:6217 +#: config/rs6000/rs6000-c.c:6487 config/rs6000/rs6000-c.c:6553 +#: config/rs6000/rs6000-c.c:6914 config/rs6000/rs6000-c.c:6961 #, gcc-internal-format msgid "builtin %qs only accepts 2 arguments" msgstr "" -#: config/rs6000/rs6000-c.c:6292 config/rs6000/rs6000-c.c:6375 -#: config/rs6000/rs6000-c.c:6736 +#: config/rs6000/rs6000-c.c:6290 config/rs6000/rs6000-c.c:6373 +#: config/rs6000/rs6000-c.c:6734 #, gcc-internal-format msgid "builtin %qs only accepts 3 arguments" msgstr "" -#: config/rs6000/rs6000-c.c:6484 +#: config/rs6000/rs6000-c.c:6482 #, gcc-internal-format msgid "builtin %qs only accepts 1 argument" msgstr "" -#: config/rs6000/rs6000-c.c:7054 +#: config/rs6000/rs6000-c.c:7052 #, gcc-internal-format msgid "builtin %qs requires builtin %qs" msgstr "" -#: config/rs6000/rs6000-c.c:7058 +#: config/rs6000/rs6000-c.c:7056 #, gcc-internal-format msgid "builtin function %qs not supported in this compiler configuration" msgstr "" -#: config/rs6000/rs6000-c.c:7068 +#: config/rs6000/rs6000-c.c:7066 #, gcc-internal-format msgid "invalid parameter combination for AltiVec intrinsic %qs" msgstr "" -#: config/rs6000/rs6000.c:3754 config/rs6000/rs6000.c:3757 -#: config/rs6000/rs6000.c:3760 +#: config/rs6000/rs6000.c:3772 config/rs6000/rs6000.c:3775 +#: config/rs6000/rs6000.c:3778 #, gcc-internal-format msgid "%qs requires %qs or %qs" msgstr "" -#: config/rs6000/rs6000.c:3861 +#: config/rs6000/rs6000.c:3879 #, gcc-internal-format msgid "%qs requires PowerPC64 architecture, enabling" msgstr "" -#: config/rs6000/rs6000.c:4037 +#: config/rs6000/rs6000.c:4057 #, fuzzy, gcc-internal-format msgid "%qs command-line option is deprecated" msgstr "Нераспазнаны выбар \"%s\"" -#: config/rs6000/rs6000.c:4048 +#: config/rs6000/rs6000.c:4068 #, 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:4147 +#: config/rs6000/rs6000.c:4167 #, gcc-internal-format msgid "will not generate %qs instructions because assembler lacks %qs support" msgstr "" -#: config/rs6000/rs6000.c:4240 +#: config/rs6000/rs6000.c:4260 #, fuzzy, gcc-internal-format msgid "%qs is not supported on little endian systems" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: config/rs6000/rs6000.c:4333 +#: config/rs6000/rs6000.c:4353 #, 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:4341 +#: config/rs6000/rs6000.c:4361 #, gcc-internal-format msgid "%qs incompatible with explicitly disabled options" msgstr "" @@ -33084,248 +33126,249 @@ msgstr "" #. error messages. However, if users have managed to select #. power9-fusion without selecting power8-fusion, they #. already know about undocumented flags. -#: config/rs6000/rs6000.c:4366 config/rs6000/rs6000.c:4373 -#: config/rs6000/rs6000.c:4380 config/rs6000/rs6000.c:4388 -#: config/rs6000/rs6000.c:4407 config/rs6000/rs6000.c:4464 -#: config/rs6000/rs6000.c:4468 config/rs6000/rs6000.c:4485 -#: config/rs6000/rs6000.c:4538 config/rs6000/rs6000.c:4565 -#: config/rs6000/rs6000.c:4580 config/rs6000/rs6000.c:4588 -#: config/rs6000/rs6000.c:4684 +#: config/rs6000/rs6000.c:4386 config/rs6000/rs6000.c:4393 +#: config/rs6000/rs6000.c:4400 config/rs6000/rs6000.c:4408 +#: config/rs6000/rs6000.c:4427 config/rs6000/rs6000.c:4484 +#: config/rs6000/rs6000.c:4488 config/rs6000/rs6000.c:4505 +#: config/rs6000/rs6000.c:4558 config/rs6000/rs6000.c:4585 +#: config/rs6000/rs6000.c:4600 config/rs6000/rs6000.c:4608 +#: config/rs6000/rs6000.c:4709 #, gcc-internal-format msgid "%qs requires %qs" msgstr "" -#: config/rs6000/rs6000.c:4625 +#: config/rs6000/rs6000.c:4650 #, gcc-internal-format msgid "Using IEEE extended precision long double" msgstr "" -#: config/rs6000/rs6000.c:4627 +#: config/rs6000/rs6000.c:4652 #, gcc-internal-format msgid "Using IBM extended precision long double" msgstr "" -#: config/rs6000/rs6000.c:4644 +#: config/rs6000/rs6000.c:4669 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "%qs requires VSX support" msgstr "%s не падтрымлівае %s" -#: config/rs6000/rs6000.c:4653 +#: config/rs6000/rs6000.c:4678 #, gcc-internal-format msgid "The -mfloat128 option may not be fully supported" msgstr "" -#: config/rs6000/rs6000.c:4676 +#: config/rs6000/rs6000.c:4701 #, gcc-internal-format msgid "%qs requires full ISA 3.0 support" msgstr "" -#: config/rs6000/rs6000.c:4743 +#: config/rs6000/rs6000.c:4768 #, gcc-internal-format msgid "unknown vectorization library ABI type (%qs) for %qs switch" msgstr "" -#: config/rs6000/rs6000.c:4930 +#: config/rs6000/rs6000.c:4955 #, gcc-internal-format msgid "%qs is not a valid number in %qs" msgstr "" -#: config/rs6000/rs6000.c:4935 +#: config/rs6000/rs6000.c:4960 #, fuzzy, gcc-internal-format msgid "%qs is not a valid offset in %qs" msgstr "Нерэчаісны выбар %s" -#: config/rs6000/rs6000.c:4947 +#: config/rs6000/rs6000.c:4972 #, fuzzy, gcc-internal-format #| msgid "invalid register name for `%s'" msgid "%qs is not a valid base register in %qs" msgstr "нерэчаісная назва рэгістра `%s'" -#: config/rs6000/rs6000.c:4955 +#: config/rs6000/rs6000.c:4980 #, gcc-internal-format msgid "%qs needs a valid base register" msgstr "" -#: config/rs6000/rs6000.c:5253 +#: config/rs6000/rs6000.c:5278 #, fuzzy, gcc-internal-format msgid "unknown option for %<%s=%s%>" msgstr "невядомая назва рэгістра: %s\n" -#: config/rs6000/rs6000.c:5290 +#: config/rs6000/rs6000.c:5315 #, gcc-internal-format msgid "%qs is deprecated and not recommended in any circumstances" msgstr "" -#: config/rs6000/rs6000.c:11401 +#: config/rs6000/rs6000.c:11439 #, gcc-internal-format msgid "cannot return value in vector register because altivec instructions are disabled, use %qs to enable them" msgstr "" -#: config/rs6000/rs6000.c:11862 +#: config/rs6000/rs6000.c:11906 #, gcc-internal-format msgid "cannot pass argument in vector register because altivec instructions are disabled, use %qs to enable them" msgstr "" -#: config/rs6000/rs6000.c:13572 +#: config/rs6000/rs6000.c:13616 #, gcc-internal-format msgid "internal error: builtin function %qs already processed" msgstr "" -#: config/rs6000/rs6000.c:14150 +#: config/rs6000/rs6000.c:14194 #, fuzzy, gcc-internal-format msgid "argument 2 must be a 1-bit unsigned literal" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/rs6000/rs6000.c:14189 +#: config/rs6000/rs6000.c:14233 #, fuzzy, gcc-internal-format msgid "argument 1 of %qs must be a constant" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/rs6000/rs6000.c:14247 config/rs6000/rs6000.c:15898 +#: config/rs6000/rs6000.c:14291 config/rs6000/rs6000.c:15942 #, fuzzy, gcc-internal-format #| msgid "argument of `__builtin_args_info' out of range" msgid "argument 1 of %qs is out of range" msgstr "аргумент `__builtin_args_info' выйшаў за межы" -#: config/rs6000/rs6000.c:14742 +#: config/rs6000/rs6000.c:14786 #, gcc-internal-format msgid "builtin %qs is only valid in 64-bit mode" msgstr "" -#: config/rs6000/rs6000.c:14939 +#: config/rs6000/rs6000.c:14983 #, gcc-internal-format msgid "builtin %qs only accepts a string argument" msgstr "" #. Invalid CPU argument. -#: config/rs6000/rs6000.c:14958 +#: config/rs6000/rs6000.c:15002 #, gcc-internal-format msgid "cpu %qs is an invalid argument to builtin %qs" msgstr "" #. Invalid HWCAP argument. -#: config/rs6000/rs6000.c:14986 +#: config/rs6000/rs6000.c:15030 #, gcc-internal-format msgid "%s %qs is an invalid argument to builtin %qs" msgstr "" -#: config/rs6000/rs6000.c:15012 +#: config/rs6000/rs6000.c:15056 #, gcc-internal-format msgid "builtin %qs needs GLIBC (2.23 and newer) that exports hardware capability bits" msgstr "" -#: config/rs6000/rs6000.c:15616 +#: config/rs6000/rs6000.c:15660 #, fuzzy, gcc-internal-format #| msgid "second argument of `%s' should be `char **'" msgid "second argument to %qs must be 0..12" msgstr "другім аргументам \"%s\" павінен быць \"char **\"" -#: config/rs6000/rs6000.c:15631 +#: config/rs6000/rs6000.c:15675 #, fuzzy, gcc-internal-format #| msgid "first argument of `%s' should be `int'" msgid "third argument to %qs must be 0..12" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/rs6000/rs6000.c:15850 +#: config/rs6000/rs6000.c:15894 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "argument 1 of %s must be a constant" msgstr "першым аргументам \"%s\" павінен быць \"int\"" -#: config/rs6000/rs6000.c:15932 +#: config/rs6000/rs6000.c:15976 #, gcc-internal-format msgid "builtin function %qs is only valid for the cell processor" msgstr "" -#: config/rs6000/rs6000.c:15934 config/rs6000/rs6000.c:15936 -#: config/rs6000/rs6000.c:15938 config/rs6000/rs6000.c:15940 -#: config/rs6000/rs6000.c:15946 config/rs6000/rs6000.c:15948 -#: config/rs6000/rs6000.c:15955 config/rs6000/rs6000.c:15962 -#: config/rs6000/rs6000.c:15969 config/rs6000/rs6000.c:15975 +#: config/rs6000/rs6000.c:15978 config/rs6000/rs6000.c:15980 +#: config/rs6000/rs6000.c:15982 config/rs6000/rs6000.c:15984 +#: config/rs6000/rs6000.c:15990 config/rs6000/rs6000.c:15992 +#: config/rs6000/rs6000.c:15999 config/rs6000/rs6000.c:16006 +#: config/rs6000/rs6000.c:16011 config/rs6000/rs6000.c:16014 +#: config/rs6000/rs6000.c:16018 config/rs6000/rs6000.c:16024 #, gcc-internal-format msgid "builtin function %qs requires the %qs option" msgstr "" -#: config/rs6000/rs6000.c:15943 config/rs6000/rs6000.c:15952 -#: config/rs6000/rs6000.c:15959 config/rs6000/rs6000.c:15966 +#: config/rs6000/rs6000.c:15987 config/rs6000/rs6000.c:15996 +#: config/rs6000/rs6000.c:16003 #, gcc-internal-format msgid "builtin function %qs requires the %qs and %qs options" msgstr "" -#: config/rs6000/rs6000.c:15972 +#: config/rs6000/rs6000.c:16021 #, gcc-internal-format msgid "builtin function %qs requires ISA 3.0 IEEE 128-bit floating point" msgstr "" -#: config/rs6000/rs6000.c:15978 +#: config/rs6000/rs6000.c:16027 #, gcc-internal-format msgid "builtin function %qs requires the %qs (or newer), and %qs or %qs options" msgstr "" -#: config/rs6000/rs6000.c:15982 +#: config/rs6000/rs6000.c:16031 #, gcc-internal-format msgid "builtin function %qs is not supported with the current options" msgstr "" -#: config/rs6000/rs6000.c:18218 +#: config/rs6000/rs6000.c:18290 #, gcc-internal-format msgid "internal error: builtin function %qs had an unexpected return type %qs" msgstr "" -#: config/rs6000/rs6000.c:18235 +#: config/rs6000/rs6000.c:18307 #, gcc-internal-format msgid "internal error: builtin function %qs, argument %d had unexpected argument type %qs" msgstr "" -#: config/rs6000/rs6000.c:29451 +#: config/rs6000/rs6000.c:29528 #, fuzzy, gcc-internal-format #| msgid "Do not use register sb" msgid "%qs uses register r29" msgstr "Не выкарыстоўваць рэгістра sb" -#: config/rs6000/rs6000.c:32748 +#: config/rs6000/rs6000.c:32825 #, gcc-internal-format msgid "you cannot take the address of a nested function if you use the %qs option" msgstr "" -#: config/rs6000/rs6000.c:32842 +#: config/rs6000/rs6000.c:32919 #, gcc-internal-format msgid "use of % in AltiVec types is invalid for 64-bit code without %qs" msgstr "" -#: config/rs6000/rs6000.c:32850 +#: config/rs6000/rs6000.c:32927 #, gcc-internal-format msgid "use of % in AltiVec types is invalid without %qs" msgstr "" -#: config/rs6000/rs6000.c:32853 +#: config/rs6000/rs6000.c:32930 #, gcc-internal-format msgid "use of % in AltiVec types is invalid without %qs" msgstr "" -#: config/rs6000/rs6000.c:36876 +#: config/rs6000/rs6000.c:36932 #, fuzzy, gcc-internal-format #| msgid "invalid use of `%D'" msgid "invalid cpu %qs for %s%qs%s" msgstr "нерэчаіснае выкарыстаньне `%D'" -#: config/rs6000/rs6000.c:36879 +#: config/rs6000/rs6000.c:36935 #, fuzzy, gcc-internal-format #| msgid "%s=%s is too large" msgid "%s%qs%s is not allowed" msgstr "%s=%s вельмі вялікі" -#: config/rs6000/rs6000.c:36881 +#: config/rs6000/rs6000.c:36937 #, gcc-internal-format msgid "%s%qs%s is invalid" msgstr "" -#: config/rs6000/rs6000.c:37416 +#: config/rs6000/rs6000.c:37472 #, gcc-internal-format msgid "%<-mno-%s%> turns off %<-m%s%>" msgstr "" -#: config/rs6000/rs6000.c:37575 +#: config/rs6000/rs6000.c:37631 #, gcc-internal-format msgid "target_clones attribute needs GLIBC (2.23 and newer) that exports hardware capability bits" msgstr "" @@ -34072,50 +34115,50 @@ msgstr "віртуальныя функцыі не могуць быць сяб msgid "subprogram %q+F not marked Inline" msgstr "" -#: ada/gcc-interface/trans.c:6404 +#: ada/gcc-interface/trans.c:6401 #, gcc-internal-format msgid "out-of-bounds access may be optimized away" msgstr "" -#: ada/gcc-interface/trans.c:6406 +#: ada/gcc-interface/trans.c:6403 #, gcc-internal-format msgid "containing loop" msgstr "" -#: ada/gcc-interface/utils.c:3887 +#: ada/gcc-interface/utils.c:3890 #, fuzzy, gcc-internal-format msgid "invalid element type for attribute %qs" msgstr "нявернае выкарыстанне \"restict\"" -#: ada/gcc-interface/utils.c:3911 +#: ada/gcc-interface/utils.c:3914 #, gcc-internal-format msgid "number of components of vector not a power of two" msgstr "" -#: ada/gcc-interface/utils.c:6037 ada/gcc-interface/utils.c:6215 -#: ada/gcc-interface/utils.c:6322 +#: ada/gcc-interface/utils.c:6043 ada/gcc-interface/utils.c:6220 +#: ada/gcc-interface/utils.c:6327 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "%qs attribute ignored" msgstr "\"%s\" атрыбут ігнарыруецца" -#: ada/gcc-interface/utils.c:6158 +#: ada/gcc-interface/utils.c:6164 #, gcc-internal-format msgid "%qs attribute requires prototypes with named arguments" msgstr "" -#: ada/gcc-interface/utils.c:6167 +#: ada/gcc-interface/utils.c:6173 #, fuzzy, gcc-internal-format msgid "%qs attribute only applies to variadic functions" msgstr "\"%s\" звычайна функцыя" -#: ada/gcc-interface/utils.c:6282 +#: ada/gcc-interface/utils.c:6287 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "%qE attribute has no effect" msgstr "\"%s\" атрыбут ігнарыруецца" -#: ada/gcc-interface/utils.c:6406 +#: ada/gcc-interface/utils.c:6411 #, fuzzy, gcc-internal-format msgid "attribute %qs applies to array types only" msgstr "\"%s\" атрыбут ігнарыруецца" @@ -34130,7 +34173,7 @@ msgstr "не магу знайсці крыніцу %s\n" #. an unprototyped function, it is compile-time undefined; #. making it a constraint in that case was rejected in #. DR#252. -#: c/c-convert.c:101 c/c-typeck.c:2175 c/c-typeck.c:6507 c/c-typeck.c:12138 +#: c/c-convert.c:101 c/c-typeck.c:2175 c/c-typeck.c:6512 c/c-typeck.c:12143 #: cp/typeck.c:2027 cp/typeck.c:7977 cp/typeck.c:8742 #, gcc-internal-format msgid "void value not ignored as it ought to be" @@ -34194,7 +34237,7 @@ msgstr "адмеціна `%D' вызначана, але не выкарысто msgid "type of array %q+D completed incompatibly with implicit initialization" msgstr "" -#: c/c-decl.c:1567 c/c-decl.c:6701 c/c-decl.c:7574 c/c-decl.c:8381 +#: c/c-decl.c:1567 c/c-decl.c:6721 c/c-decl.c:7594 c/c-decl.c:8401 #, gcc-internal-format msgid "originally defined here" msgstr "" @@ -34610,16 +34653,11 @@ 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:4548 c/c-decl.c:7147 +#: c/c-decl.c:4548 c/c-decl.c:7167 #, gcc-internal-format msgid "%<[*]%> not allowed in other than function prototype scope" msgstr "" -#: c/c-decl.c:4635 cp/decl2.c:1520 -#, gcc-internal-format -msgid "%q+D in declare target directive does not have mappable type" -msgstr "" - #: c/c-decl.c:4693 #, fuzzy, gcc-internal-format #| msgid "`%s' is usually a function" @@ -34647,7 +34685,7 @@ 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:4732 c/c-decl.c:4747 c/c-typeck.c:7630 +#: c/c-decl.c:4732 c/c-decl.c:4747 c/c-typeck.c:7635 #, gcc-internal-format msgid "variable-sized object may not be initialized" msgstr "" @@ -34709,207 +34747,212 @@ msgstr "" msgid "uninitialized const %qD is invalid in C++" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: c/c-decl.c:5268 +#: c/c-decl.c:5224 cp/decl.c:7318 +#, gcc-internal-format +msgid "%q+D in declare target directive does not have mappable type" +msgstr "" + +#: c/c-decl.c:5288 #, gcc-internal-format msgid "ISO C forbids forward parameter declarations" msgstr "" -#: c/c-decl.c:5371 +#: c/c-decl.c:5391 #, gcc-internal-format msgid "defining a type in a compound literal is invalid in C++" msgstr "" -#: c/c-decl.c:5425 c/c-decl.c:5440 +#: c/c-decl.c:5445 c/c-decl.c:5460 #, fuzzy, gcc-internal-format msgid "bit-field %qs width not an integer constant" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-decl.c:5435 +#: c/c-decl.c:5455 #, fuzzy, gcc-internal-format msgid "bit-field %qs width not an integer constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:5446 +#: c/c-decl.c:5466 #, gcc-internal-format msgid "negative width in bit-field %qs" msgstr "" -#: c/c-decl.c:5451 +#: c/c-decl.c:5471 #, gcc-internal-format msgid "zero width for bit-field %qs" msgstr "" -#: c/c-decl.c:5461 +#: c/c-decl.c:5481 #, fuzzy, gcc-internal-format #| msgid "bit-field `%s' has invalid type" msgid "bit-field %qs has invalid type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-decl.c:5467 +#: c/c-decl.c:5487 #, gcc-internal-format msgid "cannot declare bit-field %qs with % type" msgstr "" -#: c/c-decl.c:5478 +#: c/c-decl.c:5498 #, gcc-internal-format msgid "type of bit-field %qs is a GCC extension" msgstr "" -#: c/c-decl.c:5484 +#: c/c-decl.c:5504 #, gcc-internal-format msgid "width of %qs exceeds its type" msgstr "" -#: c/c-decl.c:5497 +#: c/c-decl.c:5517 #, gcc-internal-format msgid "%qs is narrower than values of its type" msgstr "" -#: c/c-decl.c:5512 +#: c/c-decl.c:5532 #, gcc-internal-format msgid "ISO C90 forbids array %qE whose size can%'t be evaluated" msgstr "" -#: c/c-decl.c:5515 +#: c/c-decl.c:5535 #, gcc-internal-format msgid "ISO C90 forbids array whose size can%'t be evaluated" msgstr "" -#: c/c-decl.c:5522 +#: c/c-decl.c:5542 #, fuzzy, gcc-internal-format msgid "ISO C90 forbids variable length array %qE" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-decl.c:5524 +#: c/c-decl.c:5544 #, fuzzy, gcc-internal-format msgid "ISO C90 forbids variable length array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-decl.c:5733 c/c-decl.c:6107 c/c-decl.c:6117 +#: c/c-decl.c:5753 c/c-decl.c:6127 c/c-decl.c:6137 #, gcc-internal-format msgid "variably modified %qE at file scope" msgstr "" -#: c/c-decl.c:5735 +#: c/c-decl.c:5755 #, gcc-internal-format msgid "variably modified field at file scope" msgstr "" -#: c/c-decl.c:5755 +#: c/c-decl.c:5775 #, gcc-internal-format msgid "type defaults to % in declaration of %qE" msgstr "" -#: c/c-decl.c:5759 +#: c/c-decl.c:5779 #, gcc-internal-format msgid "type defaults to % in type name" msgstr "" -#: c/c-decl.c:5791 +#: c/c-decl.c:5811 #, fuzzy, gcc-internal-format #| msgid "duplicate `const'" msgid "duplicate %" msgstr "паўтарэнне \"const\"" -#: c/c-decl.c:5793 +#: c/c-decl.c:5813 #, fuzzy, gcc-internal-format #| msgid "duplicate `restrict'" msgid "duplicate %" msgstr "паўтарэнне \"restrict\"" -#: c/c-decl.c:5795 +#: c/c-decl.c:5815 #, fuzzy, gcc-internal-format #| msgid "duplicate `volatile'" msgid "duplicate %" msgstr "паўтарэнне \"volatile\"" -#: c/c-decl.c:5797 +#: c/c-decl.c:5817 #, fuzzy, gcc-internal-format #| msgid "duplicate `restrict'" msgid "duplicate %<_Atomic%>" msgstr "паўтарэнне \"restrict\"" -#: c/c-decl.c:5800 +#: c/c-decl.c:5820 #, gcc-internal-format, gfc-internal-format msgid "conflicting named address spaces (%s vs %s)" msgstr "" -#: c/c-decl.c:5823 c/c-parser.c:2821 +#: c/c-decl.c:5843 c/c-parser.c:2821 #, gcc-internal-format msgid "%<_Atomic%>-qualified array type" msgstr "" -#: c/c-decl.c:5837 +#: c/c-decl.c:5857 #, gcc-internal-format msgid "function definition declared %" msgstr "" -#: c/c-decl.c:5839 +#: c/c-decl.c:5859 #, fuzzy, gcc-internal-format msgid "function definition declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: c/c-decl.c:5841 +#: c/c-decl.c:5861 #, gcc-internal-format msgid "function definition declared %" msgstr "" -#: c/c-decl.c:5843 +#: c/c-decl.c:5863 #, fuzzy, gcc-internal-format msgid "function definition declared %qs" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: c/c-decl.c:5861 +#: c/c-decl.c:5881 #, gcc-internal-format msgid "storage class specified for structure field %qE" msgstr "" -#: c/c-decl.c:5864 +#: c/c-decl.c:5884 #, gcc-internal-format msgid "storage class specified for structure field" msgstr "" -#: c/c-decl.c:5868 +#: c/c-decl.c:5888 #, gcc-internal-format msgid "storage class specified for parameter %qE" msgstr "" -#: c/c-decl.c:5871 +#: c/c-decl.c:5891 #, gcc-internal-format msgid "storage class specified for unnamed parameter" msgstr "" -#: c/c-decl.c:5874 cp/decl.c:10935 +#: c/c-decl.c:5894 cp/decl.c:10959 #, gcc-internal-format msgid "storage class specified for typename" msgstr "" -#: c/c-decl.c:5891 +#: c/c-decl.c:5911 #, gcc-internal-format msgid "%qE initialized and declared %" msgstr "" -#: c/c-decl.c:5895 +#: c/c-decl.c:5915 #, gcc-internal-format msgid "%qE has both % and initializer" msgstr "" -#: c/c-decl.c:5900 +#: c/c-decl.c:5920 #, gcc-internal-format msgid "file-scope declaration of %qE specifies %" msgstr "" -#: c/c-decl.c:5904 +#: c/c-decl.c:5924 #, gcc-internal-format msgid "file-scope declaration of %qE specifies %" msgstr "" -#: c/c-decl.c:5909 +#: c/c-decl.c:5929 #, gcc-internal-format msgid "nested function %qE declared %" msgstr "" -#: c/c-decl.c:5912 +#: c/c-decl.c:5932 #, gcc-internal-format msgid "function-scope %qE implicitly auto and declared %qs" msgstr "" @@ -34917,724 +34960,724 @@ 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:5959 c/c-decl.c:6328 +#: c/c-decl.c:5979 c/c-decl.c:6348 #, gcc-internal-format msgid "static or type qualifiers in non-parameter array declarator" msgstr "" -#: c/c-decl.c:6007 +#: c/c-decl.c:6027 #, gcc-internal-format msgid "declaration of %qE as array of voids" msgstr "" -#: c/c-decl.c:6009 +#: c/c-decl.c:6029 #, gcc-internal-format msgid "declaration of type name as array of voids" msgstr "" -#: c/c-decl.c:6016 +#: c/c-decl.c:6036 #, gcc-internal-format msgid "declaration of %qE as array of functions" msgstr "" -#: c/c-decl.c:6019 +#: c/c-decl.c:6039 #, gcc-internal-format msgid "declaration of type name as array of functions" msgstr "" -#: c/c-decl.c:6027 c/c-decl.c:8085 +#: c/c-decl.c:6047 c/c-decl.c:8105 #, fuzzy, gcc-internal-format msgid "invalid use of structure with flexible array member" msgstr "нявернае выкарыстанне \"restict\"" -#: c/c-decl.c:6053 +#: c/c-decl.c:6073 #, fuzzy, gcc-internal-format msgid "size of array %qE has non-integer type" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:6057 +#: c/c-decl.c:6077 #, fuzzy, gcc-internal-format msgid "size of unnamed array has non-integer type" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:6064 +#: c/c-decl.c:6084 #, fuzzy, gcc-internal-format msgid "size of array %qE has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:6067 +#: c/c-decl.c:6087 #, fuzzy, gcc-internal-format msgid "size of unnamed array has incomplete type" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:6078 +#: c/c-decl.c:6098 #, fuzzy, gcc-internal-format msgid "ISO C forbids zero-size array %qE" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-decl.c:6081 +#: c/c-decl.c:6101 #, fuzzy, gcc-internal-format msgid "ISO C forbids zero-size array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-decl.c:6090 +#: c/c-decl.c:6110 #, fuzzy, gcc-internal-format #| msgid "size of array is negative" msgid "size of array %qE is negative" msgstr "адмоўны памер масіва " -#: c/c-decl.c:6092 +#: c/c-decl.c:6112 #, fuzzy, gcc-internal-format #| msgid "size of array is negative" msgid "size of unnamed array is negative" msgstr "адмоўны памер масіва " -#: c/c-decl.c:6216 c/c-decl.c:6871 +#: c/c-decl.c:6236 c/c-decl.c:6891 #, 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:6238 +#: c/c-decl.c:6258 #, fuzzy, gcc-internal-format #| msgid "`%s' is not at beginning of declaration" msgid "%<[*]%> not in a declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: c/c-decl.c:6251 +#: c/c-decl.c:6271 #, fuzzy, gcc-internal-format msgid "array type has incomplete element type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:6257 +#: c/c-decl.c:6277 #, gcc-internal-format msgid "declaration of %qE as multidimensional array must have bounds for all dimensions except the first" msgstr "" -#: c/c-decl.c:6261 +#: c/c-decl.c:6281 #, gcc-internal-format msgid "declaration of multidimensional array must have bounds for all dimensions except the first" msgstr "" -#: c/c-decl.c:6364 +#: c/c-decl.c:6384 #, 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:6367 +#: c/c-decl.c:6387 #, gcc-internal-format msgid "type name declared as function returning a function" msgstr "" -#: c/c-decl.c:6374 +#: c/c-decl.c:6394 #, gcc-internal-format msgid "%qE declared as function returning an array" msgstr "" -#: c/c-decl.c:6377 +#: c/c-decl.c:6397 #, gcc-internal-format msgid "type name declared as function returning an array" msgstr "" -#: c/c-decl.c:6418 +#: c/c-decl.c:6438 #, 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:6421 cp/decl.c:11201 +#: c/c-decl.c:6441 cp/decl.c:11225 #, gcc-internal-format msgid "type qualifiers ignored on function return type" msgstr "" -#: c/c-decl.c:6459 c/c-decl.c:6668 c/c-decl.c:6721 c/c-decl.c:6805 -#: c/c-decl.c:6926 c/c-parser.c:2823 +#: c/c-decl.c:6479 c/c-decl.c:6688 c/c-decl.c:6741 c/c-decl.c:6825 +#: c/c-decl.c:6946 c/c-parser.c:2823 #, gcc-internal-format msgid "%<_Atomic%>-qualified function type" msgstr "" -#: c/c-decl.c:6465 c/c-decl.c:6674 c/c-decl.c:6810 c/c-decl.c:6931 +#: c/c-decl.c:6485 c/c-decl.c:6694 c/c-decl.c:6830 c/c-decl.c:6951 #, gcc-internal-format msgid "ISO C forbids qualified function types" msgstr "" -#: c/c-decl.c:6559 +#: c/c-decl.c:6579 #, gcc-internal-format msgid "%qs combined with % qualifier for %qE" msgstr "" -#: c/c-decl.c:6563 +#: c/c-decl.c:6583 #, gcc-internal-format msgid "%qs combined with % qualifier for %qE" msgstr "" -#: c/c-decl.c:6569 +#: c/c-decl.c:6589 #, gcc-internal-format msgid "%qs specified for auto variable %qE" msgstr "" -#: c/c-decl.c:6585 +#: c/c-decl.c:6605 #, gcc-internal-format msgid "%qs specified for parameter %qE" msgstr "" -#: c/c-decl.c:6588 +#: c/c-decl.c:6608 #, gcc-internal-format msgid "%qs specified for unnamed parameter" msgstr "" -#: c/c-decl.c:6594 +#: c/c-decl.c:6614 #, gcc-internal-format msgid "%qs specified for structure field %qE" msgstr "" -#: c/c-decl.c:6597 +#: c/c-decl.c:6617 #, gcc-internal-format msgid "%qs specified for structure field" msgstr "" -#: c/c-decl.c:6612 +#: c/c-decl.c:6632 #, fuzzy, gcc-internal-format #| msgid "bit-field `%s' has invalid type" msgid "bit-field %qE has atomic type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-decl.c:6614 +#: c/c-decl.c:6634 #, fuzzy, gcc-internal-format #| msgid "bit-field `%s' has invalid type" msgid "bit-field has atomic type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: c/c-decl.c:6623 +#: c/c-decl.c:6643 #, gcc-internal-format msgid "alignment specified for typedef %qE" msgstr "" -#: c/c-decl.c:6625 +#: c/c-decl.c:6645 #, gcc-internal-format msgid "alignment specified for % object %qE" msgstr "" -#: c/c-decl.c:6630 +#: c/c-decl.c:6650 #, gcc-internal-format msgid "alignment specified for parameter %qE" msgstr "" -#: c/c-decl.c:6632 +#: c/c-decl.c:6652 #, gcc-internal-format msgid "alignment specified for unnamed parameter" msgstr "" -#: c/c-decl.c:6637 +#: c/c-decl.c:6657 #, gcc-internal-format msgid "alignment specified for bit-field %qE" msgstr "" -#: c/c-decl.c:6639 +#: c/c-decl.c:6659 #, gcc-internal-format msgid "alignment specified for unnamed bit-field" msgstr "" -#: c/c-decl.c:6642 +#: c/c-decl.c:6662 #, fuzzy, gcc-internal-format msgid "alignment specified for function %qE" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: c/c-decl.c:6649 +#: c/c-decl.c:6669 #, gcc-internal-format msgid "%<_Alignas%> specifiers cannot reduce alignment of %qE" msgstr "" -#: c/c-decl.c:6652 +#: c/c-decl.c:6672 #, gcc-internal-format msgid "%<_Alignas%> specifiers cannot reduce alignment of unnamed field" msgstr "" -#: c/c-decl.c:6683 +#: c/c-decl.c:6703 #, gcc-internal-format msgid "typedef %q+D declared %" msgstr "" -#: c/c-decl.c:6685 +#: c/c-decl.c:6705 #, gcc-internal-format msgid "typedef %q+D declared %<_Noreturn%>" msgstr "" -#: c/c-decl.c:6727 +#: c/c-decl.c:6747 #, gcc-internal-format msgid "ISO C forbids const or volatile function types" msgstr "" #. C99 6.7.2.1p8 -#: c/c-decl.c:6738 +#: c/c-decl.c:6758 #, gcc-internal-format msgid "a member of a structure or union cannot have a variably modified type" msgstr "" -#: c/c-decl.c:6755 cp/decl.c:9989 +#: c/c-decl.c:6775 cp/decl.c:10010 #, fuzzy, gcc-internal-format msgid "variable or field %qE declared void" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:6795 +#: c/c-decl.c:6815 #, gcc-internal-format msgid "attributes in parameter array declarator ignored" msgstr "" -#: c/c-decl.c:6837 +#: c/c-decl.c:6857 #, fuzzy, gcc-internal-format msgid "parameter %q+D declared %" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:6839 +#: c/c-decl.c:6859 #, fuzzy, gcc-internal-format msgid "parameter %q+D declared %<_Noreturn%>" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:6852 +#: c/c-decl.c:6872 #, fuzzy, gcc-internal-format msgid "field %qE declared as a function" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:6859 +#: c/c-decl.c:6879 #, fuzzy, gcc-internal-format msgid "field %qE has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:6861 +#: c/c-decl.c:6881 #, fuzzy, gcc-internal-format msgid "unnamed field has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:6897 c/c-decl.c:6908 c/c-decl.c:6911 +#: c/c-decl.c:6917 c/c-decl.c:6928 c/c-decl.c:6931 #, fuzzy, gcc-internal-format msgid "invalid storage class for function %qE" msgstr "Нерэчаісны выбар \"%s\"" -#: c/c-decl.c:6968 +#: c/c-decl.c:6988 #, fuzzy, gcc-internal-format msgid "cannot inline function %" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: c/c-decl.c:6970 +#: c/c-decl.c:6990 #, gcc-internal-format msgid "% declared %<_Noreturn%>" msgstr "" -#: c/c-decl.c:6981 +#: c/c-decl.c:7001 #, 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:6984 +#: c/c-decl.c:7004 #, 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:7013 +#: c/c-decl.c:7033 #, gcc-internal-format msgid "variable previously declared % redeclared %" msgstr "" -#: c/c-decl.c:7023 +#: c/c-decl.c:7043 #, gcc-internal-format msgid "variable %q+D declared %" msgstr "" -#: c/c-decl.c:7025 +#: c/c-decl.c:7045 #, gcc-internal-format msgid "variable %q+D declared %<_Noreturn%>" msgstr "" -#: c/c-decl.c:7060 +#: c/c-decl.c:7080 #, gcc-internal-format msgid "non-nested function with variably modified type" msgstr "" -#: c/c-decl.c:7062 +#: c/c-decl.c:7082 #, gcc-internal-format msgid "object with variably modified type must have no linkage" msgstr "" -#: c/c-decl.c:7153 c/c-decl.c:8821 +#: c/c-decl.c:7173 c/c-decl.c:8841 #, gcc-internal-format msgid "function declaration isn%'t a prototype" msgstr "" -#: c/c-decl.c:7163 +#: c/c-decl.c:7183 #, gcc-internal-format msgid "parameter names (without types) in function declaration" msgstr "" -#: c/c-decl.c:7201 +#: c/c-decl.c:7221 #, fuzzy, gcc-internal-format msgid "parameter %u (%q+D) has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:7205 +#: c/c-decl.c:7225 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "parameter %u has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:7216 +#: c/c-decl.c:7236 #, fuzzy, gcc-internal-format msgid "parameter %u (%q+D) has void type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:7220 +#: c/c-decl.c:7240 #, fuzzy, gcc-internal-format, gfc-internal-format msgid "parameter %u has void type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:7294 +#: c/c-decl.c:7314 #, gcc-internal-format msgid "% as only parameter may not be qualified" msgstr "" -#: c/c-decl.c:7298 c/c-decl.c:7334 +#: c/c-decl.c:7318 c/c-decl.c:7354 #, fuzzy, gcc-internal-format msgid "% must be the only parameter" msgstr "нявернае выкарыстанне \"restict\"" -#: c/c-decl.c:7328 +#: c/c-decl.c:7348 #, gcc-internal-format msgid "parameter %q+D has just a forward declaration" msgstr "" -#: c/c-decl.c:7374 +#: c/c-decl.c:7394 #, 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:7380 +#: c/c-decl.c:7400 #, 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:7482 +#: c/c-decl.c:7502 #, gcc-internal-format msgid "enum type defined here" msgstr "" -#: c/c-decl.c:7488 +#: c/c-decl.c:7508 #, fuzzy, gcc-internal-format #| msgid "previous definition here" msgid "struct defined here" msgstr "папярэдняе вызначэньне" -#: c/c-decl.c:7494 +#: c/c-decl.c:7514 #, fuzzy, gcc-internal-format #| msgid "previous definition here" msgid "union defined here" msgstr "папярэдняе вызначэньне" -#: c/c-decl.c:7570 +#: c/c-decl.c:7590 #, fuzzy, gcc-internal-format msgid "redefinition of %" msgstr "перанакіраванне stdout: %s" -#: c/c-decl.c:7572 +#: c/c-decl.c:7592 #, fuzzy, gcc-internal-format msgid "redefinition of %" msgstr "перанакіраванне stdout: %s" -#: c/c-decl.c:7581 +#: c/c-decl.c:7601 #, fuzzy, gcc-internal-format msgid "nested redefinition of %" msgstr "перанакіраванне stdout: %s" -#: c/c-decl.c:7583 +#: c/c-decl.c:7603 #, fuzzy, gcc-internal-format msgid "nested redefinition of %" msgstr "перанакіраванне stdout: %s" -#: c/c-decl.c:7613 c/c-decl.c:8400 +#: c/c-decl.c:7633 c/c-decl.c:8420 #, gcc-internal-format msgid "defining type in %qs expression is invalid in C++" msgstr "" -#: c/c-decl.c:7680 cp/decl.c:4802 +#: c/c-decl.c:7700 cp/decl.c:4802 #, gcc-internal-format msgid "declaration does not declare anything" msgstr "" -#: c/c-decl.c:7685 +#: c/c-decl.c:7705 #, 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:7688 +#: c/c-decl.c:7708 #, 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:7781 c/c-decl.c:7799 c/c-decl.c:7860 +#: c/c-decl.c:7801 c/c-decl.c:7819 c/c-decl.c:7880 #, fuzzy, gcc-internal-format msgid "duplicate member %q+D" msgstr "паўтарэнне \"%s\"" -#: c/c-decl.c:7886 +#: c/c-decl.c:7906 #, gcc-internal-format msgid "empty struct has size 0 in C, size 1 in C++" msgstr "" -#: c/c-decl.c:7889 +#: c/c-decl.c:7909 #, gcc-internal-format msgid "empty union has size 0 in C, size 1 in C++" msgstr "" -#: c/c-decl.c:7994 +#: c/c-decl.c:8014 #, gcc-internal-format msgid "union has no named members" msgstr "" -#: c/c-decl.c:7996 +#: c/c-decl.c:8016 #, gcc-internal-format msgid "union has no members" msgstr "" -#: c/c-decl.c:8001 +#: c/c-decl.c:8021 #, gcc-internal-format msgid "struct has no named members" msgstr "" -#: c/c-decl.c:8003 +#: c/c-decl.c:8023 #, gcc-internal-format msgid "struct has no members" msgstr "" -#: c/c-decl.c:8064 cp/decl.c:12069 +#: c/c-decl.c:8084 cp/decl.c:12093 #, gcc-internal-format msgid "flexible array member in union" msgstr "" -#: c/c-decl.c:8070 +#: c/c-decl.c:8090 #, gcc-internal-format msgid "flexible array member not at end of struct" msgstr "" -#: c/c-decl.c:8076 +#: c/c-decl.c:8096 #, gcc-internal-format msgid "flexible array member in a struct with no named members" msgstr "" -#: c/c-decl.c:8107 +#: c/c-decl.c:8127 #, fuzzy, gcc-internal-format #| msgid "%s is too large" msgid "type %qT is too large" msgstr "%s - вельмі вялікі" -#: c/c-decl.c:8230 +#: c/c-decl.c:8250 #, gcc-internal-format msgid "union cannot be made transparent" msgstr "" -#: c/c-decl.c:8372 +#: c/c-decl.c:8392 #, 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:8379 +#: c/c-decl.c:8399 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "redeclaration of %" msgstr "абвяшчэньне `%#D'" -#: c/c-decl.c:8458 cp/decl.c:14423 +#: c/c-decl.c:8478 cp/decl.c:14447 #, gcc-internal-format msgid "specified mode too small for enumeral values" msgstr "" -#: c/c-decl.c:8473 +#: c/c-decl.c:8493 #, gcc-internal-format msgid "enumeration values exceed range of largest integer" msgstr "" -#: c/c-decl.c:8587 c/c-decl.c:8603 +#: c/c-decl.c:8607 c/c-decl.c:8623 #, fuzzy, gcc-internal-format msgid "enumerator value for %qE is not an integer constant" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:8598 +#: c/c-decl.c:8618 #, fuzzy, gcc-internal-format msgid "enumerator value for %qE is not an integer constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-decl.c:8622 +#: c/c-decl.c:8642 #, gcc-internal-format msgid "overflow in enumeration values" msgstr "" -#: c/c-decl.c:8630 +#: c/c-decl.c:8650 #, gcc-internal-format msgid "ISO C restricts enumerator values to range of %" msgstr "" -#: c/c-decl.c:8715 cp/decl.c:5104 cp/decl.c:14955 +#: c/c-decl.c:8735 cp/decl.c:5104 cp/decl.c:14979 #, fuzzy, gcc-internal-format msgid "inline function %qD given attribute noinline" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c/c-decl.c:8733 +#: c/c-decl.c:8753 #, gcc-internal-format msgid "return type is an incomplete type" msgstr "" -#: c/c-decl.c:8744 +#: c/c-decl.c:8764 #, fuzzy, gcc-internal-format #| msgid "return type of `%s' is not `int'" msgid "return type defaults to %" msgstr "вяртаемы тып \"%s\" не \"int\"" -#: c/c-decl.c:8771 +#: c/c-decl.c:8791 #, gcc-internal-format msgid "%q+D defined as variadic function without prototype" msgstr "" -#: c/c-decl.c:8830 +#: c/c-decl.c:8850 #, fuzzy, gcc-internal-format #| msgid "no previous prototype for `%s'" msgid "no previous prototype for %qD" msgstr "няма папярэдняга прататыпа для \"%s\"" -#: c/c-decl.c:8839 +#: c/c-decl.c:8859 #, fuzzy, gcc-internal-format msgid "%qD was used with no prototype before its definition" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:8847 cp/decl.c:15090 +#: c/c-decl.c:8867 cp/decl.c:15114 #, fuzzy, gcc-internal-format #| msgid "no previous declaration for `%s'" msgid "no previous declaration for %qD" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: c/c-decl.c:8857 +#: c/c-decl.c:8877 #, fuzzy, gcc-internal-format msgid "%qD was used with no declaration before its definition" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: c/c-decl.c:8876 +#: c/c-decl.c:8896 #, 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:8878 +#: c/c-decl.c:8898 #, gcc-internal-format msgid "%<_Atomic%>-qualified return type of %qD" msgstr "" -#: c/c-decl.c:8885 +#: c/c-decl.c:8905 #, fuzzy, gcc-internal-format #| msgid "`%s' is usually a function" msgid "%qD is normally a non-static function" msgstr "`%s' - звычайна функцыя" -#: c/c-decl.c:8922 +#: c/c-decl.c:8942 #, gcc-internal-format msgid "old-style parameter declarations in prototyped function definition" msgstr "" -#: c/c-decl.c:8937 +#: c/c-decl.c:8957 #, gcc-internal-format msgid "traditional C rejects ISO C style function definitions" msgstr "" -#: c/c-decl.c:8953 +#: c/c-decl.c:8973 #, gcc-internal-format msgid "parameter name omitted" msgstr "" -#: c/c-decl.c:8990 +#: c/c-decl.c:9010 #, gcc-internal-format msgid "old-style function definition" msgstr "" -#: c/c-decl.c:8999 +#: c/c-decl.c:9019 #, gcc-internal-format msgid "parameter name missing from parameter list" msgstr "" -#: c/c-decl.c:9015 +#: c/c-decl.c:9035 #, gcc-internal-format msgid "%qD declared as a non-parameter" msgstr "" -#: c/c-decl.c:9023 +#: c/c-decl.c:9043 #, fuzzy, gcc-internal-format msgid "multiple parameters named %qD" msgstr "невыкарыстаемы параметр \"%s\"" -#: c/c-decl.c:9032 +#: c/c-decl.c:9052 #, fuzzy, gcc-internal-format msgid "parameter %qD declared with void type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: c/c-decl.c:9061 c/c-decl.c:9066 +#: c/c-decl.c:9081 c/c-decl.c:9086 #, gcc-internal-format msgid "type of %qD defaults to %" msgstr "" -#: c/c-decl.c:9086 +#: c/c-decl.c:9106 #, fuzzy, gcc-internal-format msgid "parameter %qD has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-decl.c:9093 +#: c/c-decl.c:9113 #, gcc-internal-format msgid "declaration for parameter %qD but no such parameter" msgstr "" -#: c/c-decl.c:9146 +#: c/c-decl.c:9166 #, gcc-internal-format msgid "number of arguments doesn%'t match built-in prototype" msgstr "" -#: c/c-decl.c:9157 +#: c/c-decl.c:9177 #, 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:9160 c/c-decl.c:9207 c/c-decl.c:9221 +#: c/c-decl.c:9180 c/c-decl.c:9227 c/c-decl.c:9241 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "prototype declaration" msgstr "пустое абвяшчэньне" -#: c/c-decl.c:9199 +#: c/c-decl.c:9219 #, gcc-internal-format msgid "promoted argument %qD doesn%'t match built-in prototype" msgstr "" -#: c/c-decl.c:9204 +#: c/c-decl.c:9224 #, gcc-internal-format msgid "promoted argument %qD doesn%'t match prototype" msgstr "" -#: c/c-decl.c:9214 +#: c/c-decl.c:9234 #, gcc-internal-format msgid "argument %qD doesn%'t match built-in prototype" msgstr "" -#: c/c-decl.c:9219 +#: c/c-decl.c:9239 #, gcc-internal-format msgid "argument %qD doesn%'t match prototype" msgstr "" -#: c/c-decl.c:9470 cp/decl.c:15873 +#: c/c-decl.c:9490 cp/decl.c:15897 #, gcc-internal-format msgid "no return statement in function returning non-void" msgstr "" -#: c/c-decl.c:9490 cp/decl.c:15905 +#: c/c-decl.c:9510 cp/decl.c:15929 #, fuzzy, gcc-internal-format #| msgid "label `%D' defined but not used" msgid "parameter %qD set but not used" @@ -35643,262 +35686,262 @@ 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:9586 +#: c/c-decl.c:9606 #, gcc-internal-format msgid "% loop initial declarations are only allowed in C99 or C11 mode" msgstr "" -#: c/c-decl.c:9591 +#: c/c-decl.c:9611 #, gcc-internal-format msgid "use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code" msgstr "" -#: c/c-decl.c:9626 +#: c/c-decl.c:9646 #, gcc-internal-format msgid "declaration of static variable %qD in % loop initial declaration" msgstr "" -#: c/c-decl.c:9630 +#: c/c-decl.c:9650 #, gcc-internal-format msgid "declaration of % variable %qD in % loop initial declaration" msgstr "" -#: c/c-decl.c:9637 +#: c/c-decl.c:9657 #, gcc-internal-format msgid "% declared in % loop initial declaration" msgstr "" -#: c/c-decl.c:9642 +#: c/c-decl.c:9662 #, gcc-internal-format msgid "% declared in % loop initial declaration" msgstr "" -#: c/c-decl.c:9646 +#: c/c-decl.c:9666 #, gcc-internal-format msgid "% declared in % loop initial declaration" msgstr "" -#: c/c-decl.c:9650 +#: c/c-decl.c:9670 #, gcc-internal-format msgid "declaration of non-variable %qD in % loop initial declaration" msgstr "" -#: c/c-decl.c:9900 +#: c/c-decl.c:9920 #, gcc-internal-format msgid "incompatible address space qualifiers %qs and %qs" msgstr "" -#: c/c-decl.c:9958 c/c-decl.c:9965 +#: c/c-decl.c:9978 c/c-decl.c:9985 #, fuzzy, gcc-internal-format #| msgid "duplicate label declaration `%s'" msgid "duplicate %qE declaration specifier" msgstr "паўторнае абвяшчэньне адмеціны `%s'" -#: c/c-decl.c:9992 c/c-decl.c:10376 c/c-decl.c:10766 +#: c/c-decl.c:10012 c/c-decl.c:10396 c/c-decl.c:10786 #, gcc-internal-format msgid "two or more data types in declaration specifiers" msgstr "" -#: c/c-decl.c:10004 cp/parser.c:28261 +#: c/c-decl.c:10024 cp/parser.c:28258 #, 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:10017 +#: c/c-decl.c:10037 #, 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:10246 c/c-parser.c:8848 +#: c/c-decl.c:10266 c/c-parser.c:8848 #, 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:10292 +#: c/c-decl.c:10312 #, 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:10363 c/c-decl.c:10923 +#: c/c-decl.c:10383 c/c-decl.c:10943 #, fuzzy, gcc-internal-format #| msgid "duplicate `%s'" msgid "duplicate %qE" msgstr "паўтарэньне `%s'" -#: c/c-decl.c:10419 +#: c/c-decl.c:10439 #, 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:10441 +#: c/c-decl.c:10461 #, fuzzy, gcc-internal-format msgid "%<__int%d%> is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: c/c-decl.c:10484 +#: c/c-decl.c:10504 #, 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:10603 +#: c/c-decl.c:10623 #, 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:10653 +#: c/c-decl.c:10673 #, fuzzy, gcc-internal-format msgid "%<_Float%d%s%> is not supported on this target" msgstr "__buitin_saveregs не падтрымліваецца гэтай мэтай" -#: c/c-decl.c:10724 +#: c/c-decl.c:10744 #, fuzzy, gcc-internal-format #| msgid "ISO C89 does not support `long long'" msgid "ISO C does not support decimal floating point" msgstr "ISO C89 не падтрымлівае `long long'" -#: c/c-decl.c:10747 c/c-decl.c:11013 c/c-parser.c:7842 +#: c/c-decl.c:10767 c/c-decl.c:11033 c/c-parser.c:7842 #, fuzzy, gcc-internal-format msgid "fixed-point types not supported for this target" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: c/c-decl.c:10749 +#: c/c-decl.c:10769 #, 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:10784 +#: c/c-decl.c:10804 #, gcc-internal-format msgid "C++ lookup of %qD would return a field, not a type" msgstr "" -#: c/c-decl.c:10797 +#: c/c-decl.c:10817 #, gcc-internal-format msgid "%qE fails to be a typedef or built in type" msgstr "" -#: c/c-decl.c:10845 +#: c/c-decl.c:10865 #, 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:10866 +#: c/c-decl.c:10886 #, gcc-internal-format msgid "%qE used with %" msgstr "" -#: c/c-decl.c:10868 +#: c/c-decl.c:10888 #, gcc-internal-format msgid "%qE used with %" msgstr "" -#: c/c-decl.c:10870 +#: c/c-decl.c:10890 #, gcc-internal-format msgid "%qE used with %" msgstr "" -#: c/c-decl.c:10884 c/c-parser.c:7360 +#: c/c-decl.c:10904 c/c-parser.c:7360 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "ISO C99 does not support %qE" msgstr "%s не падтрымлівае %s" -#: c/c-decl.c:10887 c/c-parser.c:7363 +#: c/c-decl.c:10907 c/c-parser.c:7363 #, fuzzy, gcc-internal-format #| msgid "%s does not support %s" msgid "ISO C90 does not support %qE" msgstr "%s не падтрымлівае %s" -#: c/c-decl.c:10899 +#: c/c-decl.c:10919 #, gcc-internal-format msgid "%<__thread%> before %" msgstr "" -#: c/c-decl.c:10908 +#: c/c-decl.c:10928 #, gcc-internal-format msgid "%<__thread%> before %" msgstr "" -#: c/c-decl.c:10921 +#: c/c-decl.c:10941 #, gcc-internal-format msgid "duplicate %<_Thread_local%> or %<__thread%>" msgstr "" -#: c/c-decl.c:10929 +#: c/c-decl.c:10949 #, gcc-internal-format msgid "multiple storage classes in declaration specifiers" msgstr "" -#: c/c-decl.c:10937 +#: c/c-decl.c:10957 #, gcc-internal-format msgid "%qs used with %qE" msgstr "" -#: c/c-decl.c:11010 +#: c/c-decl.c:11030 #, gcc-internal-format msgid "%<_Sat%> is used without %<_Fract%> or %<_Accum%>" msgstr "" -#: c/c-decl.c:11025 +#: c/c-decl.c:11045 #, 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:11076 c/c-decl.c:11092 c/c-decl.c:11118 +#: c/c-decl.c:11096 c/c-decl.c:11112 c/c-decl.c:11138 #, gcc-internal-format msgid "ISO C does not support complex integer types" msgstr "ISO C не падтрымлівае комлексныя цэлалікавыя тыпы" -#: c/c-decl.c:11514 cp/semantics.c:5348 +#: c/c-decl.c:11534 cp/semantics.c:5351 #, gcc-internal-format msgid "%<#pragma omp declare reduction%> combiner refers to variable %qD which is not % nor %" msgstr "" -#: c/c-decl.c:11518 cp/semantics.c:5352 +#: c/c-decl.c:11538 cp/semantics.c:5355 #, gcc-internal-format msgid "%<#pragma omp declare reduction%> initializer refers to variable %qD which is not % nor %" msgstr "" -#: c/c-fold.c:385 c/c-typeck.c:11426 cp/typeck.c:4680 +#: c/c-fold.c:385 c/c-typeck.c:11431 cp/typeck.c:4680 #, gcc-internal-format msgid "left shift of negative value" msgstr "" -#: c/c-fold.c:395 c/c-typeck.c:11435 cp/typeck.c:4688 +#: c/c-fold.c:395 c/c-typeck.c:11440 cp/typeck.c:4688 #, gcc-internal-format msgid "left shift count is negative" msgstr "" -#: c/c-fold.c:396 c/c-typeck.c:11365 cp/typeck.c:4633 +#: c/c-fold.c:396 c/c-typeck.c:11370 cp/typeck.c:4633 #, gcc-internal-format msgid "right shift count is negative" msgstr "" -#: c/c-fold.c:404 c/c-typeck.c:11454 cp/typeck.c:4696 +#: c/c-fold.c:404 c/c-typeck.c:11459 cp/typeck.c:4696 #, gcc-internal-format msgid "left shift count >= width of type" msgstr "" -#: c/c-fold.c:405 c/c-typeck.c:11389 cp/typeck.c:4641 +#: c/c-fold.c:405 c/c-typeck.c:11394 cp/typeck.c:4641 #, gcc-internal-format msgid "right shift count >= width of type" msgstr "" -#: c/c-fold.c:412 c/c-typeck.c:11446 +#: c/c-fold.c:412 c/c-typeck.c:11451 #, gcc-internal-format msgid "left shift count >= width of vector element" msgstr "" -#: c/c-fold.c:413 c/c-typeck.c:11376 +#: c/c-fold.c:413 c/c-typeck.c:11381 #, gcc-internal-format msgid "right shift count >= width of vector element" msgstr "" @@ -35918,7 +35961,7 @@ msgstr "" msgid "to match this %qs" msgstr "" -#: c/c-parser.c:1216 cp/parser.c:28484 +#: c/c-parser.c:1216 cp/parser.c:28481 #, gcc-internal-format msgid "expected end of line" msgstr "" @@ -35961,7 +36004,7 @@ msgid "unknown type name %qE" msgstr "невядомая назва рэгістра: %s" #: c/c-parser.c:1848 c/c-parser.c:11129 c/c-parser.c:16147 c/c-parser.c:16585 -#: c/c-parser.c:17061 cp/parser.c:36007 cp/parser.c:38993 +#: c/c-parser.c:17061 cp/parser.c:36004 cp/parser.c:38990 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "expected declaration specifiers" @@ -35978,7 +36021,7 @@ msgstr "пустое абвяшчэньне" msgid "expected %<;%>, identifier or %<(%>" msgstr "" -#: c/c-parser.c:1906 cp/parser.c:30161 cp/parser.c:30235 +#: c/c-parser.c:1906 cp/parser.c:30158 cp/parser.c:30232 #, fuzzy, gcc-internal-format msgid "prefix attributes are ignored for methods" msgstr "\"%s\" атрыбут ігнарыруецца" @@ -36033,7 +36076,7 @@ msgstr "" msgid "%<__auto_type%> may only be used with a single declarator" msgstr "" -#: c/c-parser.c:2220 cp/parser.c:13002 cp/parser.c:13159 +#: c/c-parser.c:2220 cp/parser.c:12999 cp/parser.c:13156 #, gcc-internal-format msgid "expected %<,%> or %<;%>" msgstr "" @@ -36063,7 +36106,7 @@ msgstr "ISO C89 не падтрымлівае комлексныя тыпы" msgid "ISO C90 does not support %<_Static_assert%>" msgstr "ISO C89 не падтрымлівае комлексныя тыпы" -#: c/c-parser.c:2448 c/c-parser.c:4160 c/c-parser.c:11187 cp/parser.c:38634 +#: c/c-parser.c:2448 c/c-parser.c:4160 c/c-parser.c:11187 cp/parser.c:38631 #, gcc-internal-format msgid "expected string literal" msgstr "" @@ -36129,13 +36172,13 @@ msgstr "параметр \"%s\" ініцыялізаваны" #: c/c-parser.c:10745 c/c-parser.c:10798 c/c-parser.c:10814 c/c-parser.c:10860 #: c/c-parser.c:11496 c/c-parser.c:11537 c/c-parser.c:13445 c/c-parser.c:13681 #: c/c-parser.c:15544 c/c-parser.c:18218 c/gimple-parser.c:1058 -#: c/gimple-parser.c:1096 cp/parser.c:28487 cp/parser.c:31013 -#: cp/parser.c:31043 cp/parser.c:31113 cp/parser.c:33230 cp/parser.c:38350 +#: c/gimple-parser.c:1096 cp/parser.c:28484 cp/parser.c:31010 +#: cp/parser.c:31040 cp/parser.c:31110 cp/parser.c:33227 cp/parser.c:38347 #, gcc-internal-format msgid "expected identifier" msgstr "" -#: c/c-parser.c:2995 cp/parser.c:18384 +#: c/c-parser.c:2995 cp/parser.c:18381 #, gcc-internal-format msgid "comma at end of enumerator list" msgstr "" @@ -36307,13 +36350,13 @@ msgstr "" msgid "expected statement" msgstr "" -#: c/c-parser.c:5639 cp/parser.c:12516 +#: c/c-parser.c:5639 cp/parser.c:12513 #, 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:5681 cp/parser.c:12519 +#: c/c-parser.c:5681 cp/parser.c:12516 #, fuzzy, gcc-internal-format #| msgid "empty body in an else-statement" msgid "suggest braces around empty body in an % statement" @@ -36657,7 +36700,7 @@ msgstr "" msgid "%<__builtin_complex%> operands of different types" msgstr "" -#: c/c-parser.c:8891 cp/parser.c:6918 +#: c/c-parser.c:8891 cp/parser.c:6921 #, fuzzy, gcc-internal-format #| msgid "wrong number of arguments specified for `%s' attribute" msgid "wrong number of arguments to %<__builtin_shuffle%>" @@ -36719,77 +36762,77 @@ msgstr "" msgid "no type or storage class may be specified here," msgstr "" -#: c/c-parser.c:10661 c/c-parser.c:10718 cp/parser.c:31073 +#: c/c-parser.c:10661 c/c-parser.c:10718 cp/parser.c:31070 #, gcc-internal-format msgid "unknown property attribute" msgstr "" -#: c/c-parser.c:10682 cp/parser.c:31033 +#: c/c-parser.c:10682 cp/parser.c:31030 #, gcc-internal-format msgid "missing %<=%> (after % attribute)" msgstr "" -#: c/c-parser.c:10685 cp/parser.c:31036 +#: c/c-parser.c:10685 cp/parser.c:31033 #, gcc-internal-format msgid "missing %<=%> (after % attribute)" msgstr "" -#: c/c-parser.c:10699 cp/parser.c:31051 +#: c/c-parser.c:10699 cp/parser.c:31048 #, gcc-internal-format msgid "the % attribute may only be specified once" msgstr "" -#: c/c-parser.c:10704 cp/parser.c:31057 +#: c/c-parser.c:10704 cp/parser.c:31054 #, gcc-internal-format msgid "setter name must terminate with %<:%>" msgstr "" -#: c/c-parser.c:10711 cp/parser.c:31065 +#: c/c-parser.c:10711 cp/parser.c:31062 #, gcc-internal-format msgid "the % attribute may only be specified once" msgstr "" -#: c/c-parser.c:10905 cp/parser.c:38674 +#: c/c-parser.c:10905 cp/parser.c:38671 #, 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:10949 c/c-parser.c:16582 c/c-parser.c:16840 c/c-parser.c:16899 -#: c/c-parser.c:16983 cp/parser.c:36004 cp/parser.c:36298 cp/parser.c:36386 -#: cp/parser.c:36457 cp/parser.c:38721 cp/parser.c:38736 cp/parser.c:38752 -#: cp/parser.c:38768 cp/parser.c:38784 cp/parser.c:38811 cp/parser.c:38824 -#: cp/parser.c:38847 cp/parser.c:38860 +#: c/c-parser.c:16983 cp/parser.c:36001 cp/parser.c:36295 cp/parser.c:36383 +#: cp/parser.c:36454 cp/parser.c:38718 cp/parser.c:38733 cp/parser.c:38749 +#: cp/parser.c:38765 cp/parser.c:38781 cp/parser.c:38808 cp/parser.c:38821 +#: cp/parser.c:38844 cp/parser.c:38857 #, gcc-internal-format msgid "%<#pragma %s%> may only be used in compound statements" msgstr "" -#: c/c-parser.c:10972 cp/parser.c:38837 +#: c/c-parser.c:10972 cp/parser.c:38834 #, gcc-internal-format msgid "%<#pragma acc routine%> must be at file scope" msgstr "" -#: c/c-parser.c:11050 cp/parser.c:38918 +#: c/c-parser.c:11050 cp/parser.c:38915 #, gcc-internal-format msgid "%<#pragma omp section%> may only be used in %<#pragma omp sections%> construct" msgstr "" -#: c/c-parser.c:11074 c/c-parser.c:11098 cp/parser.c:38947 cp/parser.c:38980 +#: c/c-parser.c:11074 c/c-parser.c:11098 cp/parser.c:38944 cp/parser.c:38977 #, gcc-internal-format msgid "for, while or do statement expected" msgstr "" -#: c/c-parser.c:11111 cp/parser.c:38711 +#: c/c-parser.c:11111 cp/parser.c:38708 #, gcc-internal-format msgid "%<#pragma GCC pch_preprocess%> must be first" msgstr "" -#: c/c-parser.c:11421 cp/parser.c:31457 +#: c/c-parser.c:11421 cp/parser.c:31454 #, fuzzy, gcc-internal-format #| msgid "too many input files" msgid "too many %qs clauses" msgstr "вельмі шмат уваходзячых файлаў" -#: c/c-parser.c:11443 cp/parser.c:31994 +#: c/c-parser.c:11443 cp/parser.c:31991 #, gcc-internal-format msgid "expected integer expression before ')'" msgstr "" @@ -36804,54 +36847,54 @@ msgstr "" msgid "%qD is not a variable" msgstr "\"%s\" мае незавершаны тып" -#: c/c-parser.c:11746 cp/semantics.c:6808 +#: c/c-parser.c:11746 cp/semantics.c:6811 #, fuzzy, gcc-internal-format msgid "%qD is not a pointer variable" msgstr "\"%s\" звычайна функцыя" -#: c/c-parser.c:11788 cp/parser.c:32073 +#: c/c-parser.c:11788 cp/parser.c:32070 #, gcc-internal-format msgid "collapse argument needs positive constant integer expression" msgstr "" -#: c/c-parser.c:11865 cp/parser.c:32137 +#: c/c-parser.c:11865 cp/parser.c:32134 #, gcc-internal-format msgid "expected % or %" msgstr "" -#: c/c-parser.c:11867 cp/parser.c:32139 +#: c/c-parser.c:11867 cp/parser.c:32136 #, gcc-internal-format msgid "expected % or %" msgstr "" -#: c/c-parser.c:11968 cp/parser.c:32242 +#: c/c-parser.c:11968 cp/parser.c:32239 #, gcc-internal-format msgid "expected %, %, % or %" msgstr "" -#: c/c-parser.c:11988 c/c-parser.c:16892 c/c-parser.c:16976 cp/parser.c:32260 -#: cp/parser.c:36290 cp/parser.c:36378 +#: c/c-parser.c:11988 c/c-parser.c:16892 c/c-parser.c:16976 cp/parser.c:32257 +#: cp/parser.c:36287 cp/parser.c:36375 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:12035 cp/parser.c:32313 +#: c/c-parser.c:12035 cp/parser.c:32310 #, gcc-internal-format msgid "too many % clauses with %qs modifier" msgstr "" -#: c/c-parser.c:12042 cp/parser.c:32320 +#: c/c-parser.c:12042 cp/parser.c:32317 #, fuzzy, gcc-internal-format #| msgid "too many input files" msgid "too many % clauses" msgstr "вельмі шмат уваходзячых файлаў" -#: c/c-parser.c:12044 cp/parser.c:32322 +#: c/c-parser.c:12044 cp/parser.c:32319 #, gcc-internal-format msgid "too many % clauses without modifier" msgstr "" -#: c/c-parser.c:12050 cp/parser.c:32328 +#: c/c-parser.c:12050 cp/parser.c:32325 #, gcc-internal-format msgid "if any % clause has modifier, then all % clauses have to use modifier" msgstr "" @@ -36873,84 +36916,84 @@ msgstr "" msgid "% value must be positive" msgstr "" -#: c/c-parser.c:12229 cp/semantics.c:6992 +#: c/c-parser.c:12229 cp/semantics.c:6995 #, gcc-internal-format msgid "% value must be positive" msgstr "" -#: c/c-parser.c:12276 cp/semantics.c:7021 +#: c/c-parser.c:12276 cp/semantics.c:7024 #, gcc-internal-format msgid "% value must be non-negative" msgstr "" -#: c/c-parser.c:12341 c/c-parser.c:12347 cp/parser.c:32545 cp/parser.c:32552 +#: c/c-parser.c:12341 c/c-parser.c:12347 cp/parser.c:32542 cp/parser.c:32549 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:12355 c/c-parser.c:12361 cp/parser.c:32561 cp/parser.c:32568 +#: c/c-parser.c:12355 c/c-parser.c:12361 cp/parser.c:32558 cp/parser.c:32565 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:12425 cp/semantics.c:6299 +#: c/c-parser.c:12425 cp/semantics.c:6302 #, gcc-internal-format msgid "%qs expression must be integral" msgstr "" -#: c/c-parser.c:12437 c/c-parser.c:12560 cp/semantics.c:6331 +#: c/c-parser.c:12437 c/c-parser.c:12560 cp/semantics.c:6334 #, gcc-internal-format msgid "%qs value must be positive" msgstr "" -#: c/c-parser.c:12499 cp/parser.c:31853 +#: c/c-parser.c:12499 cp/parser.c:31850 #, fuzzy, gcc-internal-format #| msgid "too many arguments to function" msgid "too many % arguments" msgstr "вельмі шмат аргументаў у функцыі" -#: c/c-parser.c:12533 cp/parser.c:31886 +#: c/c-parser.c:12533 cp/parser.c:31883 #, fuzzy, gcc-internal-format #| msgid "no arguments" msgid "unexpected argument" msgstr "няма аргументаў" -#: c/c-parser.c:12699 cp/semantics.c:7120 +#: c/c-parser.c:12699 cp/semantics.c:7123 #, gcc-internal-format msgid "% argument needs positive integral constant" msgstr "" -#: c/c-parser.c:12765 cp/parser.c:32626 +#: c/c-parser.c:12765 cp/parser.c:32623 #, gcc-internal-format msgid "ordered argument needs positive constant integer expression" msgstr "" -#: c/c-parser.c:12857 c/c-parser.c:17625 cp/parser.c:37643 +#: c/c-parser.c:12857 c/c-parser.c:17625 cp/parser.c:37640 #, gcc-internal-format msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%> or identifier" msgstr "" -#: c/c-parser.c:12967 cp/parser.c:32840 +#: c/c-parser.c:12967 cp/parser.c:32837 #, gcc-internal-format msgid "both % and % modifiers specified" msgstr "" -#: c/c-parser.c:13021 cp/parser.c:32856 +#: c/c-parser.c:13021 cp/parser.c:32853 #, gcc-internal-format msgid "schedule % does not take a % parameter" msgstr "" -#: c/c-parser.c:13025 cp/parser.c:32859 +#: c/c-parser.c:13025 cp/parser.c:32856 #, gcc-internal-format msgid "schedule % does not take a % parameter" msgstr "" -#: c/c-parser.c:13037 cp/semantics.c:6389 +#: c/c-parser.c:13037 cp/semantics.c:6392 #, gcc-internal-format msgid "chunk size value must be positive" msgstr "" -#: c/c-parser.c:13060 cp/parser.c:32879 +#: c/c-parser.c:13060 cp/parser.c:32876 #, fuzzy, gcc-internal-format #| msgid "invalid %%-code" msgid "invalid schedule kind" @@ -36961,12 +37004,12 @@ msgstr "нерэчаісны %%-код" msgid "% value must be positive" msgstr "" -#: c/c-parser.c:13226 cp/semantics.c:6479 +#: c/c-parser.c:13226 cp/semantics.c:6482 #, gcc-internal-format msgid "% value must be positive" msgstr "" -#: c/c-parser.c:13271 cp/semantics.c:6589 +#: c/c-parser.c:13271 cp/semantics.c:6592 #, gcc-internal-format msgid "% clause alignment expression must be positive constant integer expression" msgstr "" @@ -36986,19 +37029,19 @@ msgstr "" msgid "% clause expression must be positive constant integer expression" msgstr "" -#: c/c-parser.c:13584 cp/parser.c:33374 cp/parser.c:33599 +#: c/c-parser.c:13584 cp/parser.c:33371 cp/parser.c:33596 #, fuzzy, gcc-internal-format #| msgid "invalid %%d operand" msgid "invalid depend kind" msgstr "нерэчаісны %%d аперанд" -#: c/c-parser.c:13669 cp/parser.c:33447 +#: c/c-parser.c:13669 cp/parser.c:33444 #, fuzzy, gcc-internal-format #| msgid "invalid mask" msgid "invalid map kind" msgstr "нерэчаісная маска" -#: c/c-parser.c:13767 cp/parser.c:33546 +#: c/c-parser.c:13767 cp/parser.c:33543 #, gcc-internal-format msgid "invalid dist_schedule kind" msgstr "" @@ -37008,68 +37051,68 @@ msgstr "" msgid "invalid proc_bind kind" msgstr "Нерэчаісны выбар %s" -#: c/c-parser.c:14059 cp/parser.c:33825 +#: c/c-parser.c:14059 cp/parser.c:33822 #, gcc-internal-format msgid "expected %<#pragma acc%> clause" msgstr "" -#: c/c-parser.c:14070 c/c-parser.c:14345 cp/parser.c:33836 cp/parser.c:34143 +#: c/c-parser.c:14070 c/c-parser.c:14345 cp/parser.c:33833 cp/parser.c:34140 #, fuzzy, gcc-internal-format #| msgid "complex invalid for `%s'" msgid "%qs is not valid for %qs" msgstr "complex нерэчаісны для \"%s\"" -#: c/c-parser.c:14214 cp/parser.c:34010 +#: c/c-parser.c:14214 cp/parser.c:34007 #, gcc-internal-format msgid "%qs must be the first clause of %qs" msgstr "" -#: c/c-parser.c:14334 cp/parser.c:34132 +#: c/c-parser.c:14334 cp/parser.c:34129 #, gcc-internal-format msgid "expected %<#pragma omp%> clause" msgstr "" -#: c/c-parser.c:14472 cp/parser.c:36803 +#: c/c-parser.c:14472 cp/parser.c:36800 #, gcc-internal-format msgid "no valid clauses specified in %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:14482 cp/parser.c:36813 +#: c/c-parser.c:14482 cp/parser.c:36810 #, gcc-internal-format msgid "array section in %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:14502 cp/parser.c:36833 +#: c/c-parser.c:14502 cp/parser.c:36830 #, gcc-internal-format msgid "%qD must be a global variable in %<#pragma acc declare link%>" msgstr "" -#: c/c-parser.c:14513 cp/parser.c:36844 +#: c/c-parser.c:14513 cp/parser.c:36841 #, gcc-internal-format msgid "invalid OpenACC clause at file scope" msgstr "" -#: c/c-parser.c:14520 cp/parser.c:36851 +#: c/c-parser.c:14520 cp/parser.c:36848 #, gcc-internal-format msgid "invalid use of % variable %qD in %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:14528 cp/parser.c:36859 +#: c/c-parser.c:14528 cp/parser.c:36856 #, gcc-internal-format msgid "invalid use of % variable %qD in %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:14540 cp/parser.c:36871 +#: c/c-parser.c:14540 cp/parser.c:36868 #, gcc-internal-format msgid "variable %qD used more than once with %<#pragma acc declare%>" msgstr "" -#: c/c-parser.c:14632 cp/parser.c:36957 +#: c/c-parser.c:14632 cp/parser.c:36954 #, gcc-internal-format msgid "expected % after %<#pragma acc %s%>" msgstr "" -#: c/c-parser.c:14648 cp/parser.c:36974 +#: c/c-parser.c:14648 cp/parser.c:36971 #, gcc-internal-format msgid "%<#pragma acc %s data%> has no data movement clause" msgstr "" @@ -37084,7 +37127,7 @@ msgstr "" msgid "expected function name" msgstr "" -#: c/c-parser.c:14893 cp/parser.c:38064 +#: c/c-parser.c:14893 cp/parser.c:38061 #, fuzzy, gcc-internal-format #| msgid "`%D' is not a function," msgid "%qD does not refer to a function" @@ -37095,42 +37138,42 @@ msgstr "`%D' - гэта ня функцыя," msgid "%<#pragma acc routine%> not immediately followed by function declaration or definition" msgstr "" -#: c/c-parser.c:14953 cp/parser.c:38118 cp/parser.c:38160 +#: c/c-parser.c:14953 cp/parser.c:38115 cp/parser.c:38157 #, gcc-internal-format msgid "%<#pragma acc routine%> not immediately followed by a single function declaration or definition" msgstr "" -#: c/c-parser.c:14970 cp/parser.c:38174 +#: c/c-parser.c:14970 cp/parser.c:38171 #, gcc-internal-format msgid "%<#pragma acc routine%> already applied to %qD" msgstr "" -#: c/c-parser.c:14979 cp/parser.c:38183 +#: c/c-parser.c:14979 cp/parser.c:38180 #, gcc-internal-format msgid "%<#pragma acc routine%> must be applied before use" msgstr "" -#: c/c-parser.c:14980 cp/parser.c:38184 +#: c/c-parser.c:14980 cp/parser.c:38181 #, gcc-internal-format msgid "%<#pragma acc routine%> must be applied before definition" msgstr "" -#: c/c-parser.c:15023 cp/parser.c:37152 +#: c/c-parser.c:15023 cp/parser.c:37149 #, gcc-internal-format msgid "%<#pragma acc update%> must contain at least one % or % or % clause" msgstr "" -#: c/c-parser.c:15435 cp/parser.c:34511 cp/parser.c:34537 +#: c/c-parser.c:15435 cp/parser.c:34508 cp/parser.c:34534 #, gcc-internal-format msgid "invalid form of %<#pragma omp atomic%>" msgstr "" -#: c/c-parser.c:15439 cp/parser.c:34568 cp/parser.c:34584 +#: c/c-parser.c:15439 cp/parser.c:34565 cp/parser.c:34581 #, gcc-internal-format msgid "invalid operator for %<#pragma omp atomic%>" msgstr "" -#: c/c-parser.c:15488 cp/semantics.c:8401 cp/semantics.c:8411 +#: c/c-parser.c:15488 cp/semantics.c:8404 cp/semantics.c:8414 #, gcc-internal-format msgid "%<#pragma omp atomic capture%> uses two different expressions for memory" msgstr "" @@ -37140,22 +37183,22 @@ msgstr "" msgid "expected %<(%> or end of line" msgstr "" -#: c/c-parser.c:15619 cp/parser.c:35103 +#: c/c-parser.c:15619 cp/parser.c:35100 #, gcc-internal-format msgid "% clause parameter is less than %" msgstr "" -#: c/c-parser.c:15630 cp/parser.c:35114 +#: c/c-parser.c:15630 cp/parser.c:35111 #, gcc-internal-format msgid "% clause may not be specified together with % clause with a parameter" msgstr "" -#: c/c-parser.c:15648 cp/parser.c:35141 +#: c/c-parser.c:15648 cp/parser.c:35138 #, fuzzy, gcc-internal-format msgid "for statement expected" msgstr "вельмі шмат аргументаў у функцыі" -#: c/c-parser.c:15718 cp/semantics.c:8066 cp/semantics.c:8153 +#: c/c-parser.c:15718 cp/semantics.c:8069 cp/semantics.c:8156 #, gcc-internal-format msgid "expected iteration declaration or initialization" msgstr "" @@ -37165,72 +37208,72 @@ msgstr "" msgid "not enough perfectly nested loops" msgstr "" -#: c/c-parser.c:15862 cp/parser.c:35364 +#: c/c-parser.c:15862 cp/parser.c:35361 #, gcc-internal-format msgid "collapsed loops not perfectly nested" msgstr "" -#: c/c-parser.c:15909 cp/parser.c:35184 cp/parser.c:35226 cp/pt.c:16385 +#: c/c-parser.c:15909 cp/parser.c:35181 cp/parser.c:35223 cp/pt.c:16407 #, gcc-internal-format msgid "iteration variable %qD should not be firstprivate" msgstr "" -#: c/c-parser.c:16000 cp/parser.c:35437 +#: c/c-parser.c:16000 cp/parser.c:35434 #, gcc-internal-format msgid "% clause with parameter may not be specified on %qs construct" msgstr "" -#: c/c-parser.c:16166 cp/parser.c:35600 +#: c/c-parser.c:16166 cp/parser.c:35597 #, gcc-internal-format msgid "%<#pragma omp ordered%> with % clause may only be used in compound statements" msgstr "" -#: c/c-parser.c:16374 cp/parser.c:35799 +#: c/c-parser.c:16374 cp/parser.c:35796 #, gcc-internal-format msgid "expected % after %qs" msgstr "" -#: c/c-parser.c:16573 cp/parser.c:35995 +#: c/c-parser.c:16573 cp/parser.c:35992 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:16793 cp/parser.c:36232 +#: c/c-parser.c:16793 cp/parser.c:36229 #, gcc-internal-format msgid "%<#pragma omp target data%> with map-type other than %, %, % or % on % clause" msgstr "" -#: c/c-parser.c:16806 cp/parser.c:36245 +#: c/c-parser.c:16806 cp/parser.c:36242 #, gcc-internal-format msgid "%<#pragma omp target data%> must contain at least one % clause" msgstr "" -#: c/c-parser.c:16853 cp/parser.c:36470 +#: c/c-parser.c:16853 cp/parser.c:36467 #, gcc-internal-format msgid "%<#pragma omp target update%> must contain at least one % or % clauses" msgstr "" -#: c/c-parser.c:16925 cp/parser.c:36325 +#: c/c-parser.c:16925 cp/parser.c:36322 #, gcc-internal-format msgid "%<#pragma omp target enter data%> with map-type other than % or % on % clause" msgstr "" -#: c/c-parser.c:16937 cp/parser.c:36337 +#: c/c-parser.c:16937 cp/parser.c:36334 #, gcc-internal-format msgid "%<#pragma omp target enter data%> must contain at least one % clause" msgstr "" -#: c/c-parser.c:17011 cp/parser.c:36414 +#: c/c-parser.c:17011 cp/parser.c:36411 #, gcc-internal-format msgid "%<#pragma omp target exit data%> with map-type other than %, % or % on % clause" msgstr "" -#: c/c-parser.c:17024 cp/parser.c:36427 +#: c/c-parser.c:17024 cp/parser.c:36424 #, gcc-internal-format msgid "%<#pragma omp target exit data%> must contain at least one % clause" msgstr "" -#: c/c-parser.c:17238 cp/parser.c:36680 +#: c/c-parser.c:17238 cp/parser.c:36677 #, gcc-internal-format msgid "%<#pragma omp target%> with map-type other than %, %, % or % on % clause" msgstr "" @@ -37250,32 +37293,32 @@ msgstr "" msgid "%<#pragma omp declare simd%> not immediately followed by a function declaration or definition" msgstr "" -#: c/c-parser.c:17395 cp/parser.c:37273 +#: c/c-parser.c:17395 cp/parser.c:37270 #, gcc-internal-format msgid "%<#pragma omp declare simd%> not immediately followed by a single function declaration or definition" msgstr "" -#: c/c-parser.c:17474 cp/parser.c:37343 +#: c/c-parser.c:17474 cp/parser.c:37340 #, gcc-internal-format msgid "%<#pragma omp declare target%> with clauses in between %<#pragma omp declare target%> without clauses and %<#pragma omp end declare target%>" msgstr "" -#: c/c-parser.c:17493 cp/parser.c:37362 +#: c/c-parser.c:17493 cp/parser.c:37359 #, gcc-internal-format msgid "%qD specified both in declare target % and % clauses" msgstr "" -#: c/c-parser.c:17534 cp/parser.c:37409 +#: c/c-parser.c:17534 cp/parser.c:37406 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:17541 cp/parser.c:37416 +#: c/c-parser.c:17541 cp/parser.c:37413 #, gcc-internal-format msgid "expected %" msgstr "" -#: c/c-parser.c:17547 cp/parser.c:37423 +#: c/c-parser.c:17547 cp/parser.c:37420 #, gcc-internal-format msgid "%<#pragma omp end declare target%> without corresponding %<#pragma omp declare target%>" msgstr "" @@ -37330,47 +37373,47 @@ msgstr "" msgid "one of the initializer call arguments should be %<&omp_priv%>" msgstr "" -#: c/c-parser.c:17947 cp/parser.c:37868 +#: c/c-parser.c:17947 cp/parser.c:37865 #, gcc-internal-format msgid "expected % or % or %" msgstr "" -#: c/c-parser.c:18162 cp/semantics.c:7531 +#: c/c-parser.c:18162 cp/semantics.c:7534 #, gcc-internal-format msgid "%qE declared % after first use" msgstr "" -#: c/c-parser.c:18164 cp/semantics.c:7533 +#: c/c-parser.c:18164 cp/semantics.c:7536 #, gcc-internal-format msgid "automatic variable %qE cannot be %" msgstr "" -#: c/c-parser.c:18168 cp/semantics.c:7535 +#: c/c-parser.c:18168 cp/semantics.c:7538 #, fuzzy, gcc-internal-format msgid "% %qE has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-parser.c:18368 cp/parser.c:38565 +#: c/c-parser.c:18368 cp/parser.c:38562 #, gcc-internal-format msgid "%<__transaction_cancel%> without transactional memory support enabled" msgstr "" -#: c/c-parser.c:18374 cp/parser.c:38571 +#: c/c-parser.c:18374 cp/parser.c:38568 #, gcc-internal-format msgid "%<__transaction_cancel%> within a %<__transaction_relaxed%>" msgstr "" -#: c/c-parser.c:18383 cp/parser.c:38580 +#: c/c-parser.c:18383 cp/parser.c:38577 #, gcc-internal-format msgid "outer %<__transaction_cancel%> not within outer %<__transaction_atomic%>" msgstr "" -#: c/c-parser.c:18385 cp/parser.c:38583 +#: c/c-parser.c:18385 cp/parser.c:38580 #, gcc-internal-format msgid " or a % function" msgstr "" -#: c/c-parser.c:18391 cp/parser.c:38589 +#: c/c-parser.c:18391 cp/parser.c:38586 #, gcc-internal-format msgid "%<__transaction_cancel%> not within %<__transaction_atomic%>" msgstr "" @@ -37386,7 +37429,7 @@ msgstr "" msgid "%qD has an incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:237 c/c-typeck.c:9994 c/c-typeck.c:10036 cp/call.c:4147 +#: c/c-typeck.c:237 c/c-typeck.c:9999 c/c-typeck.c:10041 cp/call.c:4147 #, gcc-internal-format msgid "invalid use of void expression" msgstr "" @@ -37462,12 +37505,12 @@ msgstr "" msgid "converting an array compound literal to a pointer is ill-formed in C++" msgstr "" -#: c/c-typeck.c:2417 c/c-typeck.c:8641 +#: c/c-typeck.c:2417 c/c-typeck.c:8646 #, gcc-internal-format msgid "%qT has no member named %qE; did you mean %qE?" msgstr "" -#: c/c-typeck.c:2421 c/c-typeck.c:8645 +#: c/c-typeck.c:2421 c/c-typeck.c:8650 #, gcc-internal-format msgid "%qT has no member named %qE" msgstr "" @@ -37666,1244 +37709,1244 @@ msgstr "" msgid "pointer to a function used in subtraction" msgstr "" -#: c/c-typeck.c:3847 +#: c/c-typeck.c:3852 #, gcc-internal-format msgid "arithmetic on pointer to an incomplete type" msgstr "" -#: c/c-typeck.c:3852 cp/typeck.c:5562 +#: c/c-typeck.c:3857 cp/typeck.c:5562 #, gcc-internal-format msgid "arithmetic on pointer to an empty aggregate" msgstr "" -#: c/c-typeck.c:4283 +#: c/c-typeck.c:4288 #, gcc-internal-format msgid "%<~%> on a boolean expression" msgstr "" -#: c/c-typeck.c:4287 +#: c/c-typeck.c:4292 #, gcc-internal-format msgid "did you mean to use logical not?" msgstr "" -#: c/c-typeck.c:4296 +#: c/c-typeck.c:4301 #, 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:4335 +#: c/c-typeck.c:4340 #, gcc-internal-format msgid "wrong type argument to unary exclamation mark" msgstr "" -#: c/c-typeck.c:4393 +#: c/c-typeck.c:4398 #, gcc-internal-format msgid "increment of enumeration value is invalid in C++" msgstr "" -#: c/c-typeck.c:4396 +#: c/c-typeck.c:4401 #, gcc-internal-format msgid "decrement of enumeration value is invalid in C++" msgstr "" -#: c/c-typeck.c:4403 +#: c/c-typeck.c:4408 #, gcc-internal-format msgid "increment of a boolean expression" msgstr "" -#: c/c-typeck.c:4406 +#: c/c-typeck.c:4411 #, gcc-internal-format msgid "decrement of a boolean expression" msgstr "" -#: c/c-typeck.c:4422 +#: c/c-typeck.c:4427 #, 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:4447 c/c-typeck.c:4481 +#: c/c-typeck.c:4452 c/c-typeck.c:4486 #, fuzzy, gcc-internal-format msgid "wrong type argument to increment" msgstr "не хапае аргументаў у функцыі" -#: c/c-typeck.c:4449 c/c-typeck.c:4484 +#: c/c-typeck.c:4454 c/c-typeck.c:4489 #, gcc-internal-format msgid "wrong type argument to decrement" msgstr "" -#: c/c-typeck.c:4469 +#: c/c-typeck.c:4474 #, fuzzy, gcc-internal-format msgid "increment of pointer to an incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:4473 +#: c/c-typeck.c:4478 #, fuzzy, gcc-internal-format msgid "decrement of pointer to an incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:4577 +#: c/c-typeck.c:4582 #, gcc-internal-format msgid "taking address of expression of type %" msgstr "" -#: c/c-typeck.c:4636 +#: c/c-typeck.c:4641 #, fuzzy, gcc-internal-format msgid "cannot take address of bit-field %qD" msgstr "не магу атрымаць адрас бітавага поля \"%s\"" -#: c/c-typeck.c:4649 +#: c/c-typeck.c:4654 #, fuzzy, gcc-internal-format msgid "cannot take address of scalar with reverse storage order" msgstr "не магу атрымаць адрас бітавага поля \"%s\"" -#: c/c-typeck.c:4657 +#: c/c-typeck.c:4662 #, gcc-internal-format msgid "address of array with reverse scalar storage order requested" msgstr "" -#: c/c-typeck.c:4838 +#: c/c-typeck.c:4843 #, gcc-internal-format msgid "global register variable %qD used in nested function" msgstr "" -#: c/c-typeck.c:4841 +#: c/c-typeck.c:4846 #, gcc-internal-format msgid "register variable %qD used in nested function" msgstr "" -#: c/c-typeck.c:4846 +#: c/c-typeck.c:4851 #, gcc-internal-format msgid "address of global register variable %qD requested" msgstr "" -#: c/c-typeck.c:4848 +#: c/c-typeck.c:4853 #, gcc-internal-format msgid "address of register variable %qD requested" msgstr "" -#: c/c-typeck.c:4951 +#: c/c-typeck.c:4956 #, gcc-internal-format msgid "non-lvalue array in conditional expression" msgstr "" -#: c/c-typeck.c:5033 +#: c/c-typeck.c:5038 #, gcc-internal-format msgid "implicit conversion from %qT to %qT to match other result of conditional" msgstr "" -#: c/c-typeck.c:5092 c/c-typeck.c:5098 +#: c/c-typeck.c:5097 c/c-typeck.c:5103 #, gcc-internal-format msgid "operand of ?: changes signedness from %qT to %qT due to unsignedness of other operand" msgstr "" -#: c/c-typeck.c:5115 +#: c/c-typeck.c:5120 #, gcc-internal-format msgid "ISO C forbids conditional expr with only one void side" msgstr "" -#: c/c-typeck.c:5132 +#: c/c-typeck.c:5137 #, gcc-internal-format msgid "pointers to disjoint address spaces used in conditional expression" msgstr "" -#: c/c-typeck.c:5143 c/c-typeck.c:5160 +#: c/c-typeck.c:5148 c/c-typeck.c:5165 #, gcc-internal-format msgid "pointer to array loses qualifier in conditional expression" msgstr "" -#: c/c-typeck.c:5148 c/c-typeck.c:5165 +#: c/c-typeck.c:5153 c/c-typeck.c:5170 #, gcc-internal-format msgid "ISO C forbids conditional expr between % and function pointer" msgstr "" -#: c/c-typeck.c:5178 +#: c/c-typeck.c:5183 #, gcc-internal-format msgid "pointer type mismatch in conditional expression" msgstr "" -#: c/c-typeck.c:5187 c/c-typeck.c:5198 +#: c/c-typeck.c:5192 c/c-typeck.c:5203 #, gcc-internal-format msgid "pointer/integer type mismatch in conditional expression" msgstr "" -#: c/c-typeck.c:5336 +#: c/c-typeck.c:5341 #, gcc-internal-format msgid "left-hand operand of comma expression has no effect" msgstr "" -#: c/c-typeck.c:5354 c/c-typeck.c:10636 +#: c/c-typeck.c:5359 c/c-typeck.c:10641 #, gcc-internal-format msgid "right-hand operand of comma expression has no effect" msgstr "" -#: c/c-typeck.c:5423 +#: c/c-typeck.c:5428 msgid "cast adds %q#v qualifier to function type" msgstr "" -#: c/c-typeck.c:5429 +#: c/c-typeck.c:5434 msgid "cast discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:5464 +#: c/c-typeck.c:5469 #, gcc-internal-format msgid "to be safe all intermediate pointers in cast from %qT to %qT must be % qualified" msgstr "" -#: c/c-typeck.c:5554 +#: c/c-typeck.c:5559 #, gcc-internal-format msgid "cast specifies array type" msgstr "" -#: c/c-typeck.c:5560 +#: c/c-typeck.c:5565 #, gcc-internal-format msgid "cast specifies function type" msgstr "" -#: c/c-typeck.c:5575 +#: c/c-typeck.c:5580 #, gcc-internal-format msgid "ISO C forbids casting nonscalar to the same type" msgstr "" -#: c/c-typeck.c:5595 +#: c/c-typeck.c:5600 #, gcc-internal-format msgid "ISO C forbids casts to union type" msgstr "" -#: c/c-typeck.c:5605 +#: c/c-typeck.c:5610 #, gcc-internal-format msgid "cast to union type from type not present in union" msgstr "" -#: c/c-typeck.c:5640 +#: c/c-typeck.c:5645 #, gcc-internal-format, gfc-internal-format msgid "cast to %s address space pointer from disjoint generic address space pointer" msgstr "" -#: c/c-typeck.c:5645 +#: c/c-typeck.c:5650 #, gcc-internal-format, gfc-internal-format msgid "cast to generic address space pointer from disjoint %s address space pointer" msgstr "" -#: c/c-typeck.c:5650 +#: c/c-typeck.c:5655 #, gcc-internal-format, gfc-internal-format msgid "cast to %s address space pointer from disjoint %s address space pointer" msgstr "" -#: c/c-typeck.c:5670 +#: c/c-typeck.c:5675 #, gcc-internal-format msgid "cast increases required alignment of target type" msgstr "" -#: c/c-typeck.c:5681 +#: c/c-typeck.c:5686 #, gcc-internal-format msgid "cast from pointer to integer of different size" msgstr "" -#: c/c-typeck.c:5686 +#: c/c-typeck.c:5691 #, gcc-internal-format msgid "cast from function call of type %qT to non-matching type %qT" msgstr "" -#: c/c-typeck.c:5695 cp/typeck.c:7811 +#: c/c-typeck.c:5700 cp/typeck.c:7811 #, gcc-internal-format msgid "cast to pointer from integer of different size" msgstr "" -#: c/c-typeck.c:5709 +#: c/c-typeck.c:5714 #, gcc-internal-format msgid "ISO C forbids conversion of function pointer to object pointer type" msgstr "" -#: c/c-typeck.c:5718 +#: c/c-typeck.c:5723 #, gcc-internal-format msgid "ISO C forbids conversion of object pointer to function pointer type" msgstr "" -#: c/c-typeck.c:5728 +#: c/c-typeck.c:5733 #, gcc-internal-format msgid "cast between incompatible function types from %qT to %qT" msgstr "" -#: c/c-typeck.c:5815 +#: c/c-typeck.c:5820 #, gcc-internal-format msgid "defining a type in a cast is invalid in C++" msgstr "" -#: c/c-typeck.c:5856 +#: c/c-typeck.c:5861 #, gcc-internal-format msgid "assignment to expression with array type" msgstr "" -#: c/c-typeck.c:5982 +#: c/c-typeck.c:5987 #, gcc-internal-format msgid "enum conversion in assignment is invalid in C++" msgstr "" -#: c/c-typeck.c:6180 c/c-typeck.c:6202 c/c-typeck.c:6226 +#: c/c-typeck.c:6185 c/c-typeck.c:6207 c/c-typeck.c:6231 #, fuzzy, gcc-internal-format #| msgid "initialization" msgid "(near initialization for %qs)" msgstr "ініцыялізацыя" -#: c/c-typeck.c:6241 +#: c/c-typeck.c:6246 #, gcc-internal-format msgid "array initialized from parenthesized string constant" msgstr "" -#: c/c-typeck.c:6284 c/c-typeck.c:6476 c/c-typeck.c:6908 +#: c/c-typeck.c:6289 c/c-typeck.c:6481 c/c-typeck.c:6913 #, gcc-internal-format msgid "expected %qT but argument is of type %qT" msgstr "" -#: c/c-typeck.c:6471 +#: c/c-typeck.c:6476 #, gcc-internal-format msgid "enum conversion when passing argument %d of %qE is invalid in C++" msgstr "" -#: c/c-typeck.c:6480 +#: c/c-typeck.c:6485 #, gcc-internal-format msgid "enum conversion from %qT to %qT in assignment is invalid in C++" msgstr "" -#: c/c-typeck.c:6484 +#: c/c-typeck.c:6489 #, gcc-internal-format msgid "enum conversion from %qT to %qT in initialization is invalid in C++" msgstr "" -#: c/c-typeck.c:6489 +#: c/c-typeck.c:6494 #, gcc-internal-format msgid "enum conversion from %qT to %qT in return is invalid in C++" msgstr "" -#: c/c-typeck.c:6523 +#: c/c-typeck.c:6528 #, gcc-internal-format msgid "cannot pass rvalue to reference parameter" msgstr "" -#: c/c-typeck.c:6656 c/c-typeck.c:6942 +#: c/c-typeck.c:6661 c/c-typeck.c:6947 msgid "passing argument %d of %qE makes %q#v qualified function pointer from unqualified" msgstr "" -#: c/c-typeck.c:6659 c/c-typeck.c:6945 +#: c/c-typeck.c:6664 c/c-typeck.c:6950 msgid "assignment makes %q#v qualified function pointer from unqualified" msgstr "" -#: c/c-typeck.c:6662 c/c-typeck.c:6947 +#: c/c-typeck.c:6667 c/c-typeck.c:6952 msgid "initialization makes %q#v qualified function pointer from unqualified" msgstr "" -#: c/c-typeck.c:6665 c/c-typeck.c:6949 +#: c/c-typeck.c:6670 c/c-typeck.c:6954 msgid "return makes %q#v qualified function pointer from unqualified" msgstr "" -#: c/c-typeck.c:6673 c/c-typeck.c:6840 c/c-typeck.c:6883 +#: c/c-typeck.c:6678 c/c-typeck.c:6845 c/c-typeck.c:6888 msgid "passing argument %d of %qE discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:6675 c/c-typeck.c:6842 c/c-typeck.c:6885 +#: c/c-typeck.c:6680 c/c-typeck.c:6847 c/c-typeck.c:6890 msgid "assignment discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:6677 c/c-typeck.c:6844 c/c-typeck.c:6887 +#: c/c-typeck.c:6682 c/c-typeck.c:6849 c/c-typeck.c:6892 msgid "initialization discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:6679 c/c-typeck.c:6846 c/c-typeck.c:6889 +#: c/c-typeck.c:6684 c/c-typeck.c:6851 c/c-typeck.c:6894 msgid "return discards %qv qualifier from pointer target type" msgstr "" -#: c/c-typeck.c:6688 +#: c/c-typeck.c:6693 #, gcc-internal-format msgid "ISO C prohibits argument conversion to union type" msgstr "" -#: c/c-typeck.c:6750 +#: c/c-typeck.c:6755 #, gcc-internal-format msgid "request for implicit conversion from %qT to %qT not permitted in C++" msgstr "" -#: c/c-typeck.c:6762 +#: c/c-typeck.c:6767 #, gcc-internal-format msgid "passing argument %d of %qE from pointer to non-enclosed address space" msgstr "" -#: c/c-typeck.c:6766 +#: c/c-typeck.c:6771 #, gcc-internal-format msgid "assignment from pointer to non-enclosed address space" msgstr "" -#: c/c-typeck.c:6770 +#: c/c-typeck.c:6775 #, gcc-internal-format msgid "initialization from pointer to non-enclosed address space" msgstr "" -#: c/c-typeck.c:6774 +#: c/c-typeck.c:6779 #, gcc-internal-format msgid "return from pointer to non-enclosed address space" msgstr "" -#: c/c-typeck.c:6792 +#: c/c-typeck.c:6797 #, gcc-internal-format msgid "argument %d of %qE might be a candidate for a format attribute" msgstr "" -#: c/c-typeck.c:6798 +#: c/c-typeck.c:6803 #, gcc-internal-format msgid "assignment left-hand side might be a candidate for a format attribute" msgstr "" -#: c/c-typeck.c:6803 +#: c/c-typeck.c:6808 #, gcc-internal-format msgid "initialization left-hand side might be a candidate for a format attribute" msgstr "" -#: c/c-typeck.c:6808 cp/typeck.c:8891 +#: c/c-typeck.c:6813 cp/typeck.c:8891 #, gcc-internal-format msgid "return type might be a candidate for a format attribute" msgstr "" -#: c/c-typeck.c:6857 +#: c/c-typeck.c:6862 #, gcc-internal-format msgid "ISO C forbids passing argument %d of %qE between function pointer and %" msgstr "" -#: c/c-typeck.c:6860 +#: c/c-typeck.c:6865 #, gcc-internal-format msgid "ISO C forbids assignment between function pointer and %" msgstr "" -#: c/c-typeck.c:6862 +#: c/c-typeck.c:6867 #, gcc-internal-format msgid "ISO C forbids initialization between function pointer and %" msgstr "" -#: c/c-typeck.c:6864 +#: c/c-typeck.c:6869 #, gcc-internal-format msgid "ISO C forbids return between function pointer and %" msgstr "" -#: c/c-typeck.c:6904 +#: c/c-typeck.c:6909 #, gcc-internal-format msgid "pointer targets in passing argument %d of %qE differ in signedness" msgstr "" -#: c/c-typeck.c:6913 +#: c/c-typeck.c:6918 #, gcc-internal-format msgid "pointer targets in assignment from %qT to %qT differ in signedness" msgstr "" -#: c/c-typeck.c:6918 +#: c/c-typeck.c:6923 #, gcc-internal-format msgid "pointer targets in initialization of %qT from %qT differ in signedness" msgstr "" -#: c/c-typeck.c:6923 +#: c/c-typeck.c:6928 #, gcc-internal-format msgid "pointer targets in returning %qT from a function with return type %qT differ in signedness" msgstr "" -#: c/c-typeck.c:6961 +#: c/c-typeck.c:6966 #, gcc-internal-format msgid "passing argument %d of %qE from incompatible pointer type" msgstr "" -#: c/c-typeck.c:6967 +#: c/c-typeck.c:6972 #, gcc-internal-format msgid "assignment to %qT from incompatible pointer type %qT" msgstr "" -#: c/c-typeck.c:6972 +#: c/c-typeck.c:6977 #, gcc-internal-format msgid "initialization of %qT from incompatible pointer type %qT" msgstr "" -#: c/c-typeck.c:6977 +#: c/c-typeck.c:6982 #, gcc-internal-format msgid "returning %qT from a function with incompatible return type %qT" msgstr "" #. ??? This should not be an error when inlining calls to #. unprototyped functions. -#: c/c-typeck.c:6991 c/c-typeck.c:7514 cp/typeck.c:2063 +#: c/c-typeck.c:6996 c/c-typeck.c:7519 cp/typeck.c:2063 #, gcc-internal-format msgid "invalid use of non-lvalue array" msgstr "" -#: c/c-typeck.c:7004 +#: c/c-typeck.c:7009 #, gcc-internal-format msgid "passing argument %d of %qE makes pointer from integer without a cast" msgstr "" -#: c/c-typeck.c:7010 +#: c/c-typeck.c:7015 #, gcc-internal-format msgid "assignment to %qT from %qT makes pointer from integer without a cast" msgstr "" -#: c/c-typeck.c:7015 +#: c/c-typeck.c:7020 #, gcc-internal-format msgid "initialization of %qT from %qT makes pointer from integer without a cast" msgstr "" -#: c/c-typeck.c:7019 +#: c/c-typeck.c:7024 #, 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:7035 +#: c/c-typeck.c:7040 #, gcc-internal-format msgid "passing argument %d of %qE makes integer from pointer without a cast" msgstr "" -#: c/c-typeck.c:7041 +#: c/c-typeck.c:7046 #, gcc-internal-format msgid "assignment to %qT from %qT makes integer from pointer without a cast" msgstr "" -#: c/c-typeck.c:7046 +#: c/c-typeck.c:7051 #, gcc-internal-format msgid "initialization of %qT from %qT makes integer from pointer without a cast" msgstr "" -#: c/c-typeck.c:7050 +#: c/c-typeck.c:7055 #, 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:7073 +#: c/c-typeck.c:7078 #, gcc-internal-format msgid "incompatible type for argument %d of %qE" msgstr "" -#: c/c-typeck.c:7078 +#: c/c-typeck.c:7083 #, gcc-internal-format msgid "incompatible types when assigning to type %qT from type %qT" msgstr "" -#: c/c-typeck.c:7083 +#: c/c-typeck.c:7088 #, gcc-internal-format msgid "incompatible types when initializing type %qT using type %qT" msgstr "" -#: c/c-typeck.c:7088 +#: c/c-typeck.c:7093 #, gcc-internal-format msgid "incompatible types when returning type %qT but %qT was expected" msgstr "" -#: c/c-typeck.c:7152 +#: c/c-typeck.c:7157 #, gcc-internal-format msgid "traditional C rejects automatic aggregate initialization" msgstr "" -#: c/c-typeck.c:7388 c/c-typeck.c:8284 cp/typeck2.c:1045 +#: c/c-typeck.c:7393 c/c-typeck.c:8289 cp/typeck2.c:1045 #, gcc-internal-format msgid "initialization of a flexible array member" msgstr "" -#: c/c-typeck.c:7398 cp/typeck2.c:1059 +#: c/c-typeck.c:7403 cp/typeck2.c:1059 #, gcc-internal-format msgid "char-array initialized from wide string" msgstr "" -#: c/c-typeck.c:7407 +#: c/c-typeck.c:7412 #, gcc-internal-format msgid "wide character array initialized from non-wide string" msgstr "" -#: c/c-typeck.c:7413 +#: c/c-typeck.c:7418 #, gcc-internal-format msgid "wide character array initialized from incompatible wide string" msgstr "" -#: c/c-typeck.c:7446 +#: c/c-typeck.c:7451 #, gcc-internal-format msgid "array of inappropriate type initialized from string constant" msgstr "" -#: c/c-typeck.c:7533 c/c-typeck.c:7557 c/c-typeck.c:7560 c/c-typeck.c:7568 -#: c/c-typeck.c:7608 c/c-typeck.c:9131 c/c-typeck.c:9181 +#: c/c-typeck.c:7538 c/c-typeck.c:7562 c/c-typeck.c:7565 c/c-typeck.c:7573 +#: c/c-typeck.c:7613 c/c-typeck.c:9136 c/c-typeck.c:9186 #, gcc-internal-format msgid "initializer element is not constant" msgstr "" -#: c/c-typeck.c:7542 +#: c/c-typeck.c:7547 #, gcc-internal-format msgid "array initialized from non-constant array expression" msgstr "" -#: c/c-typeck.c:7573 c/c-typeck.c:7621 c/c-typeck.c:9191 +#: c/c-typeck.c:7578 c/c-typeck.c:7626 c/c-typeck.c:9196 #, fuzzy, gcc-internal-format msgid "initializer element is not a constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-typeck.c:7615 c/c-typeck.c:9186 +#: c/c-typeck.c:7620 c/c-typeck.c:9191 #, gcc-internal-format msgid "initializer element is not computable at load time" msgstr "" -#: c/c-typeck.c:7634 +#: c/c-typeck.c:7639 #, gcc-internal-format msgid "invalid initializer" msgstr "нерэчаісны ініцыялізатар" -#: c/c-typeck.c:7912 cp/decl.c:6396 +#: c/c-typeck.c:7917 cp/decl.c:6396 #, gcc-internal-format msgid "opaque vector types cannot be initialized" msgstr "" -#: c/c-typeck.c:8132 +#: c/c-typeck.c:8137 #, gcc-internal-format msgid "extra brace group at end of initializer" msgstr "" -#: c/c-typeck.c:8215 +#: c/c-typeck.c:8220 #, gcc-internal-format msgid "braces around scalar initializer" msgstr "" -#: c/c-typeck.c:8281 c/c-typeck.c:9615 cp/typeck2.c:1084 cp/typeck2.c:1297 +#: c/c-typeck.c:8286 c/c-typeck.c:9620 cp/typeck2.c:1084 cp/typeck2.c:1297 #, gcc-internal-format msgid "initialization of flexible array member in a nested context" msgstr "" -#: c/c-typeck.c:8318 +#: c/c-typeck.c:8323 #, gcc-internal-format msgid "missing braces around initializer" msgstr "" -#: c/c-typeck.c:8341 +#: c/c-typeck.c:8346 #, fuzzy, gcc-internal-format msgid "missing initializer for field %qD of %qT" msgstr "прапушчан ініцыялізатар" -#: c/c-typeck.c:8365 +#: c/c-typeck.c:8370 #, gcc-internal-format msgid "empty scalar initializer" msgstr "" -#: c/c-typeck.c:8370 +#: c/c-typeck.c:8375 #, gcc-internal-format msgid "extra elements in scalar initializer" msgstr "" -#: c/c-typeck.c:8483 c/c-typeck.c:8565 +#: c/c-typeck.c:8488 c/c-typeck.c:8570 #, gcc-internal-format msgid "array index in non-array initializer" msgstr "" -#: c/c-typeck.c:8488 c/c-typeck.c:8627 +#: c/c-typeck.c:8493 c/c-typeck.c:8632 #, gcc-internal-format msgid "field name not in record or union initializer" msgstr "" -#: c/c-typeck.c:8538 +#: c/c-typeck.c:8543 #, fuzzy, gcc-internal-format msgid "array index in initializer not of integer type" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:8547 c/c-typeck.c:8556 +#: c/c-typeck.c:8552 c/c-typeck.c:8561 #, fuzzy, gcc-internal-format msgid "array index in initializer is not an integer constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-typeck.c:8561 c/c-typeck.c:8563 +#: c/c-typeck.c:8566 c/c-typeck.c:8568 #, gcc-internal-format msgid "nonconstant array index in initializer" msgstr "" -#: c/c-typeck.c:8567 c/c-typeck.c:8570 +#: c/c-typeck.c:8572 c/c-typeck.c:8575 #, gcc-internal-format msgid "array index in initializer exceeds array bounds" msgstr "" -#: c/c-typeck.c:8589 +#: c/c-typeck.c:8594 #, gcc-internal-format msgid "empty index range in initializer" msgstr "" -#: c/c-typeck.c:8598 +#: c/c-typeck.c:8603 #, gcc-internal-format msgid "array index range in initializer exceeds array bounds" msgstr "" -#: c/c-typeck.c:8700 c/c-typeck.c:8730 c/c-typeck.c:9274 +#: c/c-typeck.c:8705 c/c-typeck.c:8735 c/c-typeck.c:9279 #, gcc-internal-format msgid "initialized field with side-effects overwritten" msgstr "" -#: c/c-typeck.c:8704 c/c-typeck.c:8734 c/c-typeck.c:9277 +#: c/c-typeck.c:8709 c/c-typeck.c:8739 c/c-typeck.c:9282 #, gcc-internal-format msgid "initialized field overwritten" msgstr "" -#: c/c-typeck.c:9208 +#: c/c-typeck.c:9213 #, gcc-internal-format msgid "enum conversion in initialization is invalid in C++" msgstr "" -#: c/c-typeck.c:9496 +#: c/c-typeck.c:9501 #, gcc-internal-format msgid "excess elements in char array initializer" msgstr "" -#: c/c-typeck.c:9503 c/c-typeck.c:9574 +#: c/c-typeck.c:9508 c/c-typeck.c:9579 #, gcc-internal-format msgid "excess elements in struct initializer" msgstr "" -#: c/c-typeck.c:9518 +#: c/c-typeck.c:9523 #, gcc-internal-format msgid "positional initialization of field in % declared with % attribute" msgstr "" -#: c/c-typeck.c:9589 +#: c/c-typeck.c:9594 #, gcc-internal-format msgid "non-static initialization of a flexible array member" msgstr "" -#: c/c-typeck.c:9687 +#: c/c-typeck.c:9692 #, gcc-internal-format msgid "excess elements in union initializer" msgstr "" -#: c/c-typeck.c:9709 +#: c/c-typeck.c:9714 #, gcc-internal-format msgid "traditional C rejects initialization of unions" msgstr "" -#: c/c-typeck.c:9777 +#: c/c-typeck.c:9782 #, gcc-internal-format msgid "excess elements in array initializer" msgstr "" -#: c/c-typeck.c:9811 +#: c/c-typeck.c:9816 #, gcc-internal-format msgid "excess elements in vector initializer" msgstr "" -#: c/c-typeck.c:9843 +#: c/c-typeck.c:9848 #, gcc-internal-format msgid "excess elements in scalar initializer" msgstr "" -#: c/c-typeck.c:10086 +#: c/c-typeck.c:10091 #, fuzzy, gcc-internal-format #| msgid "ISO C forbids `goto *expr;'" msgid "ISO C forbids %" msgstr "ISO C не падтрымлівае \"goto *expr;\"" -#: c/c-typeck.c:10113 c/gimple-parser.c:1604 cp/typeck.c:9113 +#: c/c-typeck.c:10118 c/gimple-parser.c:1604 cp/typeck.c:9113 #, fuzzy, gcc-internal-format #| msgid "function does not return string type" msgid "function declared % has a % statement" msgstr "функцыя не вяртае тып string" -#: c/c-typeck.c:10139 c/c-typeck.c:10143 +#: c/c-typeck.c:10144 c/c-typeck.c:10148 #, gcc-internal-format msgid "% with no value, in function returning non-void" msgstr "" -#: c/c-typeck.c:10157 c/gimple-parser.c:1614 +#: c/c-typeck.c:10162 c/gimple-parser.c:1614 #, gcc-internal-format msgid "% with a value, in function returning void" msgstr "" -#: c/c-typeck.c:10160 +#: c/c-typeck.c:10165 #, gcc-internal-format msgid "ISO C forbids % with expression, in function returning void" msgstr "" -#: c/c-typeck.c:10236 +#: c/c-typeck.c:10241 #, fuzzy, gcc-internal-format msgid "function returns address of label" msgstr "ISO C не дазваляе пусты ізыходны файл" -#: c/c-typeck.c:10327 cp/semantics.c:1171 +#: c/c-typeck.c:10332 cp/semantics.c:1171 #, gcc-internal-format msgid "switch quantity not an integer" msgstr "" -#: c/c-typeck.c:10352 +#: c/c-typeck.c:10357 #, gcc-internal-format msgid "% switch expression not converted to % in ISO C" msgstr "" -#: c/c-typeck.c:10390 c/c-typeck.c:10398 +#: c/c-typeck.c:10395 c/c-typeck.c:10403 #, fuzzy, gcc-internal-format msgid "case label is not an integer constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: c/c-typeck.c:10404 cp/parser.c:11067 +#: c/c-typeck.c:10409 cp/parser.c:11067 #, gcc-internal-format msgid "case label not within a switch statement" msgstr "" -#: c/c-typeck.c:10406 +#: c/c-typeck.c:10411 #, gcc-internal-format msgid "% label not within a switch statement" msgstr "" -#: c/c-typeck.c:10578 cp/parser.c:12356 +#: c/c-typeck.c:10583 cp/parser.c:12353 #, gcc-internal-format msgid "break statement not within loop or switch" msgstr "" -#: c/c-typeck.c:10580 cp/parser.c:12379 +#: c/c-typeck.c:10585 cp/parser.c:12376 #, gcc-internal-format msgid "continue statement not within a loop" msgstr "" -#: c/c-typeck.c:10585 cp/parser.c:12369 +#: c/c-typeck.c:10590 cp/parser.c:12366 #, gcc-internal-format msgid "break statement used with OpenMP for loop" msgstr "" -#: c/c-typeck.c:10590 +#: c/c-typeck.c:10595 #, gcc-internal-format msgid "break statement within %<#pragma simd%> loop body" msgstr "" -#: c/c-typeck.c:10592 +#: c/c-typeck.c:10597 #, gcc-internal-format msgid "continue statement within %<#pragma simd%> loop body" msgstr "" -#: c/c-typeck.c:10618 cp/cp-gimplify.c:432 +#: c/c-typeck.c:10623 cp/cp-gimplify.c:432 #, gcc-internal-format msgid "statement with no effect" msgstr "" -#: c/c-typeck.c:10662 +#: c/c-typeck.c:10667 #, gcc-internal-format msgid "expression statement has incomplete type" msgstr "" -#: c/c-typeck.c:11476 c/c-typeck.c:11644 cp/typeck.c:5017 +#: c/c-typeck.c:11481 c/c-typeck.c:11649 cp/typeck.c:5017 #, gcc-internal-format msgid "comparing vectors with different element types" msgstr "" -#: c/c-typeck.c:11484 c/c-typeck.c:11652 cp/typeck.c:5030 +#: c/c-typeck.c:11489 c/c-typeck.c:11657 cp/typeck.c:5030 #, gcc-internal-format msgid "comparing vectors with different number of elements" msgstr "" -#: c/c-typeck.c:11509 c/c-typeck.c:11677 cp/typeck.c:5058 +#: c/c-typeck.c:11514 c/c-typeck.c:11682 cp/typeck.c:5058 #, gcc-internal-format msgid "could not find an integer type of the same size as %qT" msgstr "" -#: c/c-typeck.c:11523 cp/typeck.c:4743 +#: c/c-typeck.c:11528 cp/typeck.c:4743 #, gcc-internal-format msgid "comparing floating point with == or != is unsafe" msgstr "" -#: c/c-typeck.c:11541 c/c-typeck.c:11562 +#: c/c-typeck.c:11546 c/c-typeck.c:11567 #, gcc-internal-format msgid "the comparison will always evaluate as % for the address of %qD will never be NULL" msgstr "" -#: c/c-typeck.c:11547 c/c-typeck.c:11568 +#: c/c-typeck.c:11552 c/c-typeck.c:11573 #, gcc-internal-format msgid "the comparison will always evaluate as % for the address of %qD will never be NULL" msgstr "" -#: c/c-typeck.c:11589 c/c-typeck.c:11718 +#: c/c-typeck.c:11594 c/c-typeck.c:11723 #, gcc-internal-format msgid "comparison of pointers to disjoint address spaces" msgstr "" -#: c/c-typeck.c:11596 c/c-typeck.c:11602 +#: c/c-typeck.c:11601 c/c-typeck.c:11607 #, fuzzy, gcc-internal-format msgid "ISO C forbids comparison of % with function pointer" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: c/c-typeck.c:11609 c/c-typeck.c:11728 +#: c/c-typeck.c:11614 c/c-typeck.c:11733 #, gcc-internal-format msgid "comparison of distinct pointer types lacks a cast" msgstr "" -#: c/c-typeck.c:11621 c/c-typeck.c:11626 c/c-typeck.c:11754 c/c-typeck.c:11759 +#: c/c-typeck.c:11626 c/c-typeck.c:11631 c/c-typeck.c:11759 c/c-typeck.c:11764 #, gcc-internal-format msgid "comparison between pointer and integer" msgstr "" -#: c/c-typeck.c:11706 +#: c/c-typeck.c:11711 #, gcc-internal-format msgid "comparison of complete and incomplete pointers" msgstr "" -#: c/c-typeck.c:11708 +#: c/c-typeck.c:11713 #, gcc-internal-format msgid "ISO C forbids ordered comparisons of pointers to functions" msgstr "" -#: c/c-typeck.c:11713 +#: c/c-typeck.c:11718 #, gcc-internal-format msgid "ordered comparison of pointer with null pointer" msgstr "" -#: c/c-typeck.c:11736 c/c-typeck.c:11739 c/c-typeck.c:11746 c/c-typeck.c:11749 +#: c/c-typeck.c:11741 c/c-typeck.c:11744 c/c-typeck.c:11751 c/c-typeck.c:11754 #: cp/typeck.c:5081 cp/typeck.c:5088 #, gcc-internal-format msgid "ordered comparison of pointer with integer zero" msgstr "" -#: c/c-typeck.c:11811 +#: c/c-typeck.c:11816 #, gcc-internal-format msgid "implicit conversion from %qT to %qT to match other operand of binary expression" msgstr "" -#: c/c-typeck.c:12126 +#: c/c-typeck.c:12131 #, gcc-internal-format msgid "used array that cannot be converted to pointer where scalar is required" msgstr "" -#: c/c-typeck.c:12130 +#: c/c-typeck.c:12135 #, gcc-internal-format msgid "used struct type value where scalar is required" msgstr "" -#: c/c-typeck.c:12134 +#: c/c-typeck.c:12139 #, gcc-internal-format msgid "used union type value where scalar is required" msgstr "" -#: c/c-typeck.c:12150 +#: c/c-typeck.c:12155 #, gcc-internal-format msgid "used vector type where scalar is required" msgstr "" -#: c/c-typeck.c:12340 cp/semantics.c:8508 +#: c/c-typeck.c:12345 cp/semantics.c:8511 #, gcc-internal-format msgid "%<#pragma omp cancel%> must specify one of %, %, % or % clauses" msgstr "" -#: c/c-typeck.c:12379 cp/semantics.c:8545 +#: c/c-typeck.c:12384 cp/semantics.c:8548 #, gcc-internal-format msgid "%<#pragma omp cancellation point%> must specify one of %, %, % or % clauses" msgstr "" -#: c/c-typeck.c:12423 c/c-typeck.c:13581 c/c-typeck.c:13642 c/c-typeck.c:13704 +#: c/c-typeck.c:12428 c/c-typeck.c:13586 c/c-typeck.c:13647 c/c-typeck.c:13709 #, gcc-internal-format msgid "%<_Atomic%> %qE in %qs clause" msgstr "" -#: c/c-typeck.c:12436 c/c-typeck.c:13628 cp/semantics.c:4546 -#: cp/semantics.c:6717 +#: c/c-typeck.c:12441 c/c-typeck.c:13633 cp/semantics.c:4549 +#: cp/semantics.c:6720 #, gcc-internal-format msgid "bit-field %qE in %qs clause" msgstr "" -#: c/c-typeck.c:12445 c/c-typeck.c:13652 cp/semantics.c:4556 -#: cp/semantics.c:6735 +#: c/c-typeck.c:12450 c/c-typeck.c:13657 cp/semantics.c:4559 +#: cp/semantics.c:6738 #, gcc-internal-format msgid "%qE is a member of a union" msgstr "" -#: c/c-typeck.c:12455 cp/semantics.c:4570 cp/semantics.c:6760 +#: c/c-typeck.c:12460 cp/semantics.c:4573 cp/semantics.c:6763 #, gcc-internal-format msgid "%qD is not a variable in %qs clause" msgstr "" -#: c/c-typeck.c:12459 c/c-typeck.c:13669 cp/semantics.c:4574 -#: cp/semantics.c:6763 +#: c/c-typeck.c:12464 c/c-typeck.c:13674 cp/semantics.c:4577 +#: cp/semantics.c:6766 #, gcc-internal-format msgid "%qE is not a variable in %qs clause" msgstr "" -#: c/c-typeck.c:12466 +#: c/c-typeck.c:12471 #, gcc-internal-format msgid "%<_Atomic%> %qD in %qs clause" msgstr "" -#: c/c-typeck.c:12475 c/c-typeck.c:13676 c/c-typeck.c:13778 -#: cp/semantics.c:4591 cp/semantics.c:6769 cp/semantics.c:6931 +#: c/c-typeck.c:12480 c/c-typeck.c:13681 c/c-typeck.c:13783 +#: cp/semantics.c:4594 cp/semantics.c:6772 cp/semantics.c:6934 #, gcc-internal-format msgid "%qD is threadprivate variable in %qs clause" msgstr "" -#: c/c-typeck.c:12511 cp/semantics.c:4623 +#: c/c-typeck.c:12516 cp/semantics.c:4626 #, gcc-internal-format msgid "low bound %qE of array section does not have integral type" msgstr "" -#: c/c-typeck.c:12518 cp/semantics.c:4630 +#: c/c-typeck.c:12523 cp/semantics.c:4633 #, gcc-internal-format msgid "length %qE of array section does not have integral type" msgstr "" -#: c/c-typeck.c:12545 c/c-typeck.c:12609 c/c-typeck.c:12867 -#: cp/semantics.c:4666 cp/semantics.c:4730 +#: c/c-typeck.c:12550 c/c-typeck.c:12614 c/c-typeck.c:12872 +#: cp/semantics.c:4669 cp/semantics.c:4733 #, gcc-internal-format msgid "zero length array section in %qs clause" msgstr "" -#: c/c-typeck.c:12564 cp/semantics.c:4685 +#: c/c-typeck.c:12569 cp/semantics.c:4688 #, gcc-internal-format msgid "for unknown bound array type length expression must be specified" msgstr "" -#: c/c-typeck.c:12572 cp/semantics.c:4693 +#: c/c-typeck.c:12577 cp/semantics.c:4696 #, gcc-internal-format msgid "negative low bound in array section in %qs clause" msgstr "" -#: c/c-typeck.c:12581 c/c-typeck.c:12691 cp/semantics.c:4702 -#: cp/semantics.c:4812 +#: c/c-typeck.c:12586 c/c-typeck.c:12696 cp/semantics.c:4705 +#: cp/semantics.c:4815 #, gcc-internal-format msgid "negative length in array section in %qs clause" msgstr "" -#: c/c-typeck.c:12598 cp/semantics.c:4719 +#: c/c-typeck.c:12603 cp/semantics.c:4722 #, gcc-internal-format msgid "low bound %qE above array section size in %qs clause" msgstr "" -#: c/c-typeck.c:12635 cp/semantics.c:4756 +#: c/c-typeck.c:12640 cp/semantics.c:4759 #, gcc-internal-format msgid "length %qE above array section size in %qs clause" msgstr "" -#: c/c-typeck.c:12650 cp/semantics.c:4771 +#: c/c-typeck.c:12655 cp/semantics.c:4774 #, gcc-internal-format msgid "high bound %qE above array section size in %qs clause" msgstr "" -#: c/c-typeck.c:12683 cp/semantics.c:4804 +#: c/c-typeck.c:12688 cp/semantics.c:4807 #, gcc-internal-format msgid "for pointer type length expression must be specified" msgstr "" -#: c/c-typeck.c:12701 c/c-typeck.c:12810 cp/semantics.c:4822 -#: cp/semantics.c:4934 +#: c/c-typeck.c:12706 c/c-typeck.c:12815 cp/semantics.c:4825 +#: cp/semantics.c:4937 #, gcc-internal-format msgid "array section is not contiguous in %qs clause" msgstr "" -#: c/c-typeck.c:12709 cp/semantics.c:4830 +#: c/c-typeck.c:12714 cp/semantics.c:4833 #, gcc-internal-format msgid "%qE does not have pointer or array type" msgstr "" -#: c/c-typeck.c:13103 c/c-typeck.c:13113 +#: c/c-typeck.c:13108 c/c-typeck.c:13118 #, gcc-internal-format msgid "%qD in % clause is a zero size array" msgstr "" -#: c/c-typeck.c:13130 +#: c/c-typeck.c:13135 #, gcc-internal-format msgid "%<_Atomic%> %qE in % clause" msgstr "" -#: c/c-typeck.c:13178 +#: c/c-typeck.c:13183 #, gcc-internal-format msgid "%qE has invalid type for %" msgstr "" -#: c/c-typeck.c:13187 cp/semantics.c:5755 +#: c/c-typeck.c:13192 cp/semantics.c:5758 #, gcc-internal-format msgid "user defined reduction not found for %qE" msgstr "" -#: c/c-typeck.c:13275 +#: c/c-typeck.c:13280 #, gcc-internal-format msgid "variable length element type in array % clause" msgstr "" -#: c/c-typeck.c:13293 c/c-typeck.c:13836 cp/semantics.c:7249 +#: c/c-typeck.c:13298 c/c-typeck.c:13841 cp/semantics.c:7252 #, gcc-internal-format msgid "% clause must not be used together with %" msgstr "" -#: c/c-typeck.c:13305 cp/semantics.c:7289 +#: c/c-typeck.c:13310 cp/semantics.c:7292 #, gcc-internal-format msgid "%qE must be % for %" msgstr "" -#: c/c-typeck.c:13319 cp/semantics.c:5929 +#: c/c-typeck.c:13324 cp/semantics.c:5932 #, gcc-internal-format msgid "modifier should not be specified in % clause on % or % constructs" msgstr "" -#: c/c-typeck.c:13327 +#: c/c-typeck.c:13332 #, gcc-internal-format msgid "linear clause applied to non-integral non-pointer variable with type %qT" msgstr "" -#: c/c-typeck.c:13335 +#: c/c-typeck.c:13340 #, gcc-internal-format msgid "%<_Atomic%> %qD in % clause" msgstr "" -#: c/c-typeck.c:13354 cp/semantics.c:5999 +#: c/c-typeck.c:13359 cp/semantics.c:6002 #, gcc-internal-format msgid "% clause step %qE is neither constant nor a parameter" msgstr "" -#: c/c-typeck.c:13384 c/c-typeck.c:13771 cp/semantics.c:6083 -#: cp/semantics.c:6924 +#: c/c-typeck.c:13389 c/c-typeck.c:13776 cp/semantics.c:6086 +#: cp/semantics.c:6927 #, gcc-internal-format msgid "%qE is not a variable in clause %qs" msgstr "" -#: c/c-typeck.c:13393 cp/semantics.c:6092 +#: c/c-typeck.c:13398 cp/semantics.c:6095 #, gcc-internal-format msgid "%qD appears more than once in reduction clauses" msgstr "" -#: c/c-typeck.c:13404 c/c-typeck.c:13434 c/c-typeck.c:13463 +#: c/c-typeck.c:13409 c/c-typeck.c:13439 c/c-typeck.c:13468 #, gcc-internal-format msgid "%qE appears more than once in data clauses" msgstr "" -#: c/c-typeck.c:13411 c/c-typeck.c:13440 c/c-typeck.c:13600 c/c-typeck.c:13714 -#: c/c-typeck.c:13720 c/c-typeck.c:13733 c/c-typeck.c:13742 -#: cp/semantics.c:6102 cp/semantics.c:6109 cp/semantics.c:6160 -#: cp/semantics.c:6166 cp/semantics.c:6203 cp/semantics.c:6680 -#: cp/semantics.c:6817 cp/semantics.c:6823 cp/semantics.c:6836 -#: cp/semantics.c:6845 +#: c/c-typeck.c:13416 c/c-typeck.c:13445 c/c-typeck.c:13605 c/c-typeck.c:13719 +#: c/c-typeck.c:13725 c/c-typeck.c:13738 c/c-typeck.c:13747 +#: cp/semantics.c:6105 cp/semantics.c:6112 cp/semantics.c:6163 +#: cp/semantics.c:6169 cp/semantics.c:6206 cp/semantics.c:6683 +#: cp/semantics.c:6820 cp/semantics.c:6826 cp/semantics.c:6839 +#: cp/semantics.c:6848 #, gcc-internal-format msgid "%qD appears more than once in data clauses" msgstr "" -#: c/c-typeck.c:13413 c/c-typeck.c:13442 c/c-typeck.c:13722 c/c-typeck.c:13744 -#: cp/semantics.c:6111 cp/semantics.c:6168 cp/semantics.c:6825 -#: cp/semantics.c:6847 +#: c/c-typeck.c:13418 c/c-typeck.c:13447 c/c-typeck.c:13727 c/c-typeck.c:13749 +#: cp/semantics.c:6114 cp/semantics.c:6171 cp/semantics.c:6828 +#: cp/semantics.c:6850 #, gcc-internal-format msgid "%qD appears both in data and map clauses" msgstr "" -#: c/c-typeck.c:13427 cp/semantics.c:6154 +#: c/c-typeck.c:13432 cp/semantics.c:6157 #, gcc-internal-format msgid "%qE is not a variable in clause %" msgstr "" -#: c/c-typeck.c:13456 cp/semantics.c:6197 +#: c/c-typeck.c:13461 cp/semantics.c:6200 #, gcc-internal-format msgid "%qE is not a variable in clause %" msgstr "" -#: c/c-typeck.c:13475 cp/semantics.c:6545 +#: c/c-typeck.c:13480 cp/semantics.c:6548 #, gcc-internal-format msgid "%qE is not a variable in % clause" msgstr "" -#: c/c-typeck.c:13482 +#: c/c-typeck.c:13487 #, gcc-internal-format msgid "%qE in % clause is neither a pointer nor an array" msgstr "" -#: c/c-typeck.c:13489 +#: c/c-typeck.c:13494 #, gcc-internal-format msgid "%<_Atomic%> %qD in % clause" msgstr "" -#: c/c-typeck.c:13496 +#: c/c-typeck.c:13501 #, gcc-internal-format msgid "%qE appears more than once in % clauses" msgstr "" -#: c/c-typeck.c:13551 cp/semantics.c:6627 +#: c/c-typeck.c:13556 cp/semantics.c:6630 #, gcc-internal-format msgid "%qE is not a variable in % clause" msgstr "" -#: c/c-typeck.c:13573 cp/semantics.c:6658 +#: c/c-typeck.c:13578 cp/semantics.c:6661 #, gcc-internal-format msgid "array section does not have mappable type in %qs clause" msgstr "" -#: c/c-typeck.c:13597 c/c-typeck.c:13731 cp/semantics.c:6677 -#: cp/semantics.c:6834 +#: c/c-typeck.c:13602 c/c-typeck.c:13736 cp/semantics.c:6680 +#: cp/semantics.c:6837 #, gcc-internal-format msgid "%qD appears more than once in motion clauses" msgstr "" -#: c/c-typeck.c:13603 c/c-typeck.c:13735 cp/semantics.c:6683 -#: cp/semantics.c:6838 +#: c/c-typeck.c:13608 c/c-typeck.c:13740 cp/semantics.c:6686 +#: cp/semantics.c:6841 #, gcc-internal-format msgid "%qD appears more than once in map clauses" msgstr "" -#: c/c-typeck.c:13635 cp/semantics.c:6724 +#: c/c-typeck.c:13640 cp/semantics.c:6727 #, gcc-internal-format msgid "%qE does not have a mappable type in %qs clause" msgstr "" -#: c/c-typeck.c:13695 c/c-typeck.c:13785 cp/semantics.c:6799 -#: cp/semantics.c:6938 +#: c/c-typeck.c:13700 c/c-typeck.c:13790 cp/semantics.c:6802 +#: cp/semantics.c:6941 #, gcc-internal-format msgid "%qD does not have a mappable type in %qs clause" msgstr "" -#: c/c-typeck.c:13766 cp/semantics.c:6918 +#: c/c-typeck.c:13771 cp/semantics.c:6921 #, gcc-internal-format msgid "%qE is neither a variable nor a function name in clause %qs" msgstr "" -#: c/c-typeck.c:13794 cp/semantics.c:6947 +#: c/c-typeck.c:13799 cp/semantics.c:6950 #, gcc-internal-format msgid "%qE appears more than once on the same % directive" msgstr "" -#: c/c-typeck.c:13808 cp/semantics.c:6962 +#: c/c-typeck.c:13813 cp/semantics.c:6965 #, gcc-internal-format msgid "%qD is not an argument in % clause" msgstr "" -#: c/c-typeck.c:13811 cp/semantics.c:6964 +#: c/c-typeck.c:13816 cp/semantics.c:6967 #, gcc-internal-format msgid "%qE is not an argument in % clause" msgstr "" -#: c/c-typeck.c:13826 +#: c/c-typeck.c:13831 #, gcc-internal-format msgid "%qs variable is neither a pointer nor an array" msgstr "" -#: c/c-typeck.c:13900 cp/semantics.c:6359 +#: c/c-typeck.c:13905 cp/semantics.c:6362 #, gcc-internal-format msgid "% modifier specified for %qs schedule kind" msgstr "" -#: c/c-typeck.c:13931 cp/semantics.c:7141 +#: c/c-typeck.c:13936 cp/semantics.c:7144 #, gcc-internal-format msgid "% clause is incompatible with %" msgstr "" -#: c/c-typeck.c:13981 cp/semantics.c:7332 +#: c/c-typeck.c:13986 cp/semantics.c:7335 #, gcc-internal-format msgid "%qE is predetermined %qs for %qs" msgstr "" -#: c/c-typeck.c:14001 cp/semantics.c:7223 +#: c/c-typeck.c:14006 cp/semantics.c:7226 #, gcc-internal-format msgid "% clause value is bigger than % clause value" msgstr "" -#: c/c-typeck.c:14013 cp/semantics.c:7236 +#: c/c-typeck.c:14018 cp/semantics.c:7239 #, gcc-internal-format msgid "% schedule modifier specified together with % clause" msgstr "" -#: c/c-typeck.c:14031 cp/semantics.c:7203 +#: c/c-typeck.c:14036 cp/semantics.c:7206 #, gcc-internal-format msgid "% clause step is a parameter %qD not specified in % clause" msgstr "" -#: c/c-typeck.c:14204 +#: c/c-typeck.c:14209 #, gcc-internal-format msgid "cannot use % with reverse storage order" msgstr "" -#: c/c-typeck.c:14209 +#: c/c-typeck.c:14214 #, fuzzy, gcc-internal-format msgid "second argument to % is of incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: c/c-typeck.c:14215 +#: c/c-typeck.c:14220 #, gcc-internal-format msgid "C++ requires promoted type, not enum type, in %" msgstr "" @@ -39022,7 +39065,7 @@ msgstr "пераўтварэньне з `%T' у `%T'" msgid " no known conversion for argument %d from %qH to %qI" msgstr "" -#: cp/call.c:3441 cp/pt.c:6495 +#: cp/call.c:3441 cp/pt.c:6509 #, gcc-internal-format, gfc-internal-format msgid " candidate expects %d argument, %d provided" msgid_plural " candidate expects %d arguments, %d provided" @@ -39314,7 +39357,7 @@ msgstr "немагчымы апэратар '%s'" msgid "%q#D is private within this context" msgstr "" -#: cp/call.c:6478 cp/decl.c:7343 +#: cp/call.c:6478 cp/decl.c:7364 #, fuzzy, gcc-internal-format msgid "declared private here" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" @@ -39324,7 +39367,7 @@ msgstr "\"%s\" не абвешчан (першае выкарыстанне ў msgid "%q#D is protected within this context" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/call.c:6486 cp/decl.c:7344 +#: cp/call.c:6486 cp/decl.c:7365 #, fuzzy, gcc-internal-format #| msgid "called from here" msgid "declared protected here" @@ -39626,7 +39669,7 @@ msgstr "" msgid "call to non-function %qD" msgstr "" -#: cp/call.c:9119 cp/pt.c:15053 cp/typeck.c:2901 +#: cp/call.c:9119 cp/pt.c:15075 cp/typeck.c:2901 #, gcc-internal-format msgid "cannot call constructor %<%T::%D%> directly" msgstr "" @@ -39837,418 +39880,418 @@ msgstr "" msgid "cannot derive from % base %qT in derived type %qT" msgstr "" -#: cp/class.c:2098 +#: cp/class.c:2103 #, gcc-internal-format msgid "all member functions in class %qT are private" msgstr "" -#: cp/class.c:2110 +#: cp/class.c:2115 #, gcc-internal-format msgid "%q#T only defines a private destructor and has no friends" msgstr "" -#: cp/class.c:2152 +#: cp/class.c:2156 #, gcc-internal-format msgid "%q#T only defines private constructors and has no friends" msgstr "" -#: cp/class.c:2156 +#: cp/class.c:2160 #, gcc-internal-format msgid "%q#D is public, but requires an existing %q#T object" msgstr "" -#: cp/class.c:2430 +#: cp/class.c:2434 #, gcc-internal-format msgid "no unique final overrider for %qD in %qT" msgstr "" -#: cp/class.c:2785 +#: cp/class.c:2789 #, gcc-internal-format msgid "%qD can be marked override" msgstr "" -#: cp/class.c:2797 +#: cp/class.c:2801 #, gcc-internal-format msgid "%q+#D marked %, but is not virtual" msgstr "" -#: cp/class.c:2799 +#: cp/class.c:2803 #, gcc-internal-format msgid "%q+#D marked %, but does not override" msgstr "" -#: cp/class.c:2861 +#: cp/class.c:2865 #, gcc-internal-format msgid "%qD was hidden" msgstr "" -#: cp/class.c:2863 +#: cp/class.c:2867 #, gcc-internal-format msgid " by %qD" msgstr "" -#: cp/class.c:2896 +#: cp/class.c:2900 #, gcc-internal-format msgid "%q#D invalid; an anonymous union may only have public non-static data members" msgstr "" -#: cp/class.c:2906 cp/name-lookup.c:3293 cp/parser.c:19720 +#: cp/class.c:2910 cp/name-lookup.c:3293 cp/parser.c:19717 #, gcc-internal-format msgid "this flexibility is deprecated and will be removed" msgstr "" -#: cp/class.c:3097 +#: cp/class.c:3101 #, gcc-internal-format msgid "the ellipsis in %qD is not inherited" msgstr "" -#: cp/class.c:3213 +#: cp/class.c:3217 #, fuzzy, gcc-internal-format msgid "bit-field %q+#D with non-integral type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: cp/class.c:3229 +#: cp/class.c:3233 #, fuzzy, gcc-internal-format msgid "bit-field %q+D width not an integer constant" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: cp/class.c:3234 +#: cp/class.c:3238 #, gcc-internal-format msgid "negative width in bit-field %q+D" msgstr "" -#: cp/class.c:3239 +#: cp/class.c:3243 #, gcc-internal-format msgid "zero width for bit-field %q+D" msgstr "" -#: cp/class.c:3249 +#: cp/class.c:3253 #, gcc-internal-format msgid "width of %qD exceeds its type" msgstr "" -#: cp/class.c:3255 +#: cp/class.c:3259 #, gcc-internal-format msgid "%qD is too small to hold all values of %q#T" msgstr "" -#: cp/class.c:3316 +#: cp/class.c:3320 #, gcc-internal-format msgid "member %q+#D with constructor not allowed in union" msgstr "" -#: cp/class.c:3319 +#: cp/class.c:3323 #, gcc-internal-format msgid "member %q+#D with destructor not allowed in union" msgstr "" -#: cp/class.c:3321 +#: cp/class.c:3325 #, gcc-internal-format msgid "member %q+#D with copy assignment operator not allowed in union" msgstr "" -#: cp/class.c:3325 +#: cp/class.c:3329 #, gcc-internal-format msgid "unrestricted unions only available with -std=c++11 or -std=gnu++11" msgstr "" -#: cp/class.c:3453 +#: cp/class.c:3457 #, 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:3460 +#: cp/class.c:3464 #, gcc-internal-format msgid "non-static data member %q+D in a union may not have reference type %qT" msgstr "" -#: cp/class.c:3470 +#: cp/class.c:3474 #, fuzzy, gcc-internal-format msgid "field %q+D invalidly declared function type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: cp/class.c:3476 +#: cp/class.c:3480 #, fuzzy, gcc-internal-format msgid "field %q+D invalidly declared method type" msgstr "бітавае поле \"%s\" мае нерэчаісны тып" -#: cp/class.c:3536 +#: cp/class.c:3540 #, gcc-internal-format msgid "ignoring packed attribute because of unpacked non-POD field %q#D" msgstr "" -#: cp/class.c:3585 +#: cp/class.c:3589 #, gcc-internal-format msgid "member %q+D cannot be declared both % and %" msgstr "" -#: cp/class.c:3591 +#: cp/class.c:3595 #, gcc-internal-format msgid "member %q+D cannot be declared as a % reference" msgstr "" -#: cp/class.c:3617 +#: cp/class.c:3621 #, gcc-internal-format msgid "multiple fields in union %qT initialized" msgstr "" -#: cp/class.c:3658 +#: cp/class.c:3662 #, gcc-internal-format msgid "field %q#D with same name as class" msgstr "" -#: cp/class.c:3681 +#: cp/class.c:3685 #, gcc-internal-format msgid "%q#T has pointer data members" msgstr "" -#: cp/class.c:3686 +#: cp/class.c:3690 #, gcc-internal-format msgid " but does not override %<%T(const %T&)%>" msgstr "" -#: cp/class.c:3688 +#: cp/class.c:3692 #, gcc-internal-format msgid " or %" msgstr "" -#: cp/class.c:3692 +#: cp/class.c:3696 #, gcc-internal-format msgid " but does not override %" msgstr "" -#: cp/class.c:4097 +#: cp/class.c:4101 #, gcc-internal-format msgid "alignment of %qD increased in -fabi-version=9 (GCC 5.2)" msgstr "" -#: cp/class.c:4100 +#: cp/class.c:4104 #, gcc-internal-format msgid "alignment of %qD will increase in -fabi-version=9" msgstr "" -#: cp/class.c:4378 +#: cp/class.c:4382 #, fuzzy, gcc-internal-format msgid "initializer specified for non-virtual method %q+D" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/class.c:4813 +#: cp/class.c:4817 #, gcc-internal-format msgid "method overrides both % and %qE methods" msgstr "" -#: cp/class.c:4834 +#: cp/class.c:4838 #, gcc-internal-format msgid "method declared %qE overriding %qE method" msgstr "" -#: cp/class.c:5350 cp/constexpr.c:237 +#: cp/class.c:5367 cp/constexpr.c:237 #, gcc-internal-format msgid "enclosing class of % non-static member function %q+#D is not a literal type" msgstr "" -#: cp/class.c:5374 +#: cp/class.c:5391 #, gcc-internal-format msgid "%q+T is not literal because:" msgstr "" -#: cp/class.c:5377 +#: cp/class.c:5394 #, gcc-internal-format msgid " %qT is a closure type, which is only literal in C++17 and later" msgstr "" -#: cp/class.c:5380 +#: cp/class.c:5397 #, gcc-internal-format msgid " %q+T has a non-trivial destructor" msgstr "" -#: cp/class.c:5387 +#: cp/class.c:5404 #, 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:5420 +#: cp/class.c:5437 #, gcc-internal-format msgid " base class %qT of %q+T is non-literal" msgstr "" -#: cp/class.c:5435 +#: cp/class.c:5452 #, gcc-internal-format msgid " non-static data member %qD has non-literal type" msgstr "" -#: cp/class.c:5442 +#: cp/class.c:5459 #, gcc-internal-format msgid " non-static data member %qD has volatile type" msgstr "" -#: cp/class.c:5561 +#: cp/class.c:5578 #, gcc-internal-format msgid "base class %q#T has accessible non-virtual destructor" msgstr "" -#: cp/class.c:5590 +#: cp/class.c:5607 #, gcc-internal-format msgid "non-static reference %q#D in class without a constructor" msgstr "" -#: cp/class.c:5596 +#: cp/class.c:5613 #, gcc-internal-format msgid "non-static const member %q#D in class without a constructor" msgstr "" #. If the function is defaulted outside the class, we just #. give the synthesis error. -#: cp/class.c:5624 +#: cp/class.c:5641 #, gcc-internal-format msgid "%q+D declared to take const reference, but implicit declaration would take non-const" msgstr "" -#: cp/class.c:5898 +#: cp/class.c:5915 #, gcc-internal-format msgid "direct base %qT inaccessible in %qT due to ambiguity" msgstr "" -#: cp/class.c:5910 +#: cp/class.c:5927 #, gcc-internal-format msgid "virtual base %qT inaccessible in %qT due to ambiguity" msgstr "" -#: cp/class.c:6133 +#: cp/class.c:6150 #, gcc-internal-format msgid "offset of %qD is not ABI-compliant and may change in a future version of GCC" msgstr "" -#: cp/class.c:6291 +#: cp/class.c:6308 #, 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:6576 +#: cp/class.c:6593 #, gcc-internal-format msgid "invalid use of %q#T with a zero-size array in %q#D" msgstr "" -#: cp/class.c:6578 +#: cp/class.c:6595 #, gcc-internal-format msgid "invalid use of %q#T with a flexible array member in %q#T" msgstr "" -#: cp/class.c:6583 +#: cp/class.c:6600 #, fuzzy, gcc-internal-format msgid "array member %q#D declared here" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/class.c:6610 +#: cp/class.c:6627 #, gcc-internal-format msgid "zero-size array member %qD not at end of %q#T" msgstr "" -#: cp/class.c:6612 +#: cp/class.c:6629 #, gcc-internal-format msgid "zero-size array member %qD in an otherwise empty %q#T" msgstr "" -#: cp/class.c:6620 cp/class.c:6650 +#: cp/class.c:6637 cp/class.c:6667 #, fuzzy, gcc-internal-format #| msgid "previous definition of `%#T'" msgid "in the definition of %q#T" msgstr "папярэдняе вызначэньне `%#T'" -#: cp/class.c:6628 +#: cp/class.c:6645 #, gcc-internal-format msgid "flexible array member %qD not at end of %q#T" msgstr "" -#: cp/class.c:6630 +#: cp/class.c:6647 #, gcc-internal-format msgid "flexible array member %qD in an otherwise empty %q#T" msgstr "" -#: cp/class.c:6648 +#: cp/class.c:6665 #, gcc-internal-format msgid "next member %q#D declared here" msgstr "" -#: cp/class.c:6760 cp/parser.c:23239 +#: cp/class.c:6777 cp/parser.c:23236 #, fuzzy, gcc-internal-format #| msgid "previous definition of `%#T'" msgid "redefinition of %q#T" msgstr "папярэдняе вызначэньне `%#T'" -#: cp/class.c:6897 +#: cp/class.c:6914 #, gcc-internal-format msgid "%q#T has virtual functions and accessible non-virtual destructor" msgstr "" -#: cp/class.c:6925 +#: cp/class.c:6942 #, gcc-internal-format msgid "type transparent %q#T does not have any fields" msgstr "" -#: cp/class.c:6931 +#: cp/class.c:6948 #, gcc-internal-format msgid "type transparent class %qT has base classes" msgstr "" -#: cp/class.c:6935 +#: cp/class.c:6952 #, gcc-internal-format msgid "type transparent class %qT has virtual functions" msgstr "" -#: cp/class.c:6941 +#: cp/class.c:6958 #, 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:7071 +#: cp/class.c:7088 #, gcc-internal-format msgid "definition of %qD does not match %<#include %>" msgstr "" -#: cp/class.c:7082 +#: cp/class.c:7099 #, gcc-internal-format msgid "trying to finish struct, but kicked out due to previous parse errors" msgstr "" -#: cp/class.c:7582 +#: cp/class.c:7599 #, fuzzy, gcc-internal-format #| msgid "language %s not recognized" msgid "language string %<\"%E\"%> not recognized" msgstr "мова %s не распазнана" -#: cp/class.c:7672 +#: cp/class.c:7689 #, gcc-internal-format msgid "cannot resolve overloaded function %qD based on conversion to type %qT" msgstr "" -#: cp/class.c:7817 +#: cp/class.c:7834 #, gcc-internal-format msgid "no matches converting function %qD to type %q#T" msgstr "" -#: cp/class.c:7844 +#: cp/class.c:7861 #, gcc-internal-format msgid "converting overloaded function %qD to type %q#T is ambiguous" msgstr "" -#: cp/class.c:7870 +#: cp/class.c:7887 #, fuzzy, gcc-internal-format msgid "assuming pointer to member %qD" msgstr "прапушчан ініцыялізатар" -#: cp/class.c:7873 +#: cp/class.c:7890 #, gcc-internal-format msgid "(a pointer to member can only be formed with %<&%E%>)" msgstr "" -#: cp/class.c:7948 cp/class.c:7990 +#: cp/class.c:7965 cp/class.c:8007 #, gcc-internal-format msgid "not enough type information" msgstr "" -#: cp/class.c:7968 +#: cp/class.c:7985 #, gcc-internal-format msgid "cannot convert %qE from type %qT to type %qT" msgstr "" @@ -40258,13 +40301,13 @@ msgstr "" #. A name N used in a class S shall refer to the same declaration #. in its context and when re-evaluated in the completed scope of #. S. -#: cp/class.c:8235 +#: cp/class.c:8252 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %q#D" msgstr "абвяшчэньне `%#D'" -#: cp/class.c:8237 +#: cp/class.c:8254 #, gcc-internal-format msgid "changes meaning of %qD from %q#D" msgstr "" @@ -40658,17 +40701,17 @@ msgstr "памер масіва \"%s\" адмоўны" msgid "unexpected AST of kind %s" msgstr "" -#: cp/cp-gimplify.c:1415 +#: cp/cp-gimplify.c:1416 #, gcc-internal-format msgid "throw will always call terminate()" msgstr "" -#: cp/cp-gimplify.c:1418 +#: cp/cp-gimplify.c:1419 #, gcc-internal-format msgid "in C++11 destructors default to noexcept" msgstr "" -#: cp/cp-gimplify.c:1429 +#: cp/cp-gimplify.c:1430 #, gcc-internal-format msgid "in C++11 this throw will terminate because destructors default to noexcept" msgstr "" @@ -41078,7 +41121,7 @@ msgstr "папярэдняе абвяшчэньне `%D'" msgid "redeclaration %qD differs in % from previous declaration" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: cp/decl.c:1304 cp/decl.c:13843 +#: cp/decl.c:1304 cp/decl.c:13867 #, fuzzy, gcc-internal-format #| msgid "previous declaration `%D'" msgid "previous declaration %qD" @@ -41411,7 +41454,7 @@ msgstr "" msgid " enters OpenMP structured block" msgstr "" -#: cp/decl.c:3434 cp/parser.c:12366 cp/parser.c:12387 +#: cp/decl.c:3434 cp/parser.c:12363 cp/parser.c:12384 #, gcc-internal-format msgid "invalid exit from OpenMP structured block" msgstr "" @@ -41421,7 +41464,7 @@ msgstr "" msgid "%qD is not a type" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:3838 cp/parser.c:6366 +#: cp/decl.c:3838 cp/parser.c:6369 #, fuzzy, gcc-internal-format msgid "%qD used without template parameters" msgstr "нявернае выкарыстанне \"restict\"" @@ -41800,8 +41843,8 @@ msgstr "нерэчаісны ініцыялізатар" msgid "C99 designator %qE outside aggregate initializer" msgstr "" -#: cp/decl.c:6011 cp/decl.c:6234 cp/typeck2.c:1310 cp/typeck2.c:1590 -#: cp/typeck2.c:1638 cp/typeck2.c:1685 +#: cp/decl.c:6011 cp/decl.c:6234 cp/typeck2.c:1310 cp/typeck2.c:1593 +#: cp/typeck2.c:1641 cp/typeck2.c:1688 #, fuzzy, gcc-internal-format msgid "too many initializers for %qT" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" @@ -41876,12 +41919,12 @@ msgstr "параметр \"%s\" ініцыялізаваны" msgid "assignment (not initialization) in declaration" msgstr "" -#: cp/decl.c:6873 cp/decl.c:12605 +#: cp/decl.c:6873 cp/decl.c:12629 #, gcc-internal-format msgid "ISO C++17 does not allow % storage class specifier" msgstr "" -#: cp/decl.c:6877 cp/decl.c:12609 +#: cp/decl.c:6877 cp/decl.c:12633 #, gcc-internal-format msgid "% storage class specifier used" msgstr "" @@ -41906,1498 +41949,1498 @@ msgstr "няма папярэдняга аб'яўлення для \"%s\"" msgid "function %q#D is initialized like a variable" msgstr "" -#: cp/decl.c:7329 +#: cp/decl.c:7350 #, gcc-internal-format msgid "cannot decompose class type %qT because it has an anonymous struct member" msgstr "" -#: cp/decl.c:7332 +#: cp/decl.c:7353 #, gcc-internal-format msgid "cannot decompose class type %qT because it has an anonymous union member" msgstr "" -#: cp/decl.c:7339 +#: cp/decl.c:7360 #, gcc-internal-format msgid "cannot decompose inaccessible member %qD of %qT" msgstr "" -#: cp/decl.c:7365 +#: cp/decl.c:7386 #, 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:7374 +#: cp/decl.c:7395 #, gcc-internal-format msgid "cannot decompose class type %qT: its base classes %qT and %qT have non-static data members" msgstr "" -#: cp/decl.c:7592 +#: cp/decl.c:7613 #, fuzzy, gcc-internal-format msgid "structured binding refers to incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:7608 +#: cp/decl.c:7629 #, gcc-internal-format msgid "cannot decompose variable length array %qT" msgstr "" -#: cp/decl.c:7617 cp/decl.c:7702 +#: cp/decl.c:7638 cp/decl.c:7723 #, 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:7621 +#: cp/decl.c:7642 #, 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:7624 +#: cp/decl.c:7645 #, 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:7669 +#: cp/decl.c:7690 #, gcc-internal-format msgid "cannot decompose variable length vector %qT" msgstr "" -#: cp/decl.c:7695 +#: cp/decl.c:7716 #, fuzzy, gcc-internal-format msgid "%::value%> is not an integral constant expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:7704 +#: cp/decl.c:7725 #, gcc-internal-format msgid "while %qT decomposes into %E elements" msgstr "" -#: cp/decl.c:7725 +#: cp/decl.c:7746 #, gcc-internal-format msgid "in initialization of structured binding variable %qD" msgstr "" -#: cp/decl.c:7751 +#: cp/decl.c:7772 #, gcc-internal-format msgid "cannot decompose union type %qT" msgstr "" -#: cp/decl.c:7756 +#: cp/decl.c:7777 #, gcc-internal-format msgid "cannot decompose non-array non-class type %qT" msgstr "" -#: cp/decl.c:7761 +#: cp/decl.c:7782 #, gcc-internal-format msgid "cannot decompose lambda closure type %qT" msgstr "" -#: cp/decl.c:7765 +#: cp/decl.c:7786 #, gcc-internal-format msgid "structured binding refers to incomplete class type %qT" msgstr "" -#: cp/decl.c:7774 +#: cp/decl.c:7795 #, gcc-internal-format msgid "cannot decompose class type %qT without non-static data members" msgstr "" -#: cp/decl.c:8213 +#: cp/decl.c:8234 #, gcc-internal-format msgid "non-local variable %qD declared %<__thread%> needs dynamic initialization" msgstr "" -#: cp/decl.c:8216 +#: cp/decl.c:8237 #, gcc-internal-format msgid "non-local variable %qD declared %<__thread%> has a non-trivial destructor" msgstr "" -#: cp/decl.c:8222 +#: cp/decl.c:8243 #, gcc-internal-format msgid "C++11 % allows dynamic initialization and destruction" msgstr "" -#: cp/decl.c:8450 +#: cp/decl.c:8471 #, gcc-internal-format msgid "initializer fails to determine size of %qT" msgstr "" -#: cp/decl.c:8454 +#: cp/decl.c:8475 #, fuzzy, gcc-internal-format #| msgid "array size missing in `%D'" msgid "array size missing in %qT" msgstr "прапушчан памер масіва ў `%D'" -#: cp/decl.c:8457 +#: cp/decl.c:8478 #, fuzzy, gcc-internal-format #| msgid "zero-size array `%D'" msgid "zero-size array %qT" msgstr "нулявы памер масіва `%D'" -#: cp/decl.c:8473 +#: cp/decl.c:8494 #, gcc-internal-format msgid "destructor for alien class %qT cannot be a member" msgstr "" -#: cp/decl.c:8475 +#: cp/decl.c:8496 #, gcc-internal-format msgid "constructor for alien class %qT cannot be a member" msgstr "" -#: cp/decl.c:8499 +#: cp/decl.c:8520 #, gcc-internal-format msgid "%qD declared as a % variable" msgstr "" -#: cp/decl.c:8501 +#: cp/decl.c:8522 #, gcc-internal-format msgid "% and % function specifiers on %qD invalid in variable declaration" msgstr "" -#: cp/decl.c:8506 +#: cp/decl.c:8527 #, gcc-internal-format msgid "%qD declared as a % parameter" msgstr "" -#: cp/decl.c:8508 +#: cp/decl.c:8529 #, gcc-internal-format msgid "%qD declared as an % parameter" msgstr "" -#: cp/decl.c:8510 +#: cp/decl.c:8531 #, gcc-internal-format msgid "% and % function specifiers on %qD invalid in parameter declaration" msgstr "" -#: cp/decl.c:8515 +#: cp/decl.c:8536 #, gcc-internal-format msgid "%qD declared as a % type" msgstr "" -#: cp/decl.c:8517 +#: cp/decl.c:8538 #, gcc-internal-format msgid "%qD declared as an % type" msgstr "" -#: cp/decl.c:8519 +#: cp/decl.c:8540 #, gcc-internal-format msgid "% and % function specifiers on %qD invalid in type declaration" msgstr "" -#: cp/decl.c:8524 +#: cp/decl.c:8545 #, gcc-internal-format msgid "%qD declared as a % field" msgstr "" -#: cp/decl.c:8526 +#: cp/decl.c:8547 #, gcc-internal-format msgid "%qD declared as an % field" msgstr "" -#: cp/decl.c:8528 +#: cp/decl.c:8549 #, gcc-internal-format msgid "% and % function specifiers on %qD invalid in field declaration" msgstr "" -#: cp/decl.c:8535 +#: cp/decl.c:8556 #, gcc-internal-format msgid "%q+D declared as a friend" msgstr "" -#: cp/decl.c:8542 +#: cp/decl.c:8563 #, fuzzy, gcc-internal-format msgid "%q+D declared with an exception specification" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:8574 +#: cp/decl.c:8595 #, gcc-internal-format msgid "definition of %qD is not in namespace enclosing %qT" msgstr "" -#: cp/decl.c:8614 +#: cp/decl.c:8635 #, gcc-internal-format msgid "static member function %q#D declared with type qualifiers" msgstr "" -#: cp/decl.c:8624 +#: cp/decl.c:8645 #, gcc-internal-format msgid "concept %q#D declared with function parameters" msgstr "" -#: cp/decl.c:8630 +#: cp/decl.c:8651 #, gcc-internal-format msgid "concept %q#D declared with a deduced return type" msgstr "" -#: cp/decl.c:8632 +#: cp/decl.c:8653 #, gcc-internal-format msgid "concept %q#D with non-% return type %qT" msgstr "" -#: cp/decl.c:8703 +#: cp/decl.c:8724 #, gcc-internal-format msgid "concept %qD has no definition" msgstr "" -#: cp/decl.c:8772 +#: cp/decl.c:8793 #, fuzzy, gcc-internal-format msgid "defining explicit specialization %qD in friend declaration" msgstr "ініцыялізацыя" #. Something like `template friend void f()'. -#: cp/decl.c:8782 +#: cp/decl.c:8803 #, fuzzy, gcc-internal-format msgid "invalid use of template-id %qD in declaration of primary template" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:8800 +#: cp/decl.c:8821 #, gcc-internal-format msgid "default arguments are not allowed in declaration of friend template specialization %qD" msgstr "" -#: cp/decl.c:8808 +#: cp/decl.c:8829 #, gcc-internal-format msgid "% is not allowed in declaration of friend template specialization %qD" msgstr "" -#: cp/decl.c:8857 +#: cp/decl.c:8878 #, gcc-internal-format msgid "cannot declare %<::main%> to be a template" msgstr "" -#: cp/decl.c:8859 +#: cp/decl.c:8880 #, gcc-internal-format msgid "cannot declare %<::main%> to be inline" msgstr "" -#: cp/decl.c:8861 +#: cp/decl.c:8882 #, gcc-internal-format msgid "cannot declare %<::main%> to be %" msgstr "" -#: cp/decl.c:8863 +#: cp/decl.c:8884 #, gcc-internal-format msgid "cannot declare %<::main%> to be static" msgstr "" -#: cp/decl.c:8920 +#: cp/decl.c:8941 #, gcc-internal-format msgid "static member function %qD cannot have cv-qualifier" msgstr "" -#: cp/decl.c:8921 +#: cp/decl.c:8942 #, gcc-internal-format msgid "non-member function %qD cannot have cv-qualifier" msgstr "" -#: cp/decl.c:8929 +#: cp/decl.c:8950 #, gcc-internal-format msgid "static member function %qD cannot have ref-qualifier" msgstr "" -#: cp/decl.c:8930 +#: cp/decl.c:8951 #, gcc-internal-format msgid "non-member function %qD cannot have ref-qualifier" msgstr "" -#: cp/decl.c:8940 +#: cp/decl.c:8961 #, gcc-internal-format msgid "deduction guide %qD must be declared at namespace scope" msgstr "" -#: cp/decl.c:8946 +#: cp/decl.c:8967 #, gcc-internal-format msgid "deduction guide %qD must not have a function body" msgstr "" -#: cp/decl.c:8959 +#: cp/decl.c:8980 #, gcc-internal-format msgid "literal operator with C linkage" msgstr "" -#: cp/decl.c:8969 +#: cp/decl.c:8990 #, fuzzy, gcc-internal-format msgid "%qD has invalid argument list" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:8977 +#: cp/decl.c:8998 #, gcc-internal-format msgid "integer suffix %qs shadowed by implementation" msgstr "" -#: cp/decl.c:8983 +#: cp/decl.c:9004 #, gcc-internal-format msgid "floating point suffix %qs shadowed by implementation" msgstr "" -#: cp/decl.c:8991 +#: cp/decl.c:9012 #, gcc-internal-format msgid "literal operator suffixes not preceded by %<_%> are reserved for future standardization" msgstr "" -#: cp/decl.c:8996 +#: cp/decl.c:9017 #, gcc-internal-format msgid "%qD must be a non-member function" msgstr "" -#: cp/decl.c:9076 +#: cp/decl.c:9097 #, fuzzy, gcc-internal-format #| msgid "`main' must return `int'" msgid "%<::main%> must return %" msgstr "`main' павінна вяртаць `int'" -#: cp/decl.c:9116 +#: cp/decl.c:9137 #, gcc-internal-format msgid "definition of implicitly-declared %qD" msgstr "" -#: cp/decl.c:9121 +#: cp/decl.c:9142 #, gcc-internal-format msgid "definition of explicitly-defaulted %q+D" msgstr "" -#: cp/decl.c:9123 +#: cp/decl.c:9144 #, fuzzy, gcc-internal-format msgid "%q#D explicitly defaulted here" msgstr "ініцыялізацыя" -#: cp/decl.c:9140 +#: cp/decl.c:9161 #, gcc-internal-format msgid "no %q#D member function declared in class %qT" msgstr "" -#: cp/decl.c:9329 +#: cp/decl.c:9350 #, gcc-internal-format msgid "cannot declare %<::main%> to be a global variable" msgstr "" -#: cp/decl.c:9337 +#: cp/decl.c:9358 #, fuzzy, gcc-internal-format msgid "a non-template variable cannot be %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:9344 +#: cp/decl.c:9365 #, gcc-internal-format msgid "concept must have type %" msgstr "" -#: cp/decl.c:9464 +#: cp/decl.c:9485 #, gcc-internal-format msgid "in-class initialization of static data member %q#D of incomplete type" msgstr "" -#: cp/decl.c:9468 +#: cp/decl.c:9489 #, gcc-internal-format msgid "% needed for in-class initialization of static data member %q#D of non-integral type" msgstr "" -#: cp/decl.c:9472 +#: cp/decl.c:9493 #, gcc-internal-format msgid "in-class initialization of static data member %q#D of non-literal type" msgstr "" -#: cp/decl.c:9486 +#: cp/decl.c:9507 #, gcc-internal-format msgid "invalid in-class initialization of static data member of non-integral type %qT" msgstr "" -#: cp/decl.c:9493 +#: cp/decl.c:9514 #, gcc-internal-format msgid "ISO C++ forbids in-class initialization of non-const static member %qD" msgstr "" -#: cp/decl.c:9498 +#: cp/decl.c:9519 #, gcc-internal-format msgid "ISO C++ forbids initialization of member constant %qD of non-integral type %qT" msgstr "" -#: cp/decl.c:9598 +#: cp/decl.c:9619 #, 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:9600 +#: cp/decl.c:9621 #, fuzzy, gcc-internal-format msgid "size of array has non-integral type %qT" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:9630 cp/decl.c:9680 +#: cp/decl.c:9651 cp/decl.c:9701 #, gcc-internal-format msgid "size of array is not an integral constant-expression" msgstr "" -#: cp/decl.c:9646 +#: cp/decl.c:9667 #, fuzzy, gcc-internal-format #| msgid "size of array `%D' is negative" msgid "size of array %qD is negative" msgstr "памер масіва `%D' - адмоўны" -#: cp/decl.c:9648 cp/init.c:3651 +#: cp/decl.c:9669 cp/init.c:3667 #, gcc-internal-format msgid "size of array is negative" msgstr "адмоўны памер масіва " -#: cp/decl.c:9662 +#: cp/decl.c:9683 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids zero-size array %qD" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:9664 +#: cp/decl.c:9685 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids zero-size array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:9677 +#: cp/decl.c:9698 #, fuzzy, gcc-internal-format msgid "size of array %qD is not an integral constant-expression" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:9686 +#: cp/decl.c:9707 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids variable length array %qD" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:9688 +#: cp/decl.c:9709 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids variable length array" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:9694 +#: cp/decl.c:9715 #, gcc-internal-format msgid "variable length array %qD is used" msgstr "" -#: cp/decl.c:9697 +#: cp/decl.c:9718 #, gcc-internal-format msgid "variable length array is used" msgstr "" -#: cp/decl.c:9746 +#: cp/decl.c:9767 #, gcc-internal-format msgid "overflow in array dimension" msgstr "" -#: cp/decl.c:9799 +#: cp/decl.c:9820 #, gcc-internal-format msgid "%qD declared as array of %qT" msgstr "" -#: cp/decl.c:9809 +#: cp/decl.c:9830 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %qD as array of void" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:9811 +#: cp/decl.c:9832 #, gcc-internal-format msgid "creating array of void" msgstr "" -#: cp/decl.c:9816 +#: cp/decl.c:9837 #, gcc-internal-format msgid "declaration of %qD as array of functions" msgstr "" -#: cp/decl.c:9818 +#: cp/decl.c:9839 #, gcc-internal-format msgid "creating array of functions" msgstr "" -#: cp/decl.c:9823 +#: cp/decl.c:9844 #, gcc-internal-format msgid "declaration of %qD as array of references" msgstr "" -#: cp/decl.c:9825 +#: cp/decl.c:9846 #, gcc-internal-format msgid "creating array of references" msgstr "" -#: cp/decl.c:9830 +#: cp/decl.c:9851 #, gcc-internal-format msgid "declaration of %qD as array of function members" msgstr "" -#: cp/decl.c:9832 +#: cp/decl.c:9853 #, gcc-internal-format msgid "creating array of function members" msgstr "" -#: cp/decl.c:9846 +#: cp/decl.c:9867 #, gcc-internal-format msgid "declaration of %qD as multidimensional array must have bounds for all dimensions except the first" msgstr "" -#: cp/decl.c:9850 +#: cp/decl.c:9871 #, gcc-internal-format msgid "multidimensional array must have bounds for all dimensions except the first" msgstr "" -#: cp/decl.c:9909 +#: cp/decl.c:9930 #, gcc-internal-format msgid "return type specification for constructor invalid" msgstr "" -#: cp/decl.c:9912 +#: cp/decl.c:9933 #, fuzzy, gcc-internal-format msgid "qualifiers are not allowed on constructor declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/decl.c:9922 +#: cp/decl.c:9943 #, gcc-internal-format msgid "return type specification for destructor invalid" msgstr "" -#: cp/decl.c:9925 +#: cp/decl.c:9946 #, fuzzy, gcc-internal-format msgid "qualifiers are not allowed on destructor declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/decl.c:9937 +#: cp/decl.c:9958 #, gcc-internal-format msgid "return type specified for %" msgstr "" -#: cp/decl.c:9940 +#: cp/decl.c:9961 #, gcc-internal-format msgid "qualifiers are not allowed on declaration of %" msgstr "" -#: cp/decl.c:9948 +#: cp/decl.c:9969 #, gcc-internal-format msgid "return type specified for deduction guide" msgstr "" -#: cp/decl.c:9951 +#: cp/decl.c:9972 #, gcc-internal-format msgid "qualifiers are not allowed on declaration of deduction guide" msgstr "" -#: cp/decl.c:9955 +#: cp/decl.c:9976 #, gcc-internal-format msgid "template template parameter %qT in declaration of deduction guide" msgstr "" -#: cp/decl.c:9964 +#: cp/decl.c:9985 #, fuzzy, gcc-internal-format msgid "decl-specifier in declaration of deduction guide" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:9985 +#: cp/decl.c:10006 #, gcc-internal-format msgid "unnamed variable or field declared void" msgstr "" -#: cp/decl.c:9992 +#: cp/decl.c:10013 #, gcc-internal-format msgid "variable or field declared void" msgstr "" -#: cp/decl.c:10007 +#: cp/decl.c:10028 #, gcc-internal-format msgid "% specifier invalid for variable %qD declared at block scope" msgstr "" -#: cp/decl.c:10013 +#: cp/decl.c:10034 #, gcc-internal-format msgid "inline variables are only available with -std=c++17 or -std=gnu++17" msgstr "" -#: cp/decl.c:10268 +#: cp/decl.c:10292 #, fuzzy, gcc-internal-format msgid "invalid use of qualified-name %<::%D%>" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:10271 cp/decl.c:10291 +#: cp/decl.c:10295 cp/decl.c:10315 #, fuzzy, gcc-internal-format msgid "invalid use of qualified-name %<%T::%D%>" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:10274 +#: cp/decl.c:10298 #, fuzzy, gcc-internal-format msgid "invalid use of qualified-name %<%D::%D%>" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:10283 +#: cp/decl.c:10307 #, gcc-internal-format msgid "%q#T is not a class or a namespace" msgstr "" -#: cp/decl.c:10305 cp/decl.c:10398 cp/decl.c:10407 cp/decl.c:11970 +#: cp/decl.c:10329 cp/decl.c:10422 cp/decl.c:10431 cp/decl.c:11994 #, fuzzy, gcc-internal-format msgid "declaration of %qD as non-function" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:10311 +#: cp/decl.c:10335 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %qD as non-member" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:10339 +#: cp/decl.c:10363 #, gcc-internal-format msgid "declarator-id missing; using reserved word %qD" msgstr "" -#: cp/decl.c:10390 +#: cp/decl.c:10414 #, gcc-internal-format msgid "function definition does not declare parameters" msgstr "" -#: cp/decl.c:10415 +#: cp/decl.c:10439 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %qD as %" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:10420 +#: cp/decl.c:10444 #, fuzzy, gcc-internal-format #| msgid "declaration of `%#D'" msgid "declaration of %qD as parameter" msgstr "абвяшчэньне `%#D'" -#: cp/decl.c:10454 +#: cp/decl.c:10478 #, gcc-internal-format msgid "% cannot appear in a typedef declaration" msgstr "" -#: cp/decl.c:10460 +#: cp/decl.c:10484 #, gcc-internal-format msgid "% cannot appear in a typedef declaration" msgstr "" -#: cp/decl.c:10468 +#: cp/decl.c:10492 #, fuzzy, gcc-internal-format msgid "two or more data types in declaration of %qs" msgstr "пустое абвяшчэнне" -#: cp/decl.c:10474 +#: cp/decl.c:10498 #, fuzzy, gcc-internal-format #| msgid "conflicts with previous declaration `%#D'" msgid "conflicting specifiers in declaration of %qs" msgstr "канфлікт з папярэднім абвяшчэньнем `%#D'" -#: cp/decl.c:10515 +#: cp/decl.c:10539 #, 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:10564 cp/decl.c:10567 cp/decl.c:10570 +#: cp/decl.c:10588 cp/decl.c:10591 cp/decl.c:10594 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids declaration of %qs with no type" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:10586 +#: cp/decl.c:10610 #, 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:10592 +#: cp/decl.c:10616 #, 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:10614 cp/decl.c:10634 +#: cp/decl.c:10638 cp/decl.c:10658 #, fuzzy, gcc-internal-format #| msgid "long, short, signed or unsigned invalid for `%s'" msgid "% or % invalid for %qs" msgstr "long, short, signed ці unsigned нерэчаісны для \"%s\"" -#: cp/decl.c:10616 +#: cp/decl.c:10640 #, gcc-internal-format msgid "% and % specified together for %qs" msgstr "" -#: cp/decl.c:10618 +#: cp/decl.c:10642 #, fuzzy, gcc-internal-format #| msgid "complex invalid for `%s'" msgid "% invalid for %qs" msgstr "complex нерэчаісны для \"%s\"" -#: cp/decl.c:10620 +#: cp/decl.c:10644 #, fuzzy, gcc-internal-format #| msgid "complex invalid for `%s'" msgid "% invalid for %qs" msgstr "complex нерэчаісны для \"%s\"" -#: cp/decl.c:10622 +#: cp/decl.c:10646 #, fuzzy, gcc-internal-format #| msgid "complex invalid for `%s'" msgid "% invalid for %qs" msgstr "complex нерэчаісны для \"%s\"" -#: cp/decl.c:10624 +#: cp/decl.c:10648 #, fuzzy, gcc-internal-format #| msgid "long, short, signed or unsigned invalid for `%s'" msgid "% or % invalid for %qs" msgstr "long, short, signed ці unsigned нерэчаісны для \"%s\"" -#: cp/decl.c:10626 +#: cp/decl.c:10650 #, gcc-internal-format msgid "%, %, %, or % invalid for %qs" msgstr "" -#: cp/decl.c:10628 +#: cp/decl.c:10652 #, gcc-internal-format msgid "% or % specified with char for %qs" msgstr "" -#: cp/decl.c:10630 +#: cp/decl.c:10654 #, gcc-internal-format msgid "% and % specified together for %qs" msgstr "" -#: cp/decl.c:10636 +#: cp/decl.c:10660 #, fuzzy, gcc-internal-format #| msgid "long, short, signed or unsigned invalid for `%s'" msgid "% or % invalid for %qs" msgstr "long, short, signed ці unsigned нерэчаісны для \"%s\"" -#: cp/decl.c:10644 +#: cp/decl.c:10668 #, fuzzy, gcc-internal-format #| msgid "long, short, signed or unsigned invalid for `%s'" msgid "long, short, signed or unsigned used invalidly for %qs" msgstr "long, short, signed ці unsigned нерэчаісны для \"%s\"" -#: cp/decl.c:10712 +#: cp/decl.c:10736 #, fuzzy, gcc-internal-format #| msgid "complex invalid for `%s'" msgid "complex invalid for %qs" msgstr "complex нерэчаісны для \"%s\"" -#: cp/decl.c:10751 +#: cp/decl.c:10775 #, gcc-internal-format msgid "template placeholder type %qT must be followed by a simple declarator-id" msgstr "" -#: cp/decl.c:10769 +#: cp/decl.c:10793 #, gcc-internal-format msgid "member %qD cannot be declared both % and %" msgstr "" -#: cp/decl.c:10775 +#: cp/decl.c:10799 #, gcc-internal-format msgid "member %qD cannot be declared both % and %" msgstr "" -#: cp/decl.c:10785 +#: cp/decl.c:10809 #, gcc-internal-format msgid "typedef declaration invalid in parameter declaration" msgstr "" -#: cp/decl.c:10790 +#: cp/decl.c:10814 #, gcc-internal-format msgid "storage class specified for template parameter %qs" msgstr "" -#: cp/decl.c:10796 +#: cp/decl.c:10820 #, gcc-internal-format msgid "storage class specifiers invalid in parameter declarations" msgstr "" -#: cp/decl.c:10800 +#: cp/decl.c:10824 #, fuzzy, gcc-internal-format msgid "a parameter cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:10805 +#: cp/decl.c:10829 #, fuzzy, gcc-internal-format msgid "a parameter cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:10815 +#: cp/decl.c:10839 #, fuzzy, gcc-internal-format #| msgid "Invalid declaration" msgid "% outside class declaration" msgstr "Нерэчаіснае абвяшчэнне" -#: cp/decl.c:10825 +#: cp/decl.c:10849 #, gcc-internal-format msgid "structured binding declaration cannot be %" msgstr "" -#: cp/decl.c:10828 +#: cp/decl.c:10852 #, gcc-internal-format msgid "structured binding declaration cannot be %" msgstr "" -#: cp/decl.c:10830 +#: cp/decl.c:10854 #, gcc-internal-format msgid "structured binding declaration cannot be %" msgstr "" -#: cp/decl.c:10834 +#: cp/decl.c:10858 #, gcc-internal-format msgid "structured binding declaration cannot be %qs" msgstr "" -#: cp/decl.c:10839 +#: cp/decl.c:10863 #, gcc-internal-format msgid "structured binding declaration cannot be %" msgstr "" -#: cp/decl.c:10845 +#: cp/decl.c:10869 #, gcc-internal-format msgid "structured binding declaration cannot be %" msgstr "" -#: cp/decl.c:10849 +#: cp/decl.c:10873 #, gcc-internal-format msgid "structured binding declaration cannot be %" msgstr "" -#: cp/decl.c:10853 +#: cp/decl.c:10877 #, gcc-internal-format msgid "structured binding declaration cannot be %" msgstr "" -#: cp/decl.c:10857 +#: cp/decl.c:10881 #, gcc-internal-format msgid "structured binding declaration cannot be %" msgstr "" -#: cp/decl.c:10861 +#: cp/decl.c:10885 #, gcc-internal-format msgid "structured binding declaration cannot be C++98 %" msgstr "" -#: cp/decl.c:10872 +#: cp/decl.c:10896 #, gcc-internal-format msgid "structured binding declaration cannot have type %qT" msgstr "" -#: cp/decl.c:10875 +#: cp/decl.c:10899 #, gcc-internal-format msgid "type must be cv-qualified % or reference to cv-qualified %" msgstr "" -#: cp/decl.c:10906 +#: cp/decl.c:10930 #, fuzzy, gcc-internal-format #| msgid "duplicate label declaration `%s'" msgid "multiple storage classes in declaration of %qs" msgstr "паўторнае абвяшчэньне адмеціны `%s'" -#: cp/decl.c:10929 +#: cp/decl.c:10953 #, gcc-internal-format msgid "storage class specified for %qs" msgstr "" -#: cp/decl.c:10933 +#: cp/decl.c:10957 #, gcc-internal-format msgid "storage class specified for parameter %qs" msgstr "" -#: cp/decl.c:10946 +#: cp/decl.c:10970 #, gcc-internal-format msgid "nested function %qs declared %" msgstr "" -#: cp/decl.c:10950 +#: cp/decl.c:10974 #, gcc-internal-format msgid "top-level declaration of %qs specifies %" msgstr "" -#: cp/decl.c:10957 +#: cp/decl.c:10981 #, gcc-internal-format msgid "function-scope %qs implicitly auto and declared %<__thread%>" msgstr "" -#: cp/decl.c:10969 +#: cp/decl.c:10993 #, gcc-internal-format msgid "storage class specifiers invalid in friend function declarations" msgstr "" -#: cp/decl.c:11050 +#: cp/decl.c:11074 #, fuzzy, gcc-internal-format msgid "unnecessary parentheses in declaration of %qs" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:11098 +#: cp/decl.c:11122 #, gcc-internal-format msgid "requires-clause on return type" msgstr "" -#: cp/decl.c:11118 +#: cp/decl.c:11142 #, gcc-internal-format msgid "%qs function uses % type specifier without trailing return type" msgstr "" -#: cp/decl.c:11121 +#: cp/decl.c:11145 #, gcc-internal-format msgid "deduced return type only available with -std=c++14 or -std=gnu++14" msgstr "" -#: cp/decl.c:11127 +#: cp/decl.c:11151 #, fuzzy, gcc-internal-format #| msgid "virtual functions cannot be friends" msgid "virtual function cannot have deduced return type" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:11134 +#: cp/decl.c:11158 #, gcc-internal-format msgid "%qs function with trailing return type has %qT as its type rather than plain %" msgstr "" -#: cp/decl.c:11147 +#: cp/decl.c:11171 #, gcc-internal-format msgid "deduced class type %qD in function return type" msgstr "" -#: cp/decl.c:11156 +#: cp/decl.c:11180 #, gcc-internal-format msgid "deduction guide for %qT must have trailing return type" msgstr "" -#: cp/decl.c:11169 +#: cp/decl.c:11193 #, gcc-internal-format msgid "trailing return type %qT of deduction guide is not a specialization of %qT" msgstr "" #. Not using maybe_warn_cpp0x because this should #. always be an error. -#: cp/decl.c:11180 +#: cp/decl.c:11204 #, gcc-internal-format msgid "trailing return type only available with -std=c++11 or -std=gnu++11" msgstr "" -#: cp/decl.c:11183 +#: cp/decl.c:11207 #, gcc-internal-format msgid "%qs function with trailing return type not declared with % type specifier" msgstr "" -#: cp/decl.c:11212 +#: cp/decl.c:11236 #, 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:11218 +#: cp/decl.c:11242 #, gcc-internal-format msgid "%qs declared as function returning an array" msgstr "" -#: cp/decl.c:11247 +#: cp/decl.c:11271 #, gcc-internal-format msgid "destructor cannot be static member function" msgstr "" -#: cp/decl.c:11248 +#: cp/decl.c:11272 #, gcc-internal-format msgid "constructor cannot be static member function" msgstr "" -#: cp/decl.c:11252 +#: cp/decl.c:11276 #, gcc-internal-format msgid "destructors may not be cv-qualified" msgstr "" -#: cp/decl.c:11253 +#: cp/decl.c:11277 #, gcc-internal-format msgid "constructors may not be cv-qualified" msgstr "" -#: cp/decl.c:11261 +#: cp/decl.c:11285 #, gcc-internal-format msgid "destructors may not be ref-qualified" msgstr "" -#: cp/decl.c:11262 +#: cp/decl.c:11286 #, gcc-internal-format msgid "constructors may not be ref-qualified" msgstr "" -#: cp/decl.c:11280 +#: cp/decl.c:11304 #, fuzzy, gcc-internal-format msgid "constructors cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" #. Cannot be both friend and virtual. -#: cp/decl.c:11295 +#: cp/decl.c:11319 #, gcc-internal-format msgid "virtual functions cannot be friends" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:11299 +#: cp/decl.c:11323 #, gcc-internal-format msgid "friend declaration not in class definition" msgstr "" -#: cp/decl.c:11301 +#: cp/decl.c:11325 #, fuzzy, gcc-internal-format msgid "can%'t define friend function %qs in a local class definition" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/decl.c:11313 +#: cp/decl.c:11337 #, gcc-internal-format msgid "a conversion function cannot have a trailing return type" msgstr "" -#: cp/decl.c:11339 +#: cp/decl.c:11363 #, gcc-internal-format msgid "destructors may not have parameters" msgstr "" -#: cp/decl.c:11379 +#: cp/decl.c:11403 #, fuzzy, gcc-internal-format msgid "cannot declare pointer to %q#T" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:11392 cp/decl.c:11399 +#: cp/decl.c:11416 cp/decl.c:11423 #, fuzzy, gcc-internal-format msgid "cannot declare reference to %q#T" msgstr "Не магу знайсці файл для класа %s." -#: cp/decl.c:11401 +#: cp/decl.c:11425 #, gcc-internal-format msgid "cannot declare pointer to %q#T member" msgstr "" -#: cp/decl.c:11430 +#: cp/decl.c:11454 #, gcc-internal-format msgid "cannot declare reference to qualified function type %qT" msgstr "" -#: cp/decl.c:11431 +#: cp/decl.c:11455 #, fuzzy, gcc-internal-format msgid "cannot declare pointer to qualified function type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:11504 +#: cp/decl.c:11528 #, gcc-internal-format msgid "cannot declare reference to %q#T, which is not a typedef or a template type argument" msgstr "" -#: cp/decl.c:11574 +#: cp/decl.c:11598 #, gcc-internal-format msgid "template-id %qD used as a declarator" msgstr "" -#: cp/decl.c:11599 +#: cp/decl.c:11623 #, gcc-internal-format msgid "member functions are implicitly friends of their class" msgstr "" -#: cp/decl.c:11605 +#: cp/decl.c:11629 #, gcc-internal-format msgid "extra qualification %<%T::%> on member %qs" msgstr "" -#: cp/decl.c:11635 +#: cp/decl.c:11659 #, gcc-internal-format msgid "cannot define member function %<%T::%s%> within %qT" msgstr "" -#: cp/decl.c:11637 +#: cp/decl.c:11661 #, gcc-internal-format msgid "cannot declare member function %<%T::%s%> within %qT" msgstr "" -#: cp/decl.c:11645 +#: cp/decl.c:11669 #, gcc-internal-format msgid "cannot declare member %<%T::%s%> within %qT" msgstr "" -#: cp/decl.c:11685 +#: cp/decl.c:11709 #, gcc-internal-format msgid "non-parameter %qs cannot be a parameter pack" msgstr "" -#: cp/decl.c:11693 +#: cp/decl.c:11717 #, gcc-internal-format msgid "data member may not have variably modified type %qT" msgstr "" -#: cp/decl.c:11695 +#: cp/decl.c:11719 #, gcc-internal-format msgid "parameter may not have variably modified type %qT" msgstr "" -#: cp/decl.c:11706 +#: cp/decl.c:11730 #, fuzzy, gcc-internal-format #| msgid "duplicate label declaration `%s'" msgid "% outside class declaration" msgstr "паўторнае абвяшчэньне адмеціны `%s'" -#: cp/decl.c:11709 +#: cp/decl.c:11733 #, fuzzy, gcc-internal-format msgid "% in friend declaration" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:11712 +#: cp/decl.c:11736 #, gcc-internal-format msgid "only declarations of constructors and conversion operators can be %" msgstr "" -#: cp/decl.c:11721 +#: cp/decl.c:11745 #, fuzzy, gcc-internal-format msgid "non-member %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:11726 +#: cp/decl.c:11750 #, gcc-internal-format msgid "non-object member %qs cannot be declared %" msgstr "" -#: cp/decl.c:11732 +#: cp/decl.c:11756 #, fuzzy, gcc-internal-format msgid "function %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:11737 +#: cp/decl.c:11761 #, fuzzy, gcc-internal-format msgid "static %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:11742 +#: cp/decl.c:11766 #, fuzzy, gcc-internal-format msgid "const %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:11747 +#: cp/decl.c:11771 #, fuzzy, gcc-internal-format msgid "reference %qs cannot be declared %" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:11778 +#: cp/decl.c:11802 #, gcc-internal-format msgid "typedef declared %" msgstr "" -#: cp/decl.c:11783 +#: cp/decl.c:11807 #, gcc-internal-format msgid "requires-clause on typedef" msgstr "" -#: cp/decl.c:11787 +#: cp/decl.c:11811 #, gcc-internal-format msgid "typedef name may not be a nested-name-specifier" msgstr "" -#: cp/decl.c:11813 +#: cp/decl.c:11837 #, gcc-internal-format msgid "ISO C++ forbids nested type %qD with same name as enclosing class" msgstr "" -#: cp/decl.c:11900 +#: cp/decl.c:11924 #, fuzzy, gcc-internal-format msgid "% specified for friend class declaration" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:11908 +#: cp/decl.c:11932 #, fuzzy, gcc-internal-format msgid "template parameters cannot be friends" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:11910 +#: cp/decl.c:11934 #, gcc-internal-format msgid "friend declaration requires class-key, i.e. %" msgstr "" -#: cp/decl.c:11914 +#: cp/decl.c:11938 #, gcc-internal-format msgid "friend declaration requires class-key, i.e. %" msgstr "" -#: cp/decl.c:11927 +#: cp/decl.c:11951 #, gcc-internal-format msgid "trying to make class %qT a friend of global scope" msgstr "" -#: cp/decl.c:11947 +#: cp/decl.c:11971 #, gcc-internal-format msgid "invalid qualifiers on non-member function type" msgstr "" -#: cp/decl.c:11951 +#: cp/decl.c:11975 #, gcc-internal-format msgid "requires-clause on type-id" msgstr "" -#: cp/decl.c:11961 +#: cp/decl.c:11985 #, gcc-internal-format msgid "abstract declarator %qT used as declaration" msgstr "" -#: cp/decl.c:11976 +#: cp/decl.c:12000 #, fuzzy, gcc-internal-format msgid "requires-clause on declaration of non-function type %qT" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:11995 +#: cp/decl.c:12019 #, fuzzy, gcc-internal-format msgid "cannot use %<::%> in parameter declaration" msgstr "Не магу знайсці дэкларацыю пратакола для \"%s\"" -#: cp/decl.c:12001 +#: cp/decl.c:12025 #, gcc-internal-format msgid "% parameter not permitted in this context" msgstr "" -#: cp/decl.c:12003 +#: cp/decl.c:12027 #, fuzzy, gcc-internal-format msgid "parameter declared %" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/decl.c:12052 cp/parser.c:3270 +#: cp/decl.c:12076 cp/parser.c:3270 #, fuzzy, gcc-internal-format msgid "invalid use of template-name %qE without an argument list" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:12056 +#: cp/decl.c:12080 #, gcc-internal-format msgid "non-static data member declared with placeholder %qT" msgstr "" -#: cp/decl.c:12080 +#: cp/decl.c:12104 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids flexible array member %qs" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/decl.c:12083 +#: cp/decl.c:12107 #, 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:12099 +#: cp/decl.c:12123 #, fuzzy, gcc-internal-format #| msgid "invalid use of `::'" msgid "invalid use of %<::%>" msgstr "нерэчаіснае выкарыстаньне `::'" -#: cp/decl.c:12121 +#: cp/decl.c:12145 #, fuzzy, gcc-internal-format msgid "declaration of function %qD in invalid context" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:12130 +#: cp/decl.c:12154 #, fuzzy, gcc-internal-format msgid "function %qD declared % inside a union" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:12139 +#: cp/decl.c:12163 #, gcc-internal-format msgid "%qD cannot be declared %, since it is always static" msgstr "" -#: cp/decl.c:12153 +#: cp/decl.c:12177 #, gcc-internal-format msgid "expected qualified name in friend declaration for destructor %qD" msgstr "" -#: cp/decl.c:12160 +#: cp/decl.c:12184 #, fuzzy, gcc-internal-format #| msgid "declaration of template `%#D'" msgid "declaration of %qD as member of %qT" msgstr "абвяшчэньне шаблёну `%#D'" -#: cp/decl.c:12166 +#: cp/decl.c:12190 #, gcc-internal-format msgid "a destructor cannot be %" msgstr "" -#: cp/decl.c:12171 +#: cp/decl.c:12195 #, gcc-internal-format msgid "a destructor cannot be %" msgstr "" -#: cp/decl.c:12177 +#: cp/decl.c:12201 #, gcc-internal-format msgid "expected qualified name in friend declaration for constructor %qD" msgstr "" -#: cp/decl.c:12185 +#: cp/decl.c:12209 #, gcc-internal-format msgid "a constructor cannot be %" msgstr "" -#: cp/decl.c:12190 +#: cp/decl.c:12214 #, fuzzy, gcc-internal-format msgid "a concept cannot be a member function" msgstr "\"%s\" звычайна функцыя" -#: cp/decl.c:12199 +#: cp/decl.c:12223 #, gcc-internal-format msgid "specialization of variable template %qD declared as function" msgstr "" -#: cp/decl.c:12202 +#: cp/decl.c:12226 #, fuzzy, gcc-internal-format msgid "variable template declared here" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:12257 +#: cp/decl.c:12281 #, fuzzy, gcc-internal-format msgid "field %qD has incomplete type %qT" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:12262 +#: cp/decl.c:12286 #, fuzzy, gcc-internal-format msgid "name %qT has incomplete type" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:12272 +#: cp/decl.c:12296 #, fuzzy, gcc-internal-format msgid "%qE is neither function nor member function; cannot be declared friend" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/decl.c:12318 +#: cp/decl.c:12342 #, gcc-internal-format msgid "static data member %qE declared %" msgstr "" -#: cp/decl.c:12322 +#: cp/decl.c:12346 #, gcc-internal-format msgid "% static data member %qD must have an initializer" msgstr "" -#: cp/decl.c:12350 +#: cp/decl.c:12374 #, gcc-internal-format msgid "non-static data member %qE declared %" msgstr "" -#: cp/decl.c:12354 +#: cp/decl.c:12378 #, gcc-internal-format msgid "non-static data member %qE declared %" msgstr "" -#: cp/decl.c:12409 +#: cp/decl.c:12433 #, gcc-internal-format msgid "storage class % invalid for function %qs" msgstr "" -#: cp/decl.c:12411 +#: cp/decl.c:12435 #, gcc-internal-format msgid "storage class % invalid for function %qs" msgstr "" -#: cp/decl.c:12415 +#: cp/decl.c:12439 #, gcc-internal-format msgid "storage class %<__thread%> invalid for function %qs" msgstr "" -#: cp/decl.c:12418 +#: cp/decl.c:12442 #, gcc-internal-format msgid "storage class % invalid for function %qs" msgstr "" -#: cp/decl.c:12423 +#: cp/decl.c:12447 #, gcc-internal-format msgid "virt-specifiers in %qs not allowed outside a class definition" msgstr "" -#: cp/decl.c:12434 +#: cp/decl.c:12458 #, gcc-internal-format msgid "% specifier invalid for function %qs declared out of global scope" msgstr "" -#: cp/decl.c:12438 +#: cp/decl.c:12462 #, gcc-internal-format msgid "% specifier invalid for function %qs declared out of global scope" msgstr "" -#: cp/decl.c:12446 +#: cp/decl.c:12470 #, gcc-internal-format msgid "virtual non-class function %qs" msgstr "" -#: cp/decl.c:12453 +#: cp/decl.c:12477 #, gcc-internal-format msgid "%qs defined in a non-class scope" msgstr "" -#: cp/decl.c:12454 +#: cp/decl.c:12478 #, fuzzy, gcc-internal-format msgid "%qs declared in a non-class scope" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:12489 +#: cp/decl.c:12513 #, gcc-internal-format msgid "cannot declare member function %qD to have static linkage" msgstr "" #. 7.1.1: There can be no static function declarations within a #. block. -#: cp/decl.c:12497 +#: cp/decl.c:12521 #, gcc-internal-format msgid "cannot declare static function inside another function" msgstr "" -#: cp/decl.c:12533 +#: cp/decl.c:12557 #, gcc-internal-format msgid "% may not be used when defining (as opposed to declaring) a static data member" msgstr "" -#: cp/decl.c:12540 +#: cp/decl.c:12564 #, gcc-internal-format msgid "static member %qD declared %" msgstr "" -#: cp/decl.c:12546 +#: cp/decl.c:12570 #, gcc-internal-format msgid "cannot explicitly declare member %q#D to have extern linkage" msgstr "" -#: cp/decl.c:12553 +#: cp/decl.c:12577 #, gcc-internal-format msgid "declaration of % variable %qD is not a definition" msgstr "" -#: cp/decl.c:12574 +#: cp/decl.c:12598 #, fuzzy, gcc-internal-format msgid "declaration of %q#D has no initializer" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl.c:12585 +#: cp/decl.c:12609 #, gcc-internal-format msgid "%qs initialized and declared %" msgstr "" -#: cp/decl.c:12589 +#: cp/decl.c:12613 #, gcc-internal-format msgid "%qs has both % and initializer" msgstr "" -#: cp/decl.c:12754 +#: cp/decl.c:12778 #, fuzzy, gcc-internal-format msgid "default argument %qE uses %qD" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: cp/decl.c:12757 +#: cp/decl.c:12781 #, fuzzy, gcc-internal-format msgid "default argument %qE uses local variable %qD" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: cp/decl.c:12841 +#: cp/decl.c:12865 #, fuzzy, gcc-internal-format msgid "invalid use of cv-qualified type %qT in parameter declaration" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:12845 +#: cp/decl.c:12869 #, fuzzy, gcc-internal-format msgid "invalid use of type % in parameter declaration" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:12868 +#: cp/decl.c:12892 #, fuzzy, gcc-internal-format msgid "parameter %qD invalidly declared method type" msgstr "тып параметра \"%s\" не аб'яўлены" -#: cp/decl.c:12895 +#: cp/decl.c:12919 #, gcc-internal-format msgid "parameter %qD includes pointer to array of unknown bound %qT" msgstr "" -#: cp/decl.c:12897 +#: cp/decl.c:12921 #, gcc-internal-format msgid "parameter %qD includes reference to array of unknown bound %qT" msgstr "" @@ -43417,172 +43460,172 @@ msgstr "" #. or implicitly defined), there's no need to worry about their #. existence. Theoretically, they should never even be #. instantiated, but that's hard to forestall. -#: cp/decl.c:13150 +#: cp/decl.c:13174 #, gcc-internal-format msgid "invalid constructor; you probably meant %<%T (const %T&)%>" msgstr "" -#: cp/decl.c:13228 +#: cp/decl.c:13252 #, fuzzy, gcc-internal-format msgid "%qD may not be declared within a namespace" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:13234 +#: cp/decl.c:13258 #, fuzzy, gcc-internal-format msgid "%qD may not be declared as static" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" -#: cp/decl.c:13261 +#: cp/decl.c:13285 #, gcc-internal-format msgid "%qD must be a nonstatic member function" msgstr "" -#: cp/decl.c:13267 +#: cp/decl.c:13291 #, gcc-internal-format msgid "%qD must be either a non-static member function or a non-member function" msgstr "" -#: cp/decl.c:13277 +#: cp/decl.c:13301 #, gcc-internal-format msgid "%qD must have an argument of class or enumerated type" msgstr "" #. 13.4.0.3 -#: cp/decl.c:13303 +#: cp/decl.c:13327 #, gcc-internal-format msgid "ISO C++ prohibits overloading operator ?:" msgstr "" #. Variadic. -#: cp/decl.c:13314 +#: cp/decl.c:13338 #, gcc-internal-format msgid "%qD must not have variable number of arguments" msgstr "" -#: cp/decl.c:13338 +#: cp/decl.c:13362 #, gcc-internal-format msgid "%qD must have either zero or one argument" msgstr "" -#: cp/decl.c:13339 +#: cp/decl.c:13363 #, gcc-internal-format msgid "%qD must have either one or two arguments" msgstr "" -#: cp/decl.c:13350 +#: cp/decl.c:13374 #, gcc-internal-format msgid "postfix %qD must have % as its argument" msgstr "" -#: cp/decl.c:13351 +#: cp/decl.c:13375 #, gcc-internal-format msgid "postfix %qD must have % as its second argument" msgstr "" -#: cp/decl.c:13361 +#: cp/decl.c:13385 #, fuzzy, gcc-internal-format #| msgid "no arguments" msgid "%qD must have no arguments" msgstr "няма аргументаў" -#: cp/decl.c:13362 cp/decl.c:13371 +#: cp/decl.c:13386 cp/decl.c:13395 #, gcc-internal-format msgid "%qD must have exactly one argument" msgstr "" -#: cp/decl.c:13372 +#: cp/decl.c:13396 #, gcc-internal-format msgid "%qD must have exactly two arguments" msgstr "" -#: cp/decl.c:13389 cp/decl.c:13392 +#: cp/decl.c:13413 cp/decl.c:13416 #, fuzzy, gcc-internal-format msgid "%qD cannot have default arguments" msgstr "нехапае аргументаў у функцыі \"%s\"" -#: cp/decl.c:13419 +#: cp/decl.c:13443 #, gcc-internal-format msgid "conversion to a reference to void will never use a type conversion operator" msgstr "" -#: cp/decl.c:13421 +#: cp/decl.c:13445 #, gcc-internal-format msgid "conversion to void will never use a type conversion operator" msgstr "" -#: cp/decl.c:13428 +#: cp/decl.c:13452 #, gcc-internal-format msgid "conversion to a reference to the same type will never use a type conversion operator" msgstr "" -#: cp/decl.c:13430 +#: cp/decl.c:13454 #, gcc-internal-format msgid "conversion to the same type will never use a type conversion operator" msgstr "" -#: cp/decl.c:13438 +#: cp/decl.c:13462 #, gcc-internal-format msgid "conversion to a reference to a base class will never use a type conversion operator" msgstr "" -#: cp/decl.c:13440 +#: cp/decl.c:13464 #, gcc-internal-format msgid "conversion to a base class will never use a type conversion operator" msgstr "" -#: cp/decl.c:13455 +#: cp/decl.c:13479 #, gcc-internal-format msgid "user-defined %qD always evaluates both arguments" msgstr "" -#: cp/decl.c:13474 +#: cp/decl.c:13498 #, gcc-internal-format msgid "prefix %qD should return %qT" msgstr "" -#: cp/decl.c:13480 +#: cp/decl.c:13504 #, gcc-internal-format msgid "postfix %qD should return %qT" msgstr "" -#: cp/decl.c:13492 +#: cp/decl.c:13516 #, gcc-internal-format msgid "%qD should return by value" msgstr "" -#: cp/decl.c:13547 +#: cp/decl.c:13571 #, fuzzy, gcc-internal-format msgid "using template type parameter %qT after %qs" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/decl.c:13570 +#: cp/decl.c:13594 #, gcc-internal-format msgid "using alias template specialization %qT after %qs" msgstr "" -#: cp/decl.c:13573 +#: cp/decl.c:13597 #, gcc-internal-format msgid "using typedef-name %qD after %qs" msgstr "" -#: cp/decl.c:13575 +#: cp/decl.c:13599 #, fuzzy, gcc-internal-format #| msgid "this is a previous declaration" msgid "%qD has a previous declaration here" msgstr "гэта папярэдняе абвяшчэньне" -#: cp/decl.c:13583 +#: cp/decl.c:13607 #, gcc-internal-format msgid "%qT referred to as %qs" msgstr "" -#: cp/decl.c:13584 cp/decl.c:13591 +#: cp/decl.c:13608 cp/decl.c:13615 #, fuzzy, gcc-internal-format #| msgid "this is a previous declaration" msgid "%qT has a previous declaration here" msgstr "гэта папярэдняе абвяшчэньне" -#: cp/decl.c:13590 +#: cp/decl.c:13614 #, gcc-internal-format msgid "%qT referred to as enum" msgstr "" @@ -43594,95 +43637,95 @@ msgstr "" #. void f(class C); // No template header here #. #. then the required template argument is missing. -#: cp/decl.c:13605 +#: cp/decl.c:13629 #, fuzzy, gcc-internal-format msgid "template argument required for %<%s %T%>" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/decl.c:13659 cp/name-lookup.c:4652 +#: cp/decl.c:13683 cp/name-lookup.c:4652 #, gcc-internal-format msgid "%qD has the same name as the class in which it is declared" msgstr "" -#: cp/decl.c:13689 cp/friend.c:301 cp/parser.c:3096 cp/parser.c:6425 -#: cp/pt.c:9209 +#: cp/decl.c:13713 cp/friend.c:301 cp/parser.c:3096 cp/parser.c:6428 +#: cp/pt.c:9223 #, fuzzy, gcc-internal-format msgid "%qT is not a template" msgstr "\"%s\" мае незавершаны тып" -#: cp/decl.c:13694 +#: cp/decl.c:13718 #, gcc-internal-format msgid "perhaps you want to explicitly add %<%T::%>" msgstr "" -#: cp/decl.c:13703 cp/name-lookup.c:4079 cp/name-lookup.c:4086 -#: cp/name-lookup.c:4939 cp/parser.c:6376 cp/parser.c:26300 +#: cp/decl.c:13727 cp/name-lookup.c:4079 cp/name-lookup.c:4086 +#: cp/name-lookup.c:4939 cp/parser.c:6379 cp/parser.c:26297 #, fuzzy, gcc-internal-format msgid "reference to %qD is ambiguous" msgstr "памер \"%s\" - %d байт" -#: cp/decl.c:13806 +#: cp/decl.c:13830 #, fuzzy, gcc-internal-format msgid "use of enum %q#D without previous declaration" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: cp/decl.c:13842 +#: cp/decl.c:13866 #, fuzzy, gcc-internal-format #| msgid "declaration of template `%#D'" msgid "redeclaration of %qT as a non-template" msgstr "абвяшчэньне шаблёну `%#D'" -#: cp/decl.c:13982 +#: cp/decl.c:14006 #, gcc-internal-format msgid "derived union %qT invalid" msgstr "" -#: cp/decl.c:13989 +#: cp/decl.c:14013 #, gcc-internal-format msgid "%qT defined with multiple direct bases" msgstr "" -#: cp/decl.c:14000 +#: cp/decl.c:14024 #, gcc-internal-format msgid "%qT defined with direct virtual base" msgstr "" -#: cp/decl.c:14025 +#: cp/decl.c:14049 #, gcc-internal-format msgid "base type %qT fails to be a struct or class type" msgstr "" -#: cp/decl.c:14055 +#: cp/decl.c:14079 #, gcc-internal-format msgid "recursive type %qT undefined" msgstr "" -#: cp/decl.c:14057 +#: cp/decl.c:14081 #, fuzzy, gcc-internal-format msgid "duplicate base type %qT invalid" msgstr "паўтарэнне \"restrict\"" -#: cp/decl.c:14202 +#: cp/decl.c:14226 #, gcc-internal-format msgid "scoped/unscoped mismatch in enum %q#T" msgstr "" -#: cp/decl.c:14205 cp/decl.c:14213 cp/decl.c:14225 cp/parser.c:18284 +#: cp/decl.c:14229 cp/decl.c:14237 cp/decl.c:14249 cp/parser.c:18281 #, gcc-internal-format msgid "previous definition here" msgstr "папярэдняе вызначэньне" -#: cp/decl.c:14210 +#: cp/decl.c:14234 #, gcc-internal-format msgid "underlying type mismatch in enum %q#T" msgstr "" -#: cp/decl.c:14222 +#: cp/decl.c:14246 #, gcc-internal-format msgid "different underlying type in enum %q#T" msgstr "" -#: cp/decl.c:14300 +#: cp/decl.c:14324 #, gcc-internal-format msgid "underlying type %qT of %qT must be an integral type" msgstr "" @@ -43691,78 +43734,78 @@ msgstr "" #. #. IF no integral type can represent all the enumerator values, the #. enumeration is ill-formed. -#: cp/decl.c:14447 +#: cp/decl.c:14471 #, gcc-internal-format msgid "no integral type can represent all of the enumerator values for %qT" msgstr "" -#: cp/decl.c:14619 +#: cp/decl.c:14643 #, gcc-internal-format msgid "enumerator value for %qD must have integral or unscoped enumeration type" msgstr "" -#: cp/decl.c:14629 +#: cp/decl.c:14653 #, fuzzy, gcc-internal-format msgid "enumerator value for %qD is not an integer constant" msgstr "памер масіва \"%s\" адмоўны" -#: cp/decl.c:14678 +#: cp/decl.c:14702 #, gcc-internal-format msgid "incremented enumerator value is too large for %" msgstr "" -#: cp/decl.c:14679 +#: cp/decl.c:14703 #, gcc-internal-format msgid "incremented enumerator value is too large for %" msgstr "" -#: cp/decl.c:14690 +#: cp/decl.c:14714 #, gcc-internal-format msgid "overflow in enumeration values at %qD" msgstr "" -#: cp/decl.c:14710 +#: cp/decl.c:14734 #, gcc-internal-format msgid "enumerator value %qE is outside the range of underlying type %qT" msgstr "" -#: cp/decl.c:14821 +#: cp/decl.c:14845 #, fuzzy, gcc-internal-format msgid "return type %q#T is incomplete" msgstr "вяртаемы тып \"%s\" не \"int\"" -#: cp/decl.c:14999 cp/typeck.c:9286 +#: cp/decl.c:15023 cp/typeck.c:9286 #, gcc-internal-format msgid "% should return a reference to %<*this%>" msgstr "" -#: cp/decl.c:15344 +#: cp/decl.c:15368 #, fuzzy, gcc-internal-format #| msgid "Invalid declaration" msgid "invalid function declaration" msgstr "Нерэчаіснае абвяшчэнне" -#: cp/decl.c:15786 +#: cp/decl.c:15810 #, gcc-internal-format msgid "no return statements in function returning %qT" msgstr "" -#: cp/decl.c:15788 cp/typeck.c:9166 +#: cp/decl.c:15812 cp/typeck.c:9166 #, gcc-internal-format msgid "only plain % return type can be deduced to %" msgstr "" -#: cp/decl.c:15996 +#: cp/decl.c:16020 #, fuzzy, gcc-internal-format msgid "invalid member function declaration" msgstr "паўторнае абвяшчэнне меткі \"%s\"" -#: cp/decl.c:16010 +#: cp/decl.c:16034 #, fuzzy, gcc-internal-format msgid "%qD is already defined in class %qT" msgstr "не знойдзен клас \"%s\"" -#: cp/decl.c:16386 +#: cp/decl.c:16410 #, gcc-internal-format msgid "use of %qD before deduction of %" msgstr "" @@ -43802,7 +43845,7 @@ msgstr "" msgid "deleting %qT is undefined" msgstr "метка \"%s\" ужываецца, але не вызначана" -#: cp/decl2.c:585 cp/pt.c:5552 +#: cp/decl2.c:585 cp/pt.c:5566 #, fuzzy, gcc-internal-format msgid "template declaration of %q#D" msgstr "пустое абвяшчэнне" @@ -43815,7 +43858,7 @@ msgstr "" #. [temp.mem] #. #. A destructor shall not be a member template. -#: cp/decl2.c:640 cp/pt.c:5511 +#: cp/decl2.c:640 cp/pt.c:5525 #, gcc-internal-format msgid "destructor %qD declared as member template" msgstr "" @@ -43990,47 +44033,47 @@ msgstr "" msgid "% takes type %qT as first parameter" msgstr "" -#: cp/decl2.c:2660 +#: cp/decl2.c:2650 #, gcc-internal-format msgid "%qT has a field %qD whose type has no linkage" msgstr "" -#: cp/decl2.c:2664 +#: cp/decl2.c:2654 #, gcc-internal-format msgid "%qT has a field %qD whose type depends on the type %qT which has no linkage" msgstr "" -#: cp/decl2.c:2669 +#: cp/decl2.c:2659 #, gcc-internal-format msgid "%qT has a field %qD whose type uses the anonymous namespace" msgstr "" -#: cp/decl2.c:2677 +#: cp/decl2.c:2667 #, gcc-internal-format msgid "%qT declared with greater visibility than the type of its field %qD" msgstr "" -#: cp/decl2.c:2695 +#: cp/decl2.c:2685 #, gcc-internal-format msgid "%qT has a base %qT whose type has no linkage" msgstr "" -#: cp/decl2.c:2699 +#: cp/decl2.c:2689 #, gcc-internal-format msgid "%qT has a base %qT whose type depends on the type %qT which has no linkage" msgstr "" -#: cp/decl2.c:2704 +#: cp/decl2.c:2694 #, gcc-internal-format msgid "%qT has a base %qT whose type uses the anonymous namespace" msgstr "" -#: cp/decl2.c:2711 +#: cp/decl2.c:2701 #, gcc-internal-format msgid "%qT declared with greater visibility than its base %qT" msgstr "" -#: cp/decl2.c:4309 +#: cp/decl2.c:4299 #, gcc-internal-format msgid "%q#D, declared using unnamed type, is used but never defined" msgstr "" @@ -44039,82 +44082,82 @@ msgstr "" #. no linkage can only be used to declare extern "C" #. entities. Since it's not always an error in the #. ISO C++ 90 Standard, we only issue a warning. -#: cp/decl2.c:4318 +#: cp/decl2.c:4308 #, gcc-internal-format msgid "unnamed type with no linkage used to declare variable %q#D with linkage" msgstr "" -#: cp/decl2.c:4322 +#: cp/decl2.c:4312 #, gcc-internal-format msgid "unnamed type with no linkage used to declare function %q#D with linkage" msgstr "" -#: cp/decl2.c:4326 +#: cp/decl2.c:4316 #, gcc-internal-format msgid "%q#D does not refer to the unqualified type, so it is not used for linkage" msgstr "" -#: cp/decl2.c:4334 +#: cp/decl2.c:4324 #, gcc-internal-format msgid "%q#D, declared using local type %qT, is used but never defined" msgstr "" -#: cp/decl2.c:4338 +#: cp/decl2.c:4328 #, gcc-internal-format msgid "type %qT with no linkage used to declare variable %q#D with linkage" msgstr "" -#: cp/decl2.c:4341 +#: cp/decl2.c:4331 #, fuzzy, gcc-internal-format msgid "type %qT with no linkage used to declare function %q#D with linkage" msgstr "няма папярэдняга аб'яўлення для \"%s\"" -#: cp/decl2.c:4529 +#: cp/decl2.c:4519 #, fuzzy, gcc-internal-format #| msgid "section of `%s' conflicts with previous declaration" msgid "mangling of %q#D as %qE conflicts with a previous mangle" msgstr "секцыя \"%s\" канфліктуе з папярэдняй дэкларацыяй" -#: cp/decl2.c:4532 +#: cp/decl2.c:4522 #, fuzzy, gcc-internal-format #| msgid "previous declaration `%D'" msgid "previous mangling %q#D" msgstr "папярэдняе абвяшчэньне `%D'" -#: cp/decl2.c:4534 +#: cp/decl2.c:4524 #, gcc-internal-format msgid "a later -fabi-version= (or =0) avoids this error with a change in mangling" msgstr "" -#: cp/decl2.c:4606 cp/decl2.c:4609 +#: cp/decl2.c:4596 cp/decl2.c:4599 #, gcc-internal-format msgid "the program should also define %qD" msgstr "" -#: cp/decl2.c:4956 +#: cp/decl2.c:4946 #, fuzzy, gcc-internal-format #| msgid "label `%D' used but not defined" msgid "inline function %qD used but never defined" msgstr "адмеціна `%D' выкарыстоўвываецца, але ня вызначана" -#: cp/decl2.c:5143 +#: cp/decl2.c:5133 #, fuzzy, gcc-internal-format msgid "default argument missing for parameter %P of %q+#D" msgstr "аргумент для \"%s\" прапушчан" #. We mark a lambda conversion op as deleted if we can't #. generate it properly; see maybe_add_lambda_conv_op. -#: cp/decl2.c:5251 +#: cp/decl2.c:5241 #, gcc-internal-format msgid "converting lambda that uses %<...%> to function pointer" msgstr "" -#: cp/decl2.c:5254 +#: cp/decl2.c:5244 #, gcc-internal-format msgid "use of deleted function %qD" msgstr "" -#: cp/decl2.c:5307 +#: cp/decl2.c:5297 #, gcc-internal-format msgid "use of built-in parameter pack %qD outside of a template" msgstr "" @@ -44401,335 +44444,335 @@ msgstr "" msgid "recursive instantiation of default member initializer for %qD" msgstr "" -#: cp/init.c:613 +#: cp/init.c:629 #, gcc-internal-format msgid "default member initializer for %qD required before the end of its enclosing class" msgstr "" -#: cp/init.c:615 +#: cp/init.c:631 #, gcc-internal-format msgid "defined here" msgstr "" -#: cp/init.c:673 +#: cp/init.c:689 #, fuzzy, gcc-internal-format msgid "initializer for flexible array member %q#D" msgstr "прапушчан ініцыялізатар" -#: cp/init.c:699 +#: cp/init.c:715 #, fuzzy, gcc-internal-format msgid "%qD should be initialized in the member initialization list" msgstr "нерэчаісны ініцыялізатар" -#: cp/init.c:720 +#: cp/init.c:736 #, fuzzy, gcc-internal-format msgid "%qD is initialized with itself" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/init.c:831 +#: cp/init.c:847 #, fuzzy, gcc-internal-format msgid "invalid initializer for array member %q#D" msgstr "нерэчаісны ініцыялізатар" -#: cp/init.c:845 cp/init.c:869 cp/init.c:2410 cp/method.c:1368 +#: cp/init.c:861 cp/init.c:885 cp/init.c:2427 cp/method.c:1368 #, fuzzy, gcc-internal-format msgid "uninitialized const member in %q#T" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/init.c:847 cp/init.c:864 cp/init.c:871 cp/init.c:2395 cp/init.c:2423 +#: cp/init.c:863 cp/init.c:880 cp/init.c:887 cp/init.c:2412 cp/init.c:2440 #: cp/method.c:1371 cp/method.c:1382 #, fuzzy, gcc-internal-format msgid "%q#D should be initialized" msgstr "параметр \"%s\" ініцыялізаваны" -#: cp/init.c:862 cp/init.c:2382 cp/method.c:1379 +#: cp/init.c:878 cp/init.c:2399 cp/method.c:1379 #, fuzzy, gcc-internal-format msgid "uninitialized reference member in %q#T" msgstr "прапушчан ініцыялізатар" -#: cp/init.c:1041 +#: cp/init.c:1057 #, gcc-internal-format msgid "%qD will be initialized after" msgstr "" -#: cp/init.c:1044 +#: cp/init.c:1060 #, fuzzy, gcc-internal-format msgid "base %qT will be initialized after" msgstr "Клас \"%s\" ужо існуе" -#: cp/init.c:1048 +#: cp/init.c:1064 #, gcc-internal-format msgid " %q#D" msgstr "" -#: cp/init.c:1050 +#: cp/init.c:1066 #, gcc-internal-format msgid " base %qT" msgstr "" -#: cp/init.c:1052 +#: cp/init.c:1068 #, fuzzy, gcc-internal-format #| msgid "invalid initializer" msgid " when initialized here" msgstr "нерэчаісны ініцыялізатар" -#: cp/init.c:1069 +#: cp/init.c:1085 #, fuzzy, gcc-internal-format msgid "multiple initializations given for %qD" msgstr "ініцыялізацыя" -#: cp/init.c:1073 +#: cp/init.c:1089 #, gcc-internal-format msgid "multiple initializations given for base %qT" msgstr "" -#: cp/init.c:1158 +#: cp/init.c:1174 #, gcc-internal-format msgid "initializations for multiple members of %qT" msgstr "" -#: cp/init.c:1255 +#: cp/init.c:1271 #, gcc-internal-format msgid "base class %q#T should be explicitly initialized in the copy constructor" msgstr "" -#: cp/init.c:1482 cp/init.c:1501 +#: cp/init.c:1498 cp/init.c:1517 #, gcc-internal-format msgid "class %qT does not have any field named %qD" msgstr "" -#: cp/init.c:1488 +#: cp/init.c:1504 #, gcc-internal-format msgid "%q#D is a static data member; it can only be initialized at its definition" msgstr "" -#: cp/init.c:1495 +#: cp/init.c:1511 #, gcc-internal-format msgid "%q#D is not a non-static data member of %qT" msgstr "" -#: cp/init.c:1534 +#: cp/init.c:1550 #, gcc-internal-format msgid "unnamed initializer for %qT, which has no base classes" msgstr "" -#: cp/init.c:1542 +#: cp/init.c:1558 #, gcc-internal-format msgid "unnamed initializer for %qT, which uses multiple inheritance" msgstr "" -#: cp/init.c:1589 +#: cp/init.c:1605 #, gcc-internal-format msgid "%qD is both a direct base and an indirect virtual base" msgstr "" -#: cp/init.c:1597 +#: cp/init.c:1613 #, gcc-internal-format msgid "type %qT is not a direct or virtual base of %qT" msgstr "" -#: cp/init.c:1600 +#: cp/init.c:1616 #, gcc-internal-format msgid "type %qT is not a direct base of %qT" msgstr "" -#: cp/init.c:1710 cp/init.c:4386 cp/typeck2.c:1175 +#: cp/init.c:1727 cp/init.c:4402 cp/typeck2.c:1175 #, gcc-internal-format msgid "array must be initialized with a brace-enclosed initializer" msgstr "" -#: cp/init.c:2019 cp/semantics.c:3268 +#: cp/init.c:2036 cp/semantics.c:3271 #, fuzzy, gcc-internal-format msgid "%qT is not a class type" msgstr "\"%s\" мае незавершаны тып" -#: cp/init.c:2075 +#: cp/init.c:2092 #, gcc-internal-format msgid "incomplete type %qT does not have member %qD" msgstr "" -#: cp/init.c:2089 +#: cp/init.c:2106 #, fuzzy, gcc-internal-format msgid "invalid pointer to bit-field %qD" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/init.c:2175 cp/typeck.c:1893 +#: cp/init.c:2192 cp/typeck.c:1893 #, fuzzy, gcc-internal-format msgid "invalid use of non-static member function %qD" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/init.c:2182 cp/semantics.c:1835 +#: cp/init.c:2199 cp/semantics.c:1835 #, fuzzy, gcc-internal-format msgid "invalid use of non-static data member %qD" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/init.c:2379 +#: cp/init.c:2396 #, gcc-internal-format msgid "uninitialized reference member in %q#T using % without new-initializer" msgstr "" -#: cp/init.c:2387 +#: cp/init.c:2404 #, gcc-internal-format msgid "uninitialized reference member in base %q#T of %q#T using % without new-initializer" msgstr "" -#: cp/init.c:2391 +#: cp/init.c:2408 #, gcc-internal-format msgid "uninitialized reference member in base %q#T of %q#T" msgstr "" -#: cp/init.c:2407 +#: cp/init.c:2424 #, gcc-internal-format msgid "uninitialized const member in %q#T using % without new-initializer" msgstr "" -#: cp/init.c:2415 +#: cp/init.c:2432 #, gcc-internal-format msgid "uninitialized const member in base %q#T of %q#T using % without new-initializer" msgstr "" -#: cp/init.c:2419 +#: cp/init.c:2436 #, gcc-internal-format msgid "uninitialized const member in base %q#T of %q#T" msgstr "" -#: cp/init.c:2710 +#: cp/init.c:2727 #, 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:2721 +#: cp/init.c:2738 #, 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:2732 +#: cp/init.c:2749 #, 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:2880 +#: cp/init.c:2896 #, gcc-internal-format msgid "integer overflow in array size" msgstr "" -#: cp/init.c:2890 +#: cp/init.c:2906 #, gcc-internal-format msgid "array size in new-expression must be constant" msgstr "" -#: cp/init.c:2904 +#: cp/init.c:2920 #, gcc-internal-format msgid "variably modified type not allowed in new-expression" msgstr "" -#: cp/init.c:2920 +#: cp/init.c:2936 #, gcc-internal-format msgid "non-constant array new length must be specified directly, not by typedef" msgstr "" -#: cp/init.c:2922 +#: cp/init.c:2938 #, gcc-internal-format msgid "non-constant array new length must be specified without parentheses around the type-id" msgstr "" -#: cp/init.c:2932 +#: cp/init.c:2948 #, gcc-internal-format msgid "invalid type % for new" msgstr "" -#: cp/init.c:2975 +#: cp/init.c:2991 #, fuzzy, gcc-internal-format msgid "uninitialized const in % of %q#T" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/init.c:3101 +#: cp/init.c:3117 #, fuzzy, gcc-internal-format #| msgid "field '%s' not found in class" msgid "no suitable %qD found in class %qT" msgstr "поле \"%s\" не знойдзена ў класе" -#: cp/init.c:3108 cp/search.c:1023 +#: cp/init.c:3124 cp/search.c:1026 #, fuzzy, gcc-internal-format msgid "request for member %qD is ambiguous" msgstr "памер \"%s\" - %d байт" -#: cp/init.c:3181 +#: cp/init.c:3197 #, gcc-internal-format msgid "% of type %qT with extended alignment %d" msgstr "" -#: cp/init.c:3184 +#: cp/init.c:3200 #, gcc-internal-format msgid "uses %qD, which does not have an alignment parameter" msgstr "" -#: cp/init.c:3187 +#: cp/init.c:3203 #, gcc-internal-format msgid "use %<-faligned-new%> to enable C++17 over-aligned new support" msgstr "" -#: cp/init.c:3370 +#: cp/init.c:3386 #, gcc-internal-format msgid "parenthesized initializer in array new" msgstr "" -#: cp/init.c:3633 +#: cp/init.c:3649 #, gcc-internal-format msgid "size in array new must have integral type" msgstr "" -#: cp/init.c:3665 +#: cp/init.c:3681 #, gcc-internal-format msgid "new cannot be applied to a reference type" msgstr "" -#: cp/init.c:3674 +#: cp/init.c:3690 #, gcc-internal-format msgid "new cannot be applied to a function type" msgstr "" -#: cp/init.c:3743 +#: cp/init.c:3759 #, gcc-internal-format msgid "possible problem detected in invocation of delete [] operator:" msgstr "" -#: cp/init.c:3747 +#: cp/init.c:3763 #, gcc-internal-format msgid "neither the destructor nor the class-specific operator delete [] will be called, even if they are declared when the class is defined" msgstr "" -#: cp/init.c:4295 +#: cp/init.c:4311 #, gcc-internal-format msgid "initializer ends prematurely" msgstr "" -#: cp/init.c:4599 +#: cp/init.c:4615 #, gcc-internal-format msgid "unknown array size in delete" msgstr "" -#: cp/init.c:4623 +#: cp/init.c:4639 #, gcc-internal-format msgid "possible problem detected in invocation of delete operator:" msgstr "" -#: cp/init.c:4628 +#: cp/init.c:4644 #, gcc-internal-format msgid "neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined" msgstr "" -#: cp/init.c:4642 +#: cp/init.c:4658 #, gcc-internal-format msgid "deleting object of abstract class type %qT which has non-virtual destructor will cause undefined behavior" msgstr "" -#: cp/init.c:4647 +#: cp/init.c:4663 #, gcc-internal-format msgid "deleting object of polymorphic class type %qT which has non-virtual destructor might cause undefined behavior" msgstr "" -#: cp/init.c:4954 +#: cp/init.c:4970 #, gcc-internal-format msgid "type to vector delete is neither pointer or array type" msgstr "" @@ -45204,7 +45247,7 @@ msgstr "" msgid "ignoring %qD attribute on non-inline namespace" msgstr "" -#: cp/name-lookup.c:5111 cp/name-lookup.c:7065 +#: cp/name-lookup.c:5111 cp/name-lookup.c:7073 #, fuzzy, gcc-internal-format #| msgid "`%s' attribute ignored" msgid "%qD attribute directive ignored" @@ -45252,53 +45295,53 @@ msgstr "" msgid "it was later defined here" msgstr "" -#: cp/name-lookup.c:6687 +#: cp/name-lookup.c:6695 #, gcc-internal-format msgid "declaration of % does not match %<#include %>, isn't a template" msgstr "" -#: cp/name-lookup.c:7059 +#: cp/name-lookup.c:7067 #, fuzzy, gcc-internal-format msgid "strong using directive no longer supported" msgstr "-pipe не падтрымліваецца." -#: cp/name-lookup.c:7062 +#: cp/name-lookup.c:7070 #, gcc-internal-format msgid "you may use an inline namespace instead" msgstr "" -#: cp/name-lookup.c:7079 +#: cp/name-lookup.c:7087 #, gcc-internal-format msgid "attributes ignored on local using directive" msgstr "" -#: cp/name-lookup.c:7163 +#: cp/name-lookup.c:7171 #, fuzzy, gcc-internal-format msgid "namespace alias %qD not allowed here, assuming %qD" msgstr "\"%s\" - гэта не пачатак дэкларацыі" #. We only allow depth 255. -#: cp/name-lookup.c:7183 +#: cp/name-lookup.c:7191 #, gcc-internal-format, gfc-internal-format msgid "cannot nest more than %d namespaces" msgstr "" -#: cp/name-lookup.c:7218 +#: cp/name-lookup.c:7226 #, gcc-internal-format msgid "inline namespace must be specified at initial definition" msgstr "" -#: cp/name-lookup.c:7219 +#: cp/name-lookup.c:7227 #, fuzzy, gcc-internal-format msgid "%qD defined here" msgstr "YYDEBUG не вызначан." -#: cp/name-lookup.c:7292 +#: cp/name-lookup.c:7300 #, gcc-internal-format msgid "XXX entering pop_everything ()\n" msgstr "" -#: cp/name-lookup.c:7301 +#: cp/name-lookup.c:7309 #, gcc-internal-format msgid "XXX leaving pop_everything ()\n" msgstr "" @@ -45318,7 +45361,7 @@ msgstr "" msgid "LEXER_DEBUGGING_ENABLED_P is not set to true" msgstr "" -#: cp/parser.c:1352 cp/parser.c:37254 +#: cp/parser.c:1352 cp/parser.c:37251 #, gcc-internal-format msgid "%<#pragma omp declare simd%> not immediately followed by function declaration or definition" msgstr "" @@ -45343,7 +45386,7 @@ msgstr "" msgid "request for member %qE in non-class type %qT" msgstr "" -#: cp/parser.c:2949 cp/parser.c:18221 +#: cp/parser.c:2949 cp/parser.c:18218 #, gcc-internal-format msgid "%<%T::%E%> has not been declared" msgstr "" @@ -45423,7 +45466,7 @@ msgstr "Нерэчаісны выбар %s" msgid "ISO C++ forbids using a floating-point literal in a constant-expression" msgstr "" -#: cp/parser.c:3143 cp/pt.c:17853 +#: cp/parser.c:3143 cp/pt.c:17890 #, gcc-internal-format msgid "a cast to a type other than an integral or enumeration type cannot appear in a constant-expression" msgstr "" @@ -45646,7 +45689,7 @@ msgstr "" msgid "unable to find string literal operator %qD with %qT, %qT arguments" msgstr "" -#: cp/parser.c:4587 cp/parser.c:12940 +#: cp/parser.c:4587 cp/parser.c:12937 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "expected declaration" @@ -45698,7 +45741,7 @@ msgstr "" msgid "fold-expressions only available with -std=c++17 or -std=gnu++17" msgstr "" -#: cp/parser.c:5275 cp/parser.c:5452 cp/parser.c:5630 cp/semantics.c:3612 +#: cp/parser.c:5275 cp/parser.c:5452 cp/parser.c:5633 cp/semantics.c:3615 #, gcc-internal-format msgid "expected primary-expression" msgstr "" @@ -45718,94 +45761,94 @@ msgstr "" msgid "local variable %qD may not appear in this context" msgstr "" -#: cp/parser.c:5787 +#: cp/parser.c:5790 #, gcc-internal-format msgid "expected id-expression" msgstr "" -#: cp/parser.c:5919 +#: cp/parser.c:5922 #, gcc-internal-format msgid "scope %qT before %<~%> is not a class-name" msgstr "" -#: cp/parser.c:5948 cp/parser.c:7860 +#: cp/parser.c:5951 cp/parser.c:7860 #, gcc-internal-format msgid "%<~auto%> only available with -std=c++14 or -std=gnu++14" msgstr "" -#: cp/parser.c:6059 +#: cp/parser.c:6062 #, gcc-internal-format msgid "declaration of %<~%T%> as member of %qT" msgstr "" -#: cp/parser.c:6074 +#: cp/parser.c:6077 #, gcc-internal-format msgid "typedef-name %qD used as destructor declarator" msgstr "" -#: cp/parser.c:6111 cp/parser.c:20249 +#: cp/parser.c:6114 cp/parser.c:20246 #, gcc-internal-format msgid "expected unqualified-id" msgstr "" -#: cp/parser.c:6220 +#: cp/parser.c:6223 #, gcc-internal-format msgid "found %<:%> in nested-name-specifier, expected %<::%>" msgstr "" -#: cp/parser.c:6288 +#: cp/parser.c:6291 #, gcc-internal-format msgid "decltype evaluates to %qT, which is not a class or enumeration type" msgstr "" -#: cp/parser.c:6314 +#: cp/parser.c:6317 #, gcc-internal-format msgid "function template-id %qD in nested-name-specifier" msgstr "" -#: cp/parser.c:6322 +#: cp/parser.c:6325 #, gcc-internal-format msgid "variable template-id %qD in nested-name-specifier" msgstr "" -#: cp/parser.c:6426 cp/typeck.c:2684 cp/typeck.c:2687 cp/typeck.c:2704 +#: cp/parser.c:6429 cp/typeck.c:2684 cp/typeck.c:2687 cp/typeck.c:2704 #, fuzzy, gcc-internal-format msgid "%qD is not a template" msgstr "\"%s\" мае незавершаны тып" -#: cp/parser.c:6504 +#: cp/parser.c:6507 #, gcc-internal-format msgid "expected nested-name-specifier" msgstr "" -#: cp/parser.c:6711 cp/parser.c:8950 +#: cp/parser.c:6714 cp/parser.c:8950 #, gcc-internal-format msgid "types may not be defined in casts" msgstr "" -#: cp/parser.c:6797 +#: cp/parser.c:6800 #, gcc-internal-format msgid "types may not be defined in a % expression" msgstr "" -#: cp/parser.c:6889 +#: cp/parser.c:6892 #, fuzzy, gcc-internal-format #| msgid "wrong number of arguments specified for `%s' attribute" msgid "wrong number of arguments to %<__builtin_addressof%>" msgstr "памылковая колькасьць аргументаў, зададзеных для атрыбута `%s'" -#: cp/parser.c:6901 cp/pt.c:18416 +#: cp/parser.c:6904 cp/pt.c:18453 #, fuzzy, gcc-internal-format #| msgid "wrong number of arguments specified for `%s' attribute" msgid "wrong number of arguments to %<__builtin_launder%>" msgstr "памылковая колькасьць аргументаў, зададзеных для атрыбута `%s'" -#: cp/parser.c:6995 +#: cp/parser.c:6998 #, fuzzy, gcc-internal-format msgid "ISO C++ forbids compound-literals" msgstr "ISO C не дазваляе дэкларацыі метак (label)" -#: cp/parser.c:7054 +#: cp/parser.c:7057 #, gcc-internal-format msgid "two consecutive %<[%> shall only introduce an attribute" msgstr "" @@ -45936,7 +45979,7 @@ msgstr "" msgid "capture of non-variable %qE" msgstr "" -#: cp/parser.c:10391 cp/parser.c:10401 cp/semantics.c:3453 cp/semantics.c:3465 +#: cp/parser.c:10391 cp/parser.c:10401 cp/semantics.c:3456 cp/semantics.c:3468 #, fuzzy, gcc-internal-format msgid "%q#D declared here" msgstr "\"%s\" не абвешчан (першае выкарыстанне ў гэтай функцыі)" @@ -46023,7 +46066,7 @@ msgstr "" msgid "init-statement in selection statements only available with -std=c++17 or -std=gnu++17" msgstr "" -#: cp/parser.c:11546 cp/parser.c:28490 +#: cp/parser.c:11546 cp/parser.c:28487 #, fuzzy, gcc-internal-format #| msgid "empty body in an else-statement" msgid "expected selection-statement" @@ -46044,565 +46087,565 @@ msgstr "" msgid "inconsistent begin/end types in range-based % statement: %qT and %qT" msgstr "" -#: cp/parser.c:12250 cp/parser.c:28493 +#: cp/parser.c:12250 cp/parser.c:28490 #, fuzzy, gcc-internal-format #| msgid "empty body in an else-statement" msgid "expected iteration-statement" msgstr "пустое цела ў else-выражэнні" -#: cp/parser.c:12298 +#: cp/parser.c:12297 #, gcc-internal-format msgid "range-based % loops only available with -std=c++11 or -std=gnu++11" msgstr "" -#: cp/parser.c:12426 +#: cp/parser.c:12423 #, gcc-internal-format msgid "% in % function" msgstr "" #. Issue a warning about this use of a GNU extension. -#: cp/parser.c:12434 +#: cp/parser.c:12431 #, gcc-internal-format msgid "ISO C++ forbids computed gotos" msgstr "" -#: cp/parser.c:12447 cp/parser.c:28496 +#: cp/parser.c:12444 cp/parser.c:28493 #, gcc-internal-format msgid "expected jump-statement" msgstr "" -#: cp/parser.c:12620 cp/parser.c:23584 +#: cp/parser.c:12617 cp/parser.c:23581 #, gcc-internal-format msgid "extra %<;%>" msgstr "" -#: cp/parser.c:12863 +#: cp/parser.c:12860 #, gcc-internal-format msgid "%<__label__%> not at the beginning of a block" msgstr "" -#: cp/parser.c:13083 +#: cp/parser.c:13080 #, gcc-internal-format msgid "non-variable %qD in declaration with more than one declarator with placeholder type" msgstr "" -#: cp/parser.c:13103 +#: cp/parser.c:13100 #, gcc-internal-format msgid "inconsistent deduction for %qT: %qT and then %qT" msgstr "" -#: cp/parser.c:13124 +#: cp/parser.c:13121 #, gcc-internal-format msgid "mixing declarations and function-definitions is forbidden" msgstr "" -#: cp/parser.c:13148 +#: cp/parser.c:13145 #, gcc-internal-format msgid "types may not be defined in a for-range-declaration" msgstr "" -#: cp/parser.c:13203 +#: cp/parser.c:13200 #, gcc-internal-format msgid "initializer in range-based % loop" msgstr "" -#: cp/parser.c:13206 +#: cp/parser.c:13203 #, fuzzy, gcc-internal-format #| msgid "multiple declarations `%T' and `%T'" msgid "multiple declarations in range-based % loop" msgstr "неаднолькавае абвяшчэньне `%T' і `%T'" -#: cp/parser.c:13257 +#: cp/parser.c:13254 #, gcc-internal-format msgid "structured bindings only available with -std=c++17 or -std=gnu++17" msgstr "" -#: cp/parser.c:13306 +#: cp/parser.c:13303 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "empty structured binding declaration" msgstr "пустое абвяшчэньне" -#: cp/parser.c:13324 +#: cp/parser.c:13321 #, fuzzy, gcc-internal-format msgid "invalid initializer for structured binding declaration" msgstr "нерэчаісны ініцыялізатар" -#: cp/parser.c:13491 +#: cp/parser.c:13488 #, gcc-internal-format msgid "% used outside of class" msgstr "" -#: cp/parser.c:13558 +#: cp/parser.c:13555 #, gcc-internal-format msgid "% changes meaning in C++11; please remove it" msgstr "" -#: cp/parser.c:13594 +#: cp/parser.c:13591 #, gcc-internal-format msgid "decl-specifier invalid in condition" msgstr "" -#: cp/parser.c:13600 +#: cp/parser.c:13597 #, fuzzy, gcc-internal-format msgid "%qD invalid in lambda" msgstr "Нерэчаісны выбар \"%s\"" -#: cp/parser.c:13693 +#: cp/parser.c:13690 #, fuzzy, gcc-internal-format msgid "class definition may not be declared a friend" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:13763 cp/parser.c:24064 +#: cp/parser.c:13760 cp/parser.c:24061 #, gcc-internal-format msgid "templates may not be %" msgstr "" -#: cp/parser.c:13805 +#: cp/parser.c:13802 #, fuzzy, gcc-internal-format msgid "invalid linkage-specification" msgstr "Нерэчаісная спецыфікацыя! Памылка ў cc." -#: cp/parser.c:13909 +#: cp/parser.c:13906 #, gcc-internal-format msgid "static_assert without a message only available with -std=c++17 or -std=gnu++17" msgstr "" -#: cp/parser.c:14111 +#: cp/parser.c:14108 #, gcc-internal-format msgid "types may not be defined in % expressions" msgstr "" -#: cp/parser.c:14264 +#: cp/parser.c:14261 #, gcc-internal-format msgid "types may not be defined in a conversion-type-id" msgstr "" -#: cp/parser.c:14291 +#: cp/parser.c:14288 #, gcc-internal-format msgid "invalid use of % in conversion operator" msgstr "" -#: cp/parser.c:14295 +#: cp/parser.c:14292 #, gcc-internal-format msgid "use of % in member template conversion operator can never be deduced" msgstr "" -#: cp/parser.c:14379 +#: cp/parser.c:14376 #, gcc-internal-format msgid "only constructors take member initializers" msgstr "" -#: cp/parser.c:14406 +#: cp/parser.c:14403 #, fuzzy, gcc-internal-format msgid "cannot expand initializer for member %qD" msgstr "прапушчан ініцыялізатар" -#: cp/parser.c:14418 cp/pt.c:24255 +#: cp/parser.c:14415 cp/pt.c:24333 #, gcc-internal-format msgid "mem-initializer for %qD follows constructor delegation" msgstr "" -#: cp/parser.c:14430 cp/pt.c:24267 +#: cp/parser.c:14427 cp/pt.c:24345 #, gcc-internal-format msgid "constructor delegation follows mem-initializer for %qD" msgstr "" -#: cp/parser.c:14482 +#: cp/parser.c:14479 #, gcc-internal-format msgid "anachronistic old-style base class initializer" msgstr "" -#: cp/parser.c:14552 +#: cp/parser.c:14549 #, gcc-internal-format msgid "keyword % not allowed in this context (a qualified member initializer is implicitly a type)" msgstr "" -#: cp/parser.c:14927 +#: cp/parser.c:14924 #, gcc-internal-format msgid "unexpected keyword; remove space between quotes and suffix identifier" msgstr "" -#: cp/parser.c:14933 +#: cp/parser.c:14930 #, gcc-internal-format msgid "expected suffix identifier" msgstr "" -#: cp/parser.c:14942 +#: cp/parser.c:14939 #, gcc-internal-format msgid "expected empty string after % keyword" msgstr "" -#: cp/parser.c:14948 +#: cp/parser.c:14945 #, gcc-internal-format msgid "invalid encoding prefix in literal operator" msgstr "" -#: cp/parser.c:14975 +#: cp/parser.c:14972 #, fuzzy, gcc-internal-format #| msgid "unregistered operator %s" msgid "expected operator" msgstr "нераспазнаны аператар %s" #. Warn that we do not support `export'. -#: cp/parser.c:15020 +#: cp/parser.c:15017 #, gcc-internal-format msgid "keyword % not implemented, and will be ignored" msgstr "" -#: cp/parser.c:15190 +#: cp/parser.c:15187 #, fuzzy, gcc-internal-format msgid "invalid constrained type parameter" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:15198 +#: cp/parser.c:15195 #, fuzzy, gcc-internal-format msgid "cv-qualified type parameter" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:15283 +#: cp/parser.c:15280 #, gcc-internal-format msgid "variadic constraint introduced without %<...%>" msgstr "" -#: cp/parser.c:15347 +#: cp/parser.c:15344 #, fuzzy, gcc-internal-format msgid "invalid use of % in default template argument" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:15582 cp/parser.c:15668 cp/parser.c:21694 +#: cp/parser.c:15579 cp/parser.c:15665 cp/parser.c:21691 #, fuzzy, gcc-internal-format msgid "template parameter pack %qD cannot have a default argument" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:15586 cp/parser.c:15672 +#: cp/parser.c:15583 cp/parser.c:15669 #, fuzzy, gcc-internal-format msgid "template parameter packs cannot have default arguments" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:15738 +#: cp/parser.c:15735 #, gcc-internal-format msgid "expected template-id" msgstr "" -#: cp/parser.c:15798 +#: cp/parser.c:15795 #, gcc-internal-format msgid "%<<::%> cannot begin a template-argument list" msgstr "" -#: cp/parser.c:15802 +#: cp/parser.c:15799 #, gcc-internal-format msgid "%<<:%> is an alternate spelling for %<[%>. Insert whitespace between %<<%> and %<::%>" msgstr "" -#: cp/parser.c:15806 +#: cp/parser.c:15803 #, 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:15924 +#: cp/parser.c:15921 #, gcc-internal-format msgid "parse error in template argument list" msgstr "" #. The name does not name a template. -#: cp/parser.c:15992 cp/parser.c:16122 cp/parser.c:16337 +#: cp/parser.c:15989 cp/parser.c:16119 cp/parser.c:16334 #, gcc-internal-format msgid "expected template-name" msgstr "" #. Explain what went wrong. -#: cp/parser.c:16038 +#: cp/parser.c:16035 #, gcc-internal-format msgid "non-template %qD used as template" msgstr "" -#: cp/parser.c:16040 +#: cp/parser.c:16037 #, gcc-internal-format msgid "use %<%T::template %D%> to indicate that it is a template" msgstr "" -#: cp/parser.c:16189 +#: cp/parser.c:16186 #, gcc-internal-format msgid "expected parameter pack before %<...%>" msgstr "" -#: cp/parser.c:16298 cp/parser.c:16316 cp/parser.c:16483 +#: cp/parser.c:16295 cp/parser.c:16313 cp/parser.c:16480 #, gcc-internal-format msgid "expected template-argument" msgstr "" -#: cp/parser.c:16458 +#: cp/parser.c:16455 #, fuzzy, gcc-internal-format msgid "invalid non-type template argument" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:16585 +#: cp/parser.c:16582 #, gcc-internal-format msgid "explicit instantiation shall not use % specifier" msgstr "" -#: cp/parser.c:16589 +#: cp/parser.c:16586 #, gcc-internal-format msgid "explicit instantiation shall not use % specifier" msgstr "" -#: cp/parser.c:16648 +#: cp/parser.c:16645 #, gcc-internal-format msgid "template specialization with C linkage" msgstr "" -#: cp/parser.c:16869 +#: cp/parser.c:16866 #, gcc-internal-format msgid "expected type specifier" msgstr "" -#: cp/parser.c:17053 +#: cp/parser.c:17050 #, gcc-internal-format msgid "use of % in lambda parameter declaration only available with -std=c++14 or -std=gnu++14" msgstr "" -#: cp/parser.c:17059 +#: cp/parser.c:17056 #, gcc-internal-format msgid "use of % in parameter declaration only available with -std=c++14 or -std=gnu++14" msgstr "" -#: cp/parser.c:17064 +#: cp/parser.c:17061 #, gcc-internal-format msgid "use of % in parameter declaration only available with -fconcepts" msgstr "" -#: cp/parser.c:17209 +#: cp/parser.c:17206 #, gcc-internal-format msgid "expected template-id for type" msgstr "" -#: cp/parser.c:17278 +#: cp/parser.c:17275 #, gcc-internal-format msgid "expected type-name" msgstr "" -#: cp/parser.c:17631 +#: cp/parser.c:17628 #, gcc-internal-format msgid "elaborated-type-specifier for a scoped enum must not use the %qD keyword" msgstr "" -#: cp/parser.c:17854 +#: cp/parser.c:17851 #, gcc-internal-format msgid "declaration %qD does not declare anything" msgstr "" -#: cp/parser.c:17942 +#: cp/parser.c:17939 #, gcc-internal-format msgid "attributes ignored on uninstantiated type" msgstr "" -#: cp/parser.c:17946 +#: cp/parser.c:17943 #, gcc-internal-format msgid "attributes ignored on template instantiation" msgstr "" -#: cp/parser.c:17951 +#: cp/parser.c:17948 #, gcc-internal-format msgid "attributes ignored on elaborated-type-specifier that is not a forward declaration" msgstr "" -#: cp/parser.c:18085 +#: cp/parser.c:18082 #, fuzzy, gcc-internal-format msgid "%qD is an enumeration template" msgstr "\"%s\" звычайна функцыя" -#: cp/parser.c:18096 +#: cp/parser.c:18093 #, gcc-internal-format msgid "%qD does not name an enumeration in %qT" msgstr "" -#: cp/parser.c:18111 +#: cp/parser.c:18108 #, gcc-internal-format msgid "unnamed scoped enum is not allowed" msgstr "" -#: cp/parser.c:18166 +#: cp/parser.c:18163 #, gcc-internal-format msgid "expected %<;%> or %<{%>" msgstr "" -#: cp/parser.c:18215 +#: cp/parser.c:18212 #, gcc-internal-format msgid "cannot add an enumerator list to a template instantiation" msgstr "" -#: cp/parser.c:18229 +#: cp/parser.c:18226 #, gcc-internal-format msgid "nested name specifier %qT for enum declaration does not name a class or namespace" msgstr "" -#: cp/parser.c:18241 cp/parser.c:23070 +#: cp/parser.c:18238 cp/parser.c:23067 #, gcc-internal-format msgid "declaration of %qD in namespace %qD which does not enclose %qD" msgstr "" -#: cp/parser.c:18246 cp/parser.c:23075 +#: cp/parser.c:18243 cp/parser.c:23072 #, gcc-internal-format msgid "declaration of %qD in %qD which does not enclose %qD" msgstr "" -#: cp/parser.c:18258 cp/parser.c:23089 +#: cp/parser.c:18255 cp/parser.c:23086 #, gcc-internal-format msgid "extra qualification not allowed" msgstr "" -#: cp/parser.c:18282 +#: cp/parser.c:18279 #, fuzzy, gcc-internal-format #| msgid "previous definition of `%#T'" msgid "multiple definition of %q#T" msgstr "папярэдняе вызначэньне `%#T'" -#: cp/parser.c:18295 +#: cp/parser.c:18292 #, 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:18315 +#: cp/parser.c:18312 #, gcc-internal-format msgid "opaque-enum-specifier without name" msgstr "" -#: cp/parser.c:18318 +#: cp/parser.c:18315 #, gcc-internal-format msgid "opaque-enum-specifier must use a simple identifier" msgstr "" -#: cp/parser.c:18497 +#: cp/parser.c:18494 #, fuzzy, gcc-internal-format #| msgid "`%D' is not a function," msgid "%qD is not a namespace-name" msgstr "`%D' - гэта ня функцыя," -#: cp/parser.c:18503 +#: cp/parser.c:18500 #, gcc-internal-format msgid "expected namespace-name" msgstr "" -#: cp/parser.c:18570 +#: cp/parser.c:18567 #, gcc-internal-format msgid "nested namespace definitions only available with -std=c++17 or -std=gnu++17" msgstr "" -#: cp/parser.c:18578 +#: cp/parser.c:18575 #, gcc-internal-format msgid "nested namespace name required" msgstr "" -#: cp/parser.c:18583 +#: cp/parser.c:18580 #, gcc-internal-format msgid "namespace name required" msgstr "" -#: cp/parser.c:18587 +#: cp/parser.c:18584 #, gcc-internal-format msgid "a nested namespace definition cannot have attributes" msgstr "" -#: cp/parser.c:18590 +#: cp/parser.c:18587 #, gcc-internal-format msgid "a nested namespace definition cannot be inline" msgstr "" -#: cp/parser.c:18597 +#: cp/parser.c:18594 #, gcc-internal-format msgid "namespace %qD entered" msgstr "" -#: cp/parser.c:18652 +#: cp/parser.c:18649 #, gcc-internal-format msgid "% definition is not allowed here" msgstr "" -#: cp/parser.c:18803 +#: cp/parser.c:18800 #, gcc-internal-format msgid "pack expansion in using-declaration only available with -std=c++17 or -std=gnu++17" msgstr "" -#: cp/parser.c:18818 +#: cp/parser.c:18815 #, fuzzy, gcc-internal-format msgid "a template-id may not appear in a using-declaration" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/parser.c:18865 +#: cp/parser.c:18862 #, gcc-internal-format msgid "comma-separated list in using-declaration only available with -std=c++17 or -std=gnu++17" msgstr "" -#: cp/parser.c:18875 +#: cp/parser.c:18872 #, gcc-internal-format msgid "access declarations are deprecated in favour of using-declarations; suggestion: add the % keyword" msgstr "" -#: cp/parser.c:18940 +#: cp/parser.c:18937 #, gcc-internal-format msgid "types may not be defined in alias template declarations" msgstr "" -#: cp/parser.c:19106 +#: cp/parser.c:19103 #, gcc-internal-format msgid "% in % function" msgstr "" -#: cp/parser.c:19493 +#: cp/parser.c:19490 #, fuzzy, gcc-internal-format msgid "a function-definition is not allowed here" msgstr "атрыбуты секцыі не падтрымліваюцца для гэтай мэты" -#: cp/parser.c:19504 +#: cp/parser.c:19501 #, gcc-internal-format msgid "an asm-specification is not allowed on a function-definition" msgstr "" -#: cp/parser.c:19508 +#: cp/parser.c:19505 #, fuzzy, gcc-internal-format msgid "attributes are not allowed on a function-definition" msgstr "\"%s\" - гэта не пачатак дэкларацыі" -#: cp/parser.c:19559 +#: cp/parser.c:19556 #, gcc-internal-format msgid "expected constructor, destructor, or type conversion" msgstr "" #. Anything else is an error. -#: cp/parser.c:19598 cp/parser.c:21906 +#: cp/parser.c:19595 cp/parser.c:21903 #, fuzzy, gcc-internal-format #| msgid "invalid initializer" msgid "expected initializer" msgstr "нерэчаісны ініцыялізатар" -#: cp/parser.c:19679 +#: cp/parser.c:19676 #, fuzzy, gcc-internal-format msgid "initializer provided for function" msgstr "не магу ініцыялізаваць сяброўскую функцыю \"%s\"" -#: cp/parser.c:19713 +#: cp/parser.c:19710 #, gcc-internal-format msgid "attributes after parenthesized initializer ignored" msgstr "" -#: cp/parser.c:19727 +#: cp/parser.c:19724 #, gcc-internal-format msgid "non-function %qD declared as implicit template" msgstr "" -#: cp/parser.c:20169 +#: cp/parser.c:20166 #, fuzzy, gcc-internal-format msgid "array bound is not an integer constant" msgstr "памер масіва \"%s\" адмоўны" -#: cp/parser.c:20295 +#: cp/parser.c:20292 #, gcc-internal-format msgid "cannot define member of dependent typedef %qT" msgstr "" -#: cp/parser.c:20299 +#: cp/parser.c:20296 #, fuzzy, gcc-internal-format msgid "%<%T::%E%> is not a type" msgstr "\"%s\" мае незавершаны тып" @@ -46611,406 +46654,406 @@ msgstr "\"%s\" мае незавершаны тып" #. here because we do not have enough #. information about its original syntactic #. form. -#: cp/parser.c:20328 +#: cp/parser.c:20325 #, gcc-internal-format msgid "invalid declarator" msgstr "нерэчаісны абвяшчальнік" -#: cp/parser.c:20336 +#: cp/parser.c:20333 #, fuzzy, gcc-internal-format msgid "invalid use of constructor as a template" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:20338 +#: cp/parser.c:20335 #, 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:20410 +#: cp/parser.c:20407 #, fuzzy, gcc-internal-format #| msgid "Invalid declaration" msgid "qualified-id in declaration" msgstr "Нерэчаіснае абвяшчэнне" -#: cp/parser.c:20435 +#: cp/parser.c:20432 #, fuzzy, gcc-internal-format #| msgid "empty declaration" msgid "expected declarator" msgstr "пустое абвяшчэньне" -#: cp/parser.c:20554 +#: cp/parser.c:20551 #, gcc-internal-format msgid "%qD is a namespace" msgstr "" -#: cp/parser.c:20556 +#: cp/parser.c:20553 #, gcc-internal-format msgid "cannot form pointer to member of non-class %q#T" msgstr "" -#: cp/parser.c:20577 +#: cp/parser.c:20574 #, gcc-internal-format msgid "expected ptr-operator" msgstr "" -#: cp/parser.c:20638 +#: cp/parser.c:20635 #, fuzzy, gcc-internal-format #| msgid "duplicate `volatile'" msgid "duplicate cv-qualifier" msgstr "паўтарэнне \"volatile\"" -#: cp/parser.c:20692 +#: cp/parser.c:20689 #, gcc-internal-format msgid "multiple ref-qualifiers" msgstr "" -#: cp/parser.c:20729 +#: cp/parser.c:20726 #, gcc-internal-format msgid "%qE requires %<-fgnu-tm%>" msgstr "" -#: cp/parser.c:20787 +#: cp/parser.c:20784 #, fuzzy, gcc-internal-format #| msgid "duplicate `volatile'" msgid "duplicate virt-specifier" msgstr "паўтарэнне \"volatile\"" -#: cp/parser.c:21025 +#: cp/parser.c:21022 #, fuzzy, gcc-internal-format msgid "missing template arguments after %qT" msgstr "невыкарыстаемы параметр \"%s\"" -#: cp/parser.c:21031 cp/typeck2.c:494 cp/typeck2.c:534 cp/typeck2.c:2090 +#: cp/parser.c:21028 cp/typeck2.c:494 cp/typeck2.c:534 cp/typeck2.c:2093 #, fuzzy, gcc-internal-format #| msgid "invalid use of `%T'" msgid "invalid use of %qT" msgstr "нерэчаіснае выкарыстаньне `%T'" -#: cp/parser.c:21052 +#: cp/parser.c:21049 #, gcc-internal-format msgid "types may not be defined in template arguments" msgstr "" -#: cp/parser.c:21057 +#: cp/parser.c:21054 #, fuzzy, gcc-internal-format msgid "invalid use of % in template argument" msgstr "нявернае выкарыстанне \"restict\"" -#: cp/parser.c:21145 +#: cp/parser.c:21142 #, gcc-internal-format msgid "expected type-specifier" msgstr "" -#: cp/parser.c:21429 +#: cp/parser.c:21426 #, gcc-internal-format msgid "expected %<,%> or %<...%>" msgstr "" -#: cp/parser.c:21504 +#: cp/parser.c:21501 #, gcc-internal-format msgid "types may not be defined in parameter types" msgstr "" -#: cp/parser.c:21678 +#: cp/parser.c:21675 #, gcc-internal-format msgid "default arguments are only permitted for function parameters" msgstr "" -#: cp/parser.c:21696 +#: cp/parser.c:21693 #, gcc-internal-format msgid "parameter pack %qD cannot have a default argument" msgstr "" -#: cp/parser.c:21702 +#: cp/parser.c:21699 #, fuzzy, gcc-internal-format msgid "template parameter pack cannot have a default argument" msgstr "віртуальныя функцыі не могуць быць сяброўскімі" -#: cp/parser.c:21704 +#: cp/parser.c:21701 #, gcc-internal-format msgid "parameter pack cannot have a default argument" msgstr "" -#: cp/parser.c:22131 +#: cp/parser.c:22128 #, gcc-internal-format msgid "C++ designated initializers only available with -std=c++2a or -std=gnu++2a" msgstr "" -#: cp/parser.c:22151 +#: cp/parser.c:22148 #, gcc-internal-format msgid "ISO C++ does not allow GNU designated initializers" msgstr "" -#: cp/parser.c:22189 +#: cp/parser.c:22186 #, gcc-internal-format msgid "ISO C++ does not allow C99 designated initializers" msgstr "" -#: cp/parser.c:22203 +#: cp/parser.c:22200 #, gcc-internal-format msgid "either all initializer clauses should be designated or none of them should be" msgstr "" -#: cp/parser.c:22228 +#: cp/parser.c:22225 #, gcc-internal-format msgid "%<...%> not allowed in designated initializer list" msgstr "" -#: cp/parser.c:22266 +#: cp/parser.c:22263 #, gcc-internal-format msgid "%<.%s%> designator used multiple times in the same initializer list" msgstr "" -#: cp/parser.c:22322 cp/parser.c:22448 +#: cp/parser.c:22319 cp/parser.c:22445 #, gcc-internal-format msgid "expected class-name" msgstr "" -#: cp/parser.c:22650 +#: cp/parser.c:22647 #, gcc-internal-format msgid "expected %<;%> after class definition" msgstr "" -#: cp/parser.c:22653 +#: cp/parser.c:22650 #, gcc-internal-format msgid "expected %<;%> after struct definition" msgstr "" -#: cp/parser.c:22656 +#: cp/parser.c:22653 #, gcc-internal-format msgid "expected %<;%> after union definition" msgstr "" -#: cp/parser.c:23012 +#: cp/parser.c:23009 #, gcc-internal-format msgid "expected %<{%> or %<:%>" msgstr "" -#: cp/parser.c:23023 +#: cp/parser.c:23020 #, fuzzy, gcc-internal-format #| msgid "cannot find file for class %s" msgid "cannot specify % for a class" msgstr "немагчыма знайсьці файл для кляса %s" -#: cp/parser.c:23031 +#: cp/parser.c:23028 #, gcc-internal-format msgid "global qualification of class name is invalid" msgstr "" -#: cp/parser.c:23038 +#: cp/parser.c:23035 #, gcc-internal-format msgid "qualified name does not name a class" msgstr "" -#: cp/parser.c:23050 +#: cp/parser.c:23047 #, gcc-internal-format msgid "keyword % not allowed in class-head-name" msgstr "" -#: cp/parser.c:23056 +#: cp/parser.c:23053 #, fuzzy, gcc-internal-format msgid "invalid class name in declaration of %qD" msgstr "Нерэчаіснае абвяшчэнне" -#: cp/parser.c:23114 +#: cp/parser.c:23111 #, fuzzy, gcc-internal-format msgid "an explicit specialization must be preceded by %