[lld] r275362 - [lld] Update LLD for Archive::child_iterator change in LLVM r275361.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 19 17:51:16 PDT 2016


Hi Dave,

This is just std::error_code -> Error conversion plumbing -- lld had to be
updated because some libObject prototypes changed. Eventually the plumbing
will be used to support better error messages for malformed
objects/archives - Kevin Enderby is working on that.

- Lang.


On Mon, Jul 18, 2016 at 11:06 AM, David Blaikie <dblaikie at gmail.com> wrote:

> Any test coverage for the new diagnostics this supports? (does it support
> new diagnostics, or was the lower layer handling the diagnostics previously
> & now it's just moved around but not changed behavior?)
>
> On Wed, Jul 13, 2016 at 7:42 PM Lang Hames via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: lhames
>> Date: Wed Jul 13 21:35:18 2016
>> New Revision: 275362
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=275362&view=rev
>> Log:
>> [lld] Update LLD for Archive::child_iterator change in LLVM r275361.
>>
>> Modified:
>>     lld/trunk/COFF/InputFiles.cpp
>>     lld/trunk/ELF/Driver.cpp
>>     lld/trunk/ELF/Error.cpp
>>     lld/trunk/ELF/Error.h
>>     lld/trunk/include/lld/Core/LLVM.h
>>     lld/trunk/lib/ReaderWriter/FileArchive.cpp
>>
>> Modified: lld/trunk/COFF/InputFiles.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=275362&r1=275361&r2=275362&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/COFF/InputFiles.cpp (original)
>> +++ lld/trunk/COFF/InputFiles.cpp Wed Jul 13 21:35:18 2016
>> @@ -79,11 +79,10 @@ void ArchiveFile::parse() {
>>    // Seen is a map from member files to boolean values. Initially
>>    // all members are mapped to false, which indicates all these files
>>    // are not read yet.
>> -  for (auto &ChildOrErr : File->children()) {
>> -    error(ChildOrErr, "Failed to parse static library");
>> -    const Archive::Child &Child = *ChildOrErr;
>> +  Error Err;
>> +  for (auto &Child : File->children(Err))
>>      Seen[Child.getChildOffset()].clear();
>> -  }
>> +  error(std::move(Err), "Failed to parse static library");
>>  }
>>
>>  // Returns a buffer pointing to a member file containing a given symbol.
>>
>> Modified: lld/trunk/ELF/Driver.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=275362&r1=275361&r2=275362&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/Driver.cpp (original)
>> +++ lld/trunk/ELF/Driver.cpp Wed Jul 13 21:35:18 2016
>> @@ -90,7 +90,8 @@ LinkerDriver::getArchiveMembers(MemoryBu
>>        check(Archive::create(MB), "failed to parse archive");
>>
>>    std::vector<MemoryBufferRef> V;
>> -  for (const ErrorOr<Archive::Child> &COrErr : File->children()) {
>> +  Error Err;
>> +  for (const ErrorOr<Archive::Child> &COrErr : File->children(Err)) {
>>      Archive::Child C = check(COrErr, "could not get the child of the
>> archive " +
>>                                           File->getFileName());
>>      MemoryBufferRef MBRef =
>> @@ -99,6 +100,7 @@ LinkerDriver::getArchiveMembers(MemoryBu
>>                    File->getFileName());
>>      V.push_back(MBRef);
>>    }
>> +  check(std::move(Err));
>>
>>    // Take ownership of memory buffers created for members of thin
>> archives.
>>    for (std::unique_ptr<MemoryBuffer> &MB : File->takeThinBuffers())
>>
>> Modified: lld/trunk/ELF/Error.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Error.cpp?rev=275362&r1=275361&r2=275362&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/Error.cpp (original)
>> +++ lld/trunk/ELF/Error.cpp Wed Jul 13 21:35:18 2016
>> @@ -11,6 +11,7 @@
>>  #include "Config.h"
>>
>>  #include "llvm/ADT/Twine.h"
>> +#include "llvm/Support/Error.h"
>>  #include "llvm/Support/raw_ostream.h"
>>
>>  using namespace llvm;
>> @@ -57,5 +58,9 @@ void check(std::error_code EC) {
>>      fatal(EC.message());
>>  }
>>
>> +void check(Error Err) {
>> +  check(errorToErrorCode(std::move(Err)));
>> +}
>> +
>>  } // namespace elf
>>  } // namespace lld
>>
>> Modified: lld/trunk/ELF/Error.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Error.h?rev=275362&r1=275361&r2=275362&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/Error.h (original)
>> +++ lld/trunk/ELF/Error.h Wed Jul 13 21:35:18 2016
>> @@ -32,6 +32,7 @@ LLVM_ATTRIBUTE_NORETURN void fatal(const
>>  LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg, const Twine
>> &Prefix);
>>
>>  void check(std::error_code EC);
>> +void check(Error Err);
>>
>>  template <class T> T check(ErrorOr<T> EO) {
>>    if (EO)
>> @@ -42,7 +43,7 @@ template <class T> T check(ErrorOr<T> EO
>>  template <class T> T check(Expected<T> EO) {
>>    if (EO)
>>      return std::move(*EO);
>> -  check(errorToErrorCode(EO.takeError()));
>> +  check(EO.takeError());
>>    return T();
>>  }
>>
>>
>> Modified: lld/trunk/include/lld/Core/LLVM.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/LLVM.h?rev=275362&r1=275361&r2=275362&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/include/lld/Core/LLVM.h (original)
>> +++ lld/trunk/include/lld/Core/LLVM.h Wed Jul 13 21:35:18 2016
>> @@ -23,6 +23,7 @@
>>
>>  namespace llvm {
>>    // ADT's.
>> +  class Error;
>>    class StringRef;
>>    class Twine;
>>    class MemoryBuffer;
>> @@ -54,6 +55,7 @@ namespace lld {
>>    using llvm::cast_or_null;
>>
>>    // ADT's.
>> +  using llvm::Error;
>>    using llvm::StringRef;
>>    using llvm::Twine;
>>    using llvm::MemoryBuffer;
>>
>> Modified: lld/trunk/lib/ReaderWriter/FileArchive.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/FileArchive.cpp?rev=275362&r1=275361&r2=275362&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/lib/ReaderWriter/FileArchive.cpp (original)
>> +++ lld/trunk/lib/ReaderWriter/FileArchive.cpp Wed Jul 13 21:35:18 2016
>> @@ -49,12 +49,10 @@ public:
>>      auto member = _symbolMemberMap.find(name);
>>      if (member == _symbolMemberMap.end())
>>        return nullptr;
>> -    Archive::child_iterator ci = member->second;
>> -    if (ci->getError())
>> -      return nullptr;
>> +    Archive::Child c = member->second;
>>
>>      // Don't return a member already returned
>> -    ErrorOr<StringRef> buf = (*ci)->getBuffer();
>> +    ErrorOr<StringRef> buf = c.getBuffer();
>>      if (!buf)
>>        return nullptr;
>>      const char *memberStart = buf->data();
>> @@ -63,7 +61,7 @@ public:
>>      _membersInstantiated.insert(memberStart);
>>
>>      std::unique_ptr<File> result;
>> -    if (instantiateMember(ci, result))
>> +    if (instantiateMember(c, result))
>>        return nullptr;
>>
>>      File *file = result.get();
>> @@ -78,13 +76,20 @@ public:
>>    parseAllMembers(std::vector<std::unique_ptr<File>> &result) override {
>>      if (std::error_code ec = parse())
>>        return ec;
>> -    for (auto mf = _archive->child_begin(), me = _archive->child_end();
>> +    llvm::Error err;
>> +    for (auto mf = _archive->child_begin(err), me =
>> _archive->child_end();
>>           mf != me; ++mf) {
>>        std::unique_ptr<File> file;
>> -      if (std::error_code ec = instantiateMember(mf, file))
>> +      if (std::error_code ec = instantiateMember(*mf, file)) {
>> +        // err is Success (or we wouldn't be in the loop body) but we
>> can't
>> +        // return without testing or consuming it.
>> +        consumeError(std::move(err));
>>          return ec;
>> +      }
>>        result.push_back(std::move(file));
>>      }
>> +    if (err)
>> +      return errorToErrorCode(std::move(err));
>>      return std::error_code();
>>    }
>>
>> @@ -125,12 +130,9 @@ protected:
>>    }
>>
>>  private:
>> -  std::error_code instantiateMember(Archive::child_iterator cOrErr,
>> +  std::error_code instantiateMember(Archive::Child member,
>>                                      std::unique_ptr<File> &result) const
>> {
>> -    if (std::error_code ec = cOrErr->getError())
>> -      return ec;
>> -    Archive::child_iterator member = cOrErr->get();
>> -    ErrorOr<llvm::MemoryBufferRef> mbOrErr =
>> (*member)->getMemoryBufferRef();
>> +    ErrorOr<llvm::MemoryBufferRef> mbOrErr = member.getMemoryBufferRef();
>>      if (std::error_code ec = mbOrErr.getError())
>>        return ec;
>>      llvm::MemoryBufferRef mb = mbOrErr.get();
>> @@ -164,21 +166,21 @@ private:
>>                                         << _archive->getFileName() <<
>> "':\n");
>>      for (const Archive::Symbol &sym : _archive->symbols()) {
>>        StringRef name = sym.getName();
>> -      ErrorOr<Archive::child_iterator> memberOrErr = sym.getMember();
>> +      ErrorOr<Archive::Child> memberOrErr = sym.getMember();
>>        if (std::error_code ec = memberOrErr.getError())
>>          return ec;
>> -      Archive::child_iterator member = memberOrErr.get();
>> +      Archive::Child member = memberOrErr.get();
>>        DEBUG_WITH_TYPE("FileArchive",
>>                        llvm::dbgs()
>>                            << llvm::format("0x%08llX ",
>> -                                          (*member)->getBuffer()->data())
>> +                                          member.getBuffer()->data())
>>                            << "'" << name << "'\n");
>>        _symbolMemberMap.insert(std::make_pair(name, member));
>>      }
>>      return std::error_code();
>>    }
>>
>> -  typedef std::unordered_map<StringRef, Archive::child_iterator>
>> MemberMap;
>> +  typedef std::unordered_map<StringRef, Archive::Child> MemberMap;
>>    typedef std::set<const char *> InstantiatedSet;
>>
>>    std::shared_ptr<MemoryBuffer> _mb;
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160719/3c47b54f/attachment.html>


More information about the llvm-commits mailing list