diff options
-rw-r--r-- | lld/COFF/Chunks.cpp | 2 | ||||
-rw-r--r-- | lld/COFF/Driver.cpp | 3 | ||||
-rw-r--r-- | lld/COFF/InputFiles.cpp | 2 | ||||
-rw-r--r-- | llvm/include/llvm/Object/COFF.h | 8 | ||||
-rw-r--r-- | llvm/include/llvm/Object/ELFObjectFile.h | 15 | ||||
-rw-r--r-- | llvm/include/llvm/Object/MachO.h | 4 | ||||
-rw-r--r-- | llvm/include/llvm/Object/ObjectFile.h | 11 | ||||
-rw-r--r-- | llvm/include/llvm/Object/Wasm.h | 4 | ||||
-rw-r--r-- | llvm/include/llvm/Object/XCOFFObjectFile.h | 4 | ||||
-rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 21 | ||||
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/Object/WasmObjectFile.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/Object/XCOFFObjectFile.cpp | 5 | ||||
-rw-r--r-- | llvm/tools/llvm-objcopy/COFF/Reader.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-objcopy/MachO/MachOReader.cpp | 11 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/COFFDump.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/obj2yaml/coff2yaml.cpp | 4 |
17 files changed, 58 insertions, 59 deletions
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp index 353d9d9ad7d..88ab1103d42 100644 --- a/lld/COFF/Chunks.cpp +++ b/lld/COFF/Chunks.cpp @@ -586,7 +586,7 @@ StringRef SectionChunk::getDebugName() { ArrayRef<uint8_t> SectionChunk::getContents() const { ArrayRef<uint8_t> A; - File->getCOFFObj()->getSectionContents(Header, A); + cantFail(File->getCOFFObj()->getSectionContents(Header, A)); return A; } diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 807bd6f71c9..04db2339c8a 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -863,7 +863,8 @@ static void findKeepUniqueSections() { ArrayRef<Symbol *> Syms = Obj->getSymbols(); if (Obj->AddrsigSec) { ArrayRef<uint8_t> Contents; - Obj->getCOFFObj()->getSectionContents(Obj->AddrsigSec, Contents); + cantFail( + Obj->getCOFFObj()->getSectionContents(Obj->AddrsigSec, Contents)); const uint8_t *Cur = Contents.begin(); while (Cur != Contents.end()) { unsigned Size; diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 168466460ff..7fdb66de33c 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -176,7 +176,7 @@ SectionChunk *ObjFile::readSection(uint32_t SectionNumber, if (Name == ".drectve") { ArrayRef<uint8_t> Data; - COFFObj->getSectionContents(Sec, Data); + cantFail(COFFObj->getSectionContents(Sec, Data)); Directives = StringRef((const char *)Data.data(), Data.size()); return nullptr; } diff --git a/llvm/include/llvm/Object/COFF.h b/llvm/include/llvm/Object/COFF.h index 8e5f714ffab..c53cbc46c74 100644 --- a/llvm/include/llvm/Object/COFF.h +++ b/llvm/include/llvm/Object/COFF.h @@ -901,8 +901,8 @@ protected: uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; - std::error_code getSectionContents(DataRefImpl Sec, - StringRef &Res) const override; + Expected<ArrayRef<uint8_t>> + getSectionContents(DataRefImpl Sec) const override; uint64_t getSectionAlignment(DataRefImpl Sec) const override; bool isSectionCompressed(DataRefImpl Sec) const override; bool isSectionText(DataRefImpl Sec) const override; @@ -1034,8 +1034,8 @@ public: Expected<StringRef> getSectionName(const coff_section *Sec) const; uint64_t getSectionSize(const coff_section *Sec) const; - std::error_code getSectionContents(const coff_section *Sec, - ArrayRef<uint8_t> &Res) const; + Error getSectionContents(const coff_section *Sec, + ArrayRef<uint8_t> &Res) const; uint64_t getImageBase() const; std::error_code getVaPtr(uint64_t VA, uintptr_t &Res) const; diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h index 6884763f661..0aa6c935a83 100644 --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -264,8 +264,8 @@ protected: uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; - std::error_code getSectionContents(DataRefImpl Sec, - StringRef &Res) const override; + Expected<ArrayRef<uint8_t>> + getSectionContents(DataRefImpl Sec) const override; uint64_t getSectionAlignment(DataRefImpl Sec) const override; bool isSectionCompressed(DataRefImpl Sec) const override; bool isSectionText(DataRefImpl Sec) const override; @@ -701,16 +701,15 @@ uint64_t ELFObjectFile<ELFT>::getSectionSize(DataRefImpl Sec) const { } template <class ELFT> -std::error_code -ELFObjectFile<ELFT>::getSectionContents(DataRefImpl Sec, - StringRef &Result) const { +Expected<ArrayRef<uint8_t>> +ELFObjectFile<ELFT>::getSectionContents(DataRefImpl Sec) const { const Elf_Shdr *EShdr = getSection(Sec); if (std::error_code EC = checkOffset(getMemoryBufferRef(), (uintptr_t)base() + EShdr->sh_offset, EShdr->sh_size)) - return EC; - Result = StringRef((const char *)base() + EShdr->sh_offset, EShdr->sh_size); - return std::error_code(); + return errorCodeToError(EC); + return makeArrayRef((const uint8_t *)base() + EShdr->sh_offset, + EShdr->sh_size); } template <class ELFT> diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h index ce636a6d278..17edd9cfefb 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -297,8 +297,8 @@ public: uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; - std::error_code getSectionContents(DataRefImpl Sec, - StringRef &Res) const override; + Expected<ArrayRef<uint8_t>> + getSectionContents(DataRefImpl Sec) const override; uint64_t getSectionAlignment(DataRefImpl Sec) const override; Expected<SectionRef> getSection(unsigned SectionIndex) const; Expected<SectionRef> getSection(StringRef SectionName) const; diff --git a/llvm/include/llvm/Object/ObjectFile.h b/llvm/include/llvm/Object/ObjectFile.h index c1c2d833436..14b68efee5f 100644 --- a/llvm/include/llvm/Object/ObjectFile.h +++ b/llvm/include/llvm/Object/ObjectFile.h @@ -262,8 +262,8 @@ protected: virtual uint64_t getSectionAddress(DataRefImpl Sec) const = 0; virtual uint64_t getSectionIndex(DataRefImpl Sec) const = 0; virtual uint64_t getSectionSize(DataRefImpl Sec) const = 0; - virtual std::error_code getSectionContents(DataRefImpl Sec, - StringRef &Res) const = 0; + virtual Expected<ArrayRef<uint8_t>> + getSectionContents(DataRefImpl Sec) const = 0; virtual uint64_t getSectionAlignment(DataRefImpl Sec) const = 0; virtual bool isSectionCompressed(DataRefImpl Sec) const = 0; virtual bool isSectionText(DataRefImpl Sec) const = 0; @@ -455,7 +455,12 @@ inline uint64_t SectionRef::getSize() const { } inline std::error_code SectionRef::getContents(StringRef &Result) const { - return OwningObject->getSectionContents(SectionPimpl, Result); + Expected<ArrayRef<uint8_t>> Res = + OwningObject->getSectionContents(SectionPimpl); + if (!Res) + return errorToErrorCode(Res.takeError()); + Result = StringRef(reinterpret_cast<const char *>(Res->data()), Res->size()); + return std::error_code(); } inline uint64_t SectionRef::getAlignment() const { diff --git a/llvm/include/llvm/Object/Wasm.h b/llvm/include/llvm/Object/Wasm.h index f778526657d..e130ea32ed2 100644 --- a/llvm/include/llvm/Object/Wasm.h +++ b/llvm/include/llvm/Object/Wasm.h @@ -175,8 +175,8 @@ public: uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; - std::error_code getSectionContents(DataRefImpl Sec, - StringRef &Res) const override; + Expected<ArrayRef<uint8_t>> + getSectionContents(DataRefImpl Sec) const override; uint64_t getSectionAlignment(DataRefImpl Sec) const override; bool isSectionCompressed(DataRefImpl Sec) const override; bool isSectionText(DataRefImpl Sec) const override; diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h b/llvm/include/llvm/Object/XCOFFObjectFile.h index 36429b989d7..33a13bc2c10 100644 --- a/llvm/include/llvm/Object/XCOFFObjectFile.h +++ b/llvm/include/llvm/Object/XCOFFObjectFile.h @@ -90,8 +90,8 @@ public: uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionIndex(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override; - std::error_code getSectionContents(DataRefImpl Sec, - StringRef &Res) const override; + Expected<ArrayRef<uint8_t>> + getSectionContents(DataRefImpl Sec) const override; uint64_t getSectionAlignment(DataRefImpl Sec) const override; bool isSectionCompressed(DataRefImpl Sec) const override; bool isSectionText(DataRefImpl Sec) const override; diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index ccb861cb187..854664e679d 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -292,13 +292,13 @@ uint64_t COFFObjectFile::getSectionSize(DataRefImpl Ref) const { return getSectionSize(toSec(Ref)); } -std::error_code COFFObjectFile::getSectionContents(DataRefImpl Ref, - StringRef &Result) const { +Expected<ArrayRef<uint8_t>> +COFFObjectFile::getSectionContents(DataRefImpl Ref) const { const coff_section *Sec = toSec(Ref); ArrayRef<uint8_t> Res; - std::error_code EC = getSectionContents(Sec, Res); - Result = StringRef(reinterpret_cast<const char*>(Res.data()), Res.size()); - return EC; + if (Error E = getSectionContents(Sec, Res)) + return std::move(E); + return Res; } uint64_t COFFObjectFile::getSectionAlignment(DataRefImpl Ref) const { @@ -1118,22 +1118,21 @@ uint64_t COFFObjectFile::getSectionSize(const coff_section *Sec) const { return Sec->SizeOfRawData; } -std::error_code -COFFObjectFile::getSectionContents(const coff_section *Sec, - ArrayRef<uint8_t> &Res) const { +Error COFFObjectFile::getSectionContents(const coff_section *Sec, + ArrayRef<uint8_t> &Res) const { // In COFF, a virtual section won't have any in-file // content, so the file pointer to the content will be zero. if (Sec->PointerToRawData == 0) - return std::error_code(); + return Error::success(); // The only thing that we need to verify is that the contents is contained // within the file bounds. We don't need to make sure it doesn't cover other // 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 object_error::parse_failed; + return make_error<BinaryError>(); Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), SectionSize); - return std::error_code(); + return Error::success(); } const coff_relocation *COFFObjectFile::toRel(DataRefImpl Rel) const { diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 1aa57bbbc76..d8bcf10f075 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -1907,8 +1907,8 @@ uint64_t MachOObjectFile::getSectionSize(DataRefImpl Sec) const { return SectSize; } -std::error_code MachOObjectFile::getSectionContents(DataRefImpl Sec, - StringRef &Res) const { +Expected<ArrayRef<uint8_t>> +MachOObjectFile::getSectionContents(DataRefImpl Sec) const { uint32_t Offset; uint64_t Size; @@ -1922,8 +1922,7 @@ std::error_code MachOObjectFile::getSectionContents(DataRefImpl Sec, Size = Sect.size; } - Res = this->getData().substr(Offset, Size); - return std::error_code(); + return arrayRefFromStringRef(getData().substr(Offset, Size)); } uint64_t MachOObjectFile::getSectionAlignment(DataRefImpl Sec) const { diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index 1c56ee6652a..82aa1830dce 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -1427,14 +1427,12 @@ uint64_t WasmObjectFile::getSectionSize(DataRefImpl Sec) const { return S.Content.size(); } -std::error_code WasmObjectFile::getSectionContents(DataRefImpl Sec, - StringRef &Res) const { +Expected<ArrayRef<uint8_t>> +WasmObjectFile::getSectionContents(DataRefImpl Sec) const { const WasmSection &S = Sections[Sec.d.a]; // This will never fail since wasm sections can never be empty (user-sections // must have a name and non-user sections each have a defined structure). - Res = StringRef(reinterpret_cast<const char *>(S.Content.data()), - S.Content.size()); - return std::error_code(); + return S.Content; } uint64_t WasmObjectFile::getSectionAlignment(DataRefImpl Sec) const { diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp index 2a456538966..db57fbad002 100644 --- a/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/llvm/lib/Object/XCOFFObjectFile.cpp @@ -137,10 +137,9 @@ uint64_t XCOFFObjectFile::getSectionSize(DataRefImpl Sec) const { return toSection(Sec)->SectionSize; } -std::error_code XCOFFObjectFile::getSectionContents(DataRefImpl Sec, - StringRef &Res) const { +Expected<ArrayRef<uint8_t>> +XCOFFObjectFile::getSectionContents(DataRefImpl Sec) const { llvm_unreachable("Not yet implemented!"); - return std::error_code(); } uint64_t XCOFFObjectFile::getSectionAlignment(DataRefImpl Sec) const { diff --git a/llvm/tools/llvm-objcopy/COFF/Reader.cpp b/llvm/tools/llvm-objcopy/COFF/Reader.cpp index 774427a7704..a9511c5bd59 100644 --- a/llvm/tools/llvm-objcopy/COFF/Reader.cpp +++ b/llvm/tools/llvm-objcopy/COFF/Reader.cpp @@ -69,8 +69,8 @@ Error COFFReader::readSections(Object &Obj) const { Section &S = Sections.back(); S.Header = *Sec; ArrayRef<uint8_t> Contents; - if (auto EC = COFFObj.getSectionContents(Sec, Contents)) - return errorCodeToError(EC); + if (Error E = COFFObj.getSectionContents(Sec, Contents)) + return E; S.setContentsRef(Contents); ArrayRef<coff_relocation> Relocs = COFFObj.getRelocations(Sec); for (const coff_relocation &R : Relocs) diff --git a/llvm/tools/llvm-objcopy/MachO/MachOReader.cpp b/llvm/tools/llvm-objcopy/MachO/MachOReader.cpp index 39702cda4eb..2a1c586bf77 100644 --- a/llvm/tools/llvm-objcopy/MachO/MachOReader.cpp +++ b/llvm/tools/llvm-objcopy/MachO/MachOReader.cpp @@ -85,11 +85,12 @@ extractSections(const object::MachOObjectFile::LoadCommandInfo &LoadCmd, if (!SecRef) reportError(MachOObj.getFileName(), SecRef.takeError()); - StringRef Content; - if (auto EC = - MachOObj.getSectionContents(SecRef->getRawDataRefImpl(), Content)) - reportError(MachOObj.getFileName(), std::move(EC)); - S.Content = Content; + if (Expected<ArrayRef<uint8_t>> E = + MachOObj.getSectionContents(SecRef->getRawDataRefImpl())) + S.Content = + StringRef(reinterpret_cast<const char *>(E->data()), E->size()); + else + reportError(MachOObj.getFileName(), E.takeError()); S.Relocations.reserve(S.NReloc); for (auto RI = MachOObj.section_rel_begin(SecRef->getRawDataRefImpl()), diff --git a/llvm/tools/llvm-objdump/COFFDump.cpp b/llvm/tools/llvm-objdump/COFFDump.cpp index a81068c2ca4..1ba0a68902c 100644 --- a/llvm/tools/llvm-objdump/COFFDump.cpp +++ b/llvm/tools/llvm-objdump/COFFDump.cpp @@ -198,9 +198,7 @@ getSectionContents(const COFFObjectFile *Obj, const coff_section *Section; if (Error E = resolveSectionAndAddress(Obj, Sym, Section, Addr)) return E; - if (std::error_code EC = Obj->getSectionContents(Section, Contents)) - return errorCodeToError(EC); - return Error::success(); + return Obj->getSectionContents(Section, Contents); } // Given a vector of relocations for a section and an offset into this section diff --git a/llvm/tools/obj2yaml/coff2yaml.cpp b/llvm/tools/obj2yaml/coff2yaml.cpp index 5be6f3e0506..a05840f80bb 100644 --- a/llvm/tools/obj2yaml/coff2yaml.cpp +++ b/llvm/tools/obj2yaml/coff2yaml.cpp @@ -120,7 +120,7 @@ initializeFileAndStringTable(const llvm::object::COFFObjectFile &Obj, const object::coff_section *COFFSection = Obj.getCOFFSection(S); - Obj.getSectionContents(COFFSection, sectionData); + cantFail(Obj.getSectionContents(COFFSection, sectionData)); BinaryStreamReader Reader(sectionData, support::little); uint32_t Magic; @@ -175,7 +175,7 @@ void COFFDumper::dumpSections(unsigned NumSections) { ArrayRef<uint8_t> sectionData; if (!ObjSection.isBSS()) - Obj.getSectionContents(COFFSection, sectionData); + cantFail(Obj.getSectionContents(COFFSection, sectionData)); NewYAMLSection.SectionData = yaml::BinaryRef(sectionData); if (NewYAMLSection.Name == ".debug$S") |