<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;
 }