diff --git a/llvm/include/llvm/Support/FileSystem.h b/llvm/include/llvm/Support/FileSystem.h index 1812d24ead72..906f37f7c189 100644 --- a/llvm/include/llvm/Support/FileSystem.h +++ b/llvm/include/llvm/Support/FileSystem.h @@ -285,13 +285,18 @@ error_code create_directories(const Twine &path, bool IgnoreExisting = true); /// error if the directory already existed. error_code create_directory(const Twine &path, bool IgnoreExisting = true); -/// @brief Create a hard link from \a from to \a to. +/// @brief Create a link from \a from to \a to. +/// +/// The link may be a soft or a hard link, depending on the platform. The caller +/// may not assume which one. Currently on windows it creates a hard link since +/// soft links require extra privileges. On unix, it creates a soft link since +/// hard links don't work on SMB file systems. /// /// @param to The path to hard link to. /// @param from The path to hard link from. This is created. -/// @returns errc::success if exists(to) && exists(from) && equivalent(to, from) -/// , otherwise a platform specific error_code. -error_code create_hard_link(const Twine &to, const Twine &from); +/// @returns errc::success if the link was created, otherwise a platform +/// specific error_code. +error_code create_link(const Twine &to, const Twine &from); /// @brief Get the current path. /// diff --git a/llvm/lib/Support/LockFileManager.cpp b/llvm/lib/Support/LockFileManager.cpp index b45fcbca2e23..ba1047b88ac2 100644 --- a/llvm/lib/Support/LockFileManager.cpp +++ b/llvm/lib/Support/LockFileManager.cpp @@ -67,22 +67,6 @@ bool LockFileManager::processStillExecuting(StringRef Hostname, int PID) { return true; } -#if LLVM_ON_UNIX -static error_code unix_create_symbolic_link(const Twine &to, - const Twine &from) { - // Get arguments. - SmallString<128> from_storage; - SmallString<128> to_storage; - StringRef f = from.toNullTerminatedStringRef(from_storage); - StringRef t = to.toNullTerminatedStringRef(to_storage); - - if (::symlink(t.begin(), f.begin()) == -1) - return error_code(errno, system_category()); - - return error_code::success(); -} -#endif - LockFileManager::LockFileManager(StringRef FileName) { this->FileName = FileName; @@ -132,20 +116,9 @@ LockFileManager::LockFileManager(StringRef FileName) } while (1) { -#if LLVM_ON_UNIX - // Create a symbolic link from the lock file name. If this succeeds, we're - // done. Note that we are using symbolic link because hard links are not - // supported by all filesystems. - error_code EC - = unix_create_symbolic_link(UniqueLockFileName.str(), - LockFileName.str()); -#else - // We can't use symbolic links for windows. - // Create a hard link from the lock file name. If this succeeds, we're done. - error_code EC - = sys::fs::create_hard_link(UniqueLockFileName.str(), - LockFileName.str()); -#endif + // Create a link from the lock file name. If this succeeds, we're done. + error_code EC = + sys::fs::create_link(UniqueLockFileName.str(), LockFileName.str()); if (EC == errc::success) return; diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc index caa30c7533a2..2b29baca7387 100644 --- a/llvm/lib/Support/Unix/Path.inc +++ b/llvm/lib/Support/Unix/Path.inc @@ -272,14 +272,16 @@ error_code create_directory(const Twine &path, bool IgnoreExisting) { return error_code::success(); } -error_code create_hard_link(const Twine &to, const Twine &from) { +// Note that we are using symbolic link because hard links are not supported by +// all filesystems (SMB doesn't). +error_code create_link(const Twine &to, const Twine &from) { // Get arguments. SmallString<128> from_storage; SmallString<128> to_storage; StringRef f = from.toNullTerminatedStringRef(from_storage); StringRef t = to.toNullTerminatedStringRef(to_storage); - if (::link(t.begin(), f.begin()) == -1) + if (::symlink(t.begin(), f.begin()) == -1) return error_code(errno, system_category()); return error_code::success(); diff --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc index c39600357be3..a555f3e794e5 100644 --- a/llvm/lib/Support/Windows/Path.inc +++ b/llvm/lib/Support/Windows/Path.inc @@ -158,7 +158,8 @@ error_code create_directory(const Twine &path, bool IgnoreExisting) { return error_code::success(); } -error_code create_hard_link(const Twine &to, const Twine &from) { +// We can't use symbolic links for windows. +error_code create_link(const Twine &to, const Twine &from) { // Get arguments. SmallString<128> from_storage; SmallString<128> to_storage; diff --git a/llvm/unittests/Support/Path.cpp b/llvm/unittests/Support/Path.cpp index d5bee7ae5d86..91e421d38271 100644 --- a/llvm/unittests/Support/Path.cpp +++ b/llvm/unittests/Support/Path.cpp @@ -299,7 +299,7 @@ TEST_F(FileSystemTest, Unique) { // Two paths representing the same file on disk should still provide the // same unique id. We can test this by making a hard link. - ASSERT_NO_ERROR(fs::create_hard_link(Twine(TempPath), Twine(TempPath2))); + ASSERT_NO_ERROR(fs::create_link(Twine(TempPath), Twine(TempPath2))); fs::UniqueID D2; ASSERT_NO_ERROR(fs::getUniqueID(Twine(TempPath2), D2)); ASSERT_EQ(D2, F1); @@ -365,7 +365,7 @@ TEST_F(FileSystemTest, TempFiles) { ASSERT_FALSE(TempPath3.endswith(".")); // Create a hard link to Temp1. - ASSERT_NO_ERROR(fs::create_hard_link(Twine(TempPath), Twine(TempPath2))); + ASSERT_NO_ERROR(fs::create_link(Twine(TempPath), Twine(TempPath2))); bool equal; ASSERT_NO_ERROR(fs::equivalent(Twine(TempPath), Twine(TempPath2), equal)); EXPECT_TRUE(equal);