[llvm-commits] [lld] r155847 - in /lld/trunk: include/lld/Core/YamlReader.h lib/Core/YamlKeyValues.cpp lib/Core/YamlKeyValues.h lib/Core/YamlReader.cpp test/archive-basic.objtxt test/archive-chain.objtxt test/archive-tentdef-search.objtxt tools/l

Michael Spencer bigcheesegs at gmail.com
Mon Apr 30 22:47:57 PDT 2012


On Mon, Apr 30, 2012 at 4:39 PM, Nick Kledzik <kledzik at apple.com> wrote:
> On MacOSX, I now get a error linking lld.  The issue is that llvm builds with the default (gnu) C++ library, whereas lld uses the (clang) C++ library.   The CMakefiles for lld automatically use -stdlib=libc++ whereas llvm does not.
>
> I can get llvm to build with clang via -DCMAKE_C_COMPILER, but how do I get llvm to compile use libc++?
>
> -Nick

-DCMAKE_CXX_FLAGS=-stdlib=libc++

- Michael Spencer

> On Apr 30, 2012, at 2:20 PM, Michael J. Spencer wrote:
>> Author: mspencer
>> Date: Mon Apr 30 16:20:13 2012
>> New Revision: 155847
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=155847&view=rev
>> Log:
>> Convert the YAMLReader to use LLVM/Support/YAMLParser.
>>
>> Modified:
>>    lld/trunk/include/lld/Core/YamlReader.h
>>    lld/trunk/lib/Core/YamlKeyValues.cpp
>>    lld/trunk/lib/Core/YamlKeyValues.h
>>    lld/trunk/lib/Core/YamlReader.cpp
>>    lld/trunk/test/archive-basic.objtxt
>>    lld/trunk/test/archive-chain.objtxt
>>    lld/trunk/test/archive-tentdef-search.objtxt
>>    lld/trunk/tools/lld-core/lld-core.cpp
>>
>> Modified: lld/trunk/include/lld/Core/YamlReader.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/YamlReader.h?rev=155847&r1=155846&r2=155847&view=diff
>> ==============================================================================
>> --- lld/trunk/include/lld/Core/YamlReader.h (original)
>> +++ lld/trunk/include/lld/Core/YamlReader.h Mon Apr 30 16:20:13 2012
>> @@ -14,6 +14,7 @@
>>
>> #include "llvm/Support/system_error.h"
>>
>> +#include <memory>
>> #include <vector>
>>
>> namespace llvm {
>> @@ -33,14 +34,15 @@
>>   /// the specified vector<File*>.
>>   error_code parseObjectTextFileOrSTDIN( StringRef path
>>                                        , Platform&
>> -                                       , std::vector<const File *>&);
>> +                                       , std::vector<
>> +                                           std::unique_ptr<const File>>&);
>>
>>
>>   /// parseObjectText - Parse the specified YAML formatted MemoryBuffer
>>   /// into lld::File object(s) and append each to the specified vector<File*>.
>>   error_code parseObjectText( llvm::MemoryBuffer *mb
>>                             , Platform&
>> -                            , std::vector<const File *>&);
>> +                            , std::vector<std::unique_ptr<const File>>&);
>>
>> } // namespace yaml
>> } // namespace lld
>>
>> Modified: lld/trunk/lib/Core/YamlKeyValues.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/YamlKeyValues.cpp?rev=155847&r1=155846&r2=155847&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/Core/YamlKeyValues.cpp (original)
>> +++ lld/trunk/lib/Core/YamlKeyValues.cpp Mon Apr 30 16:20:13 2012
>> @@ -73,9 +73,9 @@
>>   { nullptr,          File::kindObject }
>> };
>>
>> - File::Kind KeyValues::fileKind(const char* str) {
>> + File::Kind KeyValues::fileKind(StringRef str) {
>>   for (const FileKindMapping* p = fileKindMappings; p->string != nullptr; ++p) {
>> -    if ( strcmp(p->string, str) == 0 )
>> +    if (str == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad file kind value");
>> @@ -103,10 +103,10 @@
>>   { nullptr,          Atom::definitionRegular }
>> };
>>
>> -Atom::Definition KeyValues::definition(const char* s)
>> +Atom::Definition KeyValues::definition(StringRef s)
>> {
>>   for (const DefinitionMapping* p = defMappings; p->string != nullptr; ++p) {
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad definition value");
>> @@ -136,10 +136,10 @@
>>   { nullptr,  DefinedAtom::scopeGlobal }
>> };
>>
>> -DefinedAtom::Scope KeyValues::scope(const char* s)
>> +DefinedAtom::Scope KeyValues::scope(StringRef s)
>> {
>>   for (const ScopeMapping* p = scopeMappings; p->string != nullptr; ++p) {
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad scope value");
>> @@ -197,10 +197,10 @@
>>   { nullptr,          DefinedAtom::typeUnknown }
>> };
>>
>> -DefinedAtom::ContentType KeyValues::contentType(const char* s)
>> +DefinedAtom::ContentType KeyValues::contentType(StringRef s)
>> {
>>   for (const ContentTypeMapping* p = typeMappings; p->string != nullptr; ++p) {
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad content type value");
>> @@ -232,11 +232,11 @@
>>   { nullptr,          DefinedAtom::deadStripNormal }
>> };
>>
>> -DefinedAtom::DeadStripKind KeyValues::deadStripKind(const char* s)
>> +DefinedAtom::DeadStripKind KeyValues::deadStripKind(StringRef s)
>> {
>>   for (const DeadStripMapping* p = deadStripMappings; p->string != nullptr; ++p)
>>   {
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad dead strip value");
>> @@ -267,10 +267,10 @@
>>   { nullptr,        DefinedAtom::interposeNo }
>> };
>>
>> -DefinedAtom::Interposable KeyValues::interposable(const char* s)
>> +DefinedAtom::Interposable KeyValues::interposable(StringRef s)
>> {
>>   for (const InterposableMapping* p = interMappings; p->string != nullptr; ++p){
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad interposable value");
>> @@ -302,10 +302,10 @@
>>   { nullptr,          DefinedAtom::mergeNo }
>> };
>>
>> -DefinedAtom::Merge KeyValues::merge(const char* s)
>> +DefinedAtom::Merge KeyValues::merge(StringRef s)
>> {
>>   for (const MergeMapping* p = mergeMappings; p->string != nullptr; ++p) {
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad merge value");
>> @@ -336,10 +336,10 @@
>>   { nullptr,           DefinedAtom::sectionBasedOnContent }
>> };
>>
>> -DefinedAtom::SectionChoice KeyValues::sectionChoice(const char* s)
>> +DefinedAtom::SectionChoice KeyValues::sectionChoice(StringRef s)
>> {
>>   for (const SectionChoiceMapping* p = sectMappings; p->string != nullptr; ++p){
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad dead strip value");
>> @@ -373,10 +373,10 @@
>>   { nullptr,           DefinedAtom::perm___ }
>> };
>>
>> -DefinedAtom::ContentPermissions KeyValues::permissions(const char* s)
>> +DefinedAtom::ContentPermissions KeyValues::permissions(StringRef s)
>> {
>>   for (const PermissionsMapping* p = permMappings; p->string != nullptr; ++p) {
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad permissions value");
>> @@ -390,37 +390,10 @@
>>   llvm::report_fatal_error("bad permissions value");
>> }
>>
>> -
>> -
>> -
>> -
>> -
>> -
>> -bool KeyValues::isThumb(const char* s)
>> -{
>> -  if ( strcmp(s, "true") == 0 )
>> -    return true;
>> -  else if ( strcmp(s, "false") == 0 )
>> -    return false;
>> -  llvm::report_fatal_error("bad is-thumb value");
>> -}
>> -
>> const char* KeyValues::isThumb(bool b) {
>>   return b ? "true" : "false";
>> }
>>
>> -
>> -
>> -
>> -bool KeyValues::isAlias(const char* s)
>> -{
>> -  if ( strcmp(s, "true") == 0 )
>> -    return true;
>> -  else if ( strcmp(s, "false") == 0 )
>> -    return false;
>> -  llvm::report_fatal_error("bad is-alias value");
>> -}
>> -
>> const char* KeyValues::isAlias(bool b) {
>>   return b ? "true" : "false";
>> }
>> @@ -441,10 +414,10 @@
>> };
>>
>>
>> -UndefinedAtom::CanBeNull KeyValues::canBeNull(const char* s)
>> +UndefinedAtom::CanBeNull KeyValues::canBeNull(StringRef s)
>> {
>>   for (const CanBeNullMapping* p = cbnMappings; p->string != nullptr; ++p) {
>> -    if ( strcmp(p->string, s) == 0 )
>> +    if (s == p->string)
>>       return p->value;
>>   }
>>   llvm::report_fatal_error("bad can-be-null value");
>>
>> Modified: lld/trunk/lib/Core/YamlKeyValues.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/YamlKeyValues.h?rev=155847&r1=155846&r2=155847&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/Core/YamlKeyValues.h (original)
>> +++ lld/trunk/lib/Core/YamlKeyValues.h Mon Apr 30 16:20:13 2012
>> @@ -15,7 +15,6 @@
>> #include "lld/Core/UndefinedAtom.h"
>> #include "lld/Core/File.h"
>>
>> -
>> namespace lld {
>> namespace yaml {
>>
>> @@ -34,62 +33,60 @@
>>
>>   static const char* const                fileKindKeyword;
>>   static const File::Kind                 fileKindDefault;
>> -  static File::Kind                       fileKind(const char*);
>> +  static File::Kind                       fileKind(StringRef);
>>   static const char*                      fileKind(File::Kind);
>>
>>   static const char* const                definitionKeyword;
>>   static const Atom::Definition           definitionDefault;
>> -  static Atom::Definition                 definition(const char*);
>> +  static Atom::Definition                 definition(StringRef);
>>   static const char*                      definition(Atom::Definition);
>>
>>   static const char* const                scopeKeyword;
>>   static const DefinedAtom::Scope         scopeDefault;
>> -  static DefinedAtom::Scope               scope(const char*);
>> +  static DefinedAtom::Scope               scope(StringRef);
>>   static const char*                      scope(DefinedAtom::Scope);
>>
>>   static const char* const                contentTypeKeyword;
>>   static const DefinedAtom::ContentType   contentTypeDefault;
>> -  static DefinedAtom::ContentType         contentType(const char*);
>> +  static DefinedAtom::ContentType         contentType(StringRef);
>>   static const char*                      contentType(DefinedAtom::ContentType);
>>
>>   static const char* const                deadStripKindKeyword;
>>   static const DefinedAtom::DeadStripKind deadStripKindDefault;
>> -  static DefinedAtom::DeadStripKind       deadStripKind(const char*);
>> +  static DefinedAtom::DeadStripKind       deadStripKind(StringRef);
>>   static const char*                      deadStripKind(DefinedAtom::DeadStripKind);
>>
>>   static const char* const                sectionChoiceKeyword;
>>   static const DefinedAtom::SectionChoice sectionChoiceDefault;
>> -  static DefinedAtom::SectionChoice       sectionChoice(const char*);
>> +  static DefinedAtom::SectionChoice       sectionChoice(StringRef);
>>   static const char*                      sectionChoice(DefinedAtom::SectionChoice);
>>
>>   static const char* const                interposableKeyword;
>>   static const DefinedAtom::Interposable  interposableDefault;
>> -  static DefinedAtom::Interposable        interposable(const char*);
>> +  static DefinedAtom::Interposable        interposable(StringRef);
>>   static const char*                      interposable(DefinedAtom::Interposable);
>>
>>   static const char* const                mergeKeyword;
>>   static const DefinedAtom::Merge         mergeDefault;
>> -  static DefinedAtom::Merge               merge(const char*);
>> +  static DefinedAtom::Merge               merge(StringRef);
>>   static const char*                      merge(DefinedAtom::Merge);
>>
>>   static const char* const                      permissionsKeyword;
>>   static const DefinedAtom::ContentPermissions  permissionsDefault;
>> -  static DefinedAtom::ContentPermissions        permissions(const char*);
>> +  static DefinedAtom::ContentPermissions        permissions(StringRef);
>>   static const char*                            permissions(DefinedAtom::ContentPermissions);
>>
>>   static const char* const                isThumbKeyword;
>>   static const bool                       isThumbDefault;
>> -  static bool                             isThumb(const char*);
>>   static const char*                      isThumb(bool);
>>
>>   static const char* const                isAliasKeyword;
>>   static const bool                       isAliasDefault;
>> -  static bool                             isAlias(const char*);
>>   static const char*                      isAlias(bool);
>>
>>   static const char* const                canBeNullKeyword;
>>   static const UndefinedAtom::CanBeNull   canBeNullDefault;
>> -  static UndefinedAtom::CanBeNull         canBeNull(const char*);
>> +  static UndefinedAtom::CanBeNull         canBeNull(StringRef);
>>   static const char*                      canBeNull(UndefinedAtom::CanBeNull);
>>
>>
>> @@ -104,4 +101,3 @@
>> } // namespace lld
>>
>> #endif // LLD_CORE_YAML_KEY_VALUES_H_
>> -
>>
>> Modified: lld/trunk/lib/Core/YamlReader.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/YamlReader.cpp?rev=155847&r1=155846&r2=155847&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/Core/YamlReader.cpp (original)
>> +++ lld/trunk/lib/Core/YamlReader.cpp Mon Apr 30 16:20:13 2012
>> @@ -24,244 +24,54 @@
>> #include "llvm/ADT/ArrayRef.h"
>> #include "llvm/ADT/OwningPtr.h"
>> #include "llvm/ADT/StringRef.h"
>> +#include "llvm/ADT/Twine.h"
>> #include "llvm/Support/DataTypes.h"
>> #include "llvm/Support/ErrorHandling.h"
>> #include "llvm/Support/MemoryBuffer.h"
>> +#include "llvm/Support/SourceMgr.h"
>> #include "llvm/Support/system_error.h"
>> +#include "llvm/Support/YAMLParser.h"
>>
>> #include <cstring>
>> -#include <vector>
>> #include <set>
>> +#include <type_traits>
>> +#include <vector>
>>
>> +using namespace lld;
>>
>> +static bool getAs(const llvm::yaml::ScalarNode *SN, bool &Result) {
>> +  SmallString<4> Storage;
>> +  StringRef Value = SN->getValue(Storage);
>> +  if (Value == "true")
>> +    Result = true;
>> +  else if (Value == "false")
>> +    Result = false;
>> +  else
>> +    return false;
>> +  return true;
>> +}
>> +
>> +template<class T>
>> +typename std::enable_if<std::numeric_limits<T>::is_integer, bool>::type
>> +getAs(const llvm::yaml::ScalarNode *SN, T &Result) {
>> +  SmallString<4> Storage;
>> +  StringRef Value = SN->getValue(Storage);
>> +  if (Value.getAsInteger(0, Result))
>> +    return false;
>> +  return true;
>> +}
>>
>> namespace lld {
>> namespace yaml {
>>
>> -namespace {
>> -
>> -class YAML {
>> -public:
>> -  struct Entry {
>> -    Entry(const char *k, const char *v, std::vector<uint8_t>* vs,
>> -          int d, bool bd, bool bs)
>> -      : key(strdup(k))
>> -      , value(v ? strdup(v) : nullptr)
>> -      , valueSequenceBytes(vs)
>> -      , depth(d)
>> -      , beginSequence(bs)
>> -      , beginDocument(bd) {}
>> -
>> -    const char *          key;
>> -    const char *          value;
>> -    std::vector<uint8_t>* valueSequenceBytes;
>> -    int                   depth;
>> -    bool                  beginSequence;
>> -    bool                  beginDocument;
>> -  };
>> -
>> -  static void parse(llvm::MemoryBuffer *mb, std::vector<const Entry *>&);
>> -
>> -private:
>> -  enum State {
>> -    start,
>> -    inHeaderComment,
>> -    inTripleDash,
>> -    inTriplePeriod,
>> -    inDocument,
>> -    inKey,
>> -    inSpaceBeforeValue,
>> -    inValue,
>> -    inValueSequence,
>> -    inValueSequenceEnd
>> -  };
>> -};
>> -
>> -
>> -void YAML::parse(llvm::MemoryBuffer *mb, std::vector<const Entry *> &entries) {
>> -  State state = start;
>> -  char key[64];
>> -  char value[64];
>> -  char *p = nullptr;
>> -  unsigned int lineNumber = 1;
>> -  int depth = 0;
>> -  bool nextKeyIsStartOfDocument = false;
>> -  bool nextKeyIsStartOfSequence = false;
>> -  std::vector<uint8_t>* sequenceBytes = nullptr;
>> -  unsigned contentByte = 0;
>> -  for (const char *s = mb->getBufferStart(); s < mb->getBufferEnd(); ++s) {
>> -    char c = *s;
>> -    if (c == '\n')
>> -      ++lineNumber;
>> -    switch (state) {
>> -    case start:
>> -      if (c == '#')
>> -        state = inHeaderComment;
>> -      else if (c == '-') {
>> -        p = &key[0];
>> -        *p++ = c;
>> -        state = inTripleDash;
>> -      }
>> -      break;
>> -    case inHeaderComment:
>> -      if (c == '\n') {
>> -        state = start;
>> -      }
>> -      break;
>> -    case inTripleDash:
>> -      if (c == '-') {
>> -        *p++ = c;
>> -      } else if (c == '\n') {
>> -        *p = '\0';
>> -        if (strcmp(key, "---") != 0)
>> -          return;
>> -        depth = 0;
>> -        state = inDocument;
>> -        nextKeyIsStartOfDocument = true;
>> -      } else {
>> -        return;
>> -      }
>> -      break;
>> -    case inTriplePeriod:
>> -      if (c == '.') {
>> -        *p++ = c;
>> -      } else if (c == '\n') {
>> -        *p = '\0';
>> -        if (strcmp(key, "...") != 0)
>> -          return;
>> -        depth = 0;
>> -        state = inHeaderComment;
>> -      } else {
>> -        return;
>> -      }
>> -      break;
>> -    case inDocument:
>> -      if (isalnum(c)) {
>> -        state = inKey;
>> -        p = &key[0];
>> -        *p++ = c;
>> -      } else if (c == '-') {
>> -        if (depth == 0) {
>> -          p = &key[0];
>> -          *p++ = c;
>> -          state = inTripleDash;
>> -        } else {
>> -          nextKeyIsStartOfSequence = true;
>> -          ++depth;
>> -        }
>> -      } else if (c == ' ') {
>> -        ++depth;
>> -      } else if (c == '.') {
>> -        p = &key[0];
>> -        *p++ = c;
>> -        state = inTriplePeriod;
>> -      } else if (c == '\n') {
>> -        // ignore empty lines
>> -        depth = 0;
>> -      } else if (c == '\t') {
>> -        llvm::report_fatal_error("TAB character found in yaml file");
>> -      } else {
>> -        return;
>> -      }
>> -      break;
>> -    case inKey:
>> -      if (isalnum(c) || (c == '-')) {
>> -        *p++ = c;
>> -      } else if (c == ':') {
>> -        *p = '\0';
>> -        state = inSpaceBeforeValue;
>> -      } else if (c == '\n') {
>> -        *p = '\0';
>> -        if (strcmp(key, "---") == 0)
>> -          state = inDocument;
>> -        else
>> -          return;
>> -      } else {
>> -        return;
>> -      }
>> -      break;
>> -    case inSpaceBeforeValue:
>> -      if (isalnum(c) || (c == '-') || (c == '_') || (c == '/')) {
>> -        p = &value[0];
>> -        *p++ = c;
>> -        state = inValue;
>> -      } else if (c == '\n') {
>> -        entries.push_back(new Entry(key, "", nullptr, depth,
>> -                                    nextKeyIsStartOfDocument,
>> -                                    nextKeyIsStartOfSequence));
>> -        nextKeyIsStartOfSequence = false;
>> -        nextKeyIsStartOfDocument = false;
>> -        state = inDocument;
>> -        depth = 0;
>> -      } else if (c == '[') {
>> -        contentByte = 0;
>> -        sequenceBytes = new std::vector<uint8_t>();
>> -        state = inValueSequence;
>> -      } else if (c == ' ') {
>> -        // eat space
>> -      } else if (c == '\t') {
>> -        llvm::report_fatal_error("TAB character found in yaml file");
>> -      } else {
>> -        return;
>> -      }
>> -      break;
>> -    case inValue:
>> -      if (c == '\n') {
>> -        *p = '\0';
>> -        entries.push_back(new Entry(key, value, nullptr, depth,
>> -                                    nextKeyIsStartOfDocument,
>> -                                    nextKeyIsStartOfSequence));
>> -        nextKeyIsStartOfSequence = false;
>> -        nextKeyIsStartOfDocument = false;
>> -        state = inDocument;
>> -        depth = 0;
>> -      }
>> -      else {
>> -        *p++ = c;
>> -      }
>> -      break;
>> -    case inValueSequence:
>> -      if (c == ']') {
>> -        sequenceBytes->push_back(contentByte);
>> -        state = inValueSequenceEnd;
>> -      }
>> -      else if ( (c == ' ') || (c == '\n') ) {
>> -        // eat white space
>> -      }
>> -      else if (c == ',') {
>> -        sequenceBytes->push_back(contentByte);
>> -      }
>> -      else if ( isdigit(c) ) {
>> -        contentByte = (contentByte << 4) | (c-'0');
>> -      }
>> -      else if ( ('a' <= tolower(c)) && (tolower(c) <= 'f') ) {
>> -        contentByte = (contentByte << 4) | (tolower(c)-'a'+10);
>> -      }
>> -      else {
>> -        llvm::report_fatal_error("non-hex digit found in content [ ]");
>> -      }
>> -      break;
>> -    case inValueSequenceEnd:
>> -      if (c == '\n') {
>> -        entries.push_back(new Entry(key, nullptr, sequenceBytes, depth,
>> -                                    nextKeyIsStartOfDocument,
>> -                                    nextKeyIsStartOfSequence));
>> -        nextKeyIsStartOfSequence = false;
>> -        nextKeyIsStartOfDocument = false;
>> -        state = inDocument;
>> -        depth = 0;
>> -      }
>> -      break;
>> -    }
>> -  }
>> -}
>> -
>> -
>> -
>> class YAMLReference : public Reference {
>> public:
>> -                YAMLReference() : _target(nullptr), _targetName(nullptr),
>> -                                   _offsetInAtom(0), _addend(0), _kind(0) { }
>> +  YAMLReference()
>> +    : _target(nullptr)
>> +    , _offsetInAtom(0)
>> +    , _addend(0)
>> +    , _kind(0)
>> +  {}
>>
>>   virtual uint64_t offsetInAtom() const {
>>     return _offsetInAtom;
>> @@ -275,7 +85,7 @@
>>     _kind = k;
>>   }
>>
>> -  virtual const Atom* target() const {
>> +  virtual const Atom *target() const {
>>     return _target;
>>   }
>>
>> @@ -287,19 +97,17 @@
>>     _addend = a;
>>   }
>>
>> -  virtual void setTarget(const Atom* newAtom) {
>> +  virtual void setTarget(const Atom *newAtom) {
>>     _target = newAtom;
>>   }
>>
>> -  const Atom*  _target;
>> -  const char*  _targetName;
>> -  uint64_t     _offsetInAtom;
>> -  Addend       _addend;
>> -  Kind         _kind;
>> +  const Atom *_target;
>> +  StringRef   _targetName;
>> +  uint64_t    _offsetInAtom;
>> +  Addend      _addend;
>> +  Kind        _kind;
>> };
>>
>> -
>> -
>> class YAMLDefinedAtom;
>>
>> class YAMLFile : public ArchiveLibraryFile {
>> @@ -315,16 +123,16 @@
>>     return _kind;
>>   }
>>
>> -  virtual const atom_collection<DefinedAtom>& defined() const {
>> +  virtual const atom_collection<DefinedAtom> &defined() const {
>>     return _definedAtoms;
>>   }
>> -  virtual const atom_collection<UndefinedAtom>& undefined() const {
>> +  virtual const atom_collection<UndefinedAtom> &undefined() const {
>>     return _undefinedAtoms;
>>   }
>> -  virtual const atom_collection<SharedLibraryAtom>& sharedLibrary() const {
>> +  virtual const atom_collection<SharedLibraryAtom> &sharedLibrary() const {
>>     return _sharedLibraryAtoms;
>>   }
>> -  virtual const atom_collection<AbsoluteAtom>& absolute() const {
>> +  virtual const atom_collection<AbsoluteAtom> &absolute() const {
>>     return _absoluteAtoms;
>>   }
>>
>> @@ -335,39 +143,37 @@
>>   virtual const File *find(StringRef name, bool dataSymbolOnly) const;
>>
>>   void bindTargetReferences();
>> -  void addDefinedAtom(YAMLDefinedAtom* atom, const char* refName);
>> -  void addUndefinedAtom(UndefinedAtom* atom);
>> -  void addSharedLibraryAtom(SharedLibraryAtom* atom);
>> -  void addAbsoluteAtom(AbsoluteAtom* atom);
>> -  Atom* findAtom(const char* name);
>> -  void addMember(const char*);
>> -  void setName(const char*);
>> +  void addDefinedAtom(YAMLDefinedAtom *atom, StringRef refName);
>> +  void addUndefinedAtom(UndefinedAtom *atom);
>> +  void addSharedLibraryAtom(SharedLibraryAtom *atom);
>> +  void addAbsoluteAtom(AbsoluteAtom *atom);
>> +  Atom *findAtom(StringRef name);
>> +  void addMember(StringRef);
>> +  void setName(StringRef);
>>
>>   struct NameAtomPair {
>> -                 NameAtomPair(const char* n, Atom* a) : name(n), atom(a) {}
>> -    const char*  name;
>> -    Atom*        atom;
>> +                 NameAtomPair(StringRef n, Atom *a) : name(n), atom(a) {}
>> +    StringRef name;
>> +    Atom     *atom;
>>   };
>>
>> -  atom_collection_vector<DefinedAtom>         _definedAtoms;
>> -  atom_collection_vector<UndefinedAtom>       _undefinedAtoms;
>> -  atom_collection_vector<SharedLibraryAtom>   _sharedLibraryAtoms;
>> -  atom_collection_vector<AbsoluteAtom>        _absoluteAtoms;
>> -  std::vector<YAMLReference>                  _references;
>> -  std::vector<NameAtomPair>                   _nameToAtomMapping;
>> -  std::vector<const char*>                    _memberNames;
>> -  std::vector<YAMLFile*>                      _memberFiles;
>> -  unsigned int                                _lastRefIndex;
>> -  File::Kind                                  _kind;
>> -  bool                                        _inArchive;
>> +  atom_collection_vector<DefinedAtom>       _definedAtoms;
>> +  atom_collection_vector<UndefinedAtom>     _undefinedAtoms;
>> +  atom_collection_vector<SharedLibraryAtom> _sharedLibraryAtoms;
>> +  atom_collection_vector<AbsoluteAtom>      _absoluteAtoms;
>> +  std::vector<YAMLReference>                _references;
>> +  std::vector<NameAtomPair>                 _nameToAtomMapping;
>> +  std::vector<StringRef>                    _memberNames;
>> +  std::vector<std::unique_ptr<YAMLFile>>    _memberFiles;
>> +  unsigned int                              _lastRefIndex;
>> +  File::Kind                                _kind;
>> +  bool                                      _inArchive;
>> };
>>
>> -
>> -
>> class YAMLDefinedAtom : public DefinedAtom {
>> public:
>>   YAMLDefinedAtom( uint32_t ord
>> -          , YAMLFile& file
>> +          , YAMLFile &file
>>           , DefinedAtom::Scope scope
>>           , DefinedAtom::ContentType type
>>           , DefinedAtom::SectionChoice sectionChoice
>> @@ -378,16 +184,16 @@
>>           , bool isThumb
>>           , bool isAlias
>>           , DefinedAtom::Alignment alignment
>> -          , const char* name
>> -          , const char* sectionName
>> +          , StringRef name
>> +          , StringRef sectionName
>>           , uint64_t size
>> -          , std::vector<uint8_t>* content)
>> +          , std::vector<uint8_t> content)
>>     : _file(file)
>>     , _name(name)
>>     , _sectionName(sectionName)
>>     , _size(size)
>>     , _ord(ord)
>> -    , _content(content)
>> +    , _content(std::move(content))
>>     , _alignment(alignment)
>>     , _scope(scope)
>>     , _type(type)
>> @@ -403,19 +209,16 @@
>>     file._lastRefIndex = _refEndIndex;
>>   }
>>
>> -  virtual const class File& file() const {
>> +  virtual const class File &file() const {
>>     return _file;
>>   }
>>
>>   virtual StringRef name() const {
>> -    if (_name == nullptr)
>> -      return StringRef();
>> -    else
>> -      return _name;
>> +    return _name;
>>   }
>>
>> - virtual uint64_t size() const {
>> -    return (_content ? _content->size() : _size);
>> +  virtual uint64_t size() const {
>> +    return _content.empty() ? _size : _content.size();
>>   }
>>
>>   virtual DefinedAtom::Scope scope() const {
>> @@ -462,11 +265,8 @@
>>     return _isAlias;
>>   }
>>
>> - ArrayRef<uint8_t> rawContent() const {
>> -    if (_content != nullptr)
>> -      return ArrayRef<uint8_t>(*_content);
>> -    else
>> -      return ArrayRef<uint8_t>();
>> +  ArrayRef<uint8_t> rawContent() const {
>> +    return ArrayRef<uint8_t>(_content);
>>   }
>>
>>   virtual uint64_t ordinal() const {
>> @@ -499,23 +299,21 @@
>>     it = reinterpret_cast<const void*>(index);
>>   }
>>
>> -
>> -
>>   void bindTargetReferences() const {
>>     for (unsigned int i=_refStartIndex; i < _refEndIndex; ++i) {
>> -      const char* targetName = _file._references[i]._targetName;
>> -      Atom* targetAtom = _file.findAtom(targetName);
>> +      StringRef targetName = _file._references[i]._targetName;
>> +      Atom *targetAtom = _file.findAtom(targetName);
>>       _file._references[i]._target = targetAtom;
>>     }
>>   }
>>
>> private:
>> -  YAMLFile&                   _file;
>> -  const char *                _name;
>> -  const char *                _sectionName;
>> +  YAMLFile                   &_file;
>> +  StringRef                   _name;
>> +  StringRef                   _sectionName;
>>   unsigned long               _size;
>>   uint32_t                    _ord;
>> -  std::vector<uint8_t>*       _content;
>> +  std::vector<uint8_t>        _content;
>>   DefinedAtom::Alignment      _alignment;
>>   DefinedAtom::Scope          _scope;
>>   DefinedAtom::ContentType    _type;
>> @@ -530,14 +328,19 @@
>>   unsigned int                _refEndIndex;
>> };
>>
>> -
>> class YAMLUndefinedAtom : public UndefinedAtom {
>> public:
>> -        YAMLUndefinedAtom(YAMLFile& f, int32_t ord, const char* nm,
>> -                          UndefinedAtom::CanBeNull cbn)
>> -            : _file(f), _name(nm), _ordinal(ord), _canBeNull(cbn) { }
>> +  YAMLUndefinedAtom( YAMLFile &f
>> +                   , int32_t ord
>> +                   , StringRef name
>> +                   , UndefinedAtom::CanBeNull cbn)
>> +    : _file(f)
>> +    , _name(name)
>> +    , _ordinal(ord)
>> +    , _canBeNull(cbn) {
>> +  }
>>
>> -  virtual const class File& file() const {
>> +  virtual const class File &file() const {
>>     return _file;
>>   }
>>
>> @@ -549,24 +352,28 @@
>>     return _canBeNull;
>>   }
>>
>> -
>> private:
>> -  YAMLFile&                   _file;
>> -  const char *                _name;
>> -  uint32_t                    _ordinal;
>> -  UndefinedAtom::CanBeNull     _canBeNull;
>> +  YAMLFile                &_file;
>> +  StringRef                _name;
>> +  uint32_t                 _ordinal;
>> +  UndefinedAtom::CanBeNull _canBeNull;
>> };
>>
>> -
>> -
>> class YAMLSharedLibraryAtom : public SharedLibraryAtom {
>> public:
>> -        YAMLSharedLibraryAtom(YAMLFile& f, int32_t ord, const char* nm,
>> -                                const char* ldnm, bool cbn)
>> -            : _file(f), _name(nm), _ordinal(ord),
>> -              _loadName(ldnm), _canBeNull(cbn) { }
>> +  YAMLSharedLibraryAtom( YAMLFile &f
>> +                       , int32_t ord
>> +                       , StringRef name
>> +                       , StringRef loadName
>> +                       , bool cbn)
>> +    : _file(f)
>> +    , _name(name)
>> +    , _ordinal(ord)
>> +    , _loadName(loadName)
>> +    , _canBeNull(cbn) {
>> +  }
>>
>> -  virtual const class File& file() const {
>> +  virtual const class File &file() const {
>>     return _file;
>>   }
>>
>> @@ -575,33 +382,31 @@
>>   }
>>
>>   virtual StringRef loadName() const {
>> -    if ( _loadName == nullptr )
>> -      return StringRef();
>> -    else
>> -      return StringRef(_loadName);
>> +    return _loadName;
>>   }
>>
>>   virtual bool canBeNullAtRuntime() const {
>>     return _canBeNull;
>>   }
>>
>> -
>> private:
>> -  YAMLFile&                   _file;
>> -  const char *                _name;
>> -  uint32_t                    _ordinal;
>> -  const char *                _loadName;
>> -  bool                        _canBeNull;
>> +  YAMLFile &_file;
>> +  StringRef _name;
>> +  uint32_t  _ordinal;
>> +  StringRef _loadName;
>> +  bool      _canBeNull;
>> };
>>
>> -
>> -
>> class YAMLAbsoluteAtom : public AbsoluteAtom {
>> public:
>> -        YAMLAbsoluteAtom(YAMLFile& f, int32_t ord, const char* nm, uint64_t v)
>> -            : _file(f), _name(nm), _ordinal(ord), _value(v) { }
>> +  YAMLAbsoluteAtom(YAMLFile &f, int32_t ord, StringRef name, uint64_t v)
>> +    : _file(f)
>> +    , _name(name)
>> +    , _ordinal(ord)
>> +    , _value(v) {
>> +  }
>>
>> -  virtual const class File& file() const {
>> +  virtual const class File &file() const {
>>     return _file;
>>   }
>>
>> @@ -614,95 +419,89 @@
>>   }
>>
>> private:
>> -  YAMLFile&        _file;
>> -  const char *     _name;
>> -  uint32_t         _ordinal;
>> -  uint64_t         _value;
>> +  YAMLFile &_file;
>> +  StringRef _name;
>> +  uint32_t  _ordinal;
>> +  uint64_t  _value;
>> };
>>
>> -
>> -
>> void YAMLFile::bindTargetReferences() {
>> -    for (const DefinedAtom *defAtom : _definedAtoms) {
>> -      const YAMLDefinedAtom* atom =
>> -                          reinterpret_cast<const YAMLDefinedAtom*>(defAtom);
>> -      atom->bindTargetReferences();
>> -    }
>> +  for (const DefinedAtom *defAtom : _definedAtoms) {
>> +    const YAMLDefinedAtom *atom =
>> +      reinterpret_cast<const YAMLDefinedAtom*>(defAtom);
>> +    atom->bindTargetReferences();
>> +  }
>> }
>>
>> -Atom* YAMLFile::findAtom(const char* name) {
>> -  for (std::vector<NameAtomPair>::const_iterator it = _nameToAtomMapping.begin();
>> -                                    it != _nameToAtomMapping.end(); ++it) {
>> -    if ( strcmp(name, it->name) == 0 )
>> -      return it->atom;
>> +Atom *YAMLFile::findAtom(StringRef name) {
>> +  for (auto &ci : _nameToAtomMapping) {
>> +    if (ci.name == name)
>> +      return ci.atom;
>>   }
>>   llvm::report_fatal_error("reference to atom that does not exist");
>> }
>>
>> -void YAMLFile::addDefinedAtom(YAMLDefinedAtom* atom, const char* refName) {
>> +void YAMLFile::addDefinedAtom(YAMLDefinedAtom *atom, StringRef refName) {
>>   _definedAtoms._atoms.push_back(atom);
>> -  assert(refName != nullptr);
>>   _nameToAtomMapping.push_back(NameAtomPair(refName, atom));
>> }
>>
>> -void YAMLFile::addUndefinedAtom(UndefinedAtom* atom) {
>> +void YAMLFile::addUndefinedAtom(UndefinedAtom *atom) {
>>   _undefinedAtoms._atoms.push_back(atom);
>> -  _nameToAtomMapping.push_back(NameAtomPair(atom->name().data(), atom));
>> +  _nameToAtomMapping.push_back(NameAtomPair(atom->name(), atom));
>> }
>>
>> -void YAMLFile::addSharedLibraryAtom(SharedLibraryAtom* atom) {
>> +void YAMLFile::addSharedLibraryAtom(SharedLibraryAtom *atom) {
>>   _sharedLibraryAtoms._atoms.push_back(atom);
>> -  _nameToAtomMapping.push_back(NameAtomPair(atom->name().data(), atom));
>> +  _nameToAtomMapping.push_back(NameAtomPair(atom->name(), atom));
>> }
>>
>> -void YAMLFile::addAbsoluteAtom(AbsoluteAtom* atom) {
>> +void YAMLFile::addAbsoluteAtom(AbsoluteAtom *atom) {
>>   _absoluteAtoms._atoms.push_back(atom);
>> -  _nameToAtomMapping.push_back(NameAtomPair(atom->name().data(), atom));
>> +  _nameToAtomMapping.push_back(NameAtomPair(atom->name(), atom));
>> }
>>
>> -void YAMLFile::addMember(const char* name) {
>> +void YAMLFile::addMember(StringRef name) {
>>   _memberNames.push_back(name);
>> }
>>
>> -void YAMLFile::setName(const char* name) {
>> +void YAMLFile::setName(StringRef name) {
>>   _path = StringRef(name);
>> }
>>
>> const File *YAMLFile::find(StringRef name, bool dataSymbolOnly) const {
>> -  for (YAMLFile *file : _memberFiles) {
>> +  for (auto &file : _memberFiles) {
>>     for (const DefinedAtom *atom : file->defined() ) {
>> -      if ( name.equals(atom->name()) )
>> -        return file;
>> +      if (name == atom->name())
>> +        return file.get();
>>     }
>>   }
>> -  return NULL;
>> +  return nullptr;
>> }
>>
>> -
>> -
>> class YAMLAtomState {
>> public:
>> -  YAMLAtomState(Platform& platform);
>> +  YAMLAtomState(Platform &platform);
>>
>> -  void setName(const char *n);
>> -  void setRefName(const char *n);
>> -  void setAlign2(const char *n);
>> +  void setName(StringRef n);
>> +  void setRefName(StringRef n);
>> +  void setAlign2(StringRef n);
>>
>> -  void setFixupKind(const char *n);
>> -  void setFixupTarget(const char *n);
>> +  void setFixupKind(StringRef n);
>> +  void setFixupTarget(StringRef n);
>>   void addFixup(YAMLFile *f);
>>
>>   void makeAtom(YAMLFile&);
>>
>> -  Platform&                   _platform;
>> -  const char *                _name;
>> -  const char *                _refName;
>> -  const char *                _sectionName;
>> -  const char*                 _loadName;
>> +  Platform                   &_platform;
>> +  StringRef                   _name;
>> +  StringRef                   _refName;
>> +  StringRef                   _sectionName;
>> +  StringRef                   _loadName;
>>   unsigned long long          _size;
>>   uint64_t                    _value;
>>   uint32_t                    _ordinal;
>> -  std::vector<uint8_t>*       _content;
>> +  std::vector<uint8_t>        _content;
>>   DefinedAtom::Alignment      _alignment;
>>   Atom::Definition            _definition;
>>   DefinedAtom::Scope          _scope;
>> @@ -719,16 +518,11 @@
>> };
>>
>>
>> -YAMLAtomState::YAMLAtomState(Platform& platform)
>> +YAMLAtomState::YAMLAtomState(Platform &platform)
>>   : _platform(platform)
>> -  , _name(nullptr)
>> -  , _refName(nullptr)
>> -  , _sectionName(nullptr)
>> -  , _loadName(nullptr)
>>   , _size(0)
>>   , _value(0)
>>   , _ordinal(0)
>> -  , _content(nullptr)
>>   , _alignment(0, 0)
>>   , _definition(KeyValues::definitionDefault)
>>   , _scope(KeyValues::scopeDefault)
>> @@ -740,357 +534,415 @@
>>   , _permissions(KeyValues::permissionsDefault)
>>   , _isThumb(KeyValues::isThumbDefault)
>>   , _isAlias(KeyValues::isAliasDefault)
>> -  , _canBeNull(KeyValues::canBeNullDefault)
>> -  {
>> -  }
>> -
>> +  , _canBeNull(KeyValues::canBeNullDefault) {
>> +}
>>
>> -void YAMLAtomState::makeAtom(YAMLFile& f) {
>> -  if ( _definition == Atom::definitionRegular ) {
>> -    YAMLDefinedAtom *a = new YAMLDefinedAtom(_ordinal, f, _scope, _type,
>> -                          _sectionChoice, _interpose, _merge, _deadStrip,
>> -                          _permissions, _isThumb, _isAlias,
>> -                          _alignment, _name, _sectionName, _size, _content);
>> -    f.addDefinedAtom(a, _refName ? _refName : _name);
>> +void YAMLAtomState::makeAtom(YAMLFile &f) {
>> +  if (_definition == Atom::definitionRegular) {
>> +    YAMLDefinedAtom *a =
>> +      new YAMLDefinedAtom( _ordinal
>> +                         , f
>> +                         , _scope
>> +                         , _type
>> +                         , _sectionChoice
>> +                         , _interpose
>> +                         , _merge
>> +                         , _deadStrip
>> +                         , _permissions
>> +                         , _isThumb
>> +                         , _isAlias
>> +                         , _alignment
>> +                         , _name
>> +                         , _sectionName
>> +                         , _size
>> +                         , _content
>> +                         );
>> +    f.addDefinedAtom(a, !_refName.empty() ? _refName : _name);
>>     ++_ordinal;
>> -  }
>> -  else if ( _definition == Atom::definitionUndefined ) {
>> +  } else if (_definition == Atom::definitionUndefined) {
>>     UndefinedAtom *a = new YAMLUndefinedAtom(f, _ordinal, _name, _canBeNull);
>>     f.addUndefinedAtom(a);
>>     ++_ordinal;
>> -  }
>> -  else if ( _definition == Atom::definitionSharedLibrary ) {
>> +  } else if (_definition == Atom::definitionSharedLibrary) {
>>     bool nullable = (_canBeNull == UndefinedAtom::canBeNullAtRuntime);
>>     SharedLibraryAtom *a = new YAMLSharedLibraryAtom(f, _ordinal, _name,
>>                                                       _loadName, nullable);
>>     f.addSharedLibraryAtom(a);
>>     ++_ordinal;
>> -  }
>> -   else if ( _definition == Atom::definitionAbsolute ) {
>> +  } else if (_definition == Atom::definitionAbsolute) {
>>     AbsoluteAtom *a = new YAMLAbsoluteAtom(f, _ordinal, _name, _value);
>>     f.addAbsoluteAtom(a);
>>     ++_ordinal;
>>   }
>>
>>   // reset state for next atom
>> -  _name             = nullptr;
>> -  _refName          = nullptr;
>> -  _sectionName      = nullptr;
>> -  _loadName         = nullptr;
>> -  _size             = 0;
>> -  _value            = 0;
>> -  _ordinal          = 0;
>> -  _content          = nullptr;
>> -  _alignment.powerOf2= 0;
>> -  _alignment.modulus = 0;
>> -  _definition       = KeyValues::definitionDefault;
>> -  _scope            = KeyValues::scopeDefault;
>> -  _type             = KeyValues::contentTypeDefault;
>> -  _sectionChoice    = KeyValues::sectionChoiceDefault;
>> -  _interpose        = KeyValues::interposableDefault;
>> -  _merge            = KeyValues::mergeDefault;
>> -  _deadStrip        = KeyValues::deadStripKindDefault;
>> -  _permissions      = KeyValues::permissionsDefault;
>> -  _isThumb          = KeyValues::isThumbDefault;
>> -  _isAlias          = KeyValues::isAliasDefault;
>> -  _canBeNull        = KeyValues::canBeNullDefault;
>> -  _ref._target       = nullptr;
>> -  _ref._targetName   = nullptr;
>> -  _ref._addend       = 0;
>> -  _ref._offsetInAtom = 0;
>> -  _ref._kind         = 0;
>> +  _name               = StringRef();
>> +  _refName            = StringRef();
>> +  _sectionName        = StringRef();
>> +  _loadName           = StringRef();
>> +  _size               = 0;
>> +  _value              = 0;
>> +  _ordinal            = 0;
>> +  _content.clear();
>> +  _alignment.powerOf2 = 0;
>> +  _alignment.modulus  = 0;
>> +  _definition         = KeyValues::definitionDefault;
>> +  _scope              = KeyValues::scopeDefault;
>> +  _type               = KeyValues::contentTypeDefault;
>> +  _sectionChoice      = KeyValues::sectionChoiceDefault;
>> +  _interpose          = KeyValues::interposableDefault;
>> +  _merge              = KeyValues::mergeDefault;
>> +  _deadStrip          = KeyValues::deadStripKindDefault;
>> +  _permissions        = KeyValues::permissionsDefault;
>> +  _isThumb            = KeyValues::isThumbDefault;
>> +  _isAlias            = KeyValues::isAliasDefault;
>> +  _canBeNull          = KeyValues::canBeNullDefault;
>> +  _ref._target        = nullptr;
>> +  _ref._targetName    = StringRef();
>> +  _ref._addend        = 0;
>> +  _ref._offsetInAtom  = 0;
>> +  _ref._kind          = 0;
>> }
>>
>> -void YAMLAtomState::setName(const char *n) {
>> +void YAMLAtomState::setName(StringRef n) {
>>   _name = n;
>> }
>>
>> -void YAMLAtomState::setRefName(const char *n) {
>> +void YAMLAtomState::setRefName(StringRef n) {
>>   _refName = n;
>> }
>>
>> -void YAMLAtomState::setAlign2(const char *s) {
>> +void YAMLAtomState::setAlign2(StringRef s) {
>>   if (StringRef(s).getAsInteger(10, _alignment.powerOf2))
>>     _alignment.powerOf2 = 1;
>> }
>>
>> -void YAMLAtomState::setFixupKind(const char *s) {
>> +void YAMLAtomState::setFixupKind(StringRef s) {
>>   _ref._kind = _platform.kindFromString(StringRef(s));
>> }
>>
>> -void YAMLAtomState::setFixupTarget(const char *s) {
>> +void YAMLAtomState::setFixupTarget(StringRef s) {
>>   _ref._targetName = s;
>> }
>>
>> -
>> void YAMLAtomState::addFixup(YAMLFile *f) {
>>   f->_references.push_back(_ref);
>>   // clear for next ref
>>   _ref._target       = nullptr;
>> -  _ref._targetName   = nullptr;
>> +  _ref._targetName   = StringRef();
>>   _ref._addend       = 0;
>>   _ref._offsetInAtom = 0;
>>   _ref._kind         = 0;
>> }
>>
>> -
>> -} // anonymous namespace
>> -
>> -
>> -
>> -
>> -
>> -/// parseObjectText - Parse the specified YAML formatted MemoryBuffer
>> -/// into lld::File object(s) and append each to the specified vector<File*>.
>> -error_code parseObjectText( llvm::MemoryBuffer *mb
>> -                          , Platform& platform
>> -                          , std::vector<const File *> &result) {
>> -  std::vector<const YAML::Entry *> entries;
>> -  std::vector<YAMLFile*> allFiles;
>> -  YAML::parse(mb, entries);
>> -
>> -  YAMLFile *file = nullptr;
>> -  YAMLAtomState atomState(platform);
>> -  bool inAtoms       = false;
>> -  bool inFixups      = false;
>> -  bool inMembers     = false;
>> -  int depthForAtoms  = -1;
>> -  int depthForFixups = -1;
>> -  int depthForMembers= -1;
>> -  int lastDepth      = -1;
>> -  bool haveAtom      = false;
>> -  bool haveFixup     = false;
>> -  bool hasArchives = false;
>> -
>> -  for (std::vector<const YAML::Entry *>::iterator it = entries.begin();
>> -       it != entries.end(); ++it) {
>> -    const YAML::Entry *entry = *it;
>> -
>> -    if (entry->beginDocument) {
>> -      if (file != nullptr) {
>> -        if (haveAtom) {
>> -          atomState.makeAtom(*file);
>> -          haveAtom = false;
>> -        }
>> -        file->bindTargetReferences();
>> -        allFiles.push_back(file);
>> -      }
>> -      file = new YAMLFile();
>> -      inAtoms = false;
>> -      depthForAtoms = -1;
>> -    }
>> -    if (lastDepth > entry->depth) {
>> -      // end of fixup sequence
>> -      if (haveFixup) {
>> -        atomState.addFixup(file);
>> -        haveFixup = false;
>> -      }
>> +llvm::error_code parseFixup( llvm::yaml::MappingNode *mn
>> +                           , llvm::yaml::Stream &s
>> +                           , Platform &p
>> +                           , YAMLFile &f
>> +                           , YAMLAtomState &yas) {
>> +  using namespace llvm::yaml;
>> +  llvm::SmallString<32> storage;
>> +
>> +  for (auto &keyval : *mn) {
>> +    ScalarNode *key = llvm::dyn_cast<ScalarNode>(keyval.getKey());
>> +    if (!key) {
>> +      s.printError(key, "Expected a scalar value");
>> +      return make_error_code(yaml_reader_error::illegal_value);
>> +    }
>> +    ScalarNode *value = llvm::dyn_cast<ScalarNode>(keyval.getValue());
>> +    if (!value) {
>> +      s.printError(value, "Expected a scalar value");
>> +      return make_error_code(yaml_reader_error::illegal_value);
>> +    }
>> +    llvm::StringRef keyValue = key->getValue(storage);
>> +    if (keyValue == KeyValues::fixupsOffsetKeyword) {
>> +      if (!getAs(value, yas._ref._offsetInAtom)) {
>> +        s.printError(value, "Invalid value for offset");
>> +        return make_error_code(yaml_reader_error::illegal_value);
>> +      }
>> +    } else if (keyValue == KeyValues::fixupsKindKeyword) {
>> +      yas._ref._kind = p.kindFromString(value->getValue(storage));
>> +    } else if (keyValue == KeyValues::fixupsTargetKeyword) {
>> +      // FIXME: string lifetime.
>> +      yas._ref._targetName = value->getValue(storage);
>> +    } else if (keyValue == KeyValues::fixupsAddendKeyword) {
>> +      if (!getAs(value, yas._ref._addend)) {
>> +        s.printError(value, "Invalid value for addend");
>> +        return make_error_code(yaml_reader_error::illegal_value);
>> +      }
>> +    } else {
>> +      s.printError(key, "Unrecognized key");
>> +      return make_error_code(yaml_reader_error::unknown_keyword);
>>     }
>> +  }
>> +  yas.addFixup(&f);
>> +  return make_error_code(yaml_reader_error::success);
>> +}
>>
>> -    if (inAtoms && (depthForAtoms == -1)) {
>> -      depthForAtoms = entry->depth;
>> -    }
>> -    if (inFixups && (depthForFixups == -1)) {
>> -      depthForFixups = entry->depth;
>> -    }
>> -    if (inMembers && (depthForMembers == -1)) {
>> -      depthForMembers = entry->depth;
>> -    }
>> -    if ( !inFixups && (strcmp(entry->key, KeyValues::fileKindKeyword) == 0) ) {
>> -      file->_kind = KeyValues::fileKind(entry->value);
>> -      if ( file->_kind == File::kindArchiveLibrary )
>> -        hasArchives = true;
>> -    }
>> -    else if (strcmp(entry->key, KeyValues::fileMembersKeyword) == 0) {
>> -      inMembers = true;
>> -    }
>> -    else if (strcmp(entry->key, KeyValues::fileAtomsKeyword) == 0) {
>> -      inAtoms = true;
>> -    }
>> -    else if ( !inAtoms && !inMembers
>> -                       && (strcmp(entry->key, KeyValues::nameKeyword) == 0) ) {
>> -      file->setName(entry->value);
>> -    }
>> -    if (inAtoms) {
>> -      if (depthForAtoms == entry->depth) {
>> -        if (entry->beginSequence) {
>> -          if (haveAtom) {
>> -            atomState.makeAtom(*file);
>> -            haveAtom = false;
>> -          }
>> -        }
>> -        if (strcmp(entry->key, KeyValues::nameKeyword) == 0) {
>> -          atomState.setName(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::refNameKeyword) == 0) {
>> -          atomState.setRefName(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::definitionKeyword) == 0) {
>> -          atomState._definition = KeyValues::definition(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::scopeKeyword) == 0) {
>> -          atomState._scope = KeyValues::scope(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::contentTypeKeyword) == 0) {
>> -          atomState._type = KeyValues::contentType(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::deadStripKindKeyword) == 0) {
>> -          atomState._deadStrip = KeyValues::deadStripKind(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::sectionChoiceKeyword) == 0) {
>> -          atomState._sectionChoice = KeyValues::sectionChoice(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::mergeKeyword) == 0) {
>> -          atomState._merge = KeyValues::merge(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::interposableKeyword) == 0) {
>> -          atomState._interpose = KeyValues::interposable(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::isThumbKeyword) == 0) {
>> -          atomState._isThumb = KeyValues::isThumb(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::isAliasKeyword) == 0) {
>> -          atomState._isAlias = KeyValues::isAlias(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::canBeNullKeyword) == 0) {
>> -          atomState._canBeNull = KeyValues::canBeNull(entry->value);
>> -          if ( atomState._definition == Atom::definitionSharedLibrary ) {
>> -            if ( atomState._canBeNull == UndefinedAtom::canBeNullAtBuildtime )
>> -              return make_error_code(yaml_reader_error::illegal_value);
>> -          }
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::sectionNameKeyword) == 0) {
>> -          atomState._sectionName = entry->value;
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::sizeKeyword) == 0) {
>> -          StringRef val = entry->value;
>> -          if (val.getAsInteger(0, atomState._size))
>> +llvm::error_code parseAtom( llvm::yaml::MappingNode *mn
>> +                          , llvm::yaml::Stream &s
>> +                          , Platform &p
>> +                          , YAMLFile &f) {
>> +  using namespace llvm::yaml;
>> +  YAMLAtomState yas(p);
>> +  llvm::SmallString<32> storage;
>> +
>> +  for (MappingNode::iterator i = mn->begin(), e = mn->end(); i != e; ++i) {
>> +    ScalarNode *Key = llvm::dyn_cast<ScalarNode>(i->getKey());
>> +    if (!Key)
>> +      return make_error_code(yaml_reader_error::illegal_value);
>> +    llvm::StringRef KeyValue = Key->getValue(storage);
>> +    if (KeyValue == KeyValues::contentKeyword) {
>> +      ScalarNode *scalarValue = llvm::dyn_cast<ScalarNode>(i->getValue());
>> +      if (scalarValue) {
>> +        yas._type = KeyValues::contentType(scalarValue->getValue(storage));
>> +      } else {
>> +        SequenceNode *Value = llvm::dyn_cast<SequenceNode>(i->getValue());
>> +        if (!Value) {
>> +          s.printError(i->getValue(), "Expected a sequence");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +        for (SequenceNode::iterator ci = Value->begin(), ce = Value->end();
>> +                                    ci != ce; ++ci) {
>> +          ScalarNode *Entry = llvm::dyn_cast<ScalarNode>(&*ci);
>> +          if (!Entry) {
>> +            s.printError(i->getValue(), "Expected a scalar value");
>>             return make_error_code(yaml_reader_error::illegal_value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::contentKeyword) == 0) {
>> -          atomState._content = entry->valueSequenceBytes;
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, "align2") == 0) {
>> -          atomState.setAlign2(entry->value);
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::fixupsKeyword) == 0) {
>> -          inFixups = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::loadNameKeyword) == 0) {
>> -          atomState._loadName = entry->value;
>> -          haveAtom = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::valueKeyword) == 0) {
>> -          llvm::APInt Val;
>> -          StringRef(entry->value).getAsInteger(0, Val);
>> -          atomState._value = Val.getZExtValue();
>> -          haveAtom = true;
>> -        }
>> -        else {
>> -          return make_error_code(yaml_reader_error::unknown_keyword);
>> -        }
>> -      }
>> -      else if (depthForFixups == entry->depth) {
>> -        if (entry->beginSequence) {
>> -          if (haveFixup) {
>> -            atomState.addFixup(file);
>> -            haveFixup = false;
>>           }
>> -        }
>> -        if (strcmp(entry->key, KeyValues::fixupsKindKeyword) == 0) {
>> -          atomState.setFixupKind(entry->value);
>> -          haveFixup = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::fixupsOffsetKeyword) == 0) {
>> -          if (StringRef(entry->value).getAsInteger(0,
>> -               atomState._ref._offsetInAtom))
>> +          unsigned int ContentByte;
>> +          if (Entry->getValue(storage).getAsInteger(16, ContentByte)) {
>> +            s.printError(i->getValue(), "Invalid content byte");
>>             return make_error_code(yaml_reader_error::illegal_value);
>> -          haveFixup = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::fixupsTargetKeyword) == 0) {
>> -          atomState.setFixupTarget(entry->value);
>> -          haveFixup = true;
>> -        }
>> -        else if (strcmp(entry->key, KeyValues::fixupsAddendKeyword) == 0) {
>> -          StringRef Addend(entry->value);
>> -          if (Addend.getAsInteger(0, atomState._ref._addend))
>> +          }
>> +          if (ContentByte > 0xFF) {
>> +            s.printError(i->getValue(), "Byte out of range (> 0xFF)");
>>             return make_error_code(yaml_reader_error::illegal_value);
>> -          haveFixup = true;
>> +          }
>> +          yas._content.push_back(ContentByte & 0xFF);
>>         }
>>       }
>> -    }
>> -    else if (inMembers) {
>> -      if (depthForMembers == entry->depth) {
>> -        if (entry->beginSequence) {
>> -          if (strcmp(entry->key, KeyValues::nameKeyword) == 0) {
>> -            file->addMember(entry->value);
>> -          }
>> +    } else if (KeyValue == KeyValues::fixupsKeyword) {
>> +      SequenceNode *Value = llvm::dyn_cast<SequenceNode>(i->getValue());
>> +      if (!Value) {
>> +        s.printError(i->getValue(), "Expected a sequence");
>> +        return make_error_code(yaml_reader_error::illegal_value);
>> +      }
>> +      for (auto &i : *Value) {
>> +        MappingNode *Fixup = llvm::dyn_cast<MappingNode>(&i);
>> +        if (!Fixup) {
>> +          s.printError(&i, "Expected a map");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +        if (error_code ec = parseFixup(Fixup, s, p, f, yas))
>> +          return ec;
>> +      }
>> +    } else {
>> +      // The rest of theses all require value to be a scalar.
>> +      ScalarNode *Value = llvm::dyn_cast<ScalarNode>(i->getValue());
>> +      if (!Value) {
>> +        s.printError(i->getValue(), "Expected a scalar value");
>> +        return make_error_code(yaml_reader_error::illegal_value);
>> +      }
>> +      if (KeyValue == KeyValues::nameKeyword) {
>> +        // FIXME: String lifetime.
>> +        yas.setName(Value->getValue(storage));
>> +      } else if (KeyValue == KeyValues::refNameKeyword) {
>> +        // FIXME: String lifetime.
>> +        yas.setRefName(Value->getValue(storage));
>> +      } else if (KeyValue == KeyValues::valueKeyword) {
>> +        if (!getAs(Value, yas._value)) {
>> +          s.printError(Value, "Invalid value for value");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +      } else if (KeyValue == KeyValues::loadNameKeyword)
>> +        // FIXME: String lifetime.
>> +        yas._loadName = Value->getValue(storage);
>> +      else if (KeyValue == KeyValues::definitionKeyword)
>> +        yas._definition = KeyValues::definition(Value->getValue(storage));
>> +      else if (KeyValue == KeyValues::scopeKeyword)
>> +        yas._scope = KeyValues::scope(Value->getValue(storage));
>> +      else if (KeyValue == KeyValues::contentTypeKeyword)
>> +        yas._type = KeyValues::contentType(Value->getValue(storage));
>> +      else if (KeyValue == KeyValues::deadStripKindKeyword)
>> +        yas._deadStrip = KeyValues::deadStripKind(Value->getValue(storage));
>> +      else if (KeyValue == KeyValues::sectionChoiceKeyword)
>> +        yas._sectionChoice = KeyValues::sectionChoice(Value->getValue(storage));
>> +      else if (KeyValue == KeyValues::mergeKeyword)
>> +        yas._merge = KeyValues::merge(Value->getValue(storage));
>> +      else if (KeyValue == KeyValues::interposableKeyword)
>> +        yas._interpose = KeyValues::interposable(Value->getValue(storage));
>> +      else if (KeyValue == KeyValues::isThumbKeyword) {
>> +        if (!getAs(Value, yas._isThumb)) {
>> +          s.printError(Value, "Invalid value for isThumb");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +      } else if (KeyValue == KeyValues::isAliasKeyword) {
>> +        if (!getAs(Value, yas._isAlias)) {
>> +          s.printError(Value, "Invalid value for isAlias");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +      } else if (KeyValue == KeyValues::canBeNullKeyword) {
>> +        yas._canBeNull = KeyValues::canBeNull(Value->getValue(storage));
>> +        if (yas._definition == Atom::definitionSharedLibrary
>> +            && yas._canBeNull == UndefinedAtom::canBeNullAtBuildtime) {
>> +          s.printError(Value, "Invalid value for can be null");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +      } else if (KeyValue == KeyValues::sectionNameKeyword)
>> +        // FIXME: String lifetime.
>> +        yas._sectionName = Value->getValue(storage);
>> +      else if (KeyValue == KeyValues::sizeKeyword) {
>> +        if (!getAs(Value, yas._size)) {
>> +          s.printError(Value, "Invalid value for size");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>>         }
>> +      } else if (KeyValue == "align2")
>> +        yas.setAlign2(Value->getValue(storage));
>> +      else {
>> +        s.printError(Key, "Unrecognized key");
>> +        return make_error_code(yaml_reader_error::unknown_keyword);
>>       }
>>     }
>> -    lastDepth = entry->depth;
>>   }
>> -  if (haveAtom) {
>> -    atomState.makeAtom(*file);
>> +  yas.makeAtom(f);
>> +  return make_error_code(yaml_reader_error::success);
>> +}
>> +
>> +llvm::error_code parseAtoms( llvm::yaml::SequenceNode *atoms
>> +                           , llvm::yaml::Stream &s
>> +                           , Platform &p
>> +                           , YAMLFile &f) {
>> +  using namespace llvm::yaml;
>> +
>> +  for (auto &atom : *atoms) {
>> +    if (MappingNode *a = llvm::dyn_cast<MappingNode>(&atom)) {
>> +      if (llvm::error_code ec = parseAtom(a, s, p, f))
>> +        return ec;
>> +    } else {
>> +      s.printError(&atom, "Expected map");
>> +      return make_error_code(yaml_reader_error::illegal_value);
>> +    }
>>   }
>> -  if (file != nullptr) {
>> -    file->bindTargetReferences();
>> -    allFiles.push_back(file);
>> -  }
>> -
>> -  // If yaml contained archive files, push members down into archives
>> -  if ( hasArchives ) {
>> -    for (YAMLFile *f : allFiles) {
>> -      if ( f->kind() == File::kindArchiveLibrary ) {
>> -        for (const char *memberName : f->_memberNames ) {
>> -          for (YAMLFile *f2 : allFiles) {
>> -            if ( f2->path().equals(memberName) ) {
>> -              f2->_inArchive = true;
>> -              f->_memberFiles.push_back(f2);
>> -            }
>> -          }
>> +  return make_error_code(yaml_reader_error::success);
>> +}
>> +
>> +llvm::error_code parseArchive( llvm::yaml::SequenceNode *archive
>> +                             , llvm::yaml::Stream &s
>> +                             , Platform &p
>> +                             , YAMLFile &f) {
>> +  using namespace llvm::yaml;
>> +  llvm::SmallString<32> storage;
>> +
>> +  for (auto &member : *archive) {
>> +    std::unique_ptr<YAMLFile> mf(new YAMLFile);
>> +    MappingNode *mem = llvm::dyn_cast<MappingNode>(&member);
>> +    if (!mem) {
>> +      s.printError(&member, "Expected map");
>> +      return make_error_code(yaml_reader_error::illegal_value);
>> +    }
>> +    for (auto &keyVal : *mem) {
>> +      ScalarNode *key = llvm::dyn_cast<ScalarNode>(keyVal.getKey());
>> +      if (!key) {
>> +        s.printError(keyVal.getKey(), "Expected scalar value");
>> +        return make_error_code(yaml_reader_error::illegal_value);
>> +      }
>> +      if (key->getValue(storage) == "name") {
>> +        ScalarNode *value = llvm::dyn_cast<ScalarNode>(keyVal.getValue());
>> +        if (!value) {
>> +          s.printError(keyVal.getValue(), "Expected scalar value");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +        // FIXME: String lifetime.
>> +        mf->setName(value->getValue(storage));
>> +      } else if (key->getValue(storage) == "atoms") {
>> +        SequenceNode *atoms = llvm::dyn_cast<SequenceNode>(keyVal.getValue());
>> +        if (!atoms) {
>> +          s.printError(keyVal.getValue(), "Expected sequence");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>>         }
>> +        if (error_code ec = parseAtoms(atoms, s, p, *mf))
>> +          return ec;
>> +      } else {
>> +        s.printError(key, "Unrecognized key");
>> +        return make_error_code(yaml_reader_error::unknown_keyword);
>>       }
>>     }
>> +    f._memberFiles.push_back(std::move(mf));
>>   }
>> -  // Copy files that have not been pushed into archives to result.
>> -  for (YAMLFile *f : allFiles) {
>> -    if ( ! f->_inArchive ) {
>> -      result.push_back(f);
>> +  return make_error_code(yaml_reader_error::success);
>> +}
>> +
>> +/// parseObjectText - Parse the specified YAML formatted MemoryBuffer
>> +/// into lld::File object(s) and append each to the specified vector<File*>.
>> +error_code parseObjectText( llvm::MemoryBuffer *mb
>> +                          , Platform& platform
>> +                          , std::vector<std::unique_ptr<const File>> &result) {
>> +  using namespace llvm::yaml;
>> +  llvm::SourceMgr sm;
>> +  Stream stream(mb->getBuffer(), sm);
>> +
>> +  llvm::SmallString<32> storage;
>> +  for (Document &d : stream) {
>> +    std::unique_ptr<YAMLFile> CurFile(new YAMLFile);
>> +    if (llvm::isa<NullNode>(d.getRoot()))
>> +      continue; // Empty files are allowed.
>> +    MappingNode *n = llvm::dyn_cast<MappingNode>(d.getRoot());
>> +    if (!n) {
>> +      stream.printError(d.getRoot(), "Expected map");
>> +      return make_error_code(yaml_reader_error::illegal_value);
>> +    }
>> +    for (MappingNode::iterator mi = n->begin(), me = n->end(); mi != me; ++mi) {
>> +      ScalarNode *key = llvm::dyn_cast<ScalarNode>(mi->getKey());
>> +      if (!key) {
>> +        stream.printError(mi->getValue(), "Expected scalar value");
>> +        return make_error_code(yaml_reader_error::illegal_value);
>> +      }
>> +      if (key->getValue(storage) == "atoms") {
>> +        SequenceNode *Atoms = llvm::dyn_cast<SequenceNode>(mi->getValue());
>> +        if (!Atoms) {
>> +          stream.printError(mi->getValue(), "Expected sequence");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +        if (error_code ec = parseAtoms(Atoms, stream, platform, *CurFile))
>> +          return ec;
>> +      } else if (key->getValue(storage) == "archive") {
>> +        CurFile->_kind = YAMLFile::kindArchiveLibrary;
>> +        SequenceNode *members = llvm::dyn_cast<SequenceNode>(mi->getValue());
>> +        if (!members) {
>> +          stream.printError(mi->getValue(), "Expected sequence");
>> +          return make_error_code(yaml_reader_error::illegal_value);
>> +        }
>> +        if (error_code ec = parseArchive( members
>> +                                        , stream
>> +                                        , platform
>> +                                        , *CurFile))
>> +          return ec;
>> +      } else {
>> +        stream.printError(key, "Unrecognized key");
>> +        return make_error_code(yaml_reader_error::unknown_keyword);
>> +      }
>>     }
>> +    if (stream.failed())
>> +      return make_error_code(yaml_reader_error::illegal_value);
>> +    CurFile->bindTargetReferences();
>> +    result.emplace_back(CurFile.release());
>>   }
>>
>>   return make_error_code(yaml_reader_error::success);
>> }
>>
>> -
>> //
>> // Fill in vector<File*> from path to input text file.
>> //
>> error_code parseObjectTextFileOrSTDIN( StringRef path
>>                                      , Platform&  platform
>> -                                     , std::vector<const File*>& result) {
>> +                                     , std::vector<
>> +                                         std::unique_ptr<const File>>& result) {
>>   OwningPtr<llvm::MemoryBuffer> mb;
>>   if (error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(path, mb))
>>     return ec;
>>
>> -  return parseObjectText(mb.get(), platform, result);
>> +  return parseObjectText(mb.take(), platform, result);
>> }
>>
>> } // namespace yaml
>>
>> Modified: lld/trunk/test/archive-basic.objtxt
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/archive-basic.objtxt?rev=155847&r1=155846&r2=155847&view=diff
>> ==============================================================================
>> --- lld/trunk/test/archive-basic.objtxt (original)
>> +++ lld/trunk/test/archive-basic.objtxt Mon Apr 30 16:20:13 2012
>> @@ -9,34 +9,29 @@
>> atoms:
>>     - name:              foo
>>       type:              code
>> -
>> +
>>     - name:              bar
>>       definition:        undefined
>>
>> ---
>> -name: bar.o
>> -atoms:
>> -    - name:              bar
>> -      scope:             global
>> -      type:              code
>> -
>> -    - name:              bar2
>> -      type:              code
>> -
>> ----
>> -name: baz.o
>> -atoms:
>> -    - name:              baz
>> -      scope:             global
>> -      type:              code
>> -
>> -    - name:              baz2
>> -      type:              code
>> ----
>> -kind: archive
>> -members:
>> -    - name:    bar.o
>> -    - name:    baz.o
>> +archive:
>> +    - name: bar.o
>> +      atoms:
>> +      - name:              bar
>> +        scope:             global
>> +        type:              code
>> +
>> +      - name:              bar2
>> +        type:              code
>> +
>> +    - name: baz.o
>> +      atoms:
>> +      - name:              baz
>> +        scope:             global
>> +        type:              code
>> +
>> +      - name:              baz2
>> +        type:              code
>> ...
>>
>> # CHECK:       name:       foo
>>
>> Modified: lld/trunk/test/archive-chain.objtxt
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/archive-chain.objtxt?rev=155847&r1=155846&r2=155847&view=diff
>> ==============================================================================
>> --- lld/trunk/test/archive-chain.objtxt (original)
>> +++ lld/trunk/test/archive-chain.objtxt Mon Apr 30 16:20:13 2012
>> @@ -8,60 +8,52 @@
>> atoms:
>>     - name:              foo
>>       type:              code
>> -
>> -    - name:              bar1
>> -      definition:        undefined
>>
>> ----
>> -name: bar1.o
>> -atoms:
>>     - name:              bar1
>> -      scope:             global
>> -      type:              code
>> -
>> -    - name:              bar1b
>> -      type:              code
>> -
>> -    - name:              baz1
>>       definition:        undefined
>> +
>> ---
>> -name: bar2.o
>> -atoms:
>> -    - name:              bar2
>> -      scope:             global
>> -      type:              code
>> -
>> -    - name:              bar2b
>> -      type:              code
>> -
>> ----
>> -name: baz1.o
>> -atoms:
>> -    - name:              baz1
>> -      scope:             global
>> -      type:              code
>> -
>> -    - name:              baz1b
>> -      type:              code
>> ----
>> -name: baz2.o
>> -atoms:
>> -    - name:              baz2
>> -      scope:             global
>> -      type:              code
>> -
>> -    - name:              baz2b
>> -      type:              code
>> ----
>> -kind: archive
>> -members:
>> -    - name:    bar1.o
>> -    - name:    bar2.o
>> +archive:
>> +    - name: bar1.o
>> +    - atoms:
>> +      - name:              bar1
>> +        scope:             global
>> +        type:              code
>> +
>> +      - name:              bar1b
>> +        type:              code
>> +
>> +      - name:              baz1
>> +        definition:        undefined
>> +
>> +    - name: bar2.o
>> +    - atoms:
>> +      - name:              bar2
>> +        scope:             global
>> +        type:              code
>> +
>> +      - name:              bar2b
>> +        type:              code
>> +
>> ---
>> -kind: archive
>> -members:
>> -    - name:    baz1.o
>> -    - name:    baz2.o
>> +archive:
>> +    - name: baz1.o
>> +    - atoms:
>> +      - name:              baz1
>> +        scope:             global
>> +        type:              code
>> +
>> +      - name:              baz1b
>> +        type:              code
>> +
>> +    - name: baz2.o
>> +    - atoms:
>> +      - name:              baz2
>> +        scope:             global
>> +        type:              code
>> +
>> +      - name:              baz2b
>> +        type:              code
>> ...
>>
>> # CHECK:       name:       foo
>>
>> Modified: lld/trunk/test/archive-tentdef-search.objtxt
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/archive-tentdef-search.objtxt?rev=155847&r1=155846&r2=155847&view=diff
>> ==============================================================================
>> --- lld/trunk/test/archive-tentdef-search.objtxt (original)
>> +++ lld/trunk/test/archive-tentdef-search.objtxt Mon Apr 30 16:20:13 2012
>> @@ -11,26 +11,22 @@
>> atoms:
>>     - name:              foo
>>       type:              code
>> -
>> +
>>     - name:              bar
>>       scope:             global
>>       content:           zero-fill
>>       merge:             asTentative
>>
>> ---
>> -name: bar.o
>> -atoms:
>> -    - name:              bar
>> -      scope:             global
>> -      type:              data
>> -
>> -    - name:              bar2
>> -      type:              data
>> -
>> ----
>> -kind: archive
>> -members:
>> -    - name:    bar.o
>> +archive:
>> +    - name: bar.o
>> +    - atoms:
>> +      - name:              bar
>> +        scope:             global
>> +        type:              data
>> +
>> +      - name:              bar2
>> +        type:              data
>> ...
>>
>> # CHK1:       name:       foo
>>
>> Modified: lld/trunk/tools/lld-core/lld-core.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/tools/lld-core/lld-core.cpp?rev=155847&r1=155846&r2=155847&view=diff
>> ==============================================================================
>> --- lld/trunk/tools/lld-core/lld-core.cpp (original)
>> +++ lld/trunk/tools/lld-core/lld-core.cpp Mon Apr 30 16:20:13 2012
>> @@ -422,7 +422,7 @@
>>   llvm::cl::ParseCommandLineOptions(argc, argv);
>>
>>   // create platform for testing
>> -  Platform* platform = NULL;
>> +  Platform* platform = nullptr;
>>   switch ( platformSelected ) {
>>     case platformTesting:
>>       platform = new TestingPlatform();
>> @@ -433,7 +433,7 @@
>>   }
>>
>>   // read input YAML doc into object file(s)
>> -  std::vector<const File *> files;
>> +  std::vector<std::unique_ptr<const File>> files;
>>   if (error(yaml::parseObjectTextFileOrSTDIN(cmdLineInputFilePath,
>>                                             *platform, files))) {
>>     return 1;
>> @@ -444,7 +444,7 @@
>>
>>   // create object to mange input files
>>   InputFiles inputFiles;
>> -  for (const File *file : files) {
>> +  for (const auto &file : files) {
>>     inputFiles.appendFile(*file);
>>   }
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list