1 #include "llvm/DebugInfo/PDB/DIA/DIAError.h" 2 #include "llvm/Support/ErrorHandling.h" 3 #include "llvm/Support/ManagedStatic.h" 4 5 using namespace llvm; 6 using namespace llvm::pdb; 7 8 class DIAErrorCategory : public std::error_category { 9 public: 10 const char *name() const LLVM_NOEXCEPT override { return "llvm.pdb.dia"; } 11 12 std::string message(int Condition) const override { 13 switch (static_cast<dia_error_code>(Condition)) { 14 case dia_error_code::could_not_create_impl: 15 return "Failed to connect to DIA at runtime. Verify that Visual Studio " 16 "is properly installed, or that msdiaXX.dll is in your PATH."; 17 case dia_error_code::invalid_file_format: 18 return "Unable to load PDB. The file has an unrecognized format."; 19 case dia_error_code::invalid_parameter: 20 return "The parameter is incorrect."; 21 case dia_error_code::already_loaded: 22 return "Unable to load the PDB or EXE, because it is already loaded."; 23 case dia_error_code::debug_info_mismatch: 24 return "The PDB file and the EXE file do not match."; 25 case dia_error_code::unspecified: 26 return "An unknown error has occurred."; 27 } 28 llvm_unreachable("Unrecognized DIAErrorCode"); 29 } 30 }; 31 32 static ManagedStatic<DIAErrorCategory> Category; 33 34 char DIAError::ID = 0; 35 36 DIAError::DIAError(dia_error_code C) : DIAError(C, "") {} 37 38 DIAError::DIAError(const std::string &Context) 39 : DIAError(dia_error_code::unspecified, Context) {} 40 41 DIAError::DIAError(dia_error_code C, const std::string &Context) : Code(C) { 42 ErrMsg = "DIA Error: "; 43 std::error_code EC = convertToErrorCode(); 44 if (Code != dia_error_code::unspecified) 45 ErrMsg += EC.message() + " "; 46 if (!Context.empty()) 47 ErrMsg += Context; 48 } 49 50 void DIAError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; } 51 52 const std::string &DIAError::getErrorMessage() const { return ErrMsg; } 53 54 std::error_code DIAError::convertToErrorCode() const { 55 return std::error_code(static_cast<int>(Code), *Category); 56 } 57