summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Bytecode/Reader/Reader.cpp2
-rw-r--r--lib/Bytecode/Reader/Reader.h2
-rw-r--r--lib/System/Win32/MappedFile.inc2
-rw-r--r--lib/System/Win32/Path.inc32
-rw-r--r--lib/System/Win32/Program.inc4
-rw-r--r--lib/System/Win32/Win32.h6
-rw-r--r--tools/gccld/gccld.cpp15
-rw-r--r--tools/llvm-ld/llvm-ld.cpp8
8 files changed, 43 insertions, 28 deletions
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp
index 7b42fee915..60c8e4f9db 100644
--- a/lib/Bytecode/Reader/Reader.cpp
+++ b/lib/Bytecode/Reader/Reader.cpp
@@ -2409,7 +2409,7 @@ void BytecodeReader::ParseModule() {
/// This function completely parses a bytecode buffer given by the \p Buf
/// and \p Length parameters.
-bool BytecodeReader::ParseBytecode(BufPtr Buf, unsigned Length,
+bool BytecodeReader::ParseBytecode(volatile BufPtr Buf, unsigned Length,
const std::string &ModuleID,
std::string* ErrMsg) {
diff --git a/lib/Bytecode/Reader/Reader.h b/lib/Bytecode/Reader/Reader.h
index 711dc89f4c..fcf79b478b 100644
--- a/lib/Bytecode/Reader/Reader.h
+++ b/lib/Bytecode/Reader/Reader.h
@@ -140,7 +140,7 @@ public:
/// @returns true if an error occurred
/// @brief Main interface to parsing a bytecode buffer.
bool ParseBytecode(
- const unsigned char *Buf, ///< Beginning of the bytecode buffer
+ volatile BufPtr Buf, ///< Beginning of the bytecode buffer
unsigned Length, ///< Length of the bytecode buffer
const std::string &ModuleID, ///< An identifier for the module constructed.
std::string* ErrMsg = 0 ///< Optional place for error message
diff --git a/lib/System/Win32/MappedFile.inc b/lib/System/Win32/MappedFile.inc
index d5bedfcfed..877ff52be5 100644
--- a/lib/System/Win32/MappedFile.inc
+++ b/lib/System/Win32/MappedFile.inc
@@ -55,6 +55,8 @@ bool MappedFile::initialize(std::string* ErrMsg) {
return MakeErrMsg(ErrMsg,
std::string("Can't get size of file: ") + path_.toString());
}
+
+ return false;
}
void MappedFile::terminate() {
diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc
index 96a59ded6f..048bf60297 100644
--- a/lib/System/Win32/Path.inc
+++ b/lib/System/Win32/Path.inc
@@ -315,12 +315,12 @@ bool Path::makeReadableOnDisk(std::string* ErrMsg) {
return false;
}
-void Path::makeWriteableOnDisk(std::string* ErrMsg) {
+bool Path::makeWriteableOnDisk(std::string* ErrMsg) {
DWORD attr = GetFileAttributes(path.c_str());
// If it doesn't exist, we're done.
if (attr == INVALID_FILE_ATTRIBUTES)
- return;
+ return false;
if (attr & FILE_ATTRIBUTE_READONLY) {
if (!SetFileAttributes(path.c_str(), attr & ~FILE_ATTRIBUTE_READONLY)) {
@@ -338,7 +338,11 @@ bool Path::makeExecutableOnDisk(std::string* ErrMsg) {
bool
Path::getDirectoryContents(std::set<Path>& result, std::string* ErrMsg) const {
- if (!isDirectory()) {
+ FileStatus Status;
+ if (getFileStatus(Status, ErrMsg))
+ return true;
+
+ if (!Status.isDir) {
MakeErrMsg(ErrMsg, path + ": not a directory");
return true;
}
@@ -512,7 +516,7 @@ Path::createDirectoryOnDisk(bool create_parents, std::string* ErrMsg) {
// Drop trailing slash.
pathname[len-1] = 0;
if (!CreateDirectory(pathname, NULL)) {
- return MakeErrMsg(, std::string(pathname) + ": Can't create directory: ");
+ return MakeErrMsg(ErrMsg, std::string(pathname) + ": Can't create directory: ");
}
}
return false;
@@ -652,10 +656,12 @@ Path::renamePathOnDisk(const Path& newName, std::string* ErrMsg) {
}
bool
-Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const {
+Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrMsg) const {
// FIXME: should work on directories also.
- if (!isFile()) return true;
-
+ if (!si.isFile) {
+ return true;
+ }
+
HANDLE h = CreateFile(path.c_str(),
FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -671,7 +677,7 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const {
DWORD err = GetLastError();
CloseHandle(h);
SetLastError(err);
- return MakeErrMsg(ErrStr, path + ": GetFileInformationByHandle: ");
+ return MakeErrMsg(ErrMsg, path + ": GetFileInformationByHandle: ");
}
FILETIME ft;
@@ -681,7 +687,7 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const {
CloseHandle(h);
if (!ret) {
SetLastError(err);
- return MakeErrMsg(path + ": SetFileTime: ");
+ return MakeErrMsg(ErrMsg, path + ": SetFileTime: ");
}
// Best we can do with Unix permission bits is to interpret the owner
@@ -690,13 +696,13 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const {
if (bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
if (!SetFileAttributes(path.c_str(),
bhfi.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY))
- return MakeErrMsg(ErrStr, path + ": SetFileAttributes: ");
+ return MakeErrMsg(ErrMsg, path + ": SetFileAttributes: ");
}
} else {
if (!(bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
if (!SetFileAttributes(path.c_str(),
bhfi.dwFileAttributes | FILE_ATTRIBUTE_READONLY))
- return MakeErrMsg(ErrStr, path + ": SetFileAttributes: ");
+ return MakeErrMsg(ErrMsg, path + ": SetFileAttributes: ");
}
}
@@ -739,13 +745,13 @@ Path::makeUnique(bool reuse_current, std::string* ErrMsg) {
bool
Path::createTemporaryFileOnDisk(bool reuse_current, std::string* ErrMsg) {
// Make this into a unique file name
- makeUnique(reuse_current);
+ makeUnique(reuse_current, ErrMsg);
// Now go and create it
HANDLE h = CreateFile(path.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE)
- return MakeErrMsg(ErrMsg, path.toString() + ": can't create file");
+ return MakeErrMsg(ErrMsg, path + ": can't create file");
CloseHandle(h);
return false;
diff --git a/lib/System/Win32/Program.inc b/lib/System/Win32/Program.inc
index b45cad1bb4..e1ad155bb3 100644
--- a/lib/System/Win32/Program.inc
+++ b/lib/System/Win32/Program.inc
@@ -158,14 +158,14 @@ Program::ExecuteAndWait(const Path& path,
MakeErrMsg(ErrMsg, "can't redirect stdin");
return -1;
}
- si.hStdOutput = RedirectIO(redirects[1], 1);
+ si.hStdOutput = RedirectIO(redirects[1], 1, ErrMsg);
if (si.hStdOutput == INVALID_HANDLE_VALUE) {
CloseHandle(si.hStdInput);
MakeErrMsg(ErrMsg, "can't redirect stdout");
return -1;
}
if (redirects[1] && redirects[2] && *(redirects[1]) != *(redirects[2])) {
- si.hStdError = RedirectIO(redirects[2], 2);
+ si.hStdError = RedirectIO(redirects[2], 2, ErrMsg);
if (si.hStdError == INVALID_HANDLE_VALUE) {
CloseHandle(si.hStdInput);
CloseHandle(si.hStdOutput);
diff --git a/lib/System/Win32/Win32.h b/lib/System/Win32/Win32.h
index 0180bfabcf..74406aec54 100644
--- a/lib/System/Win32/Win32.h
+++ b/lib/System/Win32/Win32.h
@@ -30,11 +30,7 @@ inline bool MakeErrMsg(std::string* ErrMsg, const std::string& prefix) {
char *buffer = NULL;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(), 0, (LPSTR)&buffer, 1, NULL);
- ErrMsg = prefix + buffer;
+ *ErrMsg = prefix + buffer;
LocalFree(buffer);
return true;
}
-
-inline void MakeErrnoMsg(std::string* ErrMsg, const std::string & prefix) {
- MakeErrorMsg(prefix + ": " + strerror(errno));
-}
diff --git a/tools/gccld/gccld.cpp b/tools/gccld/gccld.cpp
index c8ecde5491..9401a8acbf 100644
--- a/tools/gccld/gccld.cpp
+++ b/tools/gccld/gccld.cpp
@@ -133,17 +133,22 @@ static int PrintAndReturn(const char *progname, const std::string &Message) {
/// EmitShellScript - Output the wrapper file that invokes the JIT on the LLVM
/// bytecode file for the program.
static void EmitShellScript(char **argv) {
-#if defined(_WIN32) || defined(__CYGWIN__)
+#if defined(_WIN32) || defined(__CYGWIN__)
// Windows doesn't support #!/bin/sh style shell scripts in .exe files. To
// support windows systems, we copy the llvm-stub.exe executable from the
// build tree to the destination file.
- std::string llvmstub = FindExecutable("llvm-stub.exe", argv[0]).toString();
- if (llvmstub.empty()) {
+ std::string ErrMsg;
+ sys::Path llvmstub = FindExecutable("llvm-stub.exe", argv[0]);
+ if (llvmstub.isEmpty()) {
std::cerr << "Could not find llvm-stub.exe executable!\n";
exit(1);
}
- sys::CopyFile(sys::Path(OutputFilename), sys::Path(llvmstub));
- return;
+ if (0 != sys::CopyFile(sys::Path(OutputFilename), llvmstub, &ErrMsg)) {
+ std::cerr << argv[0] << ": " << ErrMsg << "\n";
+ exit(1);
+ }
+
+ return;
#endif
// Output the script to start the program...
diff --git a/tools/llvm-ld/llvm-ld.cpp b/tools/llvm-ld/llvm-ld.cpp
index 6b9adaff5a..ab7109fb85 100644
--- a/tools/llvm-ld/llvm-ld.cpp
+++ b/tools/llvm-ld/llvm-ld.cpp
@@ -345,12 +345,18 @@ static void EmitShellScript(char **argv) {
// Windows doesn't support #!/bin/sh style shell scripts in .exe files. To
// support windows systems, we copy the llvm-stub.exe executable from the
// build tree to the destination file.
+ std::string ErrMsg;
sys::Path llvmstub = FindExecutable("llvm-stub.exe", argv[0]);
if (llvmstub.isEmpty()) {
std::cerr << "Could not find llvm-stub.exe executable!\n";
exit(1);
}
- sys::CopyFile(sys::Path(OutputFilename), llvmstub);
+
+ if (0 != sys::CopyFile(sys::Path(OutputFilename), llvmstub, &ErrMsg)) {
+ std::cerr << argv[0] << ": " << ErrMsg << "\n";
+ exit(1);
+ }
+
return;
#endif