[lld] r264974 - Convert a few macho reader/writer helpers to new error handling. NFC.

Pete Cooper via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 30 17:44:35 PDT 2016


Should all be fixed in r264977/r264978.

Cheers,
Pete
> On Mar 30, 2016, at 5:18 PM, Pete Cooper via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Hey Rui
> 
> Had no idea that flag existed.  Thanks for pointing it out.  I’ll rebuild with it now.
> 
> Cheers,
> Pete
>> On Mar 30, 2016, at 5:17 PM, Rui Ueyama <ruiu at google.com <mailto:ruiu at google.com>> wrote:
>> 
>> Hi Pete,
>> 
>> This patch is not clean in terms of -Wpessimizing-move. Can you compile with that flag? (I can do this for you, but I expect that you are going to submit more patches like this soon.)
>> 
>> On Wed, Mar 30, 2016 at 5:08 PM, Pete Cooper via llvm-commits <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
>> Author: pete
>> Date: Wed Mar 30 19:08:16 2016
>> New Revision: 264974
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=264974&view=rev <http://llvm.org/viewvc/llvm-project?rev=264974&view=rev>
>> Log:
>> Convert a few macho reader/writer helpers to new error handling.  NFC.
>> 
>> These methods were responsible for some of the few remaining calls
>> to llvm::errorCodeToError.  Converting them makes us have more Error's
>> in the api and fewer error_code's.
>> 
>> Modified:
>>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
>>     lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
>> 
>> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp?rev=264974&r1=264973&r2=264974&view=diff <http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp?rev=264974&r1=264973&r2=264974&view=diff>
>> ==============================================================================
>> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp (original)
>> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp Wed Mar 30 19:08:16 2016
>> @@ -53,7 +53,7 @@ namespace mach_o {
>>  namespace normalized {
>> 
>>  // Utility to call a lambda expression on each load command.
>> -static std::error_code forEachLoadCommand(
>> +static llvm::Error forEachLoadCommand(
>>      StringRef lcRange, unsigned lcCount, bool isBig, bool is64,
>>      std::function<bool(uint32_t cmd, uint32_t size, const char *lc)> func) {
>>    const char* p = lcRange.begin();
>> @@ -67,15 +67,15 @@ static std::error_code forEachLoadComman
>>        slc = &lcCopy;
>>      }
>>      if ( (p + slc->cmdsize) > lcRange.end() )
>> -      return make_error_code(llvm::errc::executable_format_error);
>> +      return llvm::make_error<GenericError>("Load command exceeds range");
>> 
>>      if (func(slc->cmd, slc->cmdsize, p))
>> -      return std::error_code();
>> +      return llvm::Error();
>> 
>>      p += slc->cmdsize;
>>    }
>> 
>> -  return std::error_code();
>> +  return llvm::Error();
>>  }
>> 
>>  static std::error_code appendRelocations(Relocations &relocs, StringRef buffer,
>> @@ -257,9 +257,9 @@ readBinary(std::unique_ptr<MemoryBuffer>
>>    // Pre-scan load commands looking for indirect symbol table.
>>    uint32_t indirectSymbolTableOffset = 0;
>>    uint32_t indirectSymbolTableCount = 0;
>> -  std::error_code ec = forEachLoadCommand(lcRange, lcCount, isBig, is64,
>> -                                          [&](uint32_t cmd, uint32_t size,
>> -                                              const char *lc) -> bool {
>> +  auto ec = forEachLoadCommand(lcRange, lcCount, isBig, is64,
>> +                               [&](uint32_t cmd, uint32_t size,
>> +                                   const char *lc) -> bool {
>>      if (cmd == LC_DYSYMTAB) {
>>        const dysymtab_command *d = reinterpret_cast<const dysymtab_command*>(lc);
>>        indirectSymbolTableOffset = read32(&d->indirectsymoff, isBig);
>> @@ -269,7 +269,7 @@ readBinary(std::unique_ptr<MemoryBuffer>
>>      return false;
>>    });
>>    if (ec)
>> -    return llvm::errorCodeToError(ec);
>> +    return std::move(ec);
>> 
>>    // Walk load commands looking for segments/sections and the symbol table.
>>    const data_in_code_entry *dataInCode = nullptr;
>> @@ -485,7 +485,7 @@ readBinary(std::unique_ptr<MemoryBuffer>
>>      return false;
>>    });
>>    if (ec)
>> -    return llvm::errorCodeToError(ec);
>> +    return std::move(ec);
>> 
>>    if (dataInCode) {
>>      // Convert on-disk data_in_code_entry array to DataInCode vector.
>> 
>> Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=264974&r1=264973&r2=264974&view=diff <http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=264974&r1=264973&r2=264974&view=diff>
>> ==============================================================================
>> --- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp (original)
>> +++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp Wed Mar 30 19:08:16 2016
>> @@ -139,7 +139,7 @@ private:
>>    uint32_t    loadCommandsSize(uint32_t &count);
>>    void        buildFileOffsets();
>>    void        writeMachHeader();
>> -  std::error_code writeLoadCommands();
>> +  llvm::Error writeLoadCommands();
>>    void        writeSectionContent();
>>    void        writeRelocations();
>>    void        writeSymbolTable();
>> @@ -179,8 +179,8 @@ private:
>>    };
>> 
>>    template <typename T>
>> -  std::error_code writeSingleSegmentLoadCommand(uint8_t *&lc);
>> -  template <typename T> std::error_code writeSegmentLoadCommands(uint8_t *&lc);
>> +  llvm::Error writeSingleSegmentLoadCommand(uint8_t *&lc);
>> +  template <typename T> llvm::Error writeSegmentLoadCommands(uint8_t *&lc);
>> 
>>    uint32_t pointerAlign(uint32_t value);
>>    static StringRef dyldPath();
>> @@ -628,7 +628,7 @@ uint32_t MachOFileLayout::indirectSymbol
>>  }
>> 
>>  template <typename T>
>> -std::error_code MachOFileLayout::writeSingleSegmentLoadCommand(uint8_t *&lc) {
>> +llvm::Error MachOFileLayout::writeSingleSegmentLoadCommand(uint8_t *&lc) {
>>    typename T::command* seg = reinterpret_cast<typename T::command*>(lc);
>>    seg->cmd = T::LC;
>>    seg->cmdsize = sizeof(typename T::command)
>> @@ -668,11 +668,11 @@ std::error_code MachOFileLayout::writeSi
>>      ++sout;
>>    }
>>    lc = next;
>> -  return std::error_code();
>> +  return llvm::Error();
>>  }
>> 
>>  template <typename T>
>> -std::error_code MachOFileLayout::writeSegmentLoadCommands(uint8_t *&lc) {
>> +llvm::Error MachOFileLayout::writeSegmentLoadCommands(uint8_t *&lc) {
>>    uint32_t indirectSymRunningIndex = 0;
>>    for (const Segment &seg : _file.segments) {
>>      // Link edit has no sections and a custom range of address, so handle it
>> @@ -738,7 +738,7 @@ std::error_code MachOFileLayout::writeSe
>>      }
>>      lc = reinterpret_cast<uint8_t*>(next);
>>    }
>> -  return std::error_code();
>> +  return llvm::Error();
>>  }
>> 
>>  static void writeVersionMinLoadCommand(const NormalizedFile &_file,
>> @@ -773,15 +773,17 @@ static void writeVersionMinLoadCommand(c
>>    lc += sizeof(version_min_command);
>>  }
>> 
>> -std::error_code MachOFileLayout::writeLoadCommands() {
>> -  std::error_code ec;
>> +llvm::Error MachOFileLayout::writeLoadCommands() {
>>    uint8_t *lc = &_buffer[_startOfLoadCommands];
>>    if (_file.fileType == llvm::MachO::MH_OBJECT) {
>>      // Object files have one unnamed segment which holds all sections.
>> -    if (_is64)
>> -      ec = writeSingleSegmentLoadCommand<MachO64Trait>(lc);
>> -    else
>> -      ec = writeSingleSegmentLoadCommand<MachO32Trait>(lc);
>> +    if (_is64) {
>> +     if (auto ec = writeSingleSegmentLoadCommand<MachO64Trait>(lc))
>> +       return std::move(ec);
>> +    } else {
>> +      if (auto ec = writeSingleSegmentLoadCommand<MachO32Trait>(lc))
>> +        return std::move(ec);
>> +    }
>>      // Add LC_SYMTAB with symbol table info
>>      symtab_command* st = reinterpret_cast<symtab_command*>(lc);
>>      st->cmd     = LC_SYMTAB;
>> @@ -824,10 +826,13 @@ std::error_code MachOFileLayout::writeLo
>>      }
>>    } else {
>>      // Final linked images have sections under segments.
>> -    if (_is64)
>> -      ec = writeSegmentLoadCommands<MachO64Trait>(lc);
>> -    else
>> -      ec = writeSegmentLoadCommands<MachO32Trait>(lc);
>> +    if (_is64) {
>> +      if (auto ec = writeSegmentLoadCommands<MachO64Trait>(lc))
>> +        return std::move(ec);
>> +    } else {
>> +      if (auto ec = writeSegmentLoadCommands<MachO32Trait>(lc))
>> +        return std::move(ec);
>> +    }
>> 
>>      // Add LC_ID_DYLIB command for dynamic libraries.
>>      if (_file.fileType == llvm::MachO::MH_DYLIB) {
>> @@ -1012,7 +1017,7 @@ std::error_code MachOFileLayout::writeLo
>>        lc += sizeof(linkedit_data_command);
>>      }
>>    }
>> -  return ec;
>> +  return llvm::Error();
>>  }
>> 
>>  void MachOFileLayout::writeSectionContent() {
>> @@ -1475,9 +1480,8 @@ llvm::Error MachOFileLayout::writeBinary
>>    // Write content.
>>    _buffer = fob->getBufferStart();
>>    writeMachHeader();
>> -  std::error_code ec = writeLoadCommands();
>> -  if (ec)
>> -    return llvm::errorCodeToError(ec);
>> +  if (auto ec = writeLoadCommands())
>> +    return std::move(ec);
>>    writeSectionContent();
>>    writeLinkEditContent();
>>    fob->commit();
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
>> 
> 
> _______________________________________________
> 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/20160330/ab210c79/attachment.html>


More information about the llvm-commits mailing list