Archive members cannot be larger than 4GB. Return a uint32_t.
[oota-llvm.git] / include / llvm / Object / Archive.h
index 89b99b0d8f04449631e4b665437cef39ebb37351..05595572dde1c235ca8d8e0f679d1d579800d607 100644 (file)
@@ -33,13 +33,10 @@ struct ArchiveMemberHeader {
   /// Get the name without looking up long names.
   llvm::StringRef getName() const;
 
-  uint64_t getSize() const;
+  /// Members are not larger than 4GB.
+  uint32_t getSize() const;
 };
 
-static const ArchiveMemberHeader *ToHeader(const char *base) {
-  return reinterpret_cast<const ArchiveMemberHeader *>(base);
-}
-
 class Archive : public Binary {
   virtual void anchor();
 public:
@@ -50,11 +47,16 @@ public:
     /// \brief Offset from Data to the start of the file.
     uint16_t StartOfFile;
 
+    const ArchiveMemberHeader *getHeader() const {
+      return reinterpret_cast<const ArchiveMemberHeader *>(Data.data());
+    }
+
   public:
-    Child(const Archive *p, StringRef d);
+    Child(const Archive *Parent, const char *Start);
 
     bool operator ==(const Child &other) const {
-      return (Parent == other.Parent) && (Data.begin() == other.Data.begin());
+      assert(Parent == other.Parent);
+      return Data.begin() == other.Data.begin();
     }
 
     bool operator <(const Child &other) const {
@@ -64,7 +66,7 @@ public:
     Child getNext() const;
 
     error_code getName(StringRef &Result) const;
-    StringRef getRawName() const { return ToHeader(Data.data())->getName(); }
+    StringRef getRawName() const { return getHeader()->getName(); }
     /// \return the size of the archive member without the header or padding.
     uint64_t getSize() const { return Data.size() - StartOfFile; }
 
@@ -81,7 +83,7 @@ public:
   class child_iterator {
     Child child;
   public:
-    child_iterator() : child(Child(0, StringRef())) {}
+    child_iterator() : child(Child(0, 0)) {}
     child_iterator(const Child &c) : child(c) {}
     const Child* operator->() const {
       return &child;