<rdar://problem/10507811>
Be better at detecting when DWARF changes and handle this more
gracefully than asserting and exiting.
Also fixed up a bunch of system calls that weren't properly checking
for EINTR.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@147559 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Host/common/FileSpec.cpp b/source/Host/common/FileSpec.cpp
index b6e6e94..1f0942d 100644
--- a/source/Host/common/FileSpec.cpp
+++ b/source/Host/common/FileSpec.cpp
@@ -24,6 +24,7 @@
#include "llvm/Support/Path.h"
#include "llvm/Support/Program.h"
+#include "lldb/Host/File.h"
#include "lldb/Host/FileSpec.h"
#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/DataBufferMemoryMap.h"
@@ -776,29 +777,15 @@
char resolved_path[PATH_MAX];
if (GetPath(resolved_path, sizeof(resolved_path)))
{
- int fd = ::open (resolved_path, O_RDONLY, 0);
- if (fd != -1)
+ Error error;
+ File file;
+ error = file.Open(resolved_path, File::eOpenOptionRead);
+ if (error.Success())
{
- struct stat file_stats;
- if (::fstat (fd, &file_stats) == 0)
- {
- // Read bytes directly into our basic_string buffer
- if (file_stats.st_size > 0)
- {
- off_t lseek_result = 0;
- if (file_offset > 0)
- lseek_result = ::lseek (fd, file_offset, SEEK_SET);
-
- if (lseek_result == file_offset)
- {
- ssize_t n = ::read (fd, dst, dst_len);
- if (n >= 0)
- bytes_read = n;
- }
- }
- }
+ off_t file_offset_after_seek = file_offset;
+ bytes_read = dst_len;
+ error = file.Read(dst, bytes_read, file_offset_after_seek);
}
- close(fd);
}
return bytes_read;
}
@@ -821,49 +808,11 @@
char resolved_path[PATH_MAX];
if (GetPath(resolved_path, sizeof(resolved_path)))
{
- int fd = ::open (resolved_path, O_RDONLY, 0);
- if (fd != -1)
- {
- struct stat file_stats;
- if (::fstat (fd, &file_stats) == 0)
- {
- if (file_stats.st_size > 0)
- {
- off_t lseek_result = 0;
- if (file_offset > 0)
- lseek_result = ::lseek (fd, file_offset, SEEK_SET);
-
- if (lseek_result < 0)
- {
- // Get error from errno
- }
- else if (lseek_result == file_offset)
- {
- const size_t bytes_left = file_stats.st_size - file_offset;
- size_t num_bytes_to_read = file_size;
- if (num_bytes_to_read > bytes_left)
- num_bytes_to_read = bytes_left;
-
- std::auto_ptr<DataBufferHeap> data_heap_ap;
- data_heap_ap.reset(new DataBufferHeap(num_bytes_to_read, '\0'));
-
- if (data_heap_ap.get())
- {
- ssize_t bytesRead = ::read (fd, (void *)data_heap_ap->GetBytes(), data_heap_ap->GetByteSize());
- if (bytesRead >= 0)
- {
- // Make sure we read exactly what we asked for and if we got
- // less, adjust the array
- if ((size_t)bytesRead < data_heap_ap->GetByteSize())
- data_heap_ap->SetByteSize(bytesRead);
- data_sp.reset(data_heap_ap.release());
- }
- }
- }
- }
- }
- }
- close(fd);
+ Error error;
+ File file;
+ error = file.Open(resolved_path, File::eOpenOptionRead);
+ if (error.Success())
+ error = file.Read (file_size, file_offset, data_sp);
}
return data_sp;
}