Author: Peter Collingbourne Date: 2025-07-01T20:21:51-07:00 New Revision: 2a702cdc38f96989cb41c0b863d977f0d8f4f325
URL: https://github.com/llvm/llvm-project/commit/2a702cdc38f96989cb41c0b863d977f0d8f4f325 DIFF: https://github.com/llvm/llvm-project/commit/2a702cdc38f96989cb41c0b863d977f0d8f4f325.diff LOG: Driver: Avoid llvm::sys::path::append if resource directory absolute. After #145996 CLANG_RESOURCE_DIR can be an absolute path so we need to handle it correctly in the driver. llvm::sys::path::append does not append absolute paths in the way that I expected (or consistent with other similar APIs such as C++17 std::filesystem::path::append or Python os.path.join); instead, it effectively discards the leading / and appends the resulting relative path (e.g. append(P, "/bar") with P = "/foo" sets P to "/foo/bar"). Many tests start failing if I try to align llvm::sys::path::append with the other APIs because of callers that expect the existing behavior, so for now let's add a special case here for absolute resource paths, and document the behavior in Path.h. Reviewers: MaskRay Reviewed By: MaskRay Pull Request: https://github.com/llvm/llvm-project/pull/146449 Added: Modified: clang/lib/Driver/Driver.cpp llvm/include/llvm/Support/Path.h Removed: ################################################################################ diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 775f3f029861c..d86f47bada86b 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -192,7 +192,12 @@ std::string Driver::GetResourcesPath(StringRef BinaryPath) { StringRef ConfiguredResourceDir(CLANG_RESOURCE_DIR); if (!ConfiguredResourceDir.empty()) { - llvm::sys::path::append(P, ConfiguredResourceDir); + // FIXME: We should fix the behavior of llvm::sys::path::append so we don't + // need to check for absolute paths here. + if (llvm::sys::path::is_absolute(ConfiguredResourceDir)) + P = ConfiguredResourceDir; + else + llvm::sys::path::append(P, ConfiguredResourceDir); } else { // On Windows, libclang.dll is in bin/. // On non-Windows, libclang.so/.dylib is in lib/. diff --git a/llvm/include/llvm/Support/Path.h b/llvm/include/llvm/Support/Path.h index 0d8881359b806..0cb517146c04b 100644 --- a/llvm/include/llvm/Support/Path.h +++ b/llvm/include/llvm/Support/Path.h @@ -223,6 +223,8 @@ LLVM_ABI bool remove_dots(SmallVectorImpl<char> &path, /// /foo + bar/f => /foo/bar/f /// /foo/ + bar/f => /foo/bar/f /// foo + bar/f => foo/bar/f +/// foo + /bar/f => foo/bar/f (FIXME: will be changed to /bar/f to align +/// with C++17 std::filesystem::path::append) /// @endcode /// /// @param path Set to \a path + \a component. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits