Support more Atom attributes.  Add more test cases to lld-core

llvm-svn: 147571
diff --git a/lld/lib/Core/YamlWriter.cpp b/lld/lib/Core/YamlWriter.cpp
index e571106..8efb94c 100644
--- a/lld/lib/Core/YamlWriter.cpp
+++ b/lld/lib/Core/YamlWriter.cpp
@@ -7,6 +7,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "YamlKeyValues.h"
+
 #include "lld/Core/YamlWriter.h"
 #include "lld/Core/Atom.h"
 #include "lld/Core/File.h"
@@ -24,26 +26,121 @@
 
 class Handler : public File::AtomHandler {
 public:
-  Handler(llvm::raw_ostream &out) : _out(out) { }
+  Handler(llvm::raw_ostream &out) : _out(out), _firstAtom(true) { }
 
-  virtual void doFile(const class File &) { }
+  virtual void doFile(const class File &) { _firstAtom = true; }
+  
   virtual void doAtom(const class Atom &atom) {
-    _out << "    - name:             " << atom.name() << "\n";
+      // add blank line between atoms for readability
+      if ( !_firstAtom )
+        _out << "\n";
+      _firstAtom = false;
+        
+      _out  << "    - "
+            << KeyValues::nameKeyword
+            << ":"
+            << spacePadding(KeyValues::nameKeyword)
+            << atom.name() 
+            << "\n";
     
-    if ( atom.internalName() )
-      _out << "      internal-name:     true\n";
-      
-    if ( atom.definition() != Atom::definitionRegular )
-      _out << "      definition:       " << definitionString(atom.definition()) <<"\n";
-      
-    if ( atom.scope() != Atom::scopeTranslationUnit )
-      _out << "      scope:            " << scopeString(atom.scope()) << "\n";
-      
-    _out << "      type:             " << typeString(atom.contentType()) << "\n";
+    if ( atom.internalName() != KeyValues::internalNameDefault ) {
+      _out  << "      " 
+            << KeyValues::internalNameKeyword 
+            << ":"
+            << spacePadding(KeyValues::internalNameKeyword)
+            << KeyValues::internalName(atom.internalName()) 
+            << "\n";
+    }
     
-    if ( atom.mergeDuplicates() )
-      _out << "      merge-duplicates: true\n";
-      
+    if ( atom.definition() != KeyValues::definitionDefault ) {
+      _out  << "      " 
+            << KeyValues::definitionKeyword 
+            << ":"
+            << spacePadding(KeyValues::definitionKeyword)
+            << KeyValues::definition(atom.definition()) 
+            << "\n";
+    }
+    
+    if ( atom.scope() != KeyValues::scopeDefault ) {
+      _out  << "      " 
+            << KeyValues::scopeKeyword 
+            << ":"
+            << spacePadding(KeyValues::scopeKeyword)
+            << KeyValues::scope(atom.scope()) 
+            << "\n";
+    }
+    
+    if ( atom.contentType() != KeyValues::contentTypeDefault ) {
+      _out  << "      " 
+            << KeyValues::contentTypeKeyword 
+            << ":"
+            << spacePadding(KeyValues::contentTypeKeyword)
+            << KeyValues::contentType(atom.contentType()) 
+            << "\n";
+    }
+
+    if ( atom.deadStrip() != KeyValues::deadStripKindDefault ) {
+      _out  << "      " 
+            << KeyValues::deadStripKindKeyword 
+            << ":"
+            << spacePadding(KeyValues::deadStripKindKeyword)
+            << KeyValues::deadStripKind(atom.deadStrip()) 
+            << "\n";
+    }
+
+    if ( atom.sectionChoice() != KeyValues::sectionChoiceDefault ) {
+      _out  << "      " 
+            << KeyValues::sectionChoiceKeyword 
+            << ":"
+            << spacePadding(KeyValues::sectionChoiceKeyword)
+            << KeyValues::sectionChoice(atom.sectionChoice()) 
+            << "\n";
+      assert( ! atom.customSectionName().empty() );
+      _out  << "      " 
+            << KeyValues::sectionNameKeyword 
+            << ":"
+            << spacePadding(KeyValues::sectionNameKeyword)
+            << atom.customSectionName()
+            << "\n";
+    }
+
+    if ( atom.mergeDuplicates() != KeyValues::mergeDuplicatesDefault ) {
+      _out  << "      " 
+            << KeyValues::mergeDuplicatesKeyword 
+            << ":"
+            << spacePadding(KeyValues::mergeDuplicatesKeyword)
+            << KeyValues::mergeDuplicates(atom.mergeDuplicates()) 
+            << "\n";
+    }
+
+    if ( atom.autoHide() != KeyValues::autoHideDefault ) {
+      _out  << "      " 
+            << KeyValues::autoHideKeyword 
+            << ":"
+            << spacePadding(KeyValues::autoHideKeyword)
+            << KeyValues::autoHide(atom.autoHide()) 
+            << "\n";
+    }
+
+    if ( atom.isThumb() != KeyValues::isThumbDefault ) {
+      _out  << "      " 
+            << KeyValues::isThumbKeyword 
+            << ":"
+            << spacePadding(KeyValues::isThumbKeyword)
+            << KeyValues::isThumb(atom.isThumb()) 
+            << "\n";
+    }
+
+    if ( atom.isAlias() != KeyValues::isAliasDefault ) {
+      _out  << "      " 
+            << KeyValues::isAliasKeyword 
+            << ":"
+            << spacePadding(KeyValues::isAliasKeyword)
+            << KeyValues::isAlias(atom.isAlias()) 
+            << "\n";
+    }
+
+     
     if (atom.referencesBegin() != atom.referencesEnd()) {
       _out << "      fixups:\n";
       for (Reference::iterator it = atom.referencesBegin(),
@@ -56,49 +153,17 @@
   }
 
 private:
-  const char *scopeString(Atom::Scope scope) {
-    switch (scope) {
-    case Atom::scopeTranslationUnit:
-      return "static";
-    case Atom::scopeLinkageUnit:
-      return "hidden";
-    case Atom::scopeGlobal:
-      return "global";
-    }
-    return "???";
+  // return a string of the correct number of spaces to align value
+  const char* spacePadding(const char* key) {
+    const char* spaces = "                  ";
+    assert(strlen(spaces) > strlen(key));
+    return &spaces[strlen(key)];
   }
 
-  const char *typeString(Atom::ContentType type) {
-    switch (type) {
-    case Atom::typeCode:
-      return "code";
-    case Atom::typeCString:
-      return "c-string";
-    case Atom::typeZeroFill:
-      return "zero-fill";
-    case Atom::typeData:
-      return "data";
-    default:
-      return "???";
-    }
-  }
 
-  const char *definitionString(Atom::Definition def) {
-    switch (def) {
-    case Atom::definitionRegular:
-      return "regular";
-    case Atom::definitionWeak:
-      return "weak";
-    case Atom::definitionTentative:
-      return "tentative";
-    case Atom::definitionAbsolute:
-      return "absolute";
-    default:
-      return "???";
-    }
-  }
 
-  llvm::raw_ostream &_out;
+  llvm::raw_ostream&  _out;
+  bool                _firstAtom;
 };
 
 void writeObjectText(File &file, llvm::raw_ostream &out) {