<rdar://problem/13069948>

Major fixed to allow reading files that are over 4GB. The main problems were that the DataExtractor was using 32 bit offsets as a data cursor, and since we mmap all of our object files we could run into cases where if we had a very large core file that was over 4GB, we were running into the 4GB boundary.

So I defined a new "lldb::offset_t" which should be used for all file offsets.

After making this change, I enabled warnings for data loss and for enexpected implicit conversions temporarily and found a ton of things that I fixed.

Any functions that take an index internally, should use "size_t" for any indexes and also should return "size_t" for any sizes of collections.

llvm-svn: 173463
diff --git a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
index 97aed1a..d61a88b 100644
--- a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
+++ b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp
@@ -49,8 +49,8 @@
     ar_file_size = 0;
 }
 
-uint32_t
-ObjectContainerBSDArchive::Object::Extract (const DataExtractor& data, uint32_t offset)
+lldb::offset_t
+ObjectContainerBSDArchive::Object::Extract (const DataExtractor& data, lldb::offset_t offset)
 {
     size_t ar_name_len = 0;
     std::string str;
@@ -98,7 +98,7 @@
         ar_file_size = ar_size - ar_name_len;
         return offset;
     }
-    return LLDB_INVALID_INDEX32;
+    return LLDB_INVALID_OFFSET;
 }
 
 ObjectContainerBSDArchive::Archive::Archive
@@ -120,7 +120,7 @@
 ObjectContainerBSDArchive::Archive::ParseObjects (DataExtractor &data)
 {
     std::string str;
-    uint32_t offset = 0;
+    lldb::offset_t offset = 0;
     str.assign((const char *)data.GetData(&offset, SARMAG), SARMAG);
     if (str == ARMAG)
     {
@@ -128,9 +128,9 @@
         do
         {
             offset = obj.Extract (data, offset);
-            if (offset == LLDB_INVALID_INDEX32)
+            if (offset == LLDB_INVALID_OFFSET)
                 break;
-            uint32_t obj_idx = m_objects.size();
+            size_t obj_idx = m_objects.size();
             m_objects.push_back(obj);
             // Insert all of the C strings out of order for now...
             m_object_name_to_index_map.Append (obj.ar_name.GetCString(), obj_idx);
@@ -147,7 +147,7 @@
 ObjectContainerBSDArchive::Object *
 ObjectContainerBSDArchive::Archive::FindObject (const ConstString &object_name)
 {
-    const UniqueCStringMap<uint32_t>::Entry *match = m_object_name_to_index_map.FindFirstValueForName (object_name.GetCString());
+    const ObjectNameToIndexMap::Entry *match = m_object_name_to_index_map.FindFirstValueForName (object_name.GetCString());
     if (match)
         return &m_objects[match->value];
     return NULL;
diff --git a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
index ce245b1..22779a1 100644
--- a/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
+++ b/lldb/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
@@ -97,8 +97,8 @@
         void
         Clear();
 
-        uint32_t
-        Extract (const lldb_private::DataExtractor& data, uint32_t offset);
+        lldb::offset_t
+        Extract (const lldb_private::DataExtractor& data, lldb::offset_t offset);
 
         lldb_private::ConstString       ar_name;        // name
         uint32_t        ar_date;        // modification time
@@ -106,8 +106,8 @@
         uint16_t        ar_gid;         // group id
         uint16_t        ar_mode;        // octal file permissions
         uint32_t        ar_size;        // size in bytes
-        uint32_t        ar_file_offset; // file offset in bytes from the beginning of the file of the object data
-        uint32_t        ar_file_size;   // length of the object data
+        lldb::offset_t  ar_file_offset; // file offset in bytes from the beginning of the file of the object data
+        lldb::offset_t  ar_file_size;   // length of the object data
 
         typedef std::vector<Object>         collection;
         typedef collection::iterator        iterator;
@@ -170,14 +170,14 @@
         HasNoExternalReferences() const;
 
     protected:
-
+        typedef lldb_private::UniqueCStringMap<uint32_t> ObjectNameToIndexMap;
         //----------------------------------------------------------------------
         // Member Variables
         //----------------------------------------------------------------------
         lldb_private::ArchSpec m_arch;
         lldb_private::TimeValue m_time;
         Object::collection m_objects;
-        lldb_private::UniqueCStringMap<uint32_t> m_object_name_to_index_map;
+        ObjectNameToIndexMap m_object_name_to_index_map;
     };
 
     void
diff --git a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp
index 2241bc7..5641c26 100644
--- a/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp
+++ b/lldb/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp
@@ -75,7 +75,7 @@
 bool
 ObjectContainerUniversalMachO::MagicBytesMatch (const DataExtractor &data)
 {
-    uint32_t offset = 0;
+    lldb::offset_t offset = 0;
     uint32_t magic = data.GetU32(&offset);
     return magic == UniversalMagic || magic == UniversalMagicSwapped;
 }
@@ -105,7 +105,7 @@
 {
     // Store the file offset for this universal file as we could have a universal .o file
     // in a BSD archive, or be contained in another kind of object.
-    uint32_t offset = 0;
+    lldb::offset_t offset = 0;
     // Universal mach-o files always have their headers in big endian.
     m_data.SetByteOrder (eByteOrderBig);
     m_header.magic = m_data.GetU32(&offset);