1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

[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
This commit is contained in:
Alexey Lapshin 2020-09-23 20:04:52 +03:00
parent 69a45b21be
commit 3d0e8f94de
3 changed files with 40 additions and 20 deletions

View File

@ -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 ||

View File

@ -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() {

View File

@ -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.