From: Reid Kleckner Date: Fri, 5 Jun 2020 20:32:33 +0000 (-0700) Subject: Migrate Binary::checkOffset from error_code to Error, NFC X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=74bd98829d82312676a60c5c2d142e20691b2f13;p=platform%2Fupstream%2Fllvm.git Migrate Binary::checkOffset from error_code to Error, NFC In my use case, this saved 100ms of time doing one-time-initialization for std::error_code(). --- diff --git a/llvm/include/llvm/Object/Binary.h b/llvm/include/llvm/Object/Binary.h index aa5e718..e95516f 100644 --- a/llvm/include/llvm/Object/Binary.h +++ b/llvm/include/llvm/Object/Binary.h @@ -160,14 +160,14 @@ public: return Triple::UnknownObjectFormat; } - static std::error_code checkOffset(MemoryBufferRef M, uintptr_t Addr, - const uint64_t Size) { + static Error checkOffset(MemoryBufferRef M, uintptr_t Addr, + const uint64_t Size) { if (Addr + Size < Addr || Addr + Size < Size || Addr + Size > uintptr_t(M.getBufferEnd()) || Addr < uintptr_t(M.getBufferStart())) { - return object_error::unexpected_eof; + return errorCodeToError(object_error::unexpected_eof); } - return std::error_code(); + return Error::success(); } }; diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h index d7fdc52..62ecd8b 100644 --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -744,10 +744,10 @@ ELFObjectFile::getSectionContents(DataRefImpl Sec) const { const Elf_Shdr *EShdr = getSection(Sec); if (EShdr->sh_type == ELF::SHT_NOBITS) return makeArrayRef((const uint8_t *)base(), 0); - if (std::error_code EC = + if (Error E = checkOffset(getMemoryBufferRef(), (uintptr_t)base() + EShdr->sh_offset, EShdr->sh_size)) - return errorCodeToError(EC); + return std::move(E); return makeArrayRef((const uint8_t *)base() + EShdr->sh_offset, EShdr->sh_size); } diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 78bcfb1..3d12959 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -59,8 +59,8 @@ static std::error_code getObject(const T *&Obj, MemoryBufferRef M, const void *Ptr, const uint64_t Size = sizeof(T)) { uintptr_t Addr = uintptr_t(Ptr); - if (std::error_code EC = Binary::checkOffset(M, Addr, Size)) - return EC; + if (Error E = Binary::checkOffset(M, Addr, Size)) + return errorToErrorCode(std::move(E)); Obj = reinterpret_cast(Addr); return std::error_code(); } @@ -374,9 +374,11 @@ getFirstReloc(const coff_section *Sec, MemoryBufferRef M, const uint8_t *Base) { // relocations. begin++; } - if (Binary::checkOffset(M, uintptr_t(begin), - sizeof(coff_relocation) * NumRelocs)) + if (auto E = Binary::checkOffset(M, uintptr_t(begin), + sizeof(coff_relocation) * NumRelocs)) { + consumeError(std::move(E)); return nullptr; + } return begin; } @@ -555,8 +557,8 @@ std::error_code COFFObjectFile::initImportTablePtr() { uintptr_t IntPtr = 0; if (std::error_code EC = getRvaPtr(ImportTableRva, IntPtr)) return EC; - if (std::error_code EC = checkOffset(Data, IntPtr, DataEntry->Size)) - return EC; + if (Error E = checkOffset(Data, IntPtr, DataEntry->Size)) + return errorToErrorCode(std::move(E)); ImportDirectory = reinterpret_cast< const coff_import_directory_table_entry *>(IntPtr); return std::error_code(); @@ -1093,8 +1095,8 @@ Error COFFObjectFile::getSectionContents(const coff_section *Sec, // data, as there's nothing that says that is not allowed. uintptr_t ConStart = uintptr_t(base()) + Sec->PointerToRawData; uint32_t SectionSize = getSectionSize(Sec); - if (checkOffset(Data, ConStart, SectionSize)) - return make_error(); + if (Error E = checkOffset(Data, ConStart, SectionSize)) + return E; Res = makeArrayRef(reinterpret_cast(ConStart), SectionSize); return Error::success(); } diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp index d41afc8..f75291d 100644 --- a/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/llvm/lib/Object/XCOFFObjectFile.cpp @@ -29,8 +29,8 @@ template static Expected getObject(MemoryBufferRef M, const void *Ptr, const uint64_t Size = sizeof(T)) { uintptr_t Addr = uintptr_t(Ptr); - if (std::error_code EC = Binary::checkOffset(M, Addr, Size)) - return errorCodeToError(EC); + if (Error E = Binary::checkOffset(M, Addr, Size)) + return std::move(E); return reinterpret_cast(Addr); }