From d0a643e7dc653a0578865638cd10b23e7dd5f577 Mon Sep 17 00:00:00 2001 From: Pete Cooper Date: Thu, 31 Mar 2016 01:09:35 +0000 Subject: [PATCH] Change library search methods to return Optional instead of ErrorOr. These methods weren't really throwing errors. The only error used was that a file could not be found, which isn't really an error at all as we are searching paths and libraries for a file. All of the callers also ignored errors and just used the returned path if one was available. Changing to return Optional as that actually reflects what we are trying to do here: optionally find a given path. llvm-svn: 264979 --- lld/include/lld/ReaderWriter/MachOLinkingContext.h | 8 +++---- lld/lib/Driver/DarwinLdDriver.cpp | 12 ++++++---- lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp | 27 +++++++++++----------- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/lld/include/lld/ReaderWriter/MachOLinkingContext.h b/lld/include/lld/ReaderWriter/MachOLinkingContext.h index acb6613..7b673f0 100644 --- a/lld/include/lld/ReaderWriter/MachOLinkingContext.h +++ b/lld/include/lld/ReaderWriter/MachOLinkingContext.h @@ -225,12 +225,12 @@ public: /// The -lFoo option is documented to search for libFoo.dylib and libFoo.a in /// that order, unless Foo ends in ".o", in which case only the exact file /// matches (e.g. -lfoo.o would only find foo.o). - ErrorOr searchDirForLibrary(StringRef path, - StringRef libName) const; + llvm::Optional searchDirForLibrary(StringRef path, + StringRef libName) const; /// \brief Iterates through all search path entries looking for libName (as /// specified by -lFoo). - ErrorOr searchLibrary(StringRef libName) const; + llvm::Optional searchLibrary(StringRef libName) const; /// Add a framework search path. Internally, this method may be prepended /// the path with syslibroot. @@ -238,7 +238,7 @@ public: /// \brief Iterates through all framework directories looking for /// Foo.framework/Foo (when fwName = "Foo"). - ErrorOr findPathForFramework(StringRef fwName) const; + llvm::Optional findPathForFramework(StringRef fwName) const; /// \brief The dylib's binary compatibility version, in the raw uint32 format. /// diff --git a/lld/lib/Driver/DarwinLdDriver.cpp b/lld/lib/Driver/DarwinLdDriver.cpp index 429840b..496b651 100644 --- a/lld/lib/Driver/DarwinLdDriver.cpp +++ b/lld/lib/Driver/DarwinLdDriver.cpp @@ -1053,7 +1053,7 @@ bool parse(llvm::ArrayRef args, MachOLinkingContext &ctx, // Handle input files and sectcreate. for (auto &arg : parsedArgs) { bool upward; - ErrorOr resolvedPath = StringRef(); + llvm::Optional resolvedPath; switch (arg->getOption().getID()) { default: continue; @@ -1076,9 +1076,10 @@ bool parse(llvm::ArrayRef args, MachOLinkingContext &ctx, return false; } else if (ctx.testingFileUsage()) { diagnostics << "Found " << (upward ? "upward " : " ") << "library " - << canonicalizePath(resolvedPath.get()) << '\n'; + << canonicalizePath(resolvedPath.getValue()) << '\n'; } - addFile(resolvedPath.get(), ctx, globalWholeArchive, upward, diagnostics); + addFile(resolvedPath.getValue(), ctx, globalWholeArchive, + upward, diagnostics); break; case OPT_framework: case OPT_upward_framework: @@ -1090,9 +1091,10 @@ bool parse(llvm::ArrayRef args, MachOLinkingContext &ctx, return false; } else if (ctx.testingFileUsage()) { diagnostics << "Found " << (upward ? "upward " : " ") << "framework " - << canonicalizePath(resolvedPath.get()) << '\n'; + << canonicalizePath(resolvedPath.getValue()) << '\n'; } - addFile(resolvedPath.get(), ctx, globalWholeArchive, upward, diagnostics); + addFile(resolvedPath.getValue(), ctx, globalWholeArchive, + upward, diagnostics); break; case OPT_filelist: if (auto ec = loadFileList(arg->getValue(), diff --git a/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp b/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp index 67929c9..05375f1 100644 --- a/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp +++ b/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp @@ -530,7 +530,7 @@ void MachOLinkingContext::addFrameworkSearchDir(StringRef fwPath, _frameworkDirs.push_back(fwPath); } -ErrorOr +llvm::Optional MachOLinkingContext::searchDirForLibrary(StringRef path, StringRef libName) const { SmallString<256> fullPath; @@ -540,7 +540,7 @@ MachOLinkingContext::searchDirForLibrary(StringRef path, llvm::sys::path::append(fullPath, libName); if (fileExists(fullPath)) return fullPath.str().copy(_allocator); - return make_error_code(llvm::errc::no_such_file_or_directory); + return llvm::None; } // Search for dynamic library @@ -555,21 +555,23 @@ MachOLinkingContext::searchDirForLibrary(StringRef path, if (fileExists(fullPath)) return fullPath.str().copy(_allocator); - return make_error_code(llvm::errc::no_such_file_or_directory); + return llvm::None; } -ErrorOr MachOLinkingContext::searchLibrary(StringRef libName) const { +llvm::Optional +MachOLinkingContext::searchLibrary(StringRef libName) const { SmallString<256> path; for (StringRef dir : searchDirs()) { - ErrorOr ec = searchDirForLibrary(dir, libName); - if (ec) - return ec; + llvm::Optional searchDir = searchDirForLibrary(dir, libName); + if (searchDir) + return searchDir; } - return make_error_code(llvm::errc::no_such_file_or_directory); + return llvm::None; } -ErrorOr MachOLinkingContext::findPathForFramework(StringRef fwName) const{ +llvm::Optional +MachOLinkingContext::findPathForFramework(StringRef fwName) const{ SmallString<256> fullPath; for (StringRef dir : frameworkDirs()) { fullPath.assign(dir); @@ -578,7 +580,7 @@ ErrorOr MachOLinkingContext::findPathForFramework(StringRef fwName) c return fullPath.str().copy(_allocator); } - return make_error_code(llvm::errc::no_such_file_or_directory); + return llvm::None; } bool MachOLinkingContext::validateImpl(raw_ostream &diagnostics) { @@ -706,9 +708,8 @@ MachODylibFile* MachOLinkingContext::findIndirectDylib(StringRef path) { if (leafName.startswith("lib") && leafName.endswith(".dylib")) { // FIXME: Need to enhance searchLibrary() to only look for .dylib auto libPath = searchLibrary(leafName); - if (!libPath.getError()) { - return loadIndirectDylib(libPath.get()); - } + if (libPath) + return loadIndirectDylib(libPath.getValue()); } // Try full path with sysroot. -- 2.7.4