diff options
author | Greg Clayton <gclayton@apple.com> | 2012-01-04 22:56:43 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2012-01-04 22:56:43 +0000 |
commit | 96c09687bce5e2dfb6f81eca705515a106d1c1a3 (patch) | |
tree | eef2f707fe4a5284c16a7ea6d1c66dcaa413cd84 /lldb/source/Host/common/FileSpec.cpp | |
parent | 3ad904245686d7aeef7d2770e938146d2d97255a (diff) | |
download | bcm5719-llvm-96c09687bce5e2dfb6f81eca705515a106d1c1a3.tar.gz bcm5719-llvm-96c09687bce5e2dfb6f81eca705515a106d1c1a3.zip |
<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.
llvm-svn: 147559
Diffstat (limited to 'lldb/source/Host/common/FileSpec.cpp')
-rw-r--r-- | lldb/source/Host/common/FileSpec.cpp | 77 |
1 files changed, 13 insertions, 64 deletions
diff --git a/lldb/source/Host/common/FileSpec.cpp b/lldb/source/Host/common/FileSpec.cpp index b6e6e94d846..1f0942d5bb5 100644 --- a/lldb/source/Host/common/FileSpec.cpp +++ b/lldb/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 @@ FileSpec::ReadFileContents (off_t file_offset, void *dst, size_t dst_len) const 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 @@ FileSpec::ReadFileContents (off_t file_offset, size_t file_size) const 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; } |