From 43cba7333cb69a1027a2158bb921dea1b0e7eaef Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Tue, 3 May 2016 16:53:17 +0000 Subject: [PATCH] [ProfileData] Add error codes for compression failures Be more specific in describing compression failures. Also, check for this kind of error in emitNameData(). This is part of a series of patches to transition ProfileData over to the stricter Error/Expected interface. llvm-svn: 268400 --- llvm/include/llvm/ProfileData/InstrProf.h | 21 ++++++++++-------- llvm/lib/ProfileData/InstrProf.cpp | 25 ++++++++++++++-------- .../Transforms/Instrumentation/InstrProfiling.cpp | 6 ++++-- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/llvm/include/llvm/ProfileData/InstrProf.h b/llvm/include/llvm/ProfileData/InstrProf.h index 88fc61a..f07a540 100644 --- a/llvm/include/llvm/ProfileData/InstrProf.h +++ b/llvm/include/llvm/ProfileData/InstrProf.h @@ -204,17 +204,20 @@ StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName, /// third field is the uncompressed strings; otherwise it is the /// compressed string. When the string compression is off, the /// second field will have value zero. -int collectPGOFuncNameStrings(const std::vector &NameStrs, - bool doCompression, std::string &Result); +std::error_code +collectPGOFuncNameStrings(const std::vector &NameStrs, + bool doCompression, std::string &Result); /// Produce \c Result string with the same format described above. The input /// is vector of PGO function name variables that are referenced. -int collectPGOFuncNameStrings(const std::vector &NameVars, - std::string &Result, bool doCompression = true); +std::error_code +collectPGOFuncNameStrings(const std::vector &NameVars, + std::string &Result, bool doCompression = true); class InstrProfSymtab; /// \c NameStrings is a string composed of one of more sub-strings encoded in /// the format described above. The substrings are seperated by 0 or more zero /// bytes. This method decodes the string and populates the \c Symtab. -int readPGOFuncNameStrings(StringRef NameStrings, InstrProfSymtab &Symtab); +std::error_code readPGOFuncNameStrings(StringRef NameStrings, + InstrProfSymtab &Symtab); enum InstrProfValueKind : uint32_t { #define VALUE_PROF_KIND(Enumerator, Value) Enumerator = Value, @@ -272,7 +275,9 @@ enum class instrprof_error { hash_mismatch, count_mismatch, counter_overflow, - value_site_count_mismatch + value_site_count_mismatch, + compress_failed, + uncompress_failed }; inline std::error_code make_error_code(instrprof_error E) { @@ -390,9 +395,7 @@ std::error_code InstrProfSymtab::create(StringRef D, uint64_t BaseAddr) { } std::error_code InstrProfSymtab::create(StringRef NameStrings) { - if (readPGOFuncNameStrings(NameStrings, *this)) - return make_error_code(instrprof_error::malformed); - return std::error_code(); + return readPGOFuncNameStrings(NameStrings, *this); } template diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index 7e84a27..f459d2d 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -62,6 +62,10 @@ class InstrProfErrorCategoryType : public std::error_category { return "Counter overflow"; case instrprof_error::value_site_count_mismatch: return "Function value site count change detected (counter mismatch)"; + case instrprof_error::compress_failed: + return "Failed to compress data (zlib)"; + case instrprof_error::uncompress_failed: + return "Failed to uncompress data (zlib)"; } llvm_unreachable("A value of instrprof_error has no message."); } @@ -185,8 +189,9 @@ void InstrProfSymtab::create(Module &M, bool InLTO) { finalizeSymtab(); } -int collectPGOFuncNameStrings(const std::vector &NameStrs, - bool doCompression, std::string &Result) { +std::error_code +collectPGOFuncNameStrings(const std::vector &NameStrs, + bool doCompression, std::string &Result) { assert(NameStrs.size() && "No name data to emit"); uint8_t Header[16], *P = Header; @@ -208,7 +213,7 @@ int collectPGOFuncNameStrings(const std::vector &NameStrs, unsigned HeaderLen = P - &Header[0]; Result.append(HeaderStr, HeaderLen); Result += InputStr; - return 0; + return make_error_code(instrprof_error::success); }; if (!doCompression) @@ -220,7 +225,7 @@ int collectPGOFuncNameStrings(const std::vector &NameStrs, zlib::BestSizeCompression); if (Success != zlib::StatusOK) - return 1; + return make_error_code(instrprof_error::compress_failed); return WriteStringToResult( CompressedNameStrings.size(), @@ -234,8 +239,9 @@ StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar) { return NameStr; } -int collectPGOFuncNameStrings(const std::vector &NameVars, - std::string &Result, bool doCompression) { +std::error_code +collectPGOFuncNameStrings(const std::vector &NameVars, + std::string &Result, bool doCompression) { std::vector NameStrs; for (auto *NameVar : NameVars) { NameStrs.push_back(getPGOFuncNameVarInitializer(NameVar)); @@ -244,7 +250,8 @@ int collectPGOFuncNameStrings(const std::vector &NameVars, NameStrs, zlib::isAvailable() && doCompression, Result); } -int readPGOFuncNameStrings(StringRef NameStrings, InstrProfSymtab &Symtab) { +std::error_code readPGOFuncNameStrings(StringRef NameStrings, + InstrProfSymtab &Symtab) { const uint8_t *P = reinterpret_cast(NameStrings.data()); const uint8_t *EndP = reinterpret_cast(NameStrings.data() + NameStrings.size()); @@ -262,7 +269,7 @@ int readPGOFuncNameStrings(StringRef NameStrings, InstrProfSymtab &Symtab) { CompressedSize); if (zlib::uncompress(CompressedNameStrings, UncompressedNameStrings, UncompressedSize) != zlib::StatusOK) - return 1; + return make_error_code(instrprof_error::uncompress_failed); P += CompressedSize; NameStrings = StringRef(UncompressedNameStrings.data(), UncompressedNameStrings.size()); @@ -281,7 +288,7 @@ int readPGOFuncNameStrings(StringRef NameStrings, InstrProfSymtab &Symtab) { P++; } Symtab.finalizeSymtab(); - return 0; + return make_error_code(instrprof_error::success); } instrprof_error InstrProfValueSiteRecord::merge(InstrProfValueSiteRecord &Input, diff --git a/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp b/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp index 397e64b..930001f 100644 --- a/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp +++ b/llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp @@ -374,8 +374,10 @@ void InstrProfiling::emitNameData() { return; std::string CompressedNameStr; - collectPGOFuncNameStrings(ReferencedNames, CompressedNameStr, - DoNameCompression); + if (auto EC = collectPGOFuncNameStrings(ReferencedNames, CompressedNameStr, + DoNameCompression)) { + llvm::report_fatal_error(EC.message(), false); + } auto &Ctx = M->getContext(); auto *NamesVal = llvm::ConstantDataArray::getString( -- 2.7.4