[clang] [llvm] [SpecialCaseList] Use glob by default (PR #74809)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 7 22:00:16 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Fangrui Song (MaskRay)
<details>
<summary>Changes</summary>
https://reviews.llvm.org/D154014 addes glob support and enables it when
`#!special-case-list-v2` is the first line. This patch makes the glob
support the default (faster than regex after
https://reviews.llvm.org/D156046) and switches to the deprecated regex
support if `#!special-case-list-v1` is the first line.
I have surveyed many ignore lists. All ignore lists I find only use
basic `*` `.` and don't use regex metacharacters such as `(` and `)`.
(As neither `src:` nor `fun:` benefits from using regex.)
They are unaffected by the transition (with a caution that regex
`src:x/a.pb.*` matches `x/axpbx` but glob `src:x/a.pb.*` doesn't).
There is no deprecating warning. If a user finds
`#!special-case-list-v1`, they shall read that the old syntax is
deprecated.
Link: https://discourse.llvm.org/t/use-glob-instead-of-regex-for-specialcaselists/71666
---
Full diff: https://github.com/llvm/llvm-project/pull/74809.diff
3 Files Affected:
- (modified) clang/docs/SanitizerSpecialCaseList.rst (+11-7)
- (modified) llvm/lib/Support/SpecialCaseList.cpp (+5-6)
- (modified) llvm/unittests/Support/SpecialCaseListTest.cpp (+4-4)
``````````diff
diff --git a/clang/docs/SanitizerSpecialCaseList.rst b/clang/docs/SanitizerSpecialCaseList.rst
index ab39276b04395..c7fb0fa3f8a82 100644
--- a/clang/docs/SanitizerSpecialCaseList.rst
+++ b/clang/docs/SanitizerSpecialCaseList.rst
@@ -56,13 +56,18 @@ and lines starting with "#" are ignored.
.. note::
- In `D154014 <https://reviews.llvm.org/D154014>`_ we transitioned to using globs instead
- of regexes to match patterns in special case lists. Since this was a
- breaking change, we will temporarily support the original behavior using
- regexes. If ``#!special-case-list-v2`` is the first line of the file, then
- we will use the new behavior using globs. For more details, see
- `this discourse post <https://discourse.llvm.org/t/use-glob-instead-of-regex-for-specialcaselists/71666>`_.
+ Prior to Clang 18, section names and entries described below use a variant of
+ regex where ``*`` is translated to ``.*``. Clang 18 (`D154014
+ <https://reviews.llvm.org/D154014>`) switches to glob and plans to remove
+ regex support in Clang 19.
+ For Clang 18, regex is supported if ``#!special-case-list-v1`` is the first
+ line of the file.
+
+ Many special case lists use ``.`` to indicate the literal character and do
+ not use regex metacharacters such as ``(``, ``)``. They are unaffected by the
+ regex to glob transition. For more details, see `this discourse post
+ <https://discourse.llvm.org/t/use-glob-instead-of-regex-for-specialcaselists/71666>`_.
Section names are globs written in square brackets that denote
which sanitizer the following entries apply to. For example, ``[address]``
@@ -80,7 +85,6 @@ tool-specific docs.
.. code-block:: bash
- #!special-case-list-v2
# The line above is explained in the note above
# Lines starting with # are ignored.
# Turn off checks for the source file
diff --git a/llvm/lib/Support/SpecialCaseList.cpp b/llvm/lib/Support/SpecialCaseList.cpp
index ac8877cca8bc6..7a23421eaeb89 100644
--- a/llvm/lib/Support/SpecialCaseList.cpp
+++ b/llvm/lib/Support/SpecialCaseList.cpp
@@ -150,13 +150,12 @@ bool SpecialCaseList::parse(const MemoryBuffer *MB, std::string &Error) {
return false;
}
- // In https://reviews.llvm.org/D154014 we transitioned to using globs instead
- // of regexes to match patterns in special case lists. Since this was a
- // breaking change, we will temporarily support the original behavior using
- // regexes. If "#!special-case-list-v2" is the first line of the file, then
- // we will use the new behavior using globs. For more details, see
+ // In https://reviews.llvm.org/D154014 we added glob support and planned to
+ // remove regex support in patterns. We temporarily support the original
+ // behavior using regexes if "#!special-case-list-v1" is the first line of the
+ // file. For more details, see
// https://discourse.llvm.org/t/use-glob-instead-of-regex-for-specialcaselists/71666
- bool UseGlobs = MB->getBuffer().starts_with("#!special-case-list-v2\n");
+ bool UseGlobs = !MB->getBuffer().starts_with("#!special-case-list-v1\n");
for (line_iterator LineIt(*MB, /*SkipBlanks=*/true, /*CommentMarker=*/'#');
!LineIt.is_at_eof(); LineIt++) {
diff --git a/llvm/unittests/Support/SpecialCaseListTest.cpp b/llvm/unittests/Support/SpecialCaseListTest.cpp
index 81faeca5d6357..725d20a9b4def 100644
--- a/llvm/unittests/Support/SpecialCaseListTest.cpp
+++ b/llvm/unittests/Support/SpecialCaseListTest.cpp
@@ -25,8 +25,8 @@ class SpecialCaseListTest : public ::testing::Test {
std::string &Error,
bool UseGlobs = true) {
auto S = List.str();
- if (UseGlobs)
- S = (Twine("#!special-case-list-v2\n") + S).str();
+ if (!UseGlobs)
+ S = (Twine("#!special-case-list-v1\n") + S).str();
std::unique_ptr<MemoryBuffer> MB = MemoryBuffer::getMemBuffer(S);
return SpecialCaseList::create(MB.get(), Error);
}
@@ -46,8 +46,8 @@ class SpecialCaseListTest : public ::testing::Test {
SmallString<64> Path;
sys::fs::createTemporaryFile("SpecialCaseListTest", "temp", FD, Path);
raw_fd_ostream OF(FD, true, true);
- if (UseGlobs)
- OF << "#!special-case-list-v2\n";
+ if (!UseGlobs)
+ OF << "#!special-case-list-v1\n";
OF << Contents;
OF.close();
return std::string(Path.str());
``````````
</details>
https://github.com/llvm/llvm-project/pull/74809
More information about the cfe-commits
mailing list