[clang] [Clang] Implement C++26 P2748R5 "Disallow Binding a Returned Glvalue to a Temporary" (PR #89942)
@@ -167,7 +167,7 @@ C++2c implementation status Disallow Binding a Returned Glvalue to a Temporary https://wg21.link/P2748R5;>P2748R5 - No + Clang 19 vogelsgesang wrote: Ah, I just saw this was already fixed in the meantime - nevermind https://github.com/llvm/llvm-project/pull/89942 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Implement C++26 P2748R5 "Disallow Binding a Returned Glvalue to a Temporary" (PR #89942)
@@ -167,7 +167,7 @@ C++2c implementation status Disallow Binding a Returned Glvalue to a Temporary https://wg21.link/P2748R5;>P2748R5 - No + Clang 19 vogelsgesang wrote: Should be `class="unreleased"` instead of `class="full"` https://github.com/llvm/llvm-project/pull/89942 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Address post commit feedbacks in #89906 (PR #90495)
@@ -187,7 +187,7 @@ C++2c implementation status Trivial infinite loops are not Undefined Behavior https://wg21.link/P2809R3;>P2809R3 (DR) - Clang 19 + No vogelsgesang wrote: unreleased -> none https://github.com/llvm/llvm-project/pull/90495 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Address post commit feedbacks in #89906 (PR #90495)
@@ -177,7 +177,7 @@ C++2c implementation status Attributes for Structured Bindings https://wg21.link/P0609R3;>P0609R3 - No + Clang 19 vogelsgesang wrote: none -> unreleased But maybe just fix this together when landing #90066... https://github.com/llvm/llvm-project/pull/90495 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Implement C++26 Attributes for Structured Bindings (P0609R3) (PR #89906)
@@ -187,7 +187,7 @@ C++2c implementation status Trivial infinite loops are not Undefined Behavior https://wg21.link/P2809R3;>P2809R3 (DR) - No + Clang 19 vogelsgesang wrote: the wrong paper was marked as implemented https://github.com/llvm/llvm-project/pull/89906 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] fda7778 - [clang-tidy] Update tests to include C++23 and C++26
Author: Adrian Vogelsgesang Date: 2023-08-07T21:25:22Z New Revision: fda777849b0088ba83e28683c53c5c8321ef2558 URL: https://github.com/llvm/llvm-project/commit/fda777849b0088ba83e28683c53c5c8321ef2558 DIFF: https://github.com/llvm/llvm-project/commit/fda777849b0088ba83e28683c53c5c8321ef2558.diff LOG: [clang-tidy] Update tests to include C++23 and C++26 This commit changes the `c++xx-or-later` definitions to also include C++23 and the upcoming C++26. `readability/container-contains.cpp` to also test newer C++ versions. Also, this commit adjusts a couple of test cases slightly: * `container-contains.cpp` now also tests newer C++ versions. Restricting it to C++20 was an oversight of mine when originally writing this check. * `unconventional-assign-operator.cpp`: The `return rhs` raised a "non-const lvalue reference to type 'BadReturnStatement' cannot bind to a temporary" error in C++23. The issue is circumenvented by writing `return *`. * `const-correctness-values.cpp` was also running into the same error in C++23. The troublesome test cases were moved to a separate file. Differential Revision: https://reviews.llvm.org/D157246 Added: clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values-before-cxx23.cpp Modified: clang-tools-extra/test/clang-tidy/check_clang_tidy.py clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values.cpp clang-tools-extra/test/clang-tidy/checkers/misc/unconventional-assign-operator.cpp clang-tools-extra/test/clang-tidy/checkers/readability/container-contains.cpp Removed: diff --git a/clang-tools-extra/test/clang-tidy/check_clang_tidy.py b/clang-tools-extra/test/clang-tidy/check_clang_tidy.py index a78996a0fce3b0..53ffca0bad8d06 100755 --- a/clang-tools-extra/test/clang-tidy/check_clang_tidy.py +++ b/clang-tools-extra/test/clang-tidy/check_clang_tidy.py @@ -265,15 +265,17 @@ def run(self): def expand_std(std): if std == "c++98-or-later": -return ["c++98", "c++11", "c++14", "c++17", "c++20"] +return ["c++98", "c++11", "c++14", "c++17", "c++20", "c++23", "c++2c"] if std == "c++11-or-later": -return ["c++11", "c++14", "c++17", "c++20"] +return ["c++11", "c++14", "c++17", "c++20", "c++23", "c++2c"] if std == "c++14-or-later": -return ["c++14", "c++17", "c++20"] +return ["c++14", "c++17", "c++20", "c++23", "c++2c"] if std == "c++17-or-later": -return ["c++17", "c++20"] +return ["c++17", "c++20", "c++23", "c++2c"] if std == "c++20-or-later": -return ["c++20"] +return ["c++20", "c++23", "c++2c"] +if std == "c++23-or-later": +return ["c++23", "c++2c"] return [std] diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values-before-cxx23.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values-before-cxx23.cpp new file mode 100644 index 00..3547ec080911eb --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values-before-cxx23.cpp @@ -0,0 +1,20 @@ +// RUN: %check_clang_tidy -std=c++11,c++14,c++17,c++20 %s misc-const-correctness %t -- \ +// RUN: -config="{CheckOptions: {\ +// RUN: misc-const-correctness.TransformValues: true, \ +// RUN: misc-const-correctness.WarnPointersAsValues: false, \ +// RUN: misc-const-correctness.TransformPointersAsValues: false \ +// RUN: }}" -- -fno-delayed-template-parsing + + +double _const_ref_return() { + double p_local0 = 0.0; + // CHECK-MESSAGES: [[@LINE-1]]:3: warning: variable 'p_local0' of type 'double' can be declared 'const' + // CHECK-FIXES: double const p_local0 + double np_local0 = 42.42; + return np_local0; +} + +double *_non_const_pointer_ref() { + double *np_local0 = nullptr; + return np_local0; +} diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values.cpp index 88f40462003e88..186e3cf5a179b2 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-values.cpp @@ -1,9 +1,9 @@ // RUN: %check_clang_tidy %s misc-const-correctness %t -- \ // RUN: -config="{CheckOptions: {\ -// RUN: misc-const-correctness.TransformValues: true, \ -// RUN: misc-const-correctness.WarnPointersAsValues: false, \ -// RUN: misc-const-correctness.TransformPointersAsValues: false} \ -// RUN: }" -- -fno-delayed-template-parsing +// RUN: misc-const-correctness.TransformValues: true, \ +// RUN: misc-const-correctness.WarnPointersAsValues: false, \ +// RUN: misc-const-correctness.TransformPointersAsValues: false \ +// RUN: }}" -- -fno-delayed-template-parsing // --- Provide test samples for primitive builtins - //
[libunwind] c9cffdd - [libunwind] Fix usage of `_dl_find_object` on 32-bit x86
Author: Adrian Vogelsgesang Date: 2022-09-16T06:29:49-07:00 New Revision: c9cffdde393f646acf62d6160e7fa6613e038508 URL: https://github.com/llvm/llvm-project/commit/c9cffdde393f646acf62d6160e7fa6613e038508 DIFF: https://github.com/llvm/llvm-project/commit/c9cffdde393f646acf62d6160e7fa6613e038508.diff LOG: [libunwind] Fix usage of `_dl_find_object` on 32-bit x86 On 32-bit x86, `_dl_find_object` also returns a `dlfo_eh_dbase` address. So far, compiling against a version of `_dl_find_object` which returns a `dlfo_eh_dbase` was blocked using a `#if` + `#error`. This commit now removes this compile time assertion and simply ignores the returned `dlfo_eh_dbase`. All test cases are passing on a 32-bit build now. According to https://www.gnu.org/software/libc/manual/html_node/Dynamic-Linker-Introspection.html, `dlfo_eh_dbase` should be the base address for all DW_EH_PE_datarel relocations. However, glibc/elf/dl-find_object.h says that eh_dbase is the relocated DT_PLTGOT value. I don't understand how those two statements fit together, but to fix 32-bit x86, ignoring `dlfo_eh_dbase` seems to be good enough. Fixes #57733 Differential Revision: https://reviews.llvm.org/D133846 Added: Modified: libunwind/src/AddressSpace.hpp Removed: diff --git a/libunwind/src/AddressSpace.hpp b/libunwind/src/AddressSpace.hpp index 315289cd4211b..b0135b0c0519c 100644 --- a/libunwind/src/AddressSpace.hpp +++ b/libunwind/src/AddressSpace.hpp @@ -584,11 +584,6 @@ inline bool LocalAddressSpace::findUnwindSections(pint_t targetAddr, // support for _dl_find_object on other unwind formats is not implemented, // yet. #if defined(DLFO_STRUCT_HAS_EH_DBASE) & defined(_LIBUNWIND_SUPPORT_DWARF_INDEX) - // We expect to run on a platform which does not use a base address for - // exception information. -#if DLFO_STRUCT_HAS_EH_DBASE -#error dlfo_eh_dbase is not supported for DWARF-based unwinding -#endif // We expect `_dl_find_object` to return PT_GNU_EH_FRAME. #if DLFO_EH_SEGMENT_TYPE != PT_GNU_EH_FRAME #error _dl_find_object retrieves an unexpected section type ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 9138900 - [LLDB] Add data formatter for std::coroutine_handle
Author: Adrian Vogelsgesang Date: 2022-08-24T14:40:53-07:00 New Revision: 91389000abe8ef5d06d98cbbefd3fa03ac7e4480 URL: https://github.com/llvm/llvm-project/commit/91389000abe8ef5d06d98cbbefd3fa03ac7e4480 DIFF: https://github.com/llvm/llvm-project/commit/91389000abe8ef5d06d98cbbefd3fa03ac7e4480.diff LOG: [LLDB] Add data formatter for std::coroutine_handle This patch adds a formatter for `std::coroutine_handle`, both for libc++ and libstdc++. For the type-erased `coroutine_handle<>`, it shows the `resume` and `destroy` function pointers. For a non-type-erased `coroutine_handle` it also shows the `promise` value. With this change, executing the `v t` command on the example from https://clang.llvm.org/docs/DebuggingCoroutines.html now outputs ``` (task) t = { handle = coro frame = 0xb2a0 { resume = 0x5a10 (a.out`coro_task(int, int) at llvm-example.cpp:36) destroy = 0x6090 (a.out`coro_task(int, int) at llvm-example.cpp:36) } } ``` instead of just ``` (task) t = { handle = { __handle_ = 0xb2a0 } } ``` Note, how the symbols for the `resume` and `destroy` function pointer reveal which coroutine is stored inside the `std::coroutine_handle`. A follow-up commit will use this fact to infer the coroutine's promise type and the representation of its internal coroutine state based on the `resume` and `destroy` pointers. The same formatter is used for both libc++ and libstdc++. It would also work for MSVC's standard library, however it is not registered for MSVC, given that lldb does not provide pretty printers for other MSVC types, either. The formatter is in a newly added `Coroutines.{h,cpp}` file because there does not seem to be an already existing place where we could share formatters across libc++ and libstdc++. Also, I expect this code to grow as we improve debugging experience for coroutines further. **Testing** * Added API test Differential Revision: https://reviews.llvm.org/D132415 Added: lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp lldb/source/Plugins/Language/CPlusPlus/Coroutines.h lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/Makefile lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/TestCoroutineHandle.py lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/coroutine_handle/main.cpp Modified: clang/docs/tools/clang-formatted-files.txt lldb/packages/Python/lldbsuite/test/lldbtest.py lldb/packages/Python/lldbsuite/test/lldbutil.py lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp Removed: diff --git a/clang/docs/tools/clang-formatted-files.txt b/clang/docs/tools/clang-formatted-files.txt index f89e19ca7cd3a..c49acfaec58aa 100644 --- a/clang/docs/tools/clang-formatted-files.txt +++ b/clang/docs/tools/clang-formatted-files.txt @@ -4180,6 +4180,8 @@ lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.h lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp lldb/source/Plugins/Language/CPlusPlus/BlockPointer.h +lldb/source/Plugins/Language/CPlusPlus/Coroutines.cpp +lldb/source/Plugins/Language/CPlusPlus/Coroutines.h lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.h lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.h diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py index 69bb5ac5629e4..1c090395e6c4c 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -292,8 +292,12 @@ def check_value(self, test_base, val, error_msg=None): test_base.assertEqual(self.expect_type, val.GetDisplayTypeName(), this_error_msg) if self.expect_summary: -test_base.assertEqual(self.expect_summary, val.GetSummary(), - this_error_msg) +if isinstance(self.expect_summary, re.Pattern): +test_base.assertRegex(val.GetSummary(), self.expect_summary, + this_error_msg) +else: +test_base.assertEqual(self.expect_summary, val.GetSummary(), + this_error_msg) if self.children is not None: self.check_value_children(test_base, val, error_msg) diff --git a/lldb/packages/Python/lldbsuite/test/lldbutil.py b/lldb/packages/Python/lldbsuite/test/lldbutil.py index 8bd49c742cb04..7e64afb3639cd 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbutil.py +++ b/lldb/packages/Python/lldbsuite/test/lldbutil.py @@ -988,6 +988,21 @@ def
[libunwind] df9a23e - [libunwind] Use `_dl_find_object` if available
Author: Adrian Vogelsgesang Date: 2022-08-09T16:19:13-07:00 New Revision: df9a23e2feda18f0308b6d4dbd591ebe6b605aa4 URL: https://github.com/llvm/llvm-project/commit/df9a23e2feda18f0308b6d4dbd591ebe6b605aa4 DIFF: https://github.com/llvm/llvm-project/commit/df9a23e2feda18f0308b6d4dbd591ebe6b605aa4.diff LOG: [libunwind] Use `_dl_find_object` if available As shown in P2544R0 [1] and the accompanying benchmark [2], the current unwinding logic does not scale for multi-threaded programs. This is because `dl_iterate_phdr` takes a global lock. glibc 2.35 added `_dl_find_object` which directly returns the unwind info for a given target address. `_dl_find_object` is fully lock-free and hence allows parallel exception unwinding on multiple threads. With this commit, libunwind now takes advantage of `_dl_find_object`. Thereby, this commit improves libunwind's performance on benchmark [2] for unwinding exception on 20 threads from 1103ms to 78ms. (measured on Intel Xeon Silver 4114 with 20 physical cores) [1] https://isocpp.org/files/papers/P2544R0.html [2] https://github.com/neumannt/exceptionperformance Detailed performance numbers from the benchmark: Before: > Testing unwinding performance: sqrt computation with occasional errors > > testing baseline using 1 2 4 8 16 20 threads > failure rate 0%: 34 35 34 35 35 36 > testing exceptions using 1 2 4 8 16 20 threads > failure rate 0%: 16 32 33 34 35 36 > failure rate 0.1%: 16 32 34 36 35 36 > failure rate 1%: 20 40 40 43 90 113 > failure rate 10%: 59 92 140 304 880 1103 > [...] > > Testing invocation overhead: recursive fib with occasional errors > > testing exceptions using 1 2 4 8 16 20 threads > failure rate 0%: 19 32 37 38 39 36 > failure rate 0.1%: 22 32 40 40 39 34 > failure rate 1%: 20 28 38 39 48 40 > failure rate 10%: 25 39 44 50 92 113 After: > Testing unwinding performance: sqrt computation with occasional errors > > testing baseline using 1 2 4 8 16 20 threads > failure rate 0%: 19 30 35 38 39 35 > testing baseline using 1 2 4 8 16 20 threads > failure rate 0%: 32 35 33 34 34 36 > testing exceptions using 1 2 4 8 16 20 threads > failure rate 0%: 16 35 33 37 35 35 > failure rate 0.1%: 16 32 36 33 34 37 > failure rate 1%: 21 37 39 40 40 41 > failure rate 10%: 72 75 76 80 80 78 > [...] > > Testing invocation overhead: recursive fib with occasional errors > > testing baseline using 1 2 4 8 16 20 threads > failure rate 0%: 18 35 37 34 38 37 > testing exceptions using 1 2 4 8 16 20 threads > failure rate 0%: 19 33 40 40 41 39 > failure rate 0.1%: 21 33 39 38 39 38 > failure rate 1%: 20 36 39 40 41 40 > failure rate 10%: 25 45 41 42 44 43 Differential Revision: https://reviews.llvm.org/D130668 Added: Modified: libunwind/src/AddressSpace.hpp Removed: diff --git a/libunwind/src/AddressSpace.hpp b/libunwind/src/AddressSpace.hpp index 36c9f5a9e36f9..f1ba94ed732e3 100644 --- a/libunwind/src/AddressSpace.hpp +++ b/libunwind/src/AddressSpace.hpp @@ -601,6 +601,61 @@ inline bool LocalAddressSpace::findUnwindSections(pint_t targetAddr, if (info.arm_section && info.arm_section_length) return true; #elif defined(_LIBUNWIND_USE_DL_ITERATE_PHDR) + // Use DLFO_STRUCT_HAS_EH_DBASE to determine the existence of + // `_dl_find_object`. Use _LIBUNWIND_SUPPORT_DWARF_INDEX, because libunwind + // support for _dl_find_object on other unwind formats is not implemented, + // yet. +#if defined(DLFO_STRUCT_HAS_EH_DBASE) & defined(_LIBUNWIND_SUPPORT_DWARF_INDEX) + // We expect to run on a platform which does not use a base address for + // exception information. +#if DLFO_STRUCT_HAS_EH_DBASE +#error dlfo_eh_dbase is not supported for DWARF-based unwinding +#endif + // We expect `_dl_find_object` to return PT_GNU_EH_FRAME. +#if DLFO_EH_SEGMENT_TYPE != PT_GNU_EH_FRAME +#error _dl_find_object retrieves an unexpected section type +#endif + // We look-up `dl_find_object` dynamically at runtime to ensure backwards + // compatibility with earlier version of glibc not yet providing it. On older + // systems, we gracefully fallback to `dl_iterate_phdr`. Cache the pointer + // so we only look it up once. Do manual lock to avoid _cxa_guard_acquire. + static decltype(_dl_find_object) *dlFindObject; + static bool dlFindObjectChecked = false; + if (!dlFindObjectChecked) { +dlFindObject = reinterpret_cast( +dlsym(RTLD_DEFAULT, "_dl_find_object")); +dlFindObjectChecked = true; + } + // Try to find the unwind info using `dl_find_object` + dl_find_object findResult; + if (dlFindObject && dlFindObject((void *)targetAddr, ) == 0) { +if (findResult.dlfo_eh_frame == nullptr) { + // Found an entry for `targetAddr`, but there is no unwind info. + return false; +} +info.dso_base = reinterpret_cast(findResult.dlfo_map_start); +info.text_segment_length = static_cast( +(char *)findResult.dlfo_map_end - (char