diff options
Diffstat (limited to 'contrib/llvm/lib/System/Win32')
-rw-r--r-- | contrib/llvm/lib/System/Win32/Path.inc | 16 | ||||
-rw-r--r-- | contrib/llvm/lib/System/Win32/Signals.inc | 14 | ||||
-rw-r--r-- | contrib/llvm/lib/System/Win32/ThreadLocal.inc | 4 |
3 files changed, 28 insertions, 6 deletions
diff --git a/contrib/llvm/lib/System/Win32/Path.inc b/contrib/llvm/lib/System/Win32/Path.inc index 379527d..4a6dbd3 100644 --- a/contrib/llvm/lib/System/Win32/Path.inc +++ b/contrib/llvm/lib/System/Win32/Path.inc @@ -400,8 +400,10 @@ PathWithStatus::getFileStatus(bool update, std::string *ErrStr) const { for (unsigned i = 0; i < path.length(); ++i) status.uniqueID += path[i]; - __int64 ft = *reinterpret_cast<__int64*>(&fi.ftLastWriteTime); - status.modTime.fromWin32Time(ft); + ULARGE_INTEGER ui; + ui.LowPart = fi.ftLastWriteTime.dwLowDateTime; + ui.HighPart = fi.ftLastWriteTime.dwHighDateTime; + status.modTime.fromWin32Time(ui.QuadPart); status.isDir = fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; fsIsValid = true; @@ -720,7 +722,7 @@ Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const { bool Path::getMagicNumber(std::string& Magic, unsigned len) const { assert(len < 1024 && "Request for magic string too long"); - char* buf = (char*) alloca(1 + len); + char* buf = reinterpret_cast<char*>(alloca(len)); HANDLE h = CreateFile(path.c_str(), GENERIC_READ, @@ -739,8 +741,7 @@ bool Path::getMagicNumber(std::string& Magic, unsigned len) const { if (!ret || nRead != len) return false; - buf[len] = '\0'; - Magic = buf; + Magic = std::string(buf, len); return true; } @@ -777,8 +778,11 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrMsg) const { return MakeErrMsg(ErrMsg, path + ": GetFileInformationByHandle: "); } + ULARGE_INTEGER ui; + ui.QuadPart = si.modTime.toWin32Time(); FILETIME ft; - (uint64_t&)ft = si.modTime.toWin32Time(); + ft.dwLowDateTime = ui.LowPart; + ft.dwHighDateTime = ui.HighPart; BOOL ret = SetFileTime(h, NULL, &ft, &ft); DWORD err = GetLastError(); CloseHandle(h); diff --git a/contrib/llvm/lib/System/Win32/Signals.inc b/contrib/llvm/lib/System/Win32/Signals.inc index d6db71b..2498a26e 100644 --- a/contrib/llvm/lib/System/Win32/Signals.inc +++ b/contrib/llvm/lib/System/Win32/Signals.inc @@ -140,6 +140,20 @@ bool sys::RemoveFileOnSignal(const sys::Path &Filename, std::string* ErrMsg) { return false; } +// DontRemoveFileOnSignal - The public API +void sys::DontRemoveFileOnSignal(const sys::Path &Filename) { + if (FilesToRemove == NULL) + return; + + FilesToRemove->push_back(Filename); + std::vector<sys::Path>::reverse_iterator I = + std::find(FilesToRemove->rbegin(), FilesToRemove->rend(), Filename); + if (I != FilesToRemove->rend()) + FilesToRemove->erase(I.base()-1); + + LeaveCriticalSection(&CriticalSection); +} + /// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or /// SIGSEGV) is delivered to the process, print a stack trace and then exit. void sys::PrintStackTraceOnErrorSignal() { diff --git a/contrib/llvm/lib/System/Win32/ThreadLocal.inc b/contrib/llvm/lib/System/Win32/ThreadLocal.inc index c8f7840..b8b933c 100644 --- a/contrib/llvm/lib/System/Win32/ThreadLocal.inc +++ b/contrib/llvm/lib/System/Win32/ThreadLocal.inc @@ -46,4 +46,8 @@ void ThreadLocalImpl::setInstance(const void* d){ assert(errorcode != 0); } +void ThreadLocalImpl::removeInstance() { + setInstance(0); +} + } |