Support: Use Expected<T>::moveInto() in a few places

These are some usage examples for `Expected<T>::moveInto()`.

Differential Revision: https://reviews.llvm.org/D112280
This commit is contained in:
Duncan P. N. Exon Smith 2021-10-21 15:57:15 -07:00
parent c4ba1108dd
commit 2410fb4616
5 changed files with 24 additions and 33 deletions

View File

@ -1657,16 +1657,17 @@ void clang::EmitBackendOutput(DiagnosticsEngine &Diags,
// If we are performing a ThinLTO importing compile, load the function index
// into memory and pass it into runThinLTOBackend, which will run the
// function importer and invoke LTO passes.
Expected<std::unique_ptr<ModuleSummaryIndex>> IndexOrErr =
llvm::getModuleSummaryIndexForFile(CGOpts.ThinLTOIndexFile,
/*IgnoreEmptyThinLTOIndexFile*/true);
if (!IndexOrErr) {
logAllUnhandledErrors(IndexOrErr.takeError(), errs(),
std::unique_ptr<ModuleSummaryIndex> CombinedIndex;
if (Error E = llvm::getModuleSummaryIndexForFile(
CGOpts.ThinLTOIndexFile,
/*IgnoreEmptyThinLTOIndexFile*/ true)
.moveInto(CombinedIndex)) {
logAllUnhandledErrors(std::move(E), errs(),
"Error loading index file '" +
CGOpts.ThinLTOIndexFile + "': ");
return;
}
std::unique_ptr<ModuleSummaryIndex> CombinedIndex = std::move(*IndexOrErr);
// A null CombinedIndex means we should skip ThinLTO compilation
// (LLVM will optionally ignore empty index files, returning null instead
// of an error).

View File

@ -179,10 +179,8 @@ static Expected<std::string> readIdentificationBlock(BitstreamCursor &Stream) {
while (true) {
BitstreamEntry Entry;
if (Expected<BitstreamEntry> Res = Stream.advance())
Entry = Res.get();
else
return Res.takeError();
if (Error E = Stream.advance().moveInto(Entry))
return std::move(E);
switch (Entry.Kind) {
default:
@ -226,10 +224,8 @@ static Expected<std::string> readIdentificationCode(BitstreamCursor &Stream) {
return "";
BitstreamEntry Entry;
if (Expected<BitstreamEntry> Res = Stream.advance())
Entry = std::move(Res.get());
else
return Res.takeError();
if (Error E = Stream.advance().moveInto(Entry))
return std::move(E);
switch (Entry.Kind) {
case BitstreamEntry::EndBlock:
@ -305,10 +301,8 @@ static Expected<bool> hasObjCCategory(BitstreamCursor &Stream) {
// need to understand them all.
while (true) {
BitstreamEntry Entry;
if (Expected<BitstreamEntry> Res = Stream.advance())
Entry = std::move(Res.get());
else
return Res.takeError();
if (Error E = Stream.advance().moveInto(Entry))
return std::move(E);
switch (Entry.Kind) {
case BitstreamEntry::Error:

View File

@ -280,10 +280,7 @@ bool getGNUDebuglinkContents(const ObjectFile *Obj, std::string &DebugName,
return false;
for (const SectionRef &Section : Obj->sections()) {
StringRef Name;
if (Expected<StringRef> NameOrErr = Section.getName())
Name = *NameOrErr;
else
consumeError(NameOrErr.takeError());
consumeError(Section.getName().moveInto(Name));
Name = Name.substr(Name.find_first_not_of("._"));
if (Name == "gnu_debuglink") {

View File

@ -55,14 +55,15 @@ bool SectionRef::containsSymbol(SymbolRef S) const {
}
Expected<uint64_t> ObjectFile::getSymbolValue(DataRefImpl Ref) const {
if (Expected<uint32_t> FlagsOrErr = getSymbolFlags(Ref)) {
if (*FlagsOrErr & SymbolRef::SF_Undefined)
return 0;
if (*FlagsOrErr & SymbolRef::SF_Common)
return getCommonSymbolSize(Ref);
} else
uint32_t Flags;
if (Error E = getSymbolFlags(Ref).moveInto(Flags))
// TODO: Test this error.
return FlagsOrErr.takeError();
return std::move(E);
if (Flags & SymbolRef::SF_Undefined)
return 0;
if (Flags & SymbolRef::SF_Common)
return getCommonSymbolSize(Ref);
return getSymbolValueImpl(Ref);
}

View File

@ -86,10 +86,8 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile,
"Failed to find XRay instrumentation map.",
std::make_error_code(std::errc::executable_format_error));
if (Expected<StringRef> E = I->getContents())
Contents = *E;
else
return E.takeError();
if (Error E = I->getContents().moveInto(Contents))
return E;
RelocMap Relocs;
if (ObjFile.getBinary()->isELF()) {