MCLinker upstream commit 0459e386785c.

Change-Id: Ide6790f5a354b7fcc03d812d6c8cf43b1e309ba3
diff --git a/include/mcld/LD/SectionData.h b/include/mcld/LD/SectionData.h
index 8666195..316d92f 100644
--- a/include/mcld/LD/SectionData.h
+++ b/include/mcld/LD/SectionData.h
@@ -16,10 +16,11 @@
 #include <llvm/ADT/ilist_node.h>
 #include <llvm/Support/DataTypes.h>
 
-#include <mcld/LD/Fragment.h>
+#include <mcld/Config/Config.h>
+#include <mcld/Support/Allocators.h>
+#include <mcld/Fragment/Fragment.h>
 
-namespace mcld
-{
+namespace mcld {
 
 class LDSection;
 
@@ -29,11 +30,20 @@
 class SectionData
 {
 private:
+  friend class Chunk<SectionData, MCLD_SECTIONS_PER_INPUT>;
+
+  SectionData();
+  explicit SectionData(LDSection &pSection);
+
   SectionData(const SectionData &);            // DO NOT IMPLEMENT
   SectionData& operator=(const SectionData &); // DO NOT IMPLEMENT
 
 public:
   typedef llvm::iplist<Fragment> FragmentListType;
+
+  typedef FragmentListType::reference reference;
+  typedef FragmentListType::const_reference const_reference;
+
   typedef FragmentListType::iterator iterator;
   typedef FragmentListType::const_iterator const_iterator;
 
@@ -41,36 +51,37 @@
   typedef FragmentListType::const_reverse_iterator const_reverse_iterator;
 
 public:
-  explicit SectionData(const LDSection &pSection);
+  static SectionData* Create(LDSection& pSection);
 
-  const LDSection &getSection() const { return *m_pSection; }
+  static void Destroy(SectionData*& pSection);
 
-  unsigned int getAlignment() const { return m_Alignment; }
-  void setAlignment(unsigned int pValue) { m_Alignment = pValue; }
+  const LDSection& getSection() const { return *m_pSection; }
+  LDSection&       getSection()       { return *m_pSection; }
 
   FragmentListType &getFragmentList() { return m_Fragments; }
   const FragmentListType &getFragmentList() const { return m_Fragments; }
 
-  iterator begin() { return m_Fragments.begin(); }
-  const_iterator begin() const { return m_Fragments.begin(); }
-
-  iterator end() { return m_Fragments.end(); }
-  const_iterator end() const { return m_Fragments.end(); }
-
-  reverse_iterator rbegin() { return m_Fragments.rbegin(); }
-  const_reverse_iterator rbegin() const { return m_Fragments.rbegin(); }
-
-  reverse_iterator rend() { return m_Fragments.rend(); }
-  const_reverse_iterator rend() const { return m_Fragments.rend(); }
-
   size_t size() const { return m_Fragments.size(); }
 
   bool empty() const { return m_Fragments.empty(); }
 
+  reference              front ()       { return m_Fragments.front();  }
+  const_reference        front () const { return m_Fragments.front();  }
+  reference              back  ()       { return m_Fragments.back();   }
+  const_reference        back  () const { return m_Fragments.back();   }
+
+  const_iterator         begin () const { return m_Fragments.begin();  }
+  iterator               begin ()       { return m_Fragments.begin();  }
+  const_iterator         end   () const { return m_Fragments.end();    }
+  iterator               end   ()       { return m_Fragments.end();    }
+  const_reverse_iterator rbegin() const { return m_Fragments.rbegin(); }
+  reverse_iterator       rbegin()       { return m_Fragments.rbegin(); }
+  const_reverse_iterator rend  () const { return m_Fragments.rend();   }
+  reverse_iterator       rend  ()       { return m_Fragments.rend();   }
+
 private:
   FragmentListType m_Fragments;
-  const LDSection* m_pSection;
-  unsigned int m_Alignment;
+  LDSection* m_pSection;
 
 };