[llvm] ababcd2 - [llvm-objcopy][NFC] refactor error handling. part 2.
Alexey Lapshin via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 27 04:22:26 PDT 2020
Author: Alexey Lapshin
Date: 2020-09-27T14:21:45+03:00
New Revision: ababcd2ab4910a4ea2ba5695c0088a1bdcd974b6
URL: https://github.com/llvm/llvm-project/commit/ababcd2ab4910a4ea2ba5695c0088a1bdcd974b6
DIFF: https://github.com/llvm/llvm-project/commit/ababcd2ab4910a4ea2ba5695c0088a1bdcd974b6.diff
LOG: [llvm-objcopy][NFC] refactor error handling. part 2.
Remove usages of special error reporting functions(error(),
reportError()). This patch is extracted from D87987.
Errors are reported as Expected<>/Error returning values.
This part is for COFF subfolder of llvm-objcopy.
Testing: check-all.
Differential Revision: https://reviews.llvm.org/D88213
Added:
Modified:
llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
llvm/tools/llvm-objcopy/COFF/Object.cpp
llvm/tools/llvm-objcopy/COFF/Object.h
Removed:
################################################################################
diff --git a/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp b/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
index 43ec2b1fa82f..94325c5f63a2 100644
--- a/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
+++ b/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
@@ -40,11 +40,12 @@ static uint64_t getNextRVA(const Object &Obj) {
Obj.IsPE ? Obj.PeHeader.SectionAlignment : 1);
}
-static std::vector<uint8_t> createGnuDebugLinkSectionContents(StringRef File) {
+static Expected<std::vector<uint8_t>>
+createGnuDebugLinkSectionContents(StringRef File) {
ErrorOr<std::unique_ptr<MemoryBuffer>> LinkTargetOrErr =
MemoryBuffer::getFile(File);
if (!LinkTargetOrErr)
- error("'" + File + "': " + LinkTargetOrErr.getError().message());
+ return createFileError(File, LinkTargetOrErr.getError());
auto LinkTarget = std::move(*LinkTargetOrErr);
uint32_t CRC32 = llvm::crc32(arrayRefFromStringRef(LinkTarget->getBuffer()));
@@ -81,12 +82,17 @@ static void addSection(Object &Obj, StringRef Name, ArrayRef<uint8_t> Contents,
Obj.addSections(Sec);
}
-static void addGnuDebugLink(Object &Obj, StringRef DebugLinkFile) {
- std::vector<uint8_t> Contents =
+static Error addGnuDebugLink(Object &Obj, StringRef DebugLinkFile) {
+ Expected<std::vector<uint8_t>> Contents =
createGnuDebugLinkSectionContents(DebugLinkFile);
- addSection(Obj, ".gnu_debuglink", Contents,
+ if (!Contents)
+ return Contents.takeError();
+
+ addSection(Obj, ".gnu_debuglink", *Contents,
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
IMAGE_SCN_MEM_DISCARDABLE);
+
+ return Error::success();
}
static void setSectionFlags(Section &Sec, SectionFlag AllFlags) {
@@ -174,8 +180,7 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
Sym.Name = I->getValue();
}
- // Actually do removals of symbols.
- Obj.removeSymbols([&](const Symbol &Sym) {
+ auto ToRemove = [&](const Symbol &Sym) -> Expected<bool> {
// For StripAll, all relocations have been stripped and we remove all
// symbols.
if (Config.StripAll || Config.StripAllGNU)
@@ -184,11 +189,10 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
if (Config.SymbolsToRemove.matches(Sym.Name)) {
// Explicitly removing a referenced symbol is an error.
if (Sym.Referenced)
- reportError(Config.OutputFilename,
- createStringError(llvm::errc::invalid_argument,
- "not stripping symbol '%s' because it is "
- "named in a relocation",
- Sym.Name.str().c_str()));
+ return createStringError(
+ llvm::errc::invalid_argument,
+ "'" + Config.OutputFilename + "': not stripping symbol '" +
+ Sym.Name.str() + "' because it is named in a relocation");
return true;
}
@@ -213,7 +217,11 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
}
return false;
- });
+ };
+
+ // Actually do removals of symbols.
+ if (Error Err = Obj.removeSymbols(ToRemove))
+ return Err;
if (!Config.SetSectionFlags.empty())
for (Section &Sec : Obj.getMutableSections()) {
@@ -239,7 +247,8 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
}
if (!Config.AddGnuDebugLink.empty())
- addGnuDebugLink(Obj, Config.AddGnuDebugLink);
+ if (Error E = addGnuDebugLink(Obj, Config.AddGnuDebugLink))
+ return E;
if (Config.AllowBrokenLinks || !Config.BuildIdLinkDir.empty() ||
Config.BuildIdLinkInput || Config.BuildIdLinkOutput ||
diff --git a/llvm/tools/llvm-objcopy/COFF/Object.cpp b/llvm/tools/llvm-objcopy/COFF/Object.cpp
index b07532c1dc39..2a57f9707055 100644
--- a/llvm/tools/llvm-objcopy/COFF/Object.cpp
+++ b/llvm/tools/llvm-objcopy/COFF/Object.cpp
@@ -37,12 +37,23 @@ const Symbol *Object::findSymbol(size_t UniqueId) const {
return It->second;
}
-void Object::removeSymbols(function_ref<bool(const Symbol &)> ToRemove) {
- Symbols.erase(
- std::remove_if(std::begin(Symbols), std::end(Symbols),
- [ToRemove](const Symbol &Sym) { return ToRemove(Sym); }),
- std::end(Symbols));
+Error Object::removeSymbols(
+ function_ref<Expected<bool>(const Symbol &)> ToRemove) {
+ Error Errs = Error::success();
+ Symbols.erase(std::remove_if(std::begin(Symbols), std::end(Symbols),
+ [ToRemove, &Errs](const Symbol &Sym) {
+ Expected<bool> ShouldRemove = ToRemove(Sym);
+ if (!ShouldRemove) {
+ Errs = joinErrors(std::move(Errs),
+ ShouldRemove.takeError());
+ return false;
+ }
+ return *ShouldRemove;
+ }),
+ std::end(Symbols));
+
updateSymbols();
+ return Errs;
}
Error Object::markSymbols() {
diff --git a/llvm/tools/llvm-objcopy/COFF/Object.h b/llvm/tools/llvm-objcopy/COFF/Object.h
index 78f8da00b8cd..31233783a90a 100644
--- a/llvm/tools/llvm-objcopy/COFF/Object.h
+++ b/llvm/tools/llvm-objcopy/COFF/Object.h
@@ -116,7 +116,7 @@ struct Object {
const Symbol *findSymbol(size_t UniqueId) const;
void addSymbols(ArrayRef<Symbol> NewSymbols);
- void removeSymbols(function_ref<bool(const Symbol &)> ToRemove);
+ Error removeSymbols(function_ref<Expected<bool>(const Symbol &)> ToRemove);
// Set the Referenced field on all Symbols, based on relocations in
// all sections.
More information about the llvm-commits
mailing list