mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-27 07:12:06 +00:00
[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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268400 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6e9b03bb11
commit
707e782733
@ -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<std::string> &NameStrs,
|
||||
bool doCompression, std::string &Result);
|
||||
std::error_code
|
||||
collectPGOFuncNameStrings(const std::vector<std::string> &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<GlobalVariable *> &NameVars,
|
||||
std::string &Result, bool doCompression = true);
|
||||
std::error_code
|
||||
collectPGOFuncNameStrings(const std::vector<GlobalVariable *> &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 <typename NameIterRange>
|
||||
|
@ -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<std::string> &NameStrs,
|
||||
bool doCompression, std::string &Result) {
|
||||
std::error_code
|
||||
collectPGOFuncNameStrings(const std::vector<std::string> &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<std::string> &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<std::string> &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<GlobalVariable *> &NameVars,
|
||||
std::string &Result, bool doCompression) {
|
||||
std::error_code
|
||||
collectPGOFuncNameStrings(const std::vector<GlobalVariable *> &NameVars,
|
||||
std::string &Result, bool doCompression) {
|
||||
std::vector<std::string> NameStrs;
|
||||
for (auto *NameVar : NameVars) {
|
||||
NameStrs.push_back(getPGOFuncNameVarInitializer(NameVar));
|
||||
@ -244,7 +250,8 @@ int collectPGOFuncNameStrings(const std::vector<GlobalVariable *> &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<const uint8_t *>(NameStrings.data());
|
||||
const uint8_t *EndP = reinterpret_cast<const uint8_t *>(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,
|
||||
|
@ -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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user