From 6a7efef4af55b995fdfe9a0819adcb823cbb6191 Mon Sep 17 00:00:00 2001 From: Alexandre Ganea Date: Fri, 31 Aug 2018 17:41:58 +0000 Subject: [PATCH] [DebugInfo] Common behavior for error types Following D50807, and heading towards D50664, this intermediary change does the following: 1. Upgrade all custom Error types in llvm/trunk/lib/DebugInfo/ to use the new StringError behavior (D50807). 2. Implement std::is_error_code_enum and make_error_code() for DebugInfo error enumerations. 3. Rename GenericError -> PDBError (the file will be renamed in a subsequent commit) 4. Update custom error messages to follow the same formatting: (\w\s*)+\. 5. Keep generic "file not found" (ENOENT) errors as they are in PDB code. Previously, there used to be a custom enumeration for that purpose. 6. Remove a few extraneous LF in log() implementations. Printing LF is a responsability at a higher level, not at the error level. Differential Revision: https://reviews.llvm.org/D51499 llvm-svn: 341228 --- lld/COFF/PDB.cpp | 8 ++-- .../llvm/DebugInfo/CodeView/CodeViewError.h | 35 +++++++++----- llvm/include/llvm/DebugInfo/MSF/MSFError.h | 30 +++++++----- llvm/include/llvm/DebugInfo/PDB/DIA/DIAError.h | 34 +++++++------ llvm/include/llvm/DebugInfo/PDB/GenericError.h | 40 +++++++++------- llvm/include/llvm/DebugInfo/PDB/Native/RawError.h | 34 +++++++------ llvm/lib/DebugInfo/CodeView/CodeViewError.cpp | 35 ++------------ llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 2 +- llvm/lib/DebugInfo/MSF/MSFError.cpp | 30 ++---------- llvm/lib/DebugInfo/PDB/DIA/DIAError.cpp | 31 ++---------- llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp | 9 ++-- llvm/lib/DebugInfo/PDB/GenericError.cpp | 55 +++++++--------------- llvm/lib/DebugInfo/PDB/Native/NativeSession.cpp | 1 - llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp | 2 +- llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp | 1 - llvm/lib/DebugInfo/PDB/Native/RawError.cpp | 30 ++---------- llvm/lib/DebugInfo/PDB/PDB.cpp | 6 +-- llvm/lib/DebugInfo/Symbolize/Symbolize.cpp | 3 +- llvm/lib/Support/BinaryStreamError.cpp | 2 +- llvm/test/DebugInfo/PDB/pdb-invalid-type.test | 2 +- llvm/test/DebugInfo/PDB/pdbdump-headers.test | 2 +- .../tools/llvm-readobj/codeview-merging-cycle.test | 2 +- .../tools/llvm-symbolizer/pdb/missing_pdb.test | 2 +- llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | 3 +- llvm/tools/obj2yaml/Error.cpp | 2 +- 25 files changed, 159 insertions(+), 242 deletions(-) diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp index 624fa00..08cde6f 100644 --- a/lld/COFF/PDB.cpp +++ b/lld/COFF/PDB.cpp @@ -326,8 +326,8 @@ tryToLoadPDB(const GUID &GuidFromObj, StringRef TSPath) { // PDB file doesn't mean it matches. For it to match the InfoStream's GUID // must match the GUID specified in the TypeServer2 record. if (ExpectedInfo->getGuid() != GuidFromObj) - return make_error( - pdb::generic_error_code::type_server_not_found, TSPath); + return make_error( + pdb::pdb_error_code::type_server_not_found, TSPath); return std::move(NS); } @@ -339,8 +339,8 @@ Expected PDBLinker::maybeMergeTypeServerPDB(ObjFile *File, // First, check if the PDB has previously failed to load. if (MissingTypeServerPDBs.count(TSId)) - return make_error( - pdb::generic_error_code::type_server_not_found, TSPath); + return make_error( + pdb::pdb_error_code::type_server_not_found, TSPath); // Second, check if we already loaded a PDB with this GUID. Return the type // index mapping if we have it. diff --git a/llvm/include/llvm/DebugInfo/CodeView/CodeViewError.h b/llvm/include/llvm/DebugInfo/CodeView/CodeViewError.h index 586a720..d4615d0 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/CodeViewError.h +++ b/llvm/include/llvm/DebugInfo/CodeView/CodeViewError.h @@ -24,23 +24,32 @@ enum class cv_error_code { no_records, unknown_member_record, }; +} // namespace codeview +} // namespace llvm + +namespace std { +template <> +struct is_error_code_enum : std::true_type {}; +} // namespace std + +namespace llvm { +namespace codeview { +const std::error_category &CVErrorCategory(); + +inline std::error_code make_error_code(cv_error_code E) { + return std::error_code(static_cast(E), CVErrorCategory()); +} /// Base class for errors originating when parsing raw PDB files -class CodeViewError : public ErrorInfo { +class CodeViewError : public ErrorInfo { public: + using ErrorInfo::ErrorInfo; // inherit constructors + CodeViewError(const Twine &S) : ErrorInfo(S, cv_error_code::unspecified) {} static char ID; - CodeViewError(cv_error_code C); - CodeViewError(const std::string &Context); - CodeViewError(cv_error_code C, const std::string &Context); +}; - void log(raw_ostream &OS) const override; - const std::string &getErrorMessage() const; - std::error_code convertToErrorCode() const override; +} // namespace codeview +} // namespace llvm -private: - std::string ErrMsg; - cv_error_code Code; -}; -} -} #endif diff --git a/llvm/include/llvm/DebugInfo/MSF/MSFError.h b/llvm/include/llvm/DebugInfo/MSF/MSFError.h index e66aeca..5c043a7 100644 --- a/llvm/include/llvm/DebugInfo/MSF/MSFError.h +++ b/llvm/include/llvm/DebugInfo/MSF/MSFError.h @@ -24,22 +24,28 @@ enum class msf_error_code { invalid_format, block_in_use }; +} // namespace msf +} // namespace llvm + +namespace std { +template <> +struct is_error_code_enum : std::true_type {}; +} // namespace std + +namespace llvm { +namespace msf { +const std::error_category &MSFErrCategory(); + +inline std::error_code make_error_code(msf_error_code E) { + return std::error_code(static_cast(E), MSFErrCategory()); +} /// Base class for errors originating when parsing raw PDB files -class MSFError : public ErrorInfo { +class MSFError : public ErrorInfo { public: + using ErrorInfo::ErrorInfo; // inherit constructors + MSFError(const Twine &S) : ErrorInfo(S, msf_error_code::unspecified) {} static char ID; - MSFError(msf_error_code C); - MSFError(const std::string &Context); - MSFError(msf_error_code C, const std::string &Context); - - void log(raw_ostream &OS) const override; - const std::string &getErrorMessage() const; - std::error_code convertToErrorCode() const override; - -private: - std::string ErrMsg; - msf_error_code Code; }; } // namespace msf } // namespace llvm diff --git a/llvm/include/llvm/DebugInfo/PDB/DIA/DIAError.h b/llvm/include/llvm/DebugInfo/PDB/DIA/DIAError.h index 35a39a0..2b33a65 100644 --- a/llvm/include/llvm/DebugInfo/PDB/DIA/DIAError.h +++ b/llvm/include/llvm/DebugInfo/PDB/DIA/DIAError.h @@ -23,23 +23,29 @@ enum class dia_error_code { already_loaded, debug_info_mismatch, }; +} // namespace pdb +} // namespace llvm + +namespace std { +template <> +struct is_error_code_enum : std::true_type {}; +} // namespace std + +namespace llvm { +namespace pdb { +const std::error_category &DIAErrCategory(); + +inline std::error_code make_error_code(dia_error_code E) { + return std::error_code(static_cast(E), DIAErrCategory()); +} /// Base class for errors originating in DIA SDK, e.g. COM calls -class DIAError : public ErrorInfo { +class DIAError : public ErrorInfo { public: + using ErrorInfo::ErrorInfo; + DIAError(const Twine &S) : ErrorInfo(S, dia_error_code::unspecified) {} static char ID; - DIAError(dia_error_code C); - DIAError(StringRef Context); - DIAError(dia_error_code C, StringRef Context); - - void log(raw_ostream &OS) const override; - StringRef getErrorMessage() const; - std::error_code convertToErrorCode() const override; - -private: - std::string ErrMsg; - dia_error_code Code; }; -} -} +} // namespace pdb +} // namespace llvm #endif diff --git a/llvm/include/llvm/DebugInfo/PDB/GenericError.h b/llvm/include/llvm/DebugInfo/PDB/GenericError.h index 03205a9..4e2e8b1 100644 --- a/llvm/include/llvm/DebugInfo/PDB/GenericError.h +++ b/llvm/include/llvm/DebugInfo/PDB/GenericError.h @@ -16,29 +16,37 @@ namespace llvm { namespace pdb { -enum class generic_error_code { - invalid_path = 1, +enum class pdb_error_code { + invalid_utf8_path = 1, dia_sdk_not_present, + dia_failed_loading, + signature_out_of_date, type_server_not_found, unspecified, }; +} // namespace codeview +} // namespace llvm + +namespace std { + template <> + struct is_error_code_enum : std::true_type {}; +} // namespace std + +namespace llvm { +namespace pdb { + const std::error_category &PDBErrCategory(); + + inline std::error_code make_error_code(pdb_error_code E) { + return std::error_code(static_cast(E), PDBErrCategory()); + } /// Base class for errors originating when parsing raw PDB files -class GenericError : public ErrorInfo { +class PDBError : public ErrorInfo { public: + using ErrorInfo::ErrorInfo; // inherit constructors + PDBError(const Twine &S) : ErrorInfo(S, pdb_error_code::unspecified) {} static char ID; - GenericError(generic_error_code C); - GenericError(StringRef Context); - GenericError(generic_error_code C, StringRef Context); - - void log(raw_ostream &OS) const override; - StringRef getErrorMessage() const; - std::error_code convertToErrorCode() const override; - -private: - std::string ErrMsg; - generic_error_code Code; }; -} -} +} // namespace pdb +} // namespace llvm #endif diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/RawError.h b/llvm/include/llvm/DebugInfo/PDB/Native/RawError.h index 3624a76..97d11b4 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/RawError.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/RawError.h @@ -31,23 +31,29 @@ enum class raw_error_code { stream_too_long, invalid_tpi_hash, }; +} // namespace pdb +} // namespace llvm + +namespace std { +template <> +struct is_error_code_enum : std::true_type {}; +} // namespace std + +namespace llvm { +namespace pdb { +const std::error_category &RawErrCategory(); + +inline std::error_code make_error_code(raw_error_code E) { + return std::error_code(static_cast(E), RawErrCategory()); +} /// Base class for errors originating when parsing raw PDB files -class RawError : public ErrorInfo { +class RawError : public ErrorInfo { public: + using ErrorInfo::ErrorInfo; // inherit constructors + RawError(const Twine &S) : ErrorInfo(S, raw_error_code::unspecified) {} static char ID; - RawError(raw_error_code C); - RawError(const std::string &Context); - RawError(raw_error_code C, const std::string &Context); - - void log(raw_ostream &OS) const override; - const std::string &getErrorMessage() const; - std::error_code convertToErrorCode() const override; - -private: - std::string ErrMsg; - raw_error_code Code; }; -} -} +} // namespace pdb +} // namespace llvm #endif diff --git a/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp b/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp index 8de266b..914157e 100644 --- a/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp +++ b/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp @@ -14,25 +14,23 @@ using namespace llvm; using namespace llvm::codeview; -namespace { // FIXME: This class is only here to support the transition to llvm::Error. It // will be removed once this transition is complete. Clients should prefer to // deal with the Error value directly, rather than converting to error_code. class CodeViewErrorCategory : public std::error_category { public: const char *name() const noexcept override { return "llvm.codeview"; } - std::string message(int Condition) const override { switch (static_cast(Condition)) { case cv_error_code::unspecified: - return "An unknown error has occurred."; + return "An unknown CodeView error has occurred."; case cv_error_code::insufficient_buffer: return "The buffer is not large enough to read the requested number of " "bytes."; case cv_error_code::corrupt_record: return "The CodeView record is corrupted."; case cv_error_code::no_records: - return "There are no records"; + return "There are no records."; case cv_error_code::operation_unsupported: return "The requested operation is not supported."; case cv_error_code::unknown_member_record: @@ -41,31 +39,8 @@ public: llvm_unreachable("Unrecognized cv_error_code"); } }; -} // end anonymous namespace - -static ManagedStatic Category; - -char CodeViewError::ID = 0; - -CodeViewError::CodeViewError(cv_error_code C) : CodeViewError(C, "") {} - -CodeViewError::CodeViewError(const std::string &Context) - : CodeViewError(cv_error_code::unspecified, Context) {} - -CodeViewError::CodeViewError(cv_error_code C, const std::string &Context) - : Code(C) { - ErrMsg = "CodeView Error: "; - std::error_code EC = convertToErrorCode(); - if (Code != cv_error_code::unspecified) - ErrMsg += EC.message() + " "; - if (!Context.empty()) - ErrMsg += Context; -} - -void CodeViewError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } -const std::string &CodeViewError::getErrorMessage() const { return ErrMsg; } +static llvm::ManagedStatic CodeViewErrCategory; +const std::error_category &llvm::codeview::CVErrorCategory() { return *CodeViewErrCategory; } -std::error_code CodeViewError::convertToErrorCode() const { - return std::error_code(static_cast(Code), *Category); -} +char CodeViewError::ID; diff --git a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp index 2e29c9d..1a1d516 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp @@ -326,7 +326,7 @@ Error TypeStreamMerger::doit(const CVTypeArray &Types) { "second pass found more bad indices"); if (!LastError && NumBadIndices == BadIndicesRemaining) { return llvm::make_error( - cv_error_code::corrupt_record, "input type graph contains cycles"); + cv_error_code::corrupt_record, "Input type graph contains cycles"); } } diff --git a/llvm/lib/DebugInfo/MSF/MSFError.cpp b/llvm/lib/DebugInfo/MSF/MSFError.cpp index 1b8294e..bfac6be 100644 --- a/llvm/lib/DebugInfo/MSF/MSFError.cpp +++ b/llvm/lib/DebugInfo/MSF/MSFError.cpp @@ -14,14 +14,12 @@ using namespace llvm; using namespace llvm::msf; -namespace { // FIXME: This class is only here to support the transition to llvm::Error. It // will be removed once this transition is complete. Clients should prefer to // deal with the Error value directly, rather than converting to error_code. class MSFErrorCategory : public std::error_category { public: const char *name() const noexcept override { return "llvm.msf"; } - std::string message(int Condition) const override { switch (static_cast(Condition)) { case msf_error_code::unspecified: @@ -41,30 +39,8 @@ public: llvm_unreachable("Unrecognized msf_error_code"); } }; -} // end anonymous namespace - -static ManagedStatic Category; - -char MSFError::ID = 0; - -MSFError::MSFError(msf_error_code C) : MSFError(C, "") {} - -MSFError::MSFError(const std::string &Context) - : MSFError(msf_error_code::unspecified, Context) {} - -MSFError::MSFError(msf_error_code C, const std::string &Context) : Code(C) { - ErrMsg = "MSF Error: "; - std::error_code EC = convertToErrorCode(); - if (Code != msf_error_code::unspecified) - ErrMsg += EC.message() + " "; - if (!Context.empty()) - ErrMsg += Context; -} - -void MSFError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } -const std::string &MSFError::getErrorMessage() const { return ErrMsg; } +static llvm::ManagedStatic MSFCategory; +const std::error_category &llvm::msf::MSFErrCategory() { return *MSFCategory; } -std::error_code MSFError::convertToErrorCode() const { - return std::error_code(static_cast(Code), *Category); -} +char MSFError::ID; diff --git a/llvm/lib/DebugInfo/PDB/DIA/DIAError.cpp b/llvm/lib/DebugInfo/PDB/DIA/DIAError.cpp index 0da877b..819651f 100644 --- a/llvm/lib/DebugInfo/PDB/DIA/DIAError.cpp +++ b/llvm/lib/DebugInfo/PDB/DIA/DIAError.cpp @@ -11,14 +11,13 @@ using namespace llvm::pdb; class DIAErrorCategory : public std::error_category { public: const char *name() const noexcept override { return "llvm.pdb.dia"; } - std::string message(int Condition) const override { switch (static_cast(Condition)) { case dia_error_code::could_not_create_impl: - return "Failed to connect to DIA at runtime. Verify that Visual Studio " + return "Failed to connect to DIA at runtime. Verify that Visual Studio " "is properly installed, or that msdiaXX.dll is in your PATH."; case dia_error_code::invalid_file_format: - return "Unable to load PDB. The file has an unrecognized format."; + return "Unable to load PDB. The file has an unrecognized format."; case dia_error_code::invalid_parameter: return "The parameter is incorrect."; case dia_error_code::already_loaded: @@ -32,27 +31,7 @@ public: } }; -static ManagedStatic Category; - -char DIAError::ID = 0; - -DIAError::DIAError(dia_error_code C) : DIAError(C, "") {} - -DIAError::DIAError(StringRef Context) - : DIAError(dia_error_code::unspecified, Context) {} - -DIAError::DIAError(dia_error_code C, StringRef Context) : Code(C) { - ErrMsg = "DIA Error: "; - std::error_code EC = convertToErrorCode(); - ErrMsg += EC.message() + " "; - if (!Context.empty()) - ErrMsg += Context; -} - -void DIAError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } - -StringRef DIAError::getErrorMessage() const { return ErrMsg; } +static llvm::ManagedStatic DIACategory; +const std::error_category &llvm::pdb::DIAErrCategory() { return *DIACategory; } -std::error_code DIAError::convertToErrorCode() const { - return std::error_code(static_cast(Code), *Category); -} +char DIAError::ID; diff --git a/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp b/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp index d81f594..f133b7f 100644 --- a/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp +++ b/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp @@ -42,7 +42,7 @@ static Error ErrorFromHResult(HRESULT Result, const char *Str, Ts &&... Args) { switch (Result) { case E_PDB_NOT_FOUND: - return make_error(generic_error_code::invalid_path, Context); + return errorCodeToError(std::error_code(ENOENT, std::generic_category())); case E_PDB_FORMAT: return make_error(dia_error_code::invalid_file_format, Context); case E_INVALIDARG: @@ -71,8 +71,7 @@ static Error LoadDIA(CComPtr &DiaDataSource) { // If the CoCreateInstance call above failed, msdia*.dll is not registered. // Try loading the DLL corresponding to the #included DIA SDK. #if !defined(_MSC_VER) - return llvm::make_error( - "DIA is only supported when using MSVC."); + return llvm::make_error(pdb_error_code::dia_failed_loading); #else const wchar_t *msdia_dll = nullptr; #if _MSC_VER >= 1900 && _MSC_VER < 2000 @@ -104,7 +103,7 @@ Error DIASession::createFromPdb(StringRef Path, llvm::SmallVector Path16; if (!llvm::convertUTF8ToUTF16String(Path, Path16)) - return make_error(generic_error_code::invalid_path); + return make_error(pdb_error_code::invalid_utf8_path, Path); const wchar_t *Path16Str = reinterpret_cast(Path16.data()); HRESULT HR; @@ -130,7 +129,7 @@ Error DIASession::createFromExe(StringRef Path, llvm::SmallVector Path16; if (!llvm::convertUTF8ToUTF16String(Path, Path16)) - return make_error(generic_error_code::invalid_path, Path); + return make_error(pdb_error_code::invalid_utf8_path, Path); const wchar_t *Path16Str = reinterpret_cast(Path16.data()); HRESULT HR; diff --git a/llvm/lib/DebugInfo/PDB/GenericError.cpp b/llvm/lib/DebugInfo/PDB/GenericError.cpp index 2a677b9..b6e668a 100644 --- a/llvm/lib/DebugInfo/PDB/GenericError.cpp +++ b/llvm/lib/DebugInfo/PDB/GenericError.cpp @@ -14,55 +14,34 @@ using namespace llvm; using namespace llvm::pdb; -namespace { // FIXME: This class is only here to support the transition to llvm::Error. It // will be removed once this transition is complete. Clients should prefer to // deal with the Error value directly, rather than converting to error_code. -class GenericErrorCategory : public std::error_category { +class PDBErrorCategory : public std::error_category { public: const char *name() const noexcept override { return "llvm.pdb"; } - std::string message(int Condition) const override { - switch (static_cast(Condition)) { - case generic_error_code::unspecified: + switch (static_cast(Condition)) { + case pdb_error_code::unspecified: return "An unknown error has occurred."; - case generic_error_code::type_server_not_found: - return "Type server PDB was not found."; - case generic_error_code::dia_sdk_not_present: - return "LLVM was not compiled with support for DIA. This usually means " + case pdb_error_code::type_server_not_found: + return "Type server PDB was not found."; + case pdb_error_code::dia_sdk_not_present: + return "LLVM was not compiled with support for DIA. This usually means " "that you are not using MSVC, or your Visual Studio " - "installation " - "is corrupt."; - case generic_error_code::invalid_path: - return "Unable to load PDB. Make sure the file exists and is readable."; + "installation is corrupt."; + case pdb_error_code::dia_failed_loading: + return "DIA is only supported when using MSVC."; + case pdb_error_code::invalid_utf8_path: + return "The PDB file path is an invalid UTF8 sequence."; + case pdb_error_code::signature_out_of_date: + return "The signature does not match; the file(s) might be out of date"; } llvm_unreachable("Unrecognized generic_error_code"); } }; -} // end anonymous namespace - -static ManagedStatic Category; - -char GenericError::ID = 0; - -GenericError::GenericError(generic_error_code C) : GenericError(C, "") {} - -GenericError::GenericError(StringRef Context) - : GenericError(generic_error_code::unspecified, Context) {} - -GenericError::GenericError(generic_error_code C, StringRef Context) : Code(C) { - ErrMsg = "PDB Error: "; - std::error_code EC = convertToErrorCode(); - if (Code != generic_error_code::unspecified) - ErrMsg += EC.message() + " "; - if (!Context.empty()) - ErrMsg += Context; -} - -void GenericError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } -StringRef GenericError::getErrorMessage() const { return ErrMsg; } +static llvm::ManagedStatic PDBCategory; +const std::error_category &llvm::pdb::PDBErrCategory() { return *PDBCategory; } -std::error_code GenericError::convertToErrorCode() const { - return std::error_code(static_cast(Code), *Category); -} +char PDBError::ID; diff --git a/llvm/lib/DebugInfo/PDB/Native/NativeSession.cpp b/llvm/lib/DebugInfo/PDB/Native/NativeSession.cpp index 086da13..bf66f1c 100644 --- a/llvm/lib/DebugInfo/PDB/Native/NativeSession.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/NativeSession.cpp @@ -11,7 +11,6 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/DebugInfo/CodeView/TypeIndex.h" -#include "llvm/DebugInfo/PDB/GenericError.h" #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" #include "llvm/DebugInfo/PDB/IPDBSourceFile.h" #include "llvm/DebugInfo/PDB/Native/NativeBuiltinSymbol.h" diff --git a/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp b/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp index c5ce3e0..a1f8786f 100644 --- a/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/PDBFile.cpp @@ -125,7 +125,7 @@ Error PDBFile::parseFileHeaders() { if (auto EC = Reader.readObject(SB)) { consumeError(std::move(EC)); return make_error(raw_error_code::corrupt_file, - "Does not contain superblock"); + "MSF superblock is missing"); } if (auto EC = msf::validateSuperBlock(*SB)) diff --git a/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp b/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp index e164e7c..1612d74e 100644 --- a/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp @@ -12,7 +12,6 @@ #include "llvm/ADT/BitVector.h" #include "llvm/DebugInfo/MSF/MSFBuilder.h" -#include "llvm/DebugInfo/PDB/GenericError.h" #include "llvm/DebugInfo/PDB/Native/DbiStream.h" #include "llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h" #include "llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h" diff --git a/llvm/lib/DebugInfo/PDB/Native/RawError.cpp b/llvm/lib/DebugInfo/PDB/Native/RawError.cpp index 548289f..dec9797 100644 --- a/llvm/lib/DebugInfo/PDB/Native/RawError.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/RawError.cpp @@ -5,14 +5,12 @@ using namespace llvm; using namespace llvm::pdb; -namespace { // FIXME: This class is only here to support the transition to llvm::Error. It // will be removed once this transition is complete. Clients should prefer to // deal with the Error value directly, rather than converting to error_code. class RawErrorCategory : public std::error_category { public: const char *name() const noexcept override { return "llvm.pdb.raw"; } - std::string message(int Condition) const override { switch (static_cast(Condition)) { case raw_error_code::unspecified: @@ -46,30 +44,8 @@ public: llvm_unreachable("Unrecognized raw_error_code"); } }; -} // end anonymous namespace - -static ManagedStatic Category; - -char RawError::ID = 0; - -RawError::RawError(raw_error_code C) : RawError(C, "") {} - -RawError::RawError(const std::string &Context) - : RawError(raw_error_code::unspecified, Context) {} - -RawError::RawError(raw_error_code C, const std::string &Context) : Code(C) { - ErrMsg = "Native PDB Error: "; - std::error_code EC = convertToErrorCode(); - if (Code != raw_error_code::unspecified) - ErrMsg += EC.message() + " "; - if (!Context.empty()) - ErrMsg += Context; -} - -void RawError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } -const std::string &RawError::getErrorMessage() const { return ErrMsg; } +static llvm::ManagedStatic RawCategory; +const std::error_category &llvm::pdb::RawErrCategory() { return *RawCategory; } -std::error_code RawError::convertToErrorCode() const { - return std::error_code(static_cast(Code), *Category); -} +char RawError::ID; diff --git a/llvm/lib/DebugInfo/PDB/PDB.cpp b/llvm/lib/DebugInfo/PDB/PDB.cpp index 40f5ae9..fc1ad8b 100644 --- a/llvm/lib/DebugInfo/PDB/PDB.cpp +++ b/llvm/lib/DebugInfo/PDB/PDB.cpp @@ -29,7 +29,7 @@ Error llvm::pdb::loadDataForPDB(PDB_ReaderType Type, StringRef Path, MemoryBuffer::getFileOrSTDIN(Path, /*FileSize=*/-1, /*RequiresNullTerminator=*/false); if (!ErrorOrBuffer) - return make_error(generic_error_code::invalid_path, Path); + return errorCodeToError(ErrorOrBuffer.getError()); return NativeSession::createFromPdb(std::move(*ErrorOrBuffer), Session); } @@ -37,7 +37,7 @@ Error llvm::pdb::loadDataForPDB(PDB_ReaderType Type, StringRef Path, #if LLVM_ENABLE_DIA_SDK return DIASession::createFromPdb(Path, Session); #else - return make_error("DIA is not installed on the system"); + return make_error(pdb_error_code::dia_sdk_not_present); #endif } @@ -50,6 +50,6 @@ Error llvm::pdb::loadDataForEXE(PDB_ReaderType Type, StringRef Path, #if LLVM_ENABLE_DIA_SDK return DIASession::createFromExe(Path, Session); #else - return make_error("DIA is not installed on the system"); + return make_error(pdb_error_code::dia_sdk_not_present); #endif } diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp index f760a0e..59a85d6 100644 --- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -410,7 +410,8 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName, Objects.first->getFileName(), Session)) { Modules.insert( std::make_pair(ModuleName, std::unique_ptr())); - return std::move(Err); + // Return along the PDB filename to provide more context + return createFileError(PDBFileName, std::move(Err)); } Context.reset(new PDBContext(*CoffObject, std::move(Session))); } diff --git a/llvm/lib/Support/BinaryStreamError.cpp b/llvm/lib/Support/BinaryStreamError.cpp index 60f5e21..cdc811d 100644 --- a/llvm/lib/Support/BinaryStreamError.cpp +++ b/llvm/lib/Support/BinaryStreamError.cpp @@ -47,7 +47,7 @@ BinaryStreamError::BinaryStreamError(stream_error_code C, StringRef Context) } } -void BinaryStreamError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } +void BinaryStreamError::log(raw_ostream &OS) const { OS << ErrMsg; } StringRef BinaryStreamError::getErrorMessage() const { return ErrMsg; } diff --git a/llvm/test/DebugInfo/PDB/pdb-invalid-type.test b/llvm/test/DebugInfo/PDB/pdb-invalid-type.test index 33ea8d9..2355ec2 100644 --- a/llvm/test/DebugInfo/PDB/pdb-invalid-type.test +++ b/llvm/test/DebugInfo/PDB/pdb-invalid-type.test @@ -2,7 +2,7 @@ # RUN: llvm-pdbutil yaml2pdb -pdb=%t2.pdb %s # RUN: not llvm-pdbutil merge -pdb=%t.pdb %t1.pdb %t2.pdb 2>&1 | FileCheck %s -# CHECK: CodeView Error: The CodeView record is corrupted. +# CHECK: The CodeView record is corrupted --- TpiStream: diff --git a/llvm/test/DebugInfo/PDB/pdbdump-headers.test b/llvm/test/DebugInfo/PDB/pdbdump-headers.test index 26c2b1bb..b05e620 100644 --- a/llvm/test/DebugInfo/PDB/pdbdump-headers.test +++ b/llvm/test/DebugInfo/PDB/pdbdump-headers.test @@ -1167,4 +1167,4 @@ BIG-NEXT: Mod 0045 | `Import:api-ms-win-crt-heap-l1-1-0.dll`: BIG-NEXT: Mod 0046 | `api-ms-win-crt-heap-l1-1-0.dll`: BIG-NEXT: Mod 0047 | `* Linker *`: -BAD-BLOCK-SIZE: Native PDB Error: The PDB file is corrupt. Does not contain superblock +BAD-BLOCK-SIZE: The PDB file is corrupt. MSF superblock is missing diff --git a/llvm/test/tools/llvm-readobj/codeview-merging-cycle.test b/llvm/test/tools/llvm-readobj/codeview-merging-cycle.test index 3a96be9..f597ad6 100644 --- a/llvm/test/tools/llvm-readobj/codeview-merging-cycle.test +++ b/llvm/test/tools/llvm-readobj/codeview-merging-cycle.test @@ -1,6 +1,6 @@ ; RUN: not llvm-readobj -codeview-merged-types %S/Inputs/codeview-cycle.obj 2>&1 | FileCheck %s -; CHECK: Error{{.*}} input type graph contains cycles +; CHECK: Error{{.*}} Input type graph contains cycles ; To reproduce codeview-cycle.obj: ; $ cat codeview-cycle.asm diff --git a/llvm/test/tools/llvm-symbolizer/pdb/missing_pdb.test b/llvm/test/tools/llvm-symbolizer/pdb/missing_pdb.test index 0478dfbc..e5282f3 100644 --- a/llvm/test/tools/llvm-symbolizer/pdb/missing_pdb.test +++ b/llvm/test/tools/llvm-symbolizer/pdb/missing_pdb.test @@ -8,7 +8,7 @@ ADDR: 0x401001 llvm-symbolizer should print one error and two unknown line info records. -ERROR: LLVMSymbolizer: error reading file: PDB Error: Unable to load PDB. Make sure the file exists and is readable. +ERROR: LLVMSymbolizer: error reading file: {{.*}}: {{N|n}}o such file or directory ERROR-NOT: error reading file CHECK: ?? diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index 5b0d21f..e07ded9 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -46,7 +46,6 @@ #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/DebugInfo/CodeView/TypeStreamMerger.h" #include "llvm/DebugInfo/MSF/MSFBuilder.h" -#include "llvm/DebugInfo/PDB/GenericError.h" #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" #include "llvm/DebugInfo/PDB/IPDBInjectedSource.h" #include "llvm/DebugInfo/PDB/IPDBRawSymbol.h" @@ -681,7 +680,7 @@ static void yamlToPdb(StringRef Path) { /*RequiresNullTerminator=*/false); if (ErrorOrBuffer.getError()) { - ExitOnErr(make_error(generic_error_code::invalid_path, Path)); + ExitOnErr(createFileError(Path, errorCodeToError(ErrorOrBuffer.getError()))); } std::unique_ptr &Buffer = ErrorOrBuffer.get(); diff --git a/llvm/tools/obj2yaml/Error.cpp b/llvm/tools/obj2yaml/Error.cpp index 399b563..2b6a815 100644 --- a/llvm/tools/obj2yaml/Error.cpp +++ b/llvm/tools/obj2yaml/Error.cpp @@ -53,7 +53,7 @@ const std::error_category &obj2yaml_category() { char Obj2YamlError::ID = 0; -void Obj2YamlError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } +void Obj2YamlError::log(raw_ostream &OS) const { OS << ErrMsg; } std::error_code Obj2YamlError::convertToErrorCode() const { return std::error_code(static_cast(Code), obj2yaml_category()); -- 2.7.4