aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2021-12-11Daily bump.GCC Administrator11-1/+226
2021-12-10libgcc, Darwin: Update darwin10 unwinder shim dependencies.Iain Sandoe1-1/+1
We include libgcc_tm.h to provide a prototype for this shim so add that to the make dependencies. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> libgcc/ChangeLog: * config/t-darwin: Add libgcc_tm.h to the dependencies for darwin10-unwind-find-enc-func.
2021-12-10jit: set DECL_CONTEXT of RESULT_DECL [PR103562]David Malcolm3-0/+66
libgccjit was failing to set the DECL_CONTEXT of function RESULT_DECLs, leading to them failing to be properly handled by the inlining machinery. Fixed thusly. gcc/jit/ChangeLog: PR jit/103562 * jit-playback.c (gcc::jit::playback::context::new_function): Set DECL_CONTEXT of the result_decl. gcc/testsuite/ChangeLog: PR jit/103562 * jit.dg/all-non-failing-tests.h: Add comment about... * jit.dg/test-pr103562.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2021-12-10symtab: fix comment typoJason Merrill1-1/+1
gcc/ChangeLog: * symtab.c (symtab_node::equal_address_to): Fix comment typo.
2021-12-10c++: Add test for C++23 auto(x)Marek Polacek1-0/+18
I was curious if our auto(x) works in contexts like bit-field width and similar. It appears that it does. Might be worth adding a test for it. gcc/testsuite/ChangeLog: * g++.dg/cpp23/auto-fncast10.C: New test.
2021-12-10Fortran: fix check for pointer dummy arguments with INTENT(IN)Harald Anlauf4-31/+47
gcc/fortran/ChangeLog: PR fortran/103418 * check.c (variable_check): Replace previous check of procedure dummy arguments with INTENT(IN) attribute when passed to intrinsic procedures by gfc_check_vardef_context. * expr.c (gfc_check_vardef_context): Correct check of INTENT(IN) dummy arguments for the case of sub-components of a CLASS pointer. gcc/testsuite/ChangeLog: PR fortran/103418 * gfortran.dg/move_alloc_8.f90: Adjust error messages. * gfortran.dg/pointer_intent_9.f90: New test.
2021-12-10libstdc++: Add std::time_get %r support [PR71367]Jakub Jelinek8-7/+167
This incremental patch adds std::time_get %r support (%p was added already in the previous patch). The _M_am_fm_format method previously in the header unfortunately had wrong arguments and so was useless, so the largest complication in this patch is exporting a new symbol in the right symbol version. 2021-12-10 Jakub Jelinek <jakub@redhat.com> PR libstdc++/71367 * config/locale/dragonfly/time_members.cc (_M_initialize_timepunct): Initialize "C" _M_am_pm_format to %I:%M:%S %p rather than empty string. * config/locale/gnu/time_members.cc (_M_initialize_timepunct): Likewise. * config/locale/generic/time_members.cc (_M_initialize_timepunct): Likewise. * include/bits/locale_facets_nonio.h (_M_am_pm_format): New method. * include/bits/locale_facets_nonio.tcc (_M_extract_via_format): Handle %r. * config/abi/pre/gnu.ver (GLIBCXX_3.4.30): Export _M_am_pm_format with const _CharT** argument, ensure it isn't exported in GLIBCXX_3.4. * testsuite/22_locale/time_get/get/char/71367.cc: New test. * testsuite/22_locale/time_get/get/wchar_t/71367.cc: New test.
2021-12-10libstdc++: Some time_get fixes [PR78714]Jakub Jelinek9-84/+860
The following patch is an attempt to fix various time_get related issues. Sorry, it is long... One of them is PR78714. It seems _M_extract_via_format has been written with how strftime behaves in mind rather than how strptime behaves. There is a significant difference between the two, for strftime %a and %A behave differently etc., one emits an abbreviated name, the other full name. For strptime both should behave the same and accept both the full or abbreviated names. This needed large changes in _M_extract_name, which was assuming the names are unique and names aren't prefixes of other names. The _M_extract_name changes allow to deal with those cases. As can be seen in the new testcase, e.g. for %b and english locales we need to accept both Apr and April. If we see Apr in the input, the code looks at whether there is end right after those 3 chars or if the next character doesn't match characters in the longer names; in that case it accepts the abbreviated name. Otherwise, if the input has Apri, it commits to a longer name and fails if it isn't April. This behavior is different from strptime, which for %bix and Aprix accepts it, but for an input iterator I'm afraid we can't do better, we can't go back (peek more than the current character). Another case is that %d and %e in strptime should work the same, while previously the code was hardcoding that %d would be 01 to 31 and %e 1 to 31 (with leading 0 replaced by space). strptime POSIX 2009 documentation seems to suggest for numbers it should accept up to the specified number of digits rather than exactly that number of digits: The pattern "[x,y]" indicates that the value shall fall within the range given (both bounds being inclusive), and the maximum number of characters scanned shall be the maximum required to represent any value in the range without leading zeros. so by my reading "1:" is valid for "%H:". The glibc strptime implementation actually skips any amount of whitespace in all the cases where a number is read, my current patch skips a single space at the start of %d/%e but not the others, but doesn't subtract the space length from the len characters. One option would be to do the leading whitespace skipping in _M_extract_num but take it into account how many digits can be read. This matters for " 12:" and "%H:", but not for " 12:" and " %H:" as in the latter case the space in the format string results in all the whitespace at the start to be consumed. Note, the allowing of a single digit rather than 2 changes a behavior in other ways, e.g. when seeing 40 in a number for range [1, 31] we reject it as before, but previously we'd keep *ret == '4' because it was assuming it has to be 2 digits and 40 isn't valid, so we know error already on the 4, but now we accept the 4 as value and fail iff the next format string doesn't match the 0. Also, previously it wasn't really checking the number was in the right range, it would accept 00 for [1, 31] numbers, or would accept 39. Another thing is that %I was parsing 12 as tm_hour 12 rather than as tm_hour 0 like e.g. glibc does. Another thing is that %t was matching a single tab and %n a single newline, while strptime docs say it skips over whitespace (again, zero or more). Another thing is that %p wasn't handled at all, I think this was the main cause of FAIL: 22_locale/time_get/get_time/char/2.cc execution test FAIL: 22_locale/time_get/get_time/char/wrapped_env.cc execution test FAIL: 22_locale/time_get/get_time/char/wrapped_locale.cc execution test FAIL: 22_locale/time_get/get_time/wchar_t/2.cc execution test FAIL: 22_locale/time_get/get_time/wchar_t/wrapped_env.cc execution test FAIL: 22_locale/time_get/get_time/wchar_t/wrapped_locale.cc execution test before this patch, because en_HK* locales do use %I and %p in it. The patch handles %p only if it follows %I (i.e. when the hour is parsed first), which is the more usual case (in glibc): grep '%I' localedata/locales/* | grep '%I.*%p' | wc -l 282 grep '%I' localedata/locales/* | grep -v '%I.*%p' | wc -l 44 grep '%I' localedata/locales/* | grep -v '%p' | wc -l 17 The last case use %P instead of %p in t_fmt_ampm, not sure if that one is never used by strptime because %P isn't handled by strptime. Anyway, the right thing to handle even %p%I would be to pass some state around through all the _M_extract_via_format calls like glibc passes struct __strptime_state { unsigned int have_I : 1; unsigned int have_wday : 1; unsigned int have_yday : 1; unsigned int have_mon : 1; unsigned int have_mday : 1; unsigned int have_uweek : 1; unsigned int have_wweek : 1; unsigned int is_pm : 1; unsigned int want_century : 1; unsigned int want_era : 1; unsigned int want_xday : 1; enum ptime_locale_status decided : 2; signed char week_no; signed char century; int era_cnt; } s; around. That is for the %p case used like: if (s.have_I && s.is_pm) tm->tm_hour += 12; during finalization, but handles tons of other cases which it is unclear if libstdc++ needs or doesn't need to handle, e.g. strptime if one specifies year and yday computes wday/mon/day from it, etc. basically for the redundant fields computes them from other fields if those have been parsed and are sufficient to determine it. To do this we'd need to change ABI for the _M_extract_via_format, though sure, we could add a wrapper around the new one with the old arguments that would just use a dummy state. And we'd need a new _M_whatever finalizer that would do those post parsing tweaks. Also, %% wasn't handled. For a whitespace in the strings there was inconsistent behavior, _M_extract_via_format would require exactly that whitespace char (say matching space, or matching tab), while the caller follows what https://eel.is/c++draft/locale.time.get#members-8.5 says, that when encountering whitespace it skips whitespace in the format and then whitespace in the input if any. I've changed _M_extract_via_format to skip whitespace in the input (looping over format isn't IMHO necessary, because next iteration of the loop will handle that too). Tested on x86_64-linux by make check-target-libstdc++-v3, ok for trunk if it passes full bootstrap/regtest? For the new 3.cc testcases, I have included hopefully correctly corresponding C testcase using strptime in an attachment, and to the extent where it can be compared (e.g. strptime on failure just returns NULL, doesn't tell where it exactly stopped) I think the only difference is that str = "Novembur"; format = "%bembur"; ret = strptime (str, format, &time); case where strptime accepts it but there is no way to do it with input operator. I admit I don't have libc++ or other STL libraries around to be able to check how much the new 3.cc matches or disagrees with other implementations. Now, the things not handled by this patch but which should be fixed (I probably need to go back to compiler work) or at least looked at: 1) seems %j, %r, %U, %w and %W aren't handled (not sure if all of them are already in POSIX 2009 or some are later) 2) I haven't touched the %y/%Y/%C and year handling stuff, that is definitely not matching what POSIX 2009 says: C All but the last two digits of the year {2}; leading zeros shall be permitted but shall not be required. A leading '+' or '−' character shall be permitted before any leading zeros but shall not be required. y The last two digits of the year. When format contains neither a C conversion specifier nor a Y conversion specifier, values in the range [69,99] shall refer to years 1969 to 1999 inclusive and values in the range [00,68] shall refer to years 2000 to 2068 inclusive; leading zeros shall be permitted but shall not be re‐ quired. A leading '+' or '−' character shall be permitted before any leading zeros but shall not be required. Note: It is expected that in a future version of this standard the default century inferred from a 2-digit year will change. (This would apply to all commands accepting a 2-digit year as input.) Y The full year {4}; leading zeros shall be permitted but shall not be required. A leading '+' or '−' character shall be permitted before any leading zeros but shall not be required. I've tried to avoid making changes to _M_extract_num for these as well to keep current status quo (the __len == 4 cases). One thing is what to do for things with %C %y and/or %Y in the formats, another thing is what to do in the methods that directly perform _M_extract_num for year 3) the above question what to do for leading whitespace of any numbers being parsed 4) the %p%I issue mentioned above and generally what to do if we pass state and have finalizers at the end of parsing 5) _M_extract_via_format is also inconsistent with its callers on handling the non-whitespace characters in between format specifiers, the caller follows https://eel.is/c++draft/locale.time.get#members-8.6 and does case insensitive comparison: // TODO real case-insensitive comparison else if (__ctype.tolower(*__s) == __ctype.tolower(*__fmt) || __ctype.toupper(*__s) == __ctype.toupper(*__fmt)) while _M_extract_via_format only compares exact characters: // Verify format and input match, extract and discard. if (__format[__i] == *__beg) ++__beg; (another question is if there is a better way how to do real case-insensitive comparison of 2 characters and whether we e.g. need to handle the Turkish i/İ and ı/I which have different number of bytes in UTF-8) 6) _M_extract_name does something weird for case-sensitivity, // NB: Some of the locale data is in the form of all lowercase // names, and some is in the form of initially-capitalized // names. Look for both. if (__beg != __end) and if (__c == __names[__i1][0] || __c == __ctype.toupper(__names[__i1][0])) for the first letter while just __name[__pos] == *__beg on all the following letters. strptime says: In case a text string (such as the name of a day of the week or a month name) is to be matched, the comparison is case insensitive. so supposedly all the _M_extract_name comparisons should be case insensitive. 2021-12-10 Jakub Jelinek <jakub@redhat.com> PR libstdc++/78714 * include/bits/locale_facets_nonio.tcc (_M_extract_via_format): Mention in function comment it interprets strptime format string rather than strftime. Handle %a and %A the same by accepting both full and abbreviated names. Similarly handle %h, %b and %B the same. Handle %d and %e the same by accepting possibly optional single space and 1 or 2 digits. For %I store tm_hour 0 instead of tm_hour 12. For %t and %n skip any whitespace. Handle %p and %%. For whitespace in the string skip any whitespace. (_M_extract_num): For __len == 2 accept 1 or 2 digits rather than always 2. Don't punt early if __value * __mult is larget than __max or smaller than __min - __mult, instead punt if __value > __max. At the end verify __value is in between __min and __max and punt otherwise. (_M_extract_name): Allow non-unique names or names which are prefixes of other names. Don't recompute lengths of names for every character. * testsuite/22_locale/time_get/get/char/3.cc: New test. * testsuite/22_locale/time_get/get/wchar_t/3.cc: New test. * testsuite/22_locale/time_get/get_date/char/12791.cc (test01): Use 62 instead 60 and expect 6 to be accepted and thus *ret01 == '2'. * testsuite/22_locale/time_get/get_date/wchar_t/12791.cc (test01): Similarly. * testsuite/22_locale/time_get/get_time/char/2.cc (test02): Add " PM" to the string. * testsuite/22_locale/time_get/get_time/char/5.cc (test01): Expect tm_hour 1 rather than 0. * testsuite/22_locale/time_get/get_time/wchar_t/2.cc (test02): Add " PM" to the string. * testsuite/22_locale/time_get/get_time/wchar_t/5.cc (test01): Expect tm_hour 1 rather than 0.
2021-12-10Fix inaccuracies in VxWorks LINK_SPECDouglas B Rupp1-2/+2
-v needs to generate a -V not -v, as most/all other ports do. The latter causes collect2 to output exec'd collect-ld with same switches, which in turn causes a configure test which accumulates linker switches to contain duplicates, leading to a libstdc++ configure failure in some configurations. -V is typically used in such contexts to output the available emulations. The change also removes reference to %(link_target), long obsolete. 2021-12-07 Doug Rupp <rupp@adacore.com> * config/vxworks.h (LINK_SPEC): Remove %(link_target). Change %{v:-v} to %{v:-V}.
2021-12-10Remove assignment to STMP_FIXINC from t-vxworksOlivier Hainque1-1/+0
Just redundant with the default Makefile setting. 2021-12-07 Olivier Hainque <hainque@adacore.com> * config/t-vxworks: Remove assignment to STMP_FIXINC.
2021-12-10libstdc++: Guard mutex and condvar with gthreads macro [PR103638]Jonathan Wakely1-0/+4
A mutex and condition variable is used for timed waits on atomics if there is no "platform wait" (e.g. futex) supported. But the use of those types wasn't guarded by the _GLIBCXX_HAS_GTHREADS macro, causing errors for --disable-threads builds. This fix allows <atomic> to work on targets with futexes but no gthreads. libstdc++-v3/ChangeLog: PR libstdc++/103638 * include/bits/atomic_timed_wait.h: Check _GLIBCXX_HAS_GTHREADS before using std::mutex and std::__condvar.
2021-12-10libstdc++: Fix definition of _GLIBCXX_NO_SLEEP config macroJonathan Wakely3-5/+5
If no OS function to sleep (e.g. nanosleep, usleep, Win32 Sleep etc.) is available then configure defines the macro NO_SLEEP. But this will not get prefixed with "_GLIBCXX_" because include/Makefile.am only does that for macros beginning with "HAVE_". The configure script should define _GLIBCXX_NO_SLEEP instead (which is what the code actually checks for). libstdc++-v3/ChangeLog: * acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Add _GLIBCXX_ prefix to NO_SLEEP macro. * config.h.in: Regenerate. * configure: Regenerate.
2021-12-10Replace t-ppccomm by t-vxworks in libgcc/config/rs6000Rasmus Villemoes2-2/+3
This removes ibm-ldouble.c and a few eabi crt files from the build closure, which were producing objects we don't use anyway. 2021-12-07 Rasmus Villemoes <rv@rasmusvillemoes.dk> libgcc/ * config/rs6000/t-vxworks: New file. * config.host (powerpc*-*-vxworks*): Use it instead of t-ppccomm.
2021-12-10param: Add missing . in description.Martin Liska1-1/+1
Fixes: FAIL: compiler driver --help=param option(s): "^ +-.*[^:.]$" absent from output: " --param=max-inline-functions-called-once-loop-depth= Maximum loop depth of a call which is considered for inlining functions called once" FAIL: compiler driver --help=params option(s): "[^.]$" absent from output: "e" gcc/ChangeLog: * params.opt: Add missing dot.
2021-12-10PR ipa/103601: ICE compiling CSiBE in ipa-modref's insert_kill.Roger Sayle2-1/+37
This patch fixes PR ipa/103061 which is P1 regression that shows up as an ICE in ipa-modref-tree.c's insert_kill when compiling the CSiBE benchmark. I believe the underlying cause is that the new kill tracking functionality wasn't anticipating memory accesses that are zero bits wide!?. The failing source code (test case) contains the unusual lines: typedef struct { } spinlock_t; and q->lock = (spinlock_t) { }; Making spinlock_t larger, or removing the assignment work around the issue. The one line patch below to useful_for_kill_p teaches IPA that a memory write is only useful as a "kill" if it is more than zero bits wide. In theory, the existing known_size_p (size) test is now redundant, as poly_int64 currently uses the value -1 for unknown size values, but the proposed change makes the semantics clear, and defends against possible future changes in representation. 2021-12-10 Roger Sayle <roger@nextmovesoftware.com> gcc/ChangeLog PR ipa/103601 * ipa-modref-tree.h (useful_for_kill_p): Zero width accesses aren't useful for kill tracking. gcc/testsuite/ChangeLog PR ipa/103601 * gcc.dg/ipa/pr103601.c: New test case.
2021-12-10amdgcn: Change offload variable table discoveryAndrew Stubbs3-51/+41
Up to now the libgomp GCN plugin has been finding the offload variables by using a symbol lookup, but the AMD runtime requires that the symbols are global for that to work. This was ensured by mkoffload as a post-procssing step, but the LLVM 13 assembler no longer accepts this in the case where the variable was previously declared differently. This patch switches to locating the symbols directly from the offload_var_table, which means that only one symbol needs to be forced global. This changes breaks the libgomp image compatibility so GOMP_VERSION_GCN has also been bumped. gcc/ChangeLog: * config/gcn/mkoffload.c (process_asm): Process the variable table completely differently. (process_obj): Encode the varaible data differently. include/ChangeLog: * gomp-constants.h (GOMP_VERSION_GCN): Bump. libgomp/ChangeLog: * plugin/plugin-gcn.c (struct gcn_image_desc): Remove global_variables. (GOMP_OFFLOAD_load_image): Locate the offload variables via the table, not individual symbols.
2021-12-10pr103523: Check for PLUS/MINUS supportJoel Hutton2-4/+17
Check for PLUS_EXPR/MINUS_EXPR support in vectorizable_induction. PR103523 is an ICE on valid code: void d(float *a, float b, int c) { float e; for (; c; c--, e += b) a[c] = e; } This is due to not checking for PLUS_EXPR support, which is missing in VNx2sf mode. This causes an ICE at expand time. This patch adds a check for support in vectorizable_induction. gcc/ChangeLog: PR tree-optimization/103523 * tree-vect-loop.c (vectorizable_induction): Check for PLUS_EXPR/MINUS_EXPR support. gcc/testsuite/ChangeLog: * gcc.target/aarch64/pr103523.c: New test.
2021-12-10libstdc++: Fix diagnostic pragma push that should be popJonathan Wakely1-1/+1
libstdc++-v3/ChangeLog: * include/bits/char_traits.h: Change pragma push to pop.
2021-12-10d: Merge upstream dmd 3982604c5, druntime bc58b1e9, phobos 12329adb6.Iain Buclaw175-4902/+6436
D front-end changes: - Import dmd mainline development. - Split off enum EXP from enum TOK. - Integer promotions now follow C integral promotions by default. - Implements __traits(initSymbol). - Lowering of array construction has been moved to the dmd front-end. - Fix segfault in dmd.lexer from unaligned read (PR103529). Druntime changes: - Import druntime mainline development. - Define SIG_BLOCK for Solaris (PR103528). Phobos changes: - Import phobos mainline development. gcc/d/ChangeLog: PR d/103529 * dmd/MERGE: Merge upstream dmd 3982604c5. * Make-lang.in (D_FRONTEND_OBJS): Add d/root-optional.o. * d-attribs.cc (build_attributes): Update for new front-end interface. * d-codegen.cc (d_build_call): Likewise. * d-compiler.cc (Compiler::paintAsType): Likewise. * d-lang.cc (d_handle_option): Remove OPT_fpreview_intpromote, add handling of OPT_frevert_intpromote. * d-port.cc (Port::valcpy): Assert buffer is aligned. * d-target.cc (Target::isVectorOpSupported): Update for new front-end interface. * decl.cc (layout_class_initializer): Likewise. * expr.cc (lvalue_p): Likewise. (binop_assignment): Likewise. (ExprVisitor::visit): Likewise. (ExprVisitor::visit (AssignExp *)): Remove generation of _d_arrayctor and _d_arraysetctor library helpers. (ExprVisitor::visit (VarExp *)): Support __traits(initSymbol). * intrinsics.cc (expand_intrinsic_rotate): Update for new front-end interface. * lang.opt (fpreview=intpromote): Remove. (frevert=intpromote): New. * runtime.def (ARRAYCTOR): Remove. (ARRAYSETCTOR): Remove. * toir.cc (IRVisitor::visit): Update for new front-end interface. * types.cc (layout_aggregate_members): Likewise. * dmd/root/optional.d: New file. * dmd/root/optional.h: New file. libphobos/ChangeLog: PR d/103528 * libdruntime/MERGE: Merge upstream druntime bc58b1e9. * libdruntime/Makefile.am (DRUNTIME_DSOURCES_LINUX): Remove core/sys/linux/syscalls.d. * libdruntime/Makefile.in: Regenerate. * src/MERGE: Merge upstream phobos 12329adb6. * testsuite/libphobos.config/config.exp: Add test22523. * libdruntime/core/sys/linux/syscalls.d: Removed. * testsuite/libphobos.config/test22523.d: New test.
2021-12-09libstdc++: Make atomic<T*>::wait() const [PR102994]Thomas Rodgers3-5/+24
This was an oversight in the original commit adding wait/notify to atomic<T>. libstdc++-v3/ChangeLog: PR libstdc++/102994 * include/bits/atomic_base.h (__atomic_base<_PTp*>::wait()): Add const qualifier. * include/std/atomic (atomic<_Tp*>::wait(), atomic_wait()): Likewise. * testsuite/29_atomics/atomic/wait_notify/102994.cc: New test.
2021-12-10x86: Update -mtune=tremontCui,Lili1-2/+1
Silvermont has a special handle in add_stmt_cost function, because it has in order SIMD pipeline. But for Tremont, its SIMD pipeline is out of order, remove Tremont from this special handle. gcc/ChangeLog * config/i386/i386.c (ix86_vector_costs::add_stmt_cost): Remove Tremont.
2021-12-10d: Align methods to MINIMUM_METHOD_BOUNDARY.Iain Buclaw1-0/+3
Aligns all D defined methods to MINIMUM_METHOD_BOUNDARY, improving interoperability with C++ methods. gcc/d/ChangeLog: * decl.cc (get_symbol_decl): Align methods to MINIMUM_METHOD_BOUNDARY.
2021-12-10Daily bump.GCC Administrator11-1/+439
2021-12-09libstdc++: Fix ambiguous comparisons for iterators in C++20Jonathan Wakely1-5/+45
Since r11-1571 (c++: Refinements to "more constrained") was changed in the front end, the following comment from stl_iterator.h stopped being true: // These extra overloads are not needed in C++20, because the ones above // are constrained with a requires-clause and so overload resolution will // prefer them to greedy unconstrained function templates. The requires-clause is no longer considered when comparing unrelated function templates. That means that the constrained operator== specified in the standard is no longer more constrained than the pathological comparison operators defined in the testsuite_greedy_ops.h header. This was causing several tests to FAIL in C++20 mode: FAIL: 23_containers/deque/types/1.cc (test for excess errors) FAIL: 23_containers/vector/types/1.cc (test for excess errors) FAIL: 24_iterators/move_iterator/greedy_ops.cc (test for excess errors) FAIL: 24_iterators/normal_iterator/greedy_ops.cc (test for excess errors) FAIL: 24_iterators/reverse_iterator/greedy_ops.cc (test for excess errors) The solution is to restore some of the non-standard comparison operators that are more specialized than the greedy operators in the testsuite. libstdc++-v3/ChangeLog: * include/bits/stl_iterator.h (operator==, operator<=>): Define overloads for homogeneous specializations of reverse_iterator, __normal_iterator and move_iterator.
2021-12-09libstdc++: Remove bogus dg-error for effective-target c++20Jonathan Wakely1-4/+0
This test no longer has additional errors for C++20 mode, so remove the dg-error that is now failing, and the unnecessary dg-prune-output. libstdc++-v3/ChangeLog: * testsuite/20_util/scoped_allocator/69293_neg.cc: Remove dg-error for c++20.
2021-12-09libstdc++: Make std::make_exception_ptr work with -fno-exceptions [PR85813]Jonathan Wakely2-12/+20
This allows std::make_exception_ptr to be used in a translation unit compiled with -fno-exceptions. This works because the new implementation added for PR 68297 doesn't need to throw or catch anything. The catch is there to handle exceptions from the constructor of the exception object, which we can assume won't happen in a -fno-exceptions TU and so use the __catch macro instead. If the constructor does throw (because it's defined in a different TU which was compiled with exceptions enabled) then that exception will propagate to the make_exception_ptr caller. That seems acceptable for a program that is trying to mix & match TUs compiled with and without exceptions, and using types that throw when constructed. That should be rare, and can't reasonably be expected to have sensible behaviour. This also enables the new implementation for targets that use a non-standard calling convention for the exceptionDestructor callback (specifically, mingw, which uses __thiscall). All we need to do is mark the __dest_thunk function template with the right calling convention. Finally, the useless no-op definition of make_exception_ptr (which is only used if both RTTI and exceptions are disabled) is marked always_inline, to ensure that the linker won't keep that definition and discard the functional ones when both definitions of the function are present in the link. An alternative would be to add the abi_tag attribute to the useless definition, but making it always_inline should work, and it's small enough to always be inlined reliably. libstdc++-v3/ChangeLog: PR libstdc++/85813 * libsupc++/exception_ptr.h (__dest_thunk): Add macro for destructor calling convention. (make_exception_ptr): Enable non-throwing implementation for -fno-exceptions and for non-standard calling conventions. Use always_inline attribute on the useless no-rtti no-exceptions definition. * testsuite/18_support/exception_ptr/64241.cc: Add -fno-rtti so the no-op implementation is still used.
2021-12-09libstdc++: Fix std::exception_ptr regressions [PR103630]Jonathan Wakely2-6/+52
This restores support for std::make_exception_ptr<E&> and for using std::exception_ptr in C++98. Because the new non-throwing implementation needs to use std::decay to handle references the original throwing implementation is used for C++98. We also need to change the typeid expression so it doesn't yield the dynamic type when the function parameter is a reference to a polymorphic type. Otherwise the new exception object could be caught by any handler matching the dynamic type, even though the actual exception object is only a copy of the base class, sliced to the static type. libstdc++-v3/ChangeLog: PR libstdc++/103630 * libsupc++/exception_ptr.h (exception_ptr): Fix exception specifications on inline definitions. (make_exception_ptr): Decay the template parameter. Use typeid of the static type. * testsuite/18_support/exception_ptr/103630.cc: New test.
2021-12-09libstdc++: Implement std::ios_base::noreplace for C++23 [PR59769]Jonathan Wakely5-21/+95
This implements my P2467R0 proposal to support opening an fstream in exclusive mode. The new constant is also supported pre-C++23 as std::ios_base::__noreplace. This proposal hasn't been approved for C++23 yet, but I am confident it will be, as this is restoring a feture found in pre-ISO C++ iostreams implementations (and still present in the MSVC library as _Noreplace). If the proposal fails for C++23 we can remove the ios::noreplace name and just keep ios::__noreplace as an extension. libstdc++-v3/ChangeLog: PR libstdc++/59769 * config/io/basic_file_stdio.cc (fopen_mode): Add support for exclusive mode. * include/bits/ios_base.h (_S_noreplace): Define new enumerator. (ios_base::__noreplace): Define. (ios_base::noreplace): Define for C++23. * include/std/version (__cpp_lib_ios_noreplace): Define. * testsuite/27_io/basic_ofstream/open/char/noreplace.cc: New test. * testsuite/27_io/basic_ofstream/open/wchar_t/noreplace.cc: New test.
2021-12-09libstdc++: Allow std::condition_variable waits to be cancelled [PR103382]Jonathan Wakely8-6/+125
std::condition_variable::wait(unique_lock<mutex>&) is incorrectly marked noexcept, which means that the __forced_unwind exception used by NPTL cancellation will terminate the process. It should allow exceptions to pass through, so that a thread can be cleanly cancelled when waiting on a condition variable. The new behaviour is exported as a new version of the symbol, to avoid an ABI break for existing code linked to the non-throwing definition of the function. Code linked against older releases will have a reference to the @GLIBCXX_3.4.11 version, andcode compiled against the new libstdc++ will get a reference to the @@GLIBCXX_3.4.30 version. libstdc++-v3/ChangeLog: PR libstdc++/103382 * config/abi/pre/gnu.ver (GLIBCXX_3.4.11): Do not export old symbol if .symver renaming is supported. (GLIBCXX_3.4.30): Export new symbol if .symver renaming is supported. * doc/xml/manual/evolution.xml: Document change. * doc/html/manual/api.html: Regenerate. * include/bits/std_mutex.h (__condvar::wait, __condvar::wait_until): Remove noexcept. * include/std/condition_variable (condition_variable::wait): Likewise. * src/c++11/condition_variable.cc (condition_variable::wait): Likewise. * src/c++11/compatibility-condvar.cc (__nothrow_wait_cv::wait): Define nothrow wrapper around std::condition_variable::wait and export the old symbol as an alias to it. * testsuite/30_threads/condition_variable/members/103382.cc: New test.
2021-12-09libstdc++: Avoid unnecessary allocations in std::map insertions [PR92300]Jonathan Wakely5-8/+130
Inserting a pair<Key, Value> into a map<Key, Value> will allocate a new node and construct a pair<const Key, Value> in the node, then check if the Key is already present in the map. That is because pair<Key, Value> is not the same type as the map's value_type. But it only differs in the const-qualification on the Key, and so we should be able to do the lookup directly, without allocating a new node. This avoids allocating and then deallocating a node for the case where the key is already found and nothing gets inserted. We can take this optimization further and lookup the key directly for a pair<Key, X>, pair<const Key, X>, pair<Key&, X> etc. for any X. A strict reading of the standard says we can only do this when we know the allocator won't do anything funky with the value when constructing a pair<const Key, Value> from a slightly different type. Inserting that type only requires the value_type to be Cpp17EmplaceInsertable into the container, and that doesn't have any requirement that the value is unchanged (unlike Cpp17CopyInsertable and Cpp17MoveInsertable). For that reason, the optimization is only done for maps using std::allocator. A similar optimization can be done for map.emplace(key, value) where the first argument is similar to the key_type and so can be looked up without allocating a new node and constructing a key_type. Finally, both of the insert and emplace cases can use the same optimization when key_type is a scalar type and some other scalar is being passed as the insert/emplace argument. Converting from one scalar type to another won't have surprising value-altering behaviour, and has no side effects (unlike e.g. constructing a std::string from a const char* argument, which might allocate). We don't need to do this for std::multimap, because we always insert the new node even if the key is already present. So there's no benefit to doing the lookup before allocating the new node. libstdc++-v3/ChangeLog: PR libstdc++/92300 * include/bits/stl_map.h (insert(Pair&&), emplace(Args&&...)): Check whether the arguments can be looked up directly without constructing a temporary node first. * include/bits/stl_pair.h (__is_pair): Move to here, from ... * include/bits/uses_allocator_args.h (__is_pair): ... here. * testsuite/23_containers/map/modifiers/emplace/92300.cc: New test. * testsuite/23_containers/map/modifiers/insert/92300.cc: New test.
2021-12-09libstdc++: Do not leak empty COW stringsJonathan Wakely1-3/+6
When non-const references, pointers or iterators are obtained to the contents of a COW std::basic_string, the implementation has to assume it could result in a write to the contents. If the string was previously shared, it does the "copy-on-write" step of creating a new copy of the data that is not shared by another object. It also marks the string as "leaked", so that no future copies of it will share ownership either. However, if the string is empty then the only character in the sequence is the terminating null, and modifying that is undefined behaviour. This means that non-const references/pointers/iterators to an empty string are effectively const. Since no direct modification is possible, there is no need to "leak" the string, it can be safely shared with other objects. This avoids unnecessary allocations to create new copies of empty strings that can't be modified anyway. We already did this optimization for strings that share ownership of the static _S_empty_rep() object, but not for strings that have non-zero capacity, and not for fully-dynamic-strings (where the _S_empty_rep() object is never used). With this change we avoid two allocations in the return statement: std::string s; s.reserve(1); // allocate std::string s2 = s; std::string s3 = s; return s[0] + s2[0] + s3[0]; // leak+allocate twice libstdc++-v3/ChangeLog: * include/bits/cow_string.h (basic_string::_M_leak_hard): Do not reallocate an empty string.
2021-12-09libstdc++: Disable over-zealous warnings about std::string copies [PR103332]Jonathan Wakely1-0/+7
These warnings are triggered by perfectly valid code using std::string. They're particularly bad when --enable-fully-dynamic-string is used, because even std::string().begin() will give a warning. Use pragmas to stop the troublesome warnings for copies done by std::char_traits. libstdc++-v3/ChangeLog: PR libstdc++/103332 PR libstdc++/102958 PR libstdc++/103483 * include/bits/char_traits.h: Suppress stringop and array-bounds warnings.
2021-12-09libstdc++: Fix non-reserved name in std::allocator base class [PR64135]Jonathan Wakely11-167/+293
The possible base classes of std::allocator are new_allocator and malloc_allocator, which both cause a non-reserved name to be declared in every program that includes the definition of std::allocator. This is non-conforming. This change replaces __gnu_cxx::new_allocator with std::__new_allocator which is identical except for using a reserved name. The non-standard extension __gnu_cxx::new_allocator is preserved as a thin wrapper over std::__new_allocator. There is no problem with the extension using a non-reserved name now that it's not included by default in other headers. The same change could be done to __gnu_cxx::malloc_allocator but as it's not the default configuration it can wait. libstdc++-v3/ChangeLog: PR libstdc++/64135 * config/allocator/new_allocator_base.h: Include <bits/new_allocator.h> instead of <ext/new_allocator.h>. (__allocator_base): Use std::__new_allocator instead of __gnu_cxx::new_allocator. * doc/xml/manual/allocator.xml: Document new default base class for std::allocator. * doc/xml/manual/evolution.xml: Likewise. * doc/html/*: Regenerate. * include/Makefile.am: Add bits/new_allocator.h. * include/Makefile.in: Regenerate. * include/experimental/memory_resource (new_delete_resource): Use std::__new_allocator instead of __gnu_cxx::new_allocator. * include/ext/new_allocator.h (new_allocator): Derive from std::__new_allocator. Move implementation to ... * include/bits/new_allocator.h: New file. * testsuite/20_util/allocator/64135.cc: New test.
2021-12-09Limit inlining functions called onceJan Hubicka3-17/+46
as dicussed in PR ipa/103454 there are several benchmarks that regresses for -finline-functions-called once. Runtmes: - tramp3d with -Ofast. 31% - exchange2 with -Ofast 11-21% - roms O2 9%-10% - tonto 2.5-3.5% with LTO Build times: - specfp2006 41% (mostly wrf that builds 71% faster) - specint2006 1.5-3% - specfp2017 64% (again mostly wrf) - specint2017 2.5-3.5% This patch adds two params to tweak the behaviour: 1) max-inline-functions-called-once-loop-depth limiting the loop depth (this is useful primarily for exchange where the inlined function is in loop depth 9) 2) max-inline-functions-called-once-insns We already have large-function-insns/growth parameters, but these are limiting also inlining small functions, so reducing them will regress very large functions that are hot. Because inlining functions called once is meant just as a cleanup pass I think it makes sense to have separate limit for it. gcc/ChangeLog: 2021-12-09 Jan Hubicka <hubicka@ucw.cz> * doc/invoke.texi (max-inline-functions-called-once-loop-depth, max-inline-functions-called-once-insns): New parameters. * ipa-inline.c (check_callers): Handle param_inline_functions_called_once_loop_depth and param_inline_functions_called_once_insns. (edge_badness): Fix linebreaks. * params.opt (param=max-inline-functions-called-once-loop-depth, param=max-inline-functions-called-once-insn): New params.
2021-12-09Extend the offset and size of merged object references [PR103215].Martin Sebor8-46/+664
Resolves: PR tree-optimization/103215 - bogus -Warray-bounds with two pointers with different offsets each gcc/ChangeLog: PR tree-optimization/103215 * pointer-query.cc (access_ref::merge_ref): Extend the offset and size of the merged object instead of using the larger. gcc/testsuite/ChangeLog: PR tree-optimization/103215 * gcc.dg/Wstringop-overflow-58.c: Adjust and xfail expected warnings. * gcc.dg/Wstringop-overflow-59.c: Same. * gcc.dg/warn-strnlen-no-nul.c: Same. * gcc.dg/Warray-bounds-91.c: New test. * gcc.dg/Warray-bounds-92.c: New test. * gcc.dg/Wstringop-overflow-85.c: New test. * gcc.dg/Wstringop-overflow-87.c: New test.
2021-12-09Avoid expecting nonzero size for access none void* arguments [PR101751].Martin Sebor3-2/+70
Resolves: PR middle-end/101751 - attribute access none with void pointer expects nonzero size gcc/ChangeLog: PR middle-end/101751 * doc/extend.texi (attribute access): Adjust. * gimple-ssa-warn-access.cc (pass_waccess::maybe_check_access_sizes): Treat access mode none on a void* argument as expecting as few as zero bytes. gcc/testsuite/ChangeLog: PR middle-end/101751 * gcc.dg/Wstringop-overflow-86.c: New test.
2021-12-09Fix path to t-ppc64-fp for ppc*-vxworks7* libgcc tmake_fileFrederic Konrad1-1/+1
This fixes a basic mistake in the relative path used to reference a rs6000 specific Makefile fragment in the libgcc configuration bits for powerpc*-vxworks7. 2021-01-14 Fred Konrad <konrad@adacore.com> libgcc/ * config.host (powerpc*-wrs-vxworks7*): Fix path to rs6000/t-ppc64-fp, relative to config/ not libgcc/.
2021-12-09pch: Fix aarch64 build [PR71934]Jakub Jelinek1-1/+1
On Thu, Dec 09, 2021 at 05:42:10PM +0100, Christophe Lyon wrote: > This also broke aarch64 I think: > In file included from > /tmp/6140018_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/config/aarch64/aarch64-sve-builtins.cc:3920:0: > ./gt-aarch64-sve-builtins.h: In function 'void > gt_pch_p_19registered_function(void*, void*, gt_pointer_operator, void*)': > ./gt-aarch64-sve-builtins.h:86:44: error: no matching function for call to > 'gt_pch_nx(aarch64_sve::function_instance*, void (*&)(void*, void*, void*), > void*&)' > gt_pch_nx (&((*x).instance), op, cookie); Fixed thusly. 2021-12-09 Jakub Jelinek <jakub@redhat.com> PR pch/71934 * config/aarch64/aarch64-sve-builtins.cc (gt_pch_nx): Change type of second argument from function with 2 pointer arguments to function with 3 pointer arguments.
2021-12-09Leverage VX_CPU_PREFIX in aarch64-vxworks.hOlivier Hainque1-1/+2
This change tightens the CPU macro definitions issued for VxWorks system headers on aarch64 to incorporate the common VX_CPU_PREFIX facility, as the powerpc port does. The net effect for current configurations is the addition of an actual "_VX_" prefix to the references to architecture representative values. The absence of this prefix is most often compensated for in system headers, but not always (when going through particular #include paths), and this caused a couple of spurious test failures. 2021-12-09 Olivier Hainque <hainque@adacore.com> gcc/ * config/aarch64/aarch64-vxworks.h (TARGET_OS_CPP_BUILTINS): Use VX_CPU_PREFIX in CPU definitions.
2021-12-09Add a new dump function.Martin Sebor2-26/+94
gcc/ChangeLog: * pointer-query.cc (access_ref::dump): Define new function (pointer_query::dump): Call it. * pointer-query.h (access_ref::dump): Declare new function.
2021-12-09Refactor compute_objsize_r into helpers.Martin Sebor2-355/+423
gcc/ChangeLog: * pointer-query.cc (compute_objsize_r): Add an argument. (gimple_call_return_array): Pass a new argument to compute_objsize_r. (access_ref::merge_ref): Same. (access_ref::inform_access): Add an argument and use it. (access_data::access_data): Initialize new member. (handle_min_max_size): Pass a new argument to compute_objsize_r. (handle_decl): New function. (handle_array_ref): Pass a new argument to compute_objsize_r. Avoid incrementing deref. (set_component_ref_size): New function. (handle_component_ref): New function. (handle_mem_ref): Pass a new argument to compute_objsize_r. Only increment deref after successfully computing object size. (handle_ssa_name): New function. (compute_objsize_r): Move code into helpers and call them. (compute_objsize): Pass a new argument to compute_objsize_r. * pointer-query.h (access_ref::inform_access): Add an argument. (access_data::ostype): New member.
2021-12-09Introduce access_ref::merge_ref.Martin Sebor2-84/+147
gcc/ChangeLog: * pointer-query.cc (access_ref::merge_ref): Define new function. (access_ref::get_ref): Move code into merge_ref and call it. * pointer-query.h (access_ref::merge_ref): Declare new function.
2021-12-09Pass GIMPLE statement to compute_objsize.Martin Sebor3-9/+14
gcc/ChangeLog: * gimple-ssa-warn-restrict.c (builtin_access::builtin_access): Pass GIMPLE statement to compute_objsize. * pointer-query.cc (compute_objsize): Add a statement argument. * pointer-query.h (compute_objsize): Define a new overload.
2021-12-09Move bndrng from access_ref to access_data.Martin Sebor3-61/+79
gcc/ChangeLog: * gimple-ssa-warn-access.cc (check_access): Adjust to member name change. (pass_waccess::check_strncmp): Same. * pointer-query.cc (access_ref::access_ref): Remove arguments. Simpilfy. (access_data::access_data): Define new ctors. (access_data::set_bound): Define new member function. (compute_objsize_r): Remove unnecessary code. * pointer-query.h (struct access_ref): Remove ctor arguments. (struct access_data): Declare ctor overloads. (access_data::dst_bndrng): New member. (access_data::src_bndrng): New member.
2021-12-09Use the recursive form of compute_objsize [PR 103143].Martin Sebor2-1/+20
gcc/ChangeLog: PR middle-end/103143 * pointer-query.cc (gimple_call_return_array): Call compute_objsize_r. gcc/testsuite/ChangeLog: PR middle-end/103143 * gcc.dg/Wstringop-overflow-83.c: New test.
2021-12-09c++: Handle auto(x) in parameter-declaration-clause [PR103401]Marek Polacek10-25/+116
In C++23, auto(x) is valid, so decltype(auto(x)) should also be valid, so void f(decltype(auto(0))); should be just as void f(int); but currently, everytime we see 'auto' in a parameter-declaration-clause, we try to synthesize_implicit_template_parm for it, creating a new template parameter list. The code above actually has us calling s_i_t_p twice; once from cp_parser_decltype_expr -> cp_parser_postfix_expression which fails and then again from cp_parser_decltype_expr -> cp_parser_expression. So it looks like we have f<auto, auto> and we accept ill-formed code. This shows that we need to be more careful about synthesizing the implicit template parameter. [dcl.spec.auto.general] says that "A placeholder-type-specifier of the form type-constraintopt auto can be used as a decl-specifier of the decl-specifier-seq of a parameter-declaration of a function declaration or lambda-expression..." so this patch turns off auto_is_... after we've parsed the decl-specifier-seq. That doesn't quite cut it yet though, because we also need to handle an auto nested in the decl-specifier: void f(decltype(new auto{0})); therefore the cp_parser_decltype change. To accept "sizeof(auto{10})", the cp_parser_type_id_1 hunk only gives a hard error when we're not parsing tentatively. The cp_parser_parameter_declaration hunk broke lambda-generic-85713-2.C but I think the error we issue with this patch is in fact correct, and clang++ agrees. The r11-1913 change is OK: we need to make sure that we see '(auto)' after decltype to go ahead with 'decltype(auto)'. PR c++/103401 gcc/cp/ChangeLog: * parser.c (cp_parser_decltype): Clear auto_is_implicit_function_template_parm_p. (cp_parser_type_id_1): Give errors only when !cp_parser_simulate_error. (cp_parser_parameter_declaration): Clear auto_is_implicit_function_template_parm_p after parsing the decl-specifier-seq. (cp_parser_sizeof_operand): Clear auto_is_implicit_function_template_parm_p. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/lambda-generic-85713-2.C: Add dg-error. * g++.dg/cpp1y/pr60054.C: Adjust dg-error. * g++.dg/cpp1y/pr60332.C: Likewise. * g++.dg/cpp2a/concepts-pr84979-2.C: Likewise. * g++.dg/cpp2a/concepts-pr84979-3.C: Likewise. * g++.dg/cpp2a/concepts-pr84979.C: Likewise. * g++.dg/cpp23/auto-fncast7.C: New test. * g++.dg/cpp23/auto-fncast8.C: New test. * g++.dg/cpp23/auto-fncast9.C: New test.
2021-12-10openmp: Fix libgomp.c++ testsuite errors for non-offload configsChung-Lin Tang3-1/+6
Some testcases for libgomp.c++ only works for non-shared address space offloading, because it exercises the zero-length array section behavior for offloaded address space, testing for NULL/non-NULL cases. libgomp/ChangeLog: * testsuite/libgomp.c++/target-lambda-1.C: Only run under "target offload_device_nonshared_as" * testsuite/libgomp.c++/target-this-3.C: Likewise. * testsuite/libgomp.c++/target-this-4.C: Likewise.
2021-12-09Provide vxworks alternate stdint.h during the buildOlivier Hainque6-52/+18
This change arranges to provide the vxworks alternate stdint.h at build time instead of at install time, so it is used instead of the system one while building the libraries. This is a lot more consistent and helps the build on configurations where the system does not come with stdint.h at all. The change uses a similar mechanism as the one previsouly introduced for glimits.h and takes the opportunity to simplify the glimits.h command to use an automatic variable. This introduces an indirect dependency on the VxWorks version.h for vxcrtstuff objects, for which we then need to apply the same tricks as for libgcc2 regarding include paths (to select the system header instead of the gcc one). 2021-02-12 Olivier Hainque <hainque@adacore.com> Rasmus Villemoes <rv@rasmusvillemoes.dk> gcc/ * Makefile.in (T_STDINT_GCC_H): New variable, path to stdint-gcc.h that a target configuration may override when use_gcc_stdint is "provide". (stmp-int-hdrs): Depend on it and copy that for USE_GCC_INT=provide. * config.gcc (vxworks): Revert to use_gcc_stdint=provide. * config/t-vxworks (T_STDINT_GCC_H): Define, as vxw-stdint-gcc.h. (vxw-stdint-gcc.h): New target, produced from the original stdint-gcc.h. (vxw-glimits.h): Use an automatic variable to designate the first and only prerequisite. * config/vxworks/stdint.h: Remove. libgcc/ * config/t-vxworks: Set CRTSTUFF_T_CFLAGS to $(LIBGCC2_INCLUDES). * config/t-vxworks7: Likewise.
2021-12-09Darwin, PCH: Rework hooks for relocatable implementation [PR71934].Iain Sandoe1-49/+36
Now we have a relocatable PCH implementation we can revise the hooks that find and use the mmapped memory. Specifically, this removes the extra checking and diagnostic output for cases that were likely to fail in a non-relocatable scenario. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> gcc/ChangeLog: PR pch/71934 * config/host-darwin.c (SAFE_ALLOC_SIZE): Remove. (darwin_gt_pch_get_address): Rework for relocatable PCH. (darwin_gt_pch_use_address): Likewise.
2021-12-09pch: Fix up Darwin and HPUX pch_use_address hooks [PR71934]Jakub Jelinek2-4/+4
In the last change, I've changed the arguments from void * to void *&, but missed the fact that these hooks will in that case update the value the caller will see in an undesirable way. 2021-12-09 Jakub Jelinek <jakub@redhat.com> PR pch/71934 * config/host-darwin.c (darwin_gt_pch_use_address): When reading manually the file into mapped area, update mapped_addr as an automatic variable rather than addr which is a reference parameter. * config/host-hpux.c (hpux_gt_pch_use_address): When reading manually the file into mapped area, update addr as an automatic variable rather than base which is a reference parameter.