diff options
author | Diego Novillo <dnovillo@google.com> | 2014-11-03 00:51:45 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@google.com> | 2014-11-03 00:51:45 +0000 |
commit | fcd556074c03ab47fe809e1f94fc78a3b3fe94dd (patch) | |
tree | 0a20112f562c2a7dd6c9c11b0eebde6cedecd04c | |
parent | 4cd1d4ecb1a89d6201c24df5f48dd4c5366747fe (diff) | |
download | bcm5719-llvm-fcd556074c03ab47fe809e1f94fc78a3b3fe94dd.tar.gz bcm5719-llvm-fcd556074c03ab47fe809e1f94fc78a3b3fe94dd.zip |
Use ErrorOr for the ::create factory on instrumented and sample profilers.
Summary:
As discussed in
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20141027/242445.html,
the creation of reader and writer instances is better done using
ErrorOr. There are no functional changes, but several callers needed to
be adjusted.
Reviewers: bogner
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D6076
llvm-svn: 221120
-rw-r--r-- | llvm/include/llvm/ProfileData/InstrProfReader.h | 4 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/SampleProfReader.h | 5 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/SampleProfWriter.h | 6 | ||||
-rw-r--r-- | llvm/lib/ProfileData/InstrProfReader.cpp | 30 | ||||
-rw-r--r-- | llvm/lib/ProfileData/SampleProfReader.cpp | 25 | ||||
-rw-r--r-- | llvm/lib/ProfileData/SampleProfWriter.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/SampleProfile.cpp | 5 | ||||
-rw-r--r-- | llvm/tools/llvm-profdata/llvm-profdata.cpp | 29 |
8 files changed, 65 insertions, 51 deletions
diff --git a/llvm/include/llvm/ProfileData/InstrProfReader.h b/llvm/include/llvm/ProfileData/InstrProfReader.h index 4ab774fab45..38c5310e63d 100644 --- a/llvm/include/llvm/ProfileData/InstrProfReader.h +++ b/llvm/include/llvm/ProfileData/InstrProfReader.h @@ -18,6 +18,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ProfileData/InstrProf.h" +#include "llvm/Support/ErrorOr.h" #include "llvm/Support/LineIterator.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/EndianStream.h" @@ -94,8 +95,7 @@ public: /// Factory method to create an appropriately typed reader for the given /// instrprof file. - static std::error_code create(std::string Path, - std::unique_ptr<InstrProfReader> &Result); + static ErrorOr<std::unique_ptr<InstrProfReader>> create(std::string Path); }; /// Reader for the simple text based instrprof format. diff --git a/llvm/include/llvm/ProfileData/SampleProfReader.h b/llvm/include/llvm/ProfileData/SampleProfReader.h index e9ceae5d835..c20b815b5d9 100644 --- a/llvm/include/llvm/ProfileData/SampleProfReader.h +++ b/llvm/include/llvm/ProfileData/SampleProfReader.h @@ -92,9 +92,8 @@ public: } /// \brief Create a sample profile reader appropriate to the file format. - static std::error_code create(StringRef Filename, - std::unique_ptr<SampleProfileReader> &Reader, - LLVMContext &C); + static ErrorOr<std::unique_ptr<SampleProfileReader>> + create(StringRef Filename, LLVMContext &C); protected: /// \brief Map every function to its associated profile. diff --git a/llvm/include/llvm/ProfileData/SampleProfWriter.h b/llvm/include/llvm/ProfileData/SampleProfWriter.h index 465adb6a203..302a82d3286 100644 --- a/llvm/include/llvm/ProfileData/SampleProfWriter.h +++ b/llvm/include/llvm/ProfileData/SampleProfWriter.h @@ -17,6 +17,7 @@ #include "llvm/IR/Function.h" #include "llvm/IR/Module.h" #include "llvm/ProfileData/SampleProf.h" +#include "llvm/Support/ErrorOr.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/raw_ostream.h" @@ -71,9 +72,8 @@ public: /// \brief Profile writer factory. Create a new writer based on the value of /// \p Format. - static std::error_code create(StringRef Filename, - std::unique_ptr<SampleProfileWriter> &Result, - SampleProfileFormat Format); + static ErrorOr<std::unique_ptr<SampleProfileWriter>> + create(StringRef Filename, SampleProfileFormat Format); protected: /// \brief Output stream where to emit the profile to. diff --git a/llvm/lib/ProfileData/InstrProfReader.cpp b/llvm/lib/ProfileData/InstrProfReader.cpp index e333473f6f8..0160a640fdc 100644 --- a/llvm/lib/ProfileData/InstrProfReader.cpp +++ b/llvm/lib/ProfileData/InstrProfReader.cpp @@ -21,32 +21,34 @@ using namespace llvm; -static std::error_code -setupMemoryBuffer(std::string Path, std::unique_ptr<MemoryBuffer> &Buffer) { +static ErrorOr<std::unique_ptr<MemoryBuffer>> +setupMemoryBuffer(std::string Path) { ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr = MemoryBuffer::getFileOrSTDIN(Path); if (std::error_code EC = BufferOrErr.getError()) return EC; - Buffer = std::move(BufferOrErr.get()); + auto Buffer = std::move(BufferOrErr.get()); // Sanity check the file. if (Buffer->getBufferSize() > std::numeric_limits<unsigned>::max()) return instrprof_error::too_large; - return instrprof_error::success; + return std::move(Buffer); } static std::error_code initializeReader(InstrProfReader &Reader) { return Reader.readHeader(); } -std::error_code -InstrProfReader::create(std::string Path, - std::unique_ptr<InstrProfReader> &Result) { +ErrorOr<std::unique_ptr<InstrProfReader>> +InstrProfReader::create(std::string Path) { // Set up the buffer to read. - std::unique_ptr<MemoryBuffer> Buffer; - if (std::error_code EC = setupMemoryBuffer(Path, Buffer)) + auto BufferOrError = setupMemoryBuffer(Path); + if (std::error_code EC = BufferOrError.getError()) return EC; + auto Buffer = std::move(BufferOrError.get()); + std::unique_ptr<InstrProfReader> Result; + // Create the reader. if (IndexedInstrProfReader::hasFormat(*Buffer)) Result.reset(new IndexedInstrProfReader(std::move(Buffer))); @@ -58,16 +60,20 @@ InstrProfReader::create(std::string Path, Result.reset(new TextInstrProfReader(std::move(Buffer))); // Initialize the reader and return the result. - return initializeReader(*Result); + if (std::error_code EC = initializeReader(*Result)) + return EC; + + return std::move(Result); } std::error_code IndexedInstrProfReader::create( std::string Path, std::unique_ptr<IndexedInstrProfReader> &Result) { // Set up the buffer to read. - std::unique_ptr<MemoryBuffer> Buffer; - if (std::error_code EC = setupMemoryBuffer(Path, Buffer)) + auto BufferOrError = setupMemoryBuffer(Path); + if (std::error_code EC = BufferOrError.getError()) return EC; + auto Buffer = std::move(BufferOrError.get()); // Create the reader. if (!IndexedInstrProfReader::hasFormat(*Buffer)) return instrprof_error::bad_magic; diff --git a/llvm/lib/ProfileData/SampleProfReader.cpp b/llvm/lib/ProfileData/SampleProfReader.cpp index a6e4e0ce502..b39bfd6e2ec 100644 --- a/llvm/lib/ProfileData/SampleProfReader.cpp +++ b/llvm/lib/ProfileData/SampleProfReader.cpp @@ -356,18 +356,18 @@ bool SampleProfileReaderBinary::hasFormat(const MemoryBuffer &Buffer) { /// \brief Prepare a memory buffer for the contents of \p Filename. /// /// \returns an error code indicating the status of the buffer. -static std::error_code -setupMemoryBuffer(std::string Filename, std::unique_ptr<MemoryBuffer> &Buffer) { +static ErrorOr<std::unique_ptr<MemoryBuffer>> +setupMemoryBuffer(std::string Filename) { auto BufferOrErr = MemoryBuffer::getFileOrSTDIN(Filename); if (std::error_code EC = BufferOrErr.getError()) return EC; - Buffer = std::move(BufferOrErr.get()); + auto Buffer = std::move(BufferOrErr.get()); // Sanity check the file. if (Buffer->getBufferSize() > std::numeric_limits<unsigned>::max()) return sampleprof_error::too_large; - return sampleprof_error::success; + return std::move(Buffer); } /// \brief Create a sample profile reader based on the format of the input file. @@ -379,18 +379,21 @@ setupMemoryBuffer(std::string Filename, std::unique_ptr<MemoryBuffer> &Buffer) { /// \param C The LLVM context to use to emit diagnostics. /// /// \returns an error code indicating the status of the created reader. -std::error_code -SampleProfileReader::create(StringRef Filename, - std::unique_ptr<SampleProfileReader> &Reader, - LLVMContext &C) { - std::unique_ptr<MemoryBuffer> Buffer; - if (std::error_code EC = setupMemoryBuffer(Filename, Buffer)) +ErrorOr<std::unique_ptr<SampleProfileReader>> +SampleProfileReader::create(StringRef Filename, LLVMContext &C) { + auto BufferOrError = setupMemoryBuffer(Filename); + if (std::error_code EC = BufferOrError.getError()) return EC; + auto Buffer = std::move(BufferOrError.get()); + std::unique_ptr<SampleProfileReader> Reader; if (SampleProfileReaderBinary::hasFormat(*Buffer)) Reader.reset(new SampleProfileReaderBinary(std::move(Buffer), C)); else Reader.reset(new SampleProfileReaderText(std::move(Buffer), C)); - return Reader->readHeader(); + if (std::error_code EC = Reader->readHeader()) + return EC; + + return std::move(Reader); } diff --git a/llvm/lib/ProfileData/SampleProfWriter.cpp b/llvm/lib/ProfileData/SampleProfWriter.cpp index 49d6fdbf4f7..85250452bd1 100644 --- a/llvm/lib/ProfileData/SampleProfWriter.cpp +++ b/llvm/lib/ProfileData/SampleProfWriter.cpp @@ -107,11 +107,10 @@ bool SampleProfileWriterBinary::write(StringRef FName, /// \param Format Encoding format for the profile file. /// /// \returns an error code indicating the status of the created writer. -std::error_code -SampleProfileWriter::create(StringRef Filename, - std::unique_ptr<SampleProfileWriter> &Writer, - SampleProfileFormat Format) { +ErrorOr<std::unique_ptr<SampleProfileWriter>> +SampleProfileWriter::create(StringRef Filename, SampleProfileFormat Format) { std::error_code EC; + std::unique_ptr<SampleProfileWriter> Writer; if (Format == SPF_Binary) Writer.reset(new SampleProfileWriterBinary(Filename, EC)); @@ -120,5 +119,8 @@ SampleProfileWriter::create(StringRef Filename, else EC = sampleprof_error::unrecognized_format; - return EC; + if (EC) + return EC; + + return std::move(Writer); } diff --git a/llvm/lib/Transforms/Scalar/SampleProfile.cpp b/llvm/lib/Transforms/Scalar/SampleProfile.cpp index 89f0c27070b..aa01508d25b 100644 --- a/llvm/lib/Transforms/Scalar/SampleProfile.cpp +++ b/llvm/lib/Transforms/Scalar/SampleProfile.cpp @@ -737,12 +737,13 @@ INITIALIZE_PASS_END(SampleProfileLoader, "sample-profile", "Sample Profile loader", false, false) bool SampleProfileLoader::doInitialization(Module &M) { - if (std::error_code EC = - SampleProfileReader::create(Filename, Reader, M.getContext())) { + auto ReaderOrErr = SampleProfileReader::create(Filename, M.getContext()); + if (std::error_code EC = ReaderOrErr.getError()) { std::string Msg = "Could not open profile: " + EC.message(); M.getContext().diagnose(DiagnosticInfoSampleProfile(Filename.data(), Msg)); return false; } + Reader = std::move(ReaderOrErr.get()); ProfileIsValid = (Reader->read() == sampleprof_error::success); return true; } diff --git a/llvm/tools/llvm-profdata/llvm-profdata.cpp b/llvm/tools/llvm-profdata/llvm-profdata.cpp index 22acedc569a..e97779968d4 100644 --- a/llvm/tools/llvm-profdata/llvm-profdata.cpp +++ b/llvm/tools/llvm-profdata/llvm-profdata.cpp @@ -49,10 +49,11 @@ void mergeInstrProfile(cl::list<std::string> Inputs, StringRef OutputFilename) { InstrProfWriter Writer; for (const auto &Filename : Inputs) { - std::unique_ptr<InstrProfReader> Reader; - if (std::error_code ec = InstrProfReader::create(Filename, Reader)) + auto ReaderOrErr = InstrProfReader::create(Filename); + if (std::error_code ec = ReaderOrErr.getError()) exitWithError(ec.message(), Filename); + auto Reader = std::move(ReaderOrErr.get()); for (const auto &I : *Reader) if (std::error_code EC = Writer.addFunctionCounts(I.Name, I.Hash, I.Counts)) @@ -66,18 +67,19 @@ void mergeInstrProfile(cl::list<std::string> Inputs, StringRef OutputFilename) { void mergeSampleProfile(cl::list<std::string> Inputs, StringRef OutputFilename, sampleprof::SampleProfileFormat OutputFormat) { using namespace sampleprof; - std::unique_ptr<SampleProfileWriter> Writer; - if (std::error_code EC = SampleProfileWriter::create(OutputFilename.data(), - Writer, OutputFormat)) + auto WriterOrErr = SampleProfileWriter::create(OutputFilename, OutputFormat); + if (std::error_code EC = WriterOrErr.getError()) exitWithError(EC.message(), OutputFilename); + auto Writer = std::move(WriterOrErr.get()); StringMap<FunctionSamples> ProfileMap; for (const auto &Filename : Inputs) { - std::unique_ptr<SampleProfileReader> Reader; - if (std::error_code EC = - SampleProfileReader::create(Filename, Reader, getGlobalContext())) + auto ReaderOrErr = + SampleProfileReader::create(Filename, getGlobalContext()); + if (std::error_code EC = ReaderOrErr.getError()) exitWithError(EC.message(), Filename); + auto Reader = std::move(ReaderOrErr.get()); if (std::error_code EC = Reader->read()) exitWithError(EC.message(), Filename); @@ -129,10 +131,11 @@ int merge_main(int argc, const char *argv[]) { int showInstrProfile(std::string Filename, bool ShowCounts, bool ShowAllFunctions, std::string ShowFunction, raw_fd_ostream &OS) { - std::unique_ptr<InstrProfReader> Reader; - if (std::error_code EC = InstrProfReader::create(Filename, Reader)) + auto ReaderOrErr = InstrProfReader::create(Filename); + if (std::error_code EC = ReaderOrErr.getError()) exitWithError(EC.message(), Filename); + auto Reader = std::move(ReaderOrErr.get()); uint64_t MaxFunctionCount = 0, MaxBlockCount = 0; size_t ShownFunctions = 0, TotalFunctions = 0; for (const auto &Func : *Reader) { @@ -182,11 +185,11 @@ int showSampleProfile(std::string Filename, bool ShowCounts, bool ShowAllFunctions, std::string ShowFunction, raw_fd_ostream &OS) { using namespace sampleprof; - std::unique_ptr<SampleProfileReader> Reader; - if (std::error_code EC = - SampleProfileReader::create(Filename, Reader, getGlobalContext())) + auto ReaderOrErr = SampleProfileReader::create(Filename, getGlobalContext()); + if (std::error_code EC = ReaderOrErr.getError()) exitWithError(EC.message(), Filename); + auto Reader = std::move(ReaderOrErr.get()); Reader->read(); if (ShowAllFunctions || ShowFunction.empty()) Reader->dump(OS); |