From 8a215b60afc7c47abc6fac76bd951e005fd00dbb Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Nihei Date: Fri, 25 Mar 2022 10:47:09 -0300 Subject: [PATCH] libcxx: Add patch for preventing redefinition of PS macro on Xtensa Signed-off-by: Gustavo Henrique Nihei --- ...-macro-to-avoid-clashing-with-Xtensa.patch | 182 ++++++++++++++++++ libs/libxx/libcxx.defs | 1 + 2 files changed, 183 insertions(+) create mode 100644 libs/libxx/0001-libcxx-Rename-PS-macro-to-avoid-clashing-with-Xtensa.patch diff --git a/libs/libxx/0001-libcxx-Rename-PS-macro-to-avoid-clashing-with-Xtensa.patch b/libs/libxx/0001-libcxx-Rename-PS-macro-to-avoid-clashing-with-Xtensa.patch new file mode 100644 index 00000000000..b2f7dc5e5ac --- /dev/null +++ b/libs/libxx/0001-libcxx-Rename-PS-macro-to-avoid-clashing-with-Xtensa.patch @@ -0,0 +1,182 @@ +From 213f9acccb725a7ddcd9f41eee9d5234d81e1dc0 Mon Sep 17 00:00:00 2001 +From: Gustavo Henrique Nihei +Date: Fri, 25 Mar 2022 10:18:40 -0300 +Subject: [PATCH 1/2] [libcxx] Rename PS() macro to avoid clashing with Xtensa + register name + +This patch addresses a clash with the PS register from Xtensa +defined in the header file, which is commonly +included in OS implementation. + +Issue identified while building libc++ port for Apache NuttX, targeting +Xtensa-based chips (e.g. Espressif's ESP32). + +Signed-off-by: Gustavo Henrique Nihei + +Differential Revision: https://reviews.llvm.org/D122479 +--- + libcxx/src/filesystem/filesystem_common.h | 4 +- + libcxx/src/filesystem/operations.cpp | 46 +++++++++++------------ + 2 files changed, 24 insertions(+), 26 deletions(-) + +diff --git a/libcxx/src/filesystem/filesystem_common.h b/libcxx/src/filesystem/filesystem_common.h +index e0fdbccf96b1..b62f1406de39 100644 +--- a/libcxx/src/filesystem/filesystem_common.h ++++ b/libcxx/src/filesystem/filesystem_common.h +@@ -41,9 +41,9 @@ + #endif + + #if defined(_LIBCPP_WIN32API) +-#define PS(x) (L##x) ++# define PATHSTR(x) (L##x) + #else +-#define PS(x) (x) ++# define PATHSTR(x) (x) + #endif + + _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM +diff --git a/libcxx/src/filesystem/operations.cpp b/libcxx/src/filesystem/operations.cpp +index 50a895dc2fae..830781def52d 100644 +--- a/libcxx/src/filesystem/operations.cpp ++++ b/libcxx/src/filesystem/operations.cpp +@@ -188,14 +188,14 @@ public: + switch (State) { + case PS_BeforeBegin: + case PS_AtEnd: +- return PS(""); ++ return PATHSTR(""); + case PS_InRootDir: + if (RawEntry[0] == '\\') +- return PS("\\"); ++ return PATHSTR("\\"); + else +- return PS("/"); ++ return PATHSTR("/"); + case PS_InTrailingSep: +- return PS(""); ++ return PATHSTR(""); + case PS_InRootName: + case PS_InFilenames: + return RawEntry; +@@ -303,8 +303,8 @@ private: + }; + + string_view_pair separate_filename(string_view_t const& s) { +- if (s == PS(".") || s == PS("..") || s.empty()) +- return string_view_pair{s, PS("")}; ++ if (s == PATHSTR(".") || s == PATHSTR("..") || s.empty()) ++ return string_view_pair{s, PATHSTR("")}; + auto pos = s.find_last_of('.'); + if (pos == string_view_t::npos || pos == 0) + return string_view_pair{s, string_view_t{}}; +@@ -591,8 +591,8 @@ filesystem_error::~filesystem_error() {} + void filesystem_error::__create_what(int __num_paths) { + const char* derived_what = system_error::what(); + __storage_->__what_ = [&]() -> string { +- const path::value_type* p1 = path1().native().empty() ? PS("\"\"") : path1().c_str(); +- const path::value_type* p2 = path2().native().empty() ? PS("\"\"") : path2().c_str(); ++ const path::value_type* p1 = path1().native().empty() ? PATHSTR("\"\"") : path1().c_str(); ++ const path::value_type* p2 = path2().native().empty() ? PATHSTR("\"\"") : path2().c_str(); + switch (__num_paths) { + default: + return detail::format_string("filesystem error: %s", derived_what); +@@ -1378,7 +1378,7 @@ path& path::replace_extension(path const& replacement) { + } + if (!replacement.empty()) { + if (replacement.native()[0] != '.') { +- __pn_ += PS("."); ++ __pn_ += PATHSTR("."); + } + __pn_.append(replacement.__pn_); + } +@@ -1500,14 +1500,14 @@ enum PathPartKind : unsigned char { + static PathPartKind ClassifyPathPart(string_view_t Part) { + if (Part.empty()) + return PK_TrailingSep; +- if (Part == PS(".")) ++ if (Part == PATHSTR(".")) + return PK_Dot; +- if (Part == PS("..")) ++ if (Part == PATHSTR("..")) + return PK_DotDot; +- if (Part == PS("/")) ++ if (Part == PATHSTR("/")) + return PK_RootSep; + #if defined(_LIBCPP_WIN32API) +- if (Part == PS("\\")) ++ if (Part == PATHSTR("\\")) + return PK_RootSep; + #endif + return PK_Filename; +@@ -1557,7 +1557,7 @@ path path::lexically_normal() const { + NewPathSize -= Parts.back().first.size(); + Parts.pop_back(); + } else if (LastKind != PK_RootSep) +- AddPart(PK_DotDot, PS("..")); ++ AddPart(PK_DotDot, PATHSTR("..")); + MaybeNeedTrailingSep = LastKind == PK_Filename; + break; + } +@@ -1572,7 +1572,7 @@ path path::lexically_normal() const { + } + // [fs.path.generic]p6.8: If the path is empty, add a dot. + if (Parts.empty()) +- return PS("."); ++ return PATHSTR("."); + + // [fs.path.generic]p6.7: If the last filename is dot-dot, remove any + // trailing directory-separator. +@@ -1584,7 +1584,7 @@ path path::lexically_normal() const { + Result /= PK.first; + + if (NeedTrailingSep) +- Result /= PS(""); ++ Result /= PATHSTR(""); + + return Result; + } +@@ -1593,9 +1593,9 @@ static int DetermineLexicalElementCount(PathParser PP) { + int Count = 0; + for (; PP; ++PP) { + auto Elem = *PP; +- if (Elem == PS("..")) ++ if (Elem == PATHSTR("..")) + --Count; +- else if (Elem != PS(".") && Elem != PS("")) ++ else if (Elem != PATHSTR(".") && Elem != PATHSTR("")) + ++Count; + } + return Count; +@@ -1642,15 +1642,15 @@ path path::lexically_relative(const path& base) const { + return {}; + + // if n == 0 and (a == end() || a->empty()), returns path("."); otherwise +- if (ElemCount == 0 && (PP.atEnd() || *PP == PS(""))) +- return PS("."); ++ if (ElemCount == 0 && (PP.atEnd() || *PP == PATHSTR(""))) ++ return PATHSTR("."); + + // return a path constructed with 'n' dot-dot elements, followed by the the + // elements of '*this' after the mismatch. + path Result; + // FIXME: Reserve enough room in Result that it won't have to re-allocate. + while (ElemCount--) +- Result /= PS(".."); ++ Result /= PATHSTR(".."); + for (; PP; ++PP) + Result /= *PP; + return Result; +@@ -1662,9 +1662,7 @@ static int CompareRootName(PathParser *LHS, PathParser *RHS) { + if (!LHS->inRootName() && !RHS->inRootName()) + return 0; + +- auto GetRootName = [](PathParser *Parser) -> string_view_t { +- return Parser->inRootName() ? **Parser : PS(""); +- }; ++ auto GetRootName = [](PathParser* Parser) -> string_view_t { return Parser->inRootName() ? **Parser : PATHSTR(""); }; + int res = GetRootName(LHS).compare(GetRootName(RHS)); + ConsumeRootName(LHS); + ConsumeRootName(RHS); +-- +2.32.0 + diff --git a/libs/libxx/libcxx.defs b/libs/libxx/libcxx.defs index 42b4c004cde..e0f6cb8e6e2 100644 --- a/libs/libxx/libcxx.defs +++ b/libs/libxx/libcxx.defs @@ -29,6 +29,7 @@ libcxx: libcxx-$(LIBCXX_VERSION).src.tar.xz $(Q) mv libcxx-$(LIBCXX_VERSION).src libcxx $(Q) patch -p0 < 0001-Remove-the-locale-fallback-for-NuttX.patch $(Q) patch -p0 < 0001-libc-avoid-the-waring-__EXCEPTIONS-is-not-defined-ev.patch + $(Q) patch -p1 < 0001-libcxx-Rename-PS-macro-to-avoid-clashing-with-Xtensa.patch $(Q) touch $@ $(TOPDIR)/include/libcxx: libcxx