split the function into several small functions.
change the function like
static void dumpSymbolNamesFromFile(std::string &Filename) {
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr = MemoryBuffer::getFileOrSTDIN(Filename); if (error(BufferOrErr.getError(), Filename)) return; LLVMContext Context; LLVMContext *ContextPtr = NoLLVMBitcode ? nullptr : &Context; Expected<std::unique_ptr<Binary>> BinaryOrErr = createBinary(BufferOrErr.get()->getMemBufferRef(), ContextPtr); if (!BinaryOrErr) { error(BinaryOrErr.takeError(), Filename); return; } Binary &Bin = *BinaryOrErr.get(); if (Archive *A = dyn_cast<Archive>(&Bin)) dumpArchive(A, Filename, ContextPtr); else if (MachOUniversalBinary *UB = dyn_cast<MachOUniversalBinary>(&Bin)) dumpMachOUniversalBinary(UB, Filename, ContextPtr); else if (TapiUniversal *TU = dyn_cast<TapiUniversal>(&Bin)) dumpTapiUniversal(TU, Filename); else if (SymbolicFile *O = dyn_cast<SymbolicFile>(&Bin)) dumpSymbolicFile(O, Filename);
}
Might be worth a comment saying what the boolean return indicates.