diff --git a/lib/System/Path.cpp b/lib/System/Path.cpp
index d0ee1a3..1c2b00e 100644
--- a/lib/System/Path.cpp
+++ b/lib/System/Path.cpp
@@ -23,6 +23,14 @@
 //===          independent code. 
 //===----------------------------------------------------------------------===//
 
+Path
+Path::GetLLVMConfigDir() {
+  Path result;
+  if (result.setDirectory(LLVM_ETCDIR))
+    return result;
+  return GetLLVMDefaultConfigDir();
+}
+
 LLVMFileType 
 sys::IdentifyFileType(const char*magic, unsigned length) {
   assert(magic && "Invalid magic number string");
diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp
index 6733f03..d4bf026 100644
--- a/lib/System/Unix/Path.cpp
+++ b/lib/System/Unix/Path.cpp
@@ -87,7 +87,7 @@
   }
 #ifdef LLVMGCCDIR
   {
-    Path tmpPath(std::string(LLVMGCCDIR) + "bytecode-libs/");
+    Path tmpPath(std::string(LLVMGCCDIR) + "lib/");
     if (tmpPath.readable())
       Paths.push_back(tmpPath);
   }
@@ -108,14 +108,6 @@
   return Path("/etc/llvm/");
 }
 
-Path 
-Path::GetLLVMConfigDir() {
-  Path result;
-  if (result.setDirectory(LLVM_ETCDIR))
-    return result;
-  return GetLLVMDefaultConfigDir();
-}
-
 Path
 Path::GetUserHomeDirectory() {
   const char* home = getenv("HOME");
@@ -491,20 +483,19 @@
 bool
 Path::createTemporaryFile() {
   // Make sure we're dealing with a file
-  if (!isFile()) return false;
+  if (!isFile()) 
+    return false;
 
-  // Append the filename filler
-  char pathname[MAXPATHLEN];
-  path.copy(pathname,MAXPATHLEN);
-  pathname[path.length()] = 0;
-  strcat(pathname,"XXXXXX");
-  int fd = ::mkstemp(pathname);
-  if (fd < 0) {
-    ThrowErrno(path + ": Can't create temporary file");
+  // Make this into a unique file name
+  makeUnique();
+
+  // create the file
+  int outFile = ::open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666);
+  if (outFile != -1) {
+    ::close(outFile);
+    return true;
   }
-  path = pathname;
-  ::close(fd);
-  return true;
+  return false;
 }
 
 bool
@@ -565,6 +556,93 @@
   return true;
 }
 
+void 
+CopyFile(const sys::Path &Dest, const sys::Path &Src) {
+  int inFile = -1;
+  int outFile = -1;
+  try {
+    inFile = ::open(Src.c_str(), O_RDONLY);
+    if (inFile == -1)
+      ThrowErrno("Cannnot open source file to copy: " + Src.toString());
+
+    outFile = ::open(Dest.c_str(), O_WRONLY|O_CREAT, 0666);
+    if (outFile == -1)
+      ThrowErrno("Cannnot create destination file for copy: " +Dest.toString());
+
+    char Buffer[16*1024];
+    while (ssize_t Amt = ::read(inFile, Buffer, 16*1024)) {
+      if (Amt == -1) {
+        if (errno != EINTR && errno != EAGAIN) 
+          ThrowErrno("Can't read source file: " + Src.toString());
+      } else {
+        char *BufPtr = Buffer;
+        while (Amt) {
+          ssize_t AmtWritten = ::write(outFile, BufPtr, Amt);
+          if (AmtWritten == -1) {
+            if (errno != EINTR && errno != EAGAIN) 
+              ThrowErrno("Can't write destination file: " + Dest.toString());
+          } else {
+            Amt -= AmtWritten;
+            BufPtr += AmtWritten;
+          }
+        }
+      }
+    }
+    ::close(inFile);
+    ::close(outFile);
+  } catch (...) {
+    if (inFile != -1)
+      ::close(inFile);
+    if (outFile != -1)
+      ::close(outFile);
+    throw;
+  }
+}
+
+void 
+Path::makeUnique() {
+  if (!exists())
+    return; // File doesn't exist already, just use it!
+
+  // Append an XXXXXX pattern to the end of the file for use with mkstemp, 
+  // mktemp or our own implementation.
+  char *FNBuffer = (char*) alloca(path.size()+8);
+  path.copy(FNBuffer,path.size());
+  strcpy(FNBuffer+path.size(), "-XXXXXX");
+
+#if defined(HAVE_MKSTEMP)
+  int TempFD;
+  if ((TempFD = mkstemp(FNBuffer)) == -1) {
+    ThrowErrno("Cannot make unique filename for '" + path + "'");
+  }
+
+  // We don't need to hold the temp file descriptor... we will trust that no one
+  // will overwrite/delete the file before we can open it again.
+  close(TempFD);
+
+  // Save the name
+  path = FNBuffer;
+#elif defined(HAVE_MKTEMP)
+  // If we don't have mkstemp, use the old and obsolete mktemp function.
+  if (mktemp(FNBuffer) == 0) {
+    ThrowErrno("Cannot make unique filename for '" + path + "'");
+  }
+
+  // Save the name
+  path = FNBuffer;
+#else
+  // Okay, looks like we have to do it all by our lonesome.
+  static unsigned FCounter = 0;
+  unsigned offset = path.size() + 1;
+  while ( FCounter < 999999 && exists()) {
+    sprintf(FNBuffer+offset,"%06u",++FCounter);
+    path = FNBuffer;
+  }
+  if (FCounter > 999999)
+    throw std::string("Cannot make unique filename for '" + path + "'");
+#endif
+
+}
 }
 
 // vim: sw=2
diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc
index 6733f03..d4bf026 100644
--- a/lib/System/Unix/Path.inc
+++ b/lib/System/Unix/Path.inc
@@ -87,7 +87,7 @@
   }
 #ifdef LLVMGCCDIR
   {
-    Path tmpPath(std::string(LLVMGCCDIR) + "bytecode-libs/");
+    Path tmpPath(std::string(LLVMGCCDIR) + "lib/");
     if (tmpPath.readable())
       Paths.push_back(tmpPath);
   }
@@ -108,14 +108,6 @@
   return Path("/etc/llvm/");
 }
 
-Path 
-Path::GetLLVMConfigDir() {
-  Path result;
-  if (result.setDirectory(LLVM_ETCDIR))
-    return result;
-  return GetLLVMDefaultConfigDir();
-}
-
 Path
 Path::GetUserHomeDirectory() {
   const char* home = getenv("HOME");
@@ -491,20 +483,19 @@
 bool
 Path::createTemporaryFile() {
   // Make sure we're dealing with a file
-  if (!isFile()) return false;
+  if (!isFile()) 
+    return false;
 
-  // Append the filename filler
-  char pathname[MAXPATHLEN];
-  path.copy(pathname,MAXPATHLEN);
-  pathname[path.length()] = 0;
-  strcat(pathname,"XXXXXX");
-  int fd = ::mkstemp(pathname);
-  if (fd < 0) {
-    ThrowErrno(path + ": Can't create temporary file");
+  // Make this into a unique file name
+  makeUnique();
+
+  // create the file
+  int outFile = ::open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666);
+  if (outFile != -1) {
+    ::close(outFile);
+    return true;
   }
-  path = pathname;
-  ::close(fd);
-  return true;
+  return false;
 }
 
 bool
@@ -565,6 +556,93 @@
   return true;
 }
 
+void 
+CopyFile(const sys::Path &Dest, const sys::Path &Src) {
+  int inFile = -1;
+  int outFile = -1;
+  try {
+    inFile = ::open(Src.c_str(), O_RDONLY);
+    if (inFile == -1)
+      ThrowErrno("Cannnot open source file to copy: " + Src.toString());
+
+    outFile = ::open(Dest.c_str(), O_WRONLY|O_CREAT, 0666);
+    if (outFile == -1)
+      ThrowErrno("Cannnot create destination file for copy: " +Dest.toString());
+
+    char Buffer[16*1024];
+    while (ssize_t Amt = ::read(inFile, Buffer, 16*1024)) {
+      if (Amt == -1) {
+        if (errno != EINTR && errno != EAGAIN) 
+          ThrowErrno("Can't read source file: " + Src.toString());
+      } else {
+        char *BufPtr = Buffer;
+        while (Amt) {
+          ssize_t AmtWritten = ::write(outFile, BufPtr, Amt);
+          if (AmtWritten == -1) {
+            if (errno != EINTR && errno != EAGAIN) 
+              ThrowErrno("Can't write destination file: " + Dest.toString());
+          } else {
+            Amt -= AmtWritten;
+            BufPtr += AmtWritten;
+          }
+        }
+      }
+    }
+    ::close(inFile);
+    ::close(outFile);
+  } catch (...) {
+    if (inFile != -1)
+      ::close(inFile);
+    if (outFile != -1)
+      ::close(outFile);
+    throw;
+  }
+}
+
+void 
+Path::makeUnique() {
+  if (!exists())
+    return; // File doesn't exist already, just use it!
+
+  // Append an XXXXXX pattern to the end of the file for use with mkstemp, 
+  // mktemp or our own implementation.
+  char *FNBuffer = (char*) alloca(path.size()+8);
+  path.copy(FNBuffer,path.size());
+  strcpy(FNBuffer+path.size(), "-XXXXXX");
+
+#if defined(HAVE_MKSTEMP)
+  int TempFD;
+  if ((TempFD = mkstemp(FNBuffer)) == -1) {
+    ThrowErrno("Cannot make unique filename for '" + path + "'");
+  }
+
+  // We don't need to hold the temp file descriptor... we will trust that no one
+  // will overwrite/delete the file before we can open it again.
+  close(TempFD);
+
+  // Save the name
+  path = FNBuffer;
+#elif defined(HAVE_MKTEMP)
+  // If we don't have mkstemp, use the old and obsolete mktemp function.
+  if (mktemp(FNBuffer) == 0) {
+    ThrowErrno("Cannot make unique filename for '" + path + "'");
+  }
+
+  // Save the name
+  path = FNBuffer;
+#else
+  // Okay, looks like we have to do it all by our lonesome.
+  static unsigned FCounter = 0;
+  unsigned offset = path.size() + 1;
+  while ( FCounter < 999999 && exists()) {
+    sprintf(FNBuffer+offset,"%06u",++FCounter);
+    path = FNBuffer;
+  }
+  if (FCounter > 999999)
+    throw std::string("Cannot make unique filename for '" + path + "'");
+#endif
+
+}
 }
 
 // vim: sw=2
diff --git a/lib/System/Win32/Path.cpp b/lib/System/Win32/Path.cpp
index f6e4c3b..149b4a1 100644
--- a/lib/System/Win32/Path.cpp
+++ b/lib/System/Win32/Path.cpp
@@ -158,7 +158,7 @@
   }
 #ifdef LLVMGCCDIR
   {
-    Path tmpPath(std::string(LLVMGCCDIR) + "bytecode-libs/");
+    Path tmpPath(std::string(LLVMGCCDIR) + "lib/");
     if (tmpPath.readable())
       Paths.push_back(tmpPath);
   }
@@ -584,6 +584,29 @@
   return true;
 }
 
+void 
+CopyFile(const sys::Path &Dest, const sys::Path &Src) {
+  if (!::CopyFile(Src.c_str(), Dest.c_str(), false))
+    ThrowError("Can't copy '" + Src.toString() + 
+               "' to '" + Dest.toString() + "'");
+}
+
+void 
+Path::makeUnique() {
+  if (!exists())
+    return; // File doesn't exist already, just use it!
+
+  Path dir (*this);
+  dir.elideFile();
+  std::string fname = this->getLast();
+
+  char* newName = alloca(MAX_PATH+1);
+  if (!GetTempFileName(dir.c_str(), fname.c_str(), 0, newName))
+    ThrowError("Cannot make unique filename for '" + path + "'");
+
+  path = newName;
+}
+
 }
 }
 
diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc
index f6e4c3b..149b4a1 100644
--- a/lib/System/Win32/Path.inc
+++ b/lib/System/Win32/Path.inc
@@ -158,7 +158,7 @@
   }
 #ifdef LLVMGCCDIR
   {
-    Path tmpPath(std::string(LLVMGCCDIR) + "bytecode-libs/");
+    Path tmpPath(std::string(LLVMGCCDIR) + "lib/");
     if (tmpPath.readable())
       Paths.push_back(tmpPath);
   }
@@ -584,6 +584,29 @@
   return true;
 }
 
+void 
+CopyFile(const sys::Path &Dest, const sys::Path &Src) {
+  if (!::CopyFile(Src.c_str(), Dest.c_str(), false))
+    ThrowError("Can't copy '" + Src.toString() + 
+               "' to '" + Dest.toString() + "'");
+}
+
+void 
+Path::makeUnique() {
+  if (!exists())
+    return; // File doesn't exist already, just use it!
+
+  Path dir (*this);
+  dir.elideFile();
+  std::string fname = this->getLast();
+
+  char* newName = alloca(MAX_PATH+1);
+  if (!GetTempFileName(dir.c_str(), fname.c_str(), 0, newName))
+    ThrowError("Cannot make unique filename for '" + path + "'");
+
+  path = newName;
+}
+
 }
 }
 
