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:
parent
69a45b21be
commit
3d0e8f94de
@ -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 ||
|
||||
|
@ -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() {
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user