Add SectionPosition and OrderPass

llvm-svn: 173300
diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
index 7d702c5..c17240e 100644
--- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
+++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
@@ -335,6 +335,16 @@
 };
 
 template <>
+struct ScalarEnumerationTraits<lld::DefinedAtom::SectionPosition> {
+  static void enumeration(IO &io, lld::DefinedAtom::SectionPosition &value) {
+    io.enumCase(value, "start",   lld::DefinedAtom::sectionPositionStart);
+    io.enumCase(value, "early",   lld::DefinedAtom::sectionPositionEarly);
+    io.enumCase(value, "any",     lld::DefinedAtom::sectionPositionAny);
+    io.enumCase(value, "end",     lld::DefinedAtom::sectionPositionEnd);
+  }
+};
+
+template <>
 struct ScalarEnumerationTraits<lld::DefinedAtom::Interposable> {
   static void enumeration(IO &io, lld::DefinedAtom::Interposable &value) {
     io.enumCase(value, "no",  lld::DefinedAtom::interposeNo);
@@ -451,10 +461,6 @@
                           lld::DefinedAtom::typeTLVInitialZeroFill);
     io.enumCase(value, "tlv-initializer-ptr", 
                           lld::DefinedAtom::typeTLVInitializerPtr);
-    io.enumCase(value, "first-in-section",    
-                          lld::DefinedAtom::typeFirstInSection);
-    io.enumCase(value, "last-in-section",     
-                          lld::DefinedAtom::typeLastInSection);
   }
 };
 
@@ -617,6 +623,14 @@
       return this;
     }
 
+    virtual void setOrdinalAndIncrement(uint64_t &ordinal) const {
+      _ordinal = ordinal++;
+      // Assign sequential ordinals to member files
+      for (const ArchMember &member : _members) {
+        member._content->setOrdinalAndIncrement(ordinal);
+      }
+    }
+    
     virtual const atom_collection<lld::DefinedAtom> &defined() const {
       return _noDefinedAtoms;
     }
@@ -824,6 +838,8 @@
     NormalizedAtom(IO &io)
       : _file(fileFromContext(io)), _name(), _refName(), 
         _alignment(0), _content(), _references() {
+      static uint32_t ordinalCounter = 1;
+      _ordinal = ordinalCounter++;
     }
     NormalizedAtom(IO &io, const lld::DefinedAtom *atom)
       : _file(fileFromContext(io)),
@@ -835,6 +851,7 @@
         _contentType(atom->contentType()),
         _alignment(atom->alignment()),
         _sectionChoice(atom->sectionChoice()),
+        _sectionPosition(atom->sectionPosition()),
         _deadStrip(atom->deadStrip()),
         _permissions(atom->permissions()),
         _size(atom->size()),
@@ -882,6 +899,7 @@
     virtual Alignment          alignment() const     { return _alignment; }
     virtual SectionChoice      sectionChoice() const { return _sectionChoice; }
     virtual StringRef          customSectionName() const { return _sectionName;}
+    virtual SectionPosition    sectionPosition() const{return _sectionPosition;}
     virtual DeadStripKind      deadStrip() const     { return _deadStrip;  }
     virtual ContentPermissions permissions() const   { return _permissions; }
     virtual bool               isThumb() const       { return false; }
@@ -891,7 +909,7 @@
         reinterpret_cast<const uint8_t *>(_content.data()), _content.size());
     }
 
-    virtual uint64_t           ordinal() const       { return 0; }
+    virtual uint64_t           ordinal() const       { return _ordinal; }
     
     reference_iterator begin() const { 
       uintptr_t index = 0;
@@ -923,8 +941,10 @@
     ContentType               _contentType;
     Alignment                 _alignment;
     SectionChoice             _sectionChoice;
+    SectionPosition           _sectionPosition;
     DeadStripKind             _deadStrip;
     ContentPermissions        _permissions;
+    uint32_t                  _ordinal;
     std::vector<ImplicitHex8> _content;
     uint64_t                  _size;
     StringRef                 _sectionName;
@@ -968,6 +988,8 @@
                                         lld::DefinedAtom::sectionBasedOnContent);
     io.mapOptional("section-name",   keys->_sectionName,   
                                         StringRef());
+    io.mapOptional("section-position",keys->_sectionPosition,   
+                                        lld::DefinedAtom::sectionPositionAny);
     io.mapOptional("dead-strip",     keys->_deadStrip,     
                                         lld::DefinedAtom::deadStripNormal);
     // default permissions based on content type
@@ -1038,6 +1060,7 @@
 };
 
 
+
 // YAML conversion for const lld::SharedLibraryAtom*
 template <>
 struct MappingTraits<const lld::SharedLibraryAtom*> {