summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/Chunks.cpp2
-rw-r--r--lld/COFF/Driver.cpp3
-rw-r--r--lld/COFF/InputFiles.cpp2
-rw-r--r--llvm/include/llvm/Object/COFF.h8
-rw-r--r--llvm/include/llvm/Object/ELFObjectFile.h15
-rw-r--r--llvm/include/llvm/Object/MachO.h4
-rw-r--r--llvm/include/llvm/Object/ObjectFile.h11
-rw-r--r--llvm/include/llvm/Object/Wasm.h4
-rw-r--r--llvm/include/llvm/Object/XCOFFObjectFile.h4
-rw-r--r--llvm/lib/Object/COFFObjectFile.cpp21
-rw-r--r--llvm/lib/Object/MachOObjectFile.cpp7
-rw-r--r--llvm/lib/Object/WasmObjectFile.cpp8
-rw-r--r--llvm/lib/Object/XCOFFObjectFile.cpp5
-rw-r--r--llvm/tools/llvm-objcopy/COFF/Reader.cpp4
-rw-r--r--llvm/tools/llvm-objcopy/MachO/MachOReader.cpp11
-rw-r--r--llvm/tools/llvm-objdump/COFFDump.cpp4
-rw-r--r--llvm/tools/obj2yaml/coff2yaml.cpp4
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")
OpenPOWER on IntegriCloud