diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2021-10-21 18:33:24 -0700 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2021-10-29 12:09:41 -0700 |
commit | 99023627010bbfefb71e25a2b4d056de1cbd354e (patch) | |
tree | a7ad434f3071922aac052bf9eb23c29c577cb885 /clang | |
parent | 51ce567b38ec92163ec05c9bef0bd0e2bd53c667 (diff) | |
download | llvm-99023627010bbfefb71e25a2b4d056de1cbd354e.zip llvm-99023627010bbfefb71e25a2b4d056de1cbd354e.tar.gz llvm-99023627010bbfefb71e25a2b4d056de1cbd354e.tar.bz2 |
Support: Use sys::path::is_style_{posix,windows}() in a few places
Use the new sys::path::is_style_posix() and is_style_windows() in a few
places that need to detect the system's native path style.
In llvm/lib/Support/Path.cpp, this patch removes most uses of the
private `real_style()`, where is_style_posix() and is_style_windows()
are just a little tidier.
Elsewhere, this removes `_WIN32` macro checks. Added a FIXME to a
FileManagerTest that seemed fishy, but maintained the existing
behaviour.
Differential Revision: https://reviews.llvm.org/D112289
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/JsonSupport.h | 26 | ||||
-rw-r--r-- | clang/lib/Basic/FileManager.cpp | 18 | ||||
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChain.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Lex/PPDirectives.cpp | 8 | ||||
-rw-r--r-- | clang/unittests/Basic/FileManagerTest.cpp | 55 | ||||
-rw-r--r-- | clang/unittests/Driver/ToolChainTest.cpp | 15 | ||||
-rw-r--r-- | clang/unittests/Lex/HeaderSearchTest.cpp | 10 | ||||
-rw-r--r-- | clang/unittests/Tooling/RefactoringTest.cpp | 31 |
9 files changed, 80 insertions, 102 deletions
diff --git a/clang/include/clang/Basic/JsonSupport.h b/clang/include/clang/Basic/JsonSupport.h index 6cd3f4d..2ccb08e 100644 --- a/clang/include/clang/Basic/JsonSupport.h +++ b/clang/include/clang/Basic/JsonSupport.h @@ -12,6 +12,7 @@ #include "clang/Basic/LLVM.h" #include "clang/Basic/SourceManager.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" #include <iterator> @@ -98,18 +99,19 @@ inline void printSourceLocationAsJson(raw_ostream &Out, SourceLocation Loc, if (AddBraces) Out << "{ "; std::string filename(PLoc.getFilename()); -#ifdef _WIN32 - // Remove forbidden Windows path characters - auto RemoveIt = - std::remove_if(filename.begin(), filename.end(), [](auto Char) { - static const char ForbiddenChars[] = "<>*?\"|"; - return std::find(std::begin(ForbiddenChars), std::end(ForbiddenChars), - Char) != std::end(ForbiddenChars); - }); - filename.erase(RemoveIt, filename.end()); - // Handle windows-specific path delimiters. - std::replace(filename.begin(), filename.end(), '\\', '/'); -#endif + if (is_style_windows(llvm::sys::path::Style::native)) { + // Remove forbidden Windows path characters + auto RemoveIt = + std::remove_if(filename.begin(), filename.end(), [](auto Char) { + static const char ForbiddenChars[] = "<>*?\"|"; + return std::find(std::begin(ForbiddenChars), + std::end(ForbiddenChars), + Char) != std::end(ForbiddenChars); + }); + filename.erase(RemoveIt, filename.end()); + // Handle windows-specific path delimiters. + std::replace(filename.begin(), filename.end(), '\\', '/'); + } Out << "\"line\": " << PLoc.getLine() << ", \"column\": " << PLoc.getColumn() << ", \"file\": \"" << filename << "\""; diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp index c4eae6a..1cb52d5 100644 --- a/clang/lib/Basic/FileManager.cpp +++ b/clang/lib/Basic/FileManager.cpp @@ -123,16 +123,16 @@ FileManager::getDirectoryRef(StringRef DirName, bool CacheFailure) { DirName != llvm::sys::path::root_path(DirName) && llvm::sys::path::is_separator(DirName.back())) DirName = DirName.substr(0, DirName.size()-1); -#ifdef _WIN32 - // Fixing a problem with "clang C:test.c" on Windows. - // Stat("C:") does not recognize "C:" as a valid directory - std::string DirNameStr; - if (DirName.size() > 1 && DirName.back() == ':' && - DirName.equals_insensitive(llvm::sys::path::root_name(DirName))) { - DirNameStr = DirName.str() + '.'; - DirName = DirNameStr; + if (is_style_windows(llvm::sys::path::Style::native)) { + // Fixing a problem with "clang C:test.c" on Windows. + // Stat("C:") does not recognize "C:" as a valid directory + std::string DirNameStr; + if (DirName.size() > 1 && DirName.back() == ':' && + DirName.equals_insensitive(llvm::sys::path::root_name(DirName))) { + DirNameStr = DirName.str() + '.'; + DirName = DirNameStr; + } } -#endif ++NumDirLookups; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 5b64ca8..2ddb753 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4899,11 +4899,11 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, bool MultipleArchs, StringRef OffloadingPrefix) const { std::string BoundArch = OrigBoundArch.str(); -#if defined(_WIN32) - // BoundArch may contains ':', which is invalid in file names on Windows, - // therefore replace it with '%'. - std::replace(BoundArch.begin(), BoundArch.end(), ':', '@'); -#endif + if (is_style_windows(llvm::sys::path::Style::native)) { + // BoundArch may contains ':', which is invalid in file names on Windows, + // therefore replace it with '%'. + std::replace(BoundArch.begin(), BoundArch.end(), ':', '@'); + } llvm::PrettyStackTraceString CrashInfo("Computing output path"); // Output to a user requested destination? diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index df205c3..debaf9e 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -169,10 +169,11 @@ static const DriverSuffix *FindDriverSuffix(StringRef ProgName, size_t &Pos) { /// present and lower-casing the string on Windows. static std::string normalizeProgramName(llvm::StringRef Argv0) { std::string ProgName = std::string(llvm::sys::path::stem(Argv0)); -#ifdef _WIN32 - // Transform to lowercase for case insensitive file systems. - std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(), ::tolower); -#endif + if (is_style_windows(llvm::sys::path::Style::native)) { + // Transform to lowercase for case insensitive file systems. + std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(), + ::tolower); + } return ProgName; } diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index ea14921..1c2439a 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -2012,20 +2012,16 @@ Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport( SourceLocation FilenameLoc = FilenameTok.getLocation(); StringRef LookupFilename = Filename; -#ifdef _WIN32 - llvm::sys::path::Style BackslashStyle = llvm::sys::path::Style::windows; -#else // Normalize slashes when compiling with -fms-extensions on non-Windows. This // is unnecessary on Windows since the filesystem there handles backslashes. SmallString<128> NormalizedPath; - llvm::sys::path::Style BackslashStyle = llvm::sys::path::Style::posix; - if (LangOpts.MicrosoftExt) { + llvm::sys::path::Style BackslashStyle = llvm::sys::path::Style::native; + if (is_style_posix(BackslashStyle) && LangOpts.MicrosoftExt) { NormalizedPath = Filename.str(); llvm::sys::path::native(NormalizedPath); LookupFilename = NormalizedPath; BackslashStyle = llvm::sys::path::Style::windows; } -#endif Optional<FileEntryRef> File = LookupHeaderIncludeOrImport( CurDir, Filename, FilenameLoc, FilenameRange, FilenameTok, diff --git a/clang/unittests/Basic/FileManagerTest.cpp b/clang/unittests/Basic/FileManagerTest.cpp index a122747..3c058a0 100644 --- a/clang/unittests/Basic/FileManagerTest.cpp +++ b/clang/unittests/Basic/FileManagerTest.cpp @@ -31,18 +31,18 @@ private: void InjectFileOrDirectory(const char *Path, ino_t INode, bool IsFile, const char *StatPath) { -#ifndef _WIN32 SmallString<128> NormalizedPath(Path); - llvm::sys::path::native(NormalizedPath); - Path = NormalizedPath.c_str(); - SmallString<128> NormalizedStatPath; - if (StatPath) { - NormalizedStatPath = StatPath; - llvm::sys::path::native(NormalizedStatPath); - StatPath = NormalizedStatPath.c_str(); + if (is_style_posix(llvm::sys::path::Style::native)) { + llvm::sys::path::native(NormalizedPath); + Path = NormalizedPath.c_str(); + + if (StatPath) { + NormalizedStatPath = StatPath; + llvm::sys::path::native(NormalizedStatPath); + StatPath = NormalizedStatPath.c_str(); + } } -#endif if (!StatPath) StatPath = Path; @@ -74,11 +74,11 @@ public: bool isFile, std::unique_ptr<llvm::vfs::File> *F, llvm::vfs::FileSystem &FS) override { -#ifndef _WIN32 SmallString<128> NormalizedPath(Path); - llvm::sys::path::native(NormalizedPath); - Path = NormalizedPath.c_str(); -#endif + if (is_style_posix(llvm::sys::path::Style::native)) { + llvm::sys::path::native(NormalizedPath); + Path = NormalizedPath.c_str(); + } if (StatCalls.count(Path) != 0) { Status = StatCalls[Path]; @@ -436,13 +436,16 @@ TEST_F(FileManagerTest, getVirtualFileWithDifferentName) { #endif // !_WIN32 +static StringRef getSystemRoot() { + return is_style_windows(llvm::sys::path::Style::native) ? "C:/" : "/"; +} + TEST_F(FileManagerTest, makeAbsoluteUsesVFS) { - SmallString<64> CustomWorkingDir; -#ifdef _WIN32 - CustomWorkingDir = "C:"; -#else - CustomWorkingDir = "/"; -#endif + // FIXME: Should this be using a root path / call getSystemRoot()? For now, + // avoiding that and leaving the test as-is. + SmallString<64> CustomWorkingDir = + is_style_windows(llvm::sys::path::Style::native) ? StringRef("C:") + : StringRef("/"); llvm::sys::path::append(CustomWorkingDir, "some", "weird", "path"); auto FS = IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem>( @@ -464,12 +467,7 @@ TEST_F(FileManagerTest, makeAbsoluteUsesVFS) { // getVirtualFile should always fill the real path. TEST_F(FileManagerTest, getVirtualFileFillsRealPathName) { - SmallString<64> CustomWorkingDir; -#ifdef _WIN32 - CustomWorkingDir = "C:/"; -#else - CustomWorkingDir = "/"; -#endif + SmallString<64> CustomWorkingDir = getSystemRoot(); auto FS = IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem>( new llvm::vfs::InMemoryFileSystem); @@ -497,12 +495,7 @@ TEST_F(FileManagerTest, getVirtualFileFillsRealPathName) { } TEST_F(FileManagerTest, getFileDontOpenRealPath) { - SmallString<64> CustomWorkingDir; -#ifdef _WIN32 - CustomWorkingDir = "C:/"; -#else - CustomWorkingDir = "/"; -#endif + SmallString<64> CustomWorkingDir = getSystemRoot(); auto FS = IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem>( new llvm::vfs::InMemoryFileSystem); diff --git a/clang/unittests/Driver/ToolChainTest.cpp b/clang/unittests/Driver/ToolChainTest.cpp index 2bf727d..62ad6f7 100644 --- a/clang/unittests/Driver/ToolChainTest.cpp +++ b/clang/unittests/Driver/ToolChainTest.cpp @@ -85,9 +85,8 @@ TEST(ToolChainTest, VFSGCCInstallation) { llvm::raw_string_ostream OS(S); C->getDefaultToolChain().printVerboseInfo(OS); } -#if _WIN32 - std::replace(S.begin(), S.end(), '\\', '/'); -#endif + if (is_style_windows(llvm::sys::path::Style::native)) + std::replace(S.begin(), S.end(), '\\', '/'); EXPECT_EQ( "Found candidate GCC installation: " "/usr/lib/gcc/arm-linux-gnueabihf/4.6.3\n" @@ -110,9 +109,8 @@ TEST(ToolChainTest, VFSGCCInstallation) { llvm::raw_string_ostream OS(S); C->getDefaultToolChain().printVerboseInfo(OS); } -#if _WIN32 - std::replace(S.begin(), S.end(), '\\', '/'); -#endif + if (is_style_windows(llvm::sys::path::Style::native)) + std::replace(S.begin(), S.end(), '\\', '/'); // Test that 4.5.3 from --sysroot is not overridden by 4.6.3 (larger // version) from /usr. EXPECT_EQ("Found candidate GCC installation: " @@ -153,9 +151,8 @@ TEST(ToolChainTest, VFSGCCInstallationRelativeDir) { llvm::raw_string_ostream OS(S); C->getDefaultToolChain().printVerboseInfo(OS); } -#if _WIN32 - std::replace(S.begin(), S.end(), '\\', '/'); -#endif + if (is_style_windows(llvm::sys::path::Style::windows)) + std::replace(S.begin(), S.end(), '\\', '/'); EXPECT_EQ("Found candidate GCC installation: " "/home/test/bin/../lib/gcc/arm-linux-gnueabi/4.6.1\n" "Selected GCC installation: " diff --git a/clang/unittests/Lex/HeaderSearchTest.cpp b/clang/unittests/Lex/HeaderSearchTest.cpp index 78e2a2c..6ceec7c 100644 --- a/clang/unittests/Lex/HeaderSearchTest.cpp +++ b/clang/unittests/Lex/HeaderSearchTest.cpp @@ -188,11 +188,11 @@ TEST_F(HeaderSearchTest, HeaderMapFrameworkLookup) { std::string HeaderDirName = "/tmp/Sources/Foo/Headers/"; std::string HeaderName = "Foo.h"; -#ifdef _WIN32 - // Force header path to be absolute on windows. - // As headermap content should represent absolute locations. - HeaderDirName = "C:" + HeaderDirName; -#endif /*_WIN32*/ + if (is_style_windows(llvm::sys::path::Style::native)) { + // Force header path to be absolute on windows. + // As headermap content should represent absolute locations. + HeaderDirName = "C:" + HeaderDirName; + } test::HMapFileMockMaker<FileTy> Maker(File); auto a = Maker.addString("Foo/Foo.h"); diff --git a/clang/unittests/Tooling/RefactoringTest.cpp b/clang/unittests/Tooling/RefactoringTest.cpp index d239aba..c71a724 100644 --- a/clang/unittests/Tooling/RefactoringTest.cpp +++ b/clang/unittests/Tooling/RefactoringTest.cpp @@ -1031,18 +1031,17 @@ TEST_F(MergeReplacementsTest, OverlappingRanges) { toReplacements({{"", 0, 3, "cc"}, {"", 3, 3, "dd"}})); } +static constexpr bool usesWindowsPaths() { + return is_style_windows(llvm::sys::path::Style::native); +} + TEST(DeduplicateByFileTest, PathsWithDots) { std::map<std::string, Replacements> FileToReplaces; llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> VFS( new llvm::vfs::InMemoryFileSystem()); FileManager FileMgr(FileSystemOptions(), VFS); -#if !defined(_WIN32) - StringRef Path1 = "a/b/.././c.h"; - StringRef Path2 = "a/c.h"; -#else - StringRef Path1 = "a\\b\\..\\.\\c.h"; - StringRef Path2 = "a\\c.h"; -#endif + StringRef Path1 = usesWindowsPaths() ? "a\\b\\..\\.\\c.h" : "a/b/.././c.h"; + StringRef Path2 = usesWindowsPaths() ? "a\\c.h" : "a/c.h"; EXPECT_TRUE(VFS->addFile(Path1, 0, llvm::MemoryBuffer::getMemBuffer(""))); EXPECT_TRUE(VFS->addFile(Path2, 0, llvm::MemoryBuffer::getMemBuffer(""))); FileToReplaces[std::string(Path1)] = Replacements(); @@ -1057,13 +1056,8 @@ TEST(DeduplicateByFileTest, PathWithDotSlash) { llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> VFS( new llvm::vfs::InMemoryFileSystem()); FileManager FileMgr(FileSystemOptions(), VFS); -#if !defined(_WIN32) - StringRef Path1 = "./a/b/c.h"; - StringRef Path2 = "a/b/c.h"; -#else - StringRef Path1 = ".\\a\\b\\c.h"; - StringRef Path2 = "a\\b\\c.h"; -#endif + StringRef Path1 = usesWindowsPaths() ? ".\\a\\b\\c.h" : "./a/b/c.h"; + StringRef Path2 = usesWindowsPaths() ? "a\\b\\c.h" : "a/b/c.h"; EXPECT_TRUE(VFS->addFile(Path1, 0, llvm::MemoryBuffer::getMemBuffer(""))); EXPECT_TRUE(VFS->addFile(Path2, 0, llvm::MemoryBuffer::getMemBuffer(""))); FileToReplaces[std::string(Path1)] = Replacements(); @@ -1078,13 +1072,8 @@ TEST(DeduplicateByFileTest, NonExistingFilePath) { llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> VFS( new llvm::vfs::InMemoryFileSystem()); FileManager FileMgr(FileSystemOptions(), VFS); -#if !defined(_WIN32) - StringRef Path1 = "./a/b/c.h"; - StringRef Path2 = "a/b/c.h"; -#else - StringRef Path1 = ".\\a\\b\\c.h"; - StringRef Path2 = "a\\b\\c.h"; -#endif + StringRef Path1 = usesWindowsPaths() ? ".\\a\\b\\c.h" : "./a/b/c.h"; + StringRef Path2 = usesWindowsPaths() ? "a\\b\\c.h" : "a/b/c.h"; FileToReplaces[std::string(Path1)] = Replacements(); FileToReplaces[std::string(Path2)] = Replacements(); FileToReplaces = groupReplacementsByFile(FileMgr, FileToReplaces); |