summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-03-11 18:40:24 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-03-11 18:40:24 +0000
commit83f858e578d3efa07549c1757d675293bc844b9a (patch)
treee1cfec2ace6af51b8973a1b30d50896d7c470d12
parent698a5bdbba4c01c39a03b23280cd95ecbf153164 (diff)
downloadbcm5719-llvm-83f858e578d3efa07549c1757d675293bc844b9a.tar.gz
bcm5719-llvm-83f858e578d3efa07549c1757d675293bc844b9a.zip
Cleanup the interface for creating soft or hard links.
Before this patch the unix code for creating hardlinks was unused. The code for creating symbolic links was implemented in lib/Support/LockFileManager.cpp and the code for creating hard links in lib/Support/*/Path.inc. The only use we have for these is in LockFileManager.cpp and it can use both soft and hard links. Just have a create_link function that creates one or the other depending on the platform. llvm-svn: 203596
-rw-r--r--llvm/include/llvm/Support/FileSystem.h13
-rw-r--r--llvm/lib/Support/LockFileManager.cpp33
-rw-r--r--llvm/lib/Support/Unix/Path.inc6
-rw-r--r--llvm/lib/Support/Windows/Path.inc3
-rw-r--r--llvm/unittests/Support/Path.cpp4
5 files changed, 20 insertions, 39 deletions
diff --git a/llvm/include/llvm/Support/FileSystem.h b/llvm/include/llvm/Support/FileSystem.h
index 1812d24ead7..906f37f7c18 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 b45fcbca2e2..ba1047b88ac 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 caa30c7533a..2b29baca738 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 c39600357be..a555f3e794e 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 d5bee7ae5d8..91e421d3827 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);
OpenPOWER on IntegriCloud