mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-17 15:40:04 +00:00

Some PDBs or object files can contain references to other PDBs where the real type information lives. When this happens, all type indices in the original PDB are meaningless because their records are not there. With this patch we add the ability to pull type info from those secondary PDBs. Differential Revision: https://reviews.llvm.org/D29973 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295382 91177308-0d34-0410-b5e6-96231b3b80d8
72 lines
2.5 KiB
C++
72 lines
2.5 KiB
C++
//===- CodeViewError.cpp - Error extensions for CodeView --------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/DebugInfo/CodeView/CodeViewError.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/ManagedStatic.h"
|
|
|
|
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<cv_error_code>(Condition)) {
|
|
case cv_error_code::unspecified:
|
|
return "An unknown 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";
|
|
case cv_error_code::operation_unsupported:
|
|
return "The requested operation is not supported.";
|
|
case cv_error_code::unknown_member_record:
|
|
return "The member record is of an unknown type.";
|
|
}
|
|
llvm_unreachable("Unrecognized cv_error_code");
|
|
}
|
|
};
|
|
} // end anonymous namespace
|
|
|
|
static ManagedStatic<CodeViewErrorCategory> 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; }
|
|
|
|
std::error_code CodeViewError::convertToErrorCode() const {
|
|
return std::error_code(static_cast<int>(Code), *Category);
|
|
}
|