summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/Tools.cpp
diff options
context:
space:
mode:
authorBen Langmuir <blangmuir@apple.com>2015-02-03 19:28:37 +0000
committerBen Langmuir <blangmuir@apple.com>2015-02-03 19:28:37 +0000
commit3b7b5406801e75a0616c1383dcdc6c9294fee3e3 (patch)
tree8682f9d95f3e73ca2cb67bbc98ab2e06488bf521 /clang/lib/Driver/Tools.cpp
parenta5ef4905a5e0d51199b8e0d5e414a7b384af5e49 (diff)
downloadbcm5719-llvm-3b7b5406801e75a0616c1383dcdc6c9294fee3e3.tar.gz
bcm5719-llvm-3b7b5406801e75a0616c1383dcdc6c9294fee3e3.zip
Make the default module cache user-specific
Appends the username to the first component (after the temp dir) of the module cache path. If the username contains a character that shouldn't go into a path (for now conservatively allow [a-zA-Z0-9_]), we fallback to the user id. llvm-svn: 228013
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r--clang/lib/Driver/Tools.cpp39
1 files changed, 38 insertions, 1 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 9dd5a909a81..b769d081288 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -40,6 +40,10 @@
#include "llvm/Support/Program.h"
#include "llvm/Support/raw_ostream.h"
+#ifdef LLVM_ON_UNIX
+#include <unistd.h> // For getuid().
+#endif
+
using namespace clang::driver;
using namespace clang::driver::tools;
using namespace clang;
@@ -2456,6 +2460,38 @@ static void claimNoWarnArgs(const ArgList &Args) {
Args.ClaimAllArgs(options::OPT_fno_lto);
}
+static void appendUserToPath(SmallVectorImpl<char> &Result) {
+#ifdef LLVM_ON_UNIX
+ const char *Username = getenv("LOGNAME");
+#else
+ const char *Username = getenv("USERNAME");
+#endif
+ if (Username) {
+ // Validate that LoginName can be used in a path, and get its length.
+ size_t Len = 0;
+ for (const char *P = Username; *P; ++P, ++Len) {
+ if (!isalnum(*P) && *P != '_') {
+ Username = nullptr;
+ break;
+ }
+ }
+
+ if (Username && Len > 0) {
+ Result.append(Username, Username + Len);
+ return;
+ }
+ }
+
+ // Fallback to user id.
+#ifdef LLVM_ON_UNIX
+ std::string UID = llvm::utostr(getuid());
+#else
+ // FIXME: Windows seems to have an 'SID' that might work.
+ std::string UID = "9999";
+#endif
+ Result.append(UID.begin(), UID.end());
+}
+
void Clang::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
@@ -3878,7 +3914,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
// No module path was provided: use the default.
llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
ModuleCachePath);
- llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
+ llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
+ appendUserToPath(ModuleCachePath);
llvm::sys::path::append(ModuleCachePath, "ModuleCache");
}
const char Arg[] = "-fmodules-cache-path=";
OpenPOWER on IntegriCloud