summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2016-05-25 20:37:03 +0000
committerZachary Turner <zturner@google.com>2016-05-25 20:37:03 +0000
commitd5d37dcf8329b7c5774aadc60c4474c8e4a4e55f (patch)
treed6b8dde6b19a10110b013544b3288848120add80
parent1fe3f1ca50bfc7b1dcc356ee9785bfe3757a8aec (diff)
downloadbcm5719-llvm-d5d37dcf8329b7c5774aadc60c4474c8e4a4e55f.tar.gz
bcm5719-llvm-d5d37dcf8329b7c5774aadc60c4474c8e4a4e55f.zip
[codeview] Move StreamInterface and StreamReader to libcodeview.
We have need to reuse this functionality, including making additional generic stream types that are smarter about how and when they copy memory versus referencing the original memory. So all of these structures belong in the common library rather than being pdb specific. llvm-svn: 270751
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/ByteStream.h (renamed from llvm/include/llvm/DebugInfo/PDB/Raw/ByteStream.h)11
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/CodeViewError.h43
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/StreamInterface.h (renamed from llvm/include/llvm/DebugInfo/PDB/Raw/StreamInterface.h)12
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/StreamReader.h (renamed from llvm/include/llvm/DebugInfo/PDB/Raw/StreamReader.h)19
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/DbiStream.h16
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h4
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/ModStream.h10
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h11
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/NameMap.h7
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h1
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h4
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/TpiStream.h10
-rw-r--r--llvm/lib/DebugInfo/CodeView/ByteStream.cpp (renamed from llvm/lib/DebugInfo/PDB/Raw/ByteStream.cpp)12
-rw-r--r--llvm/lib/DebugInfo/CodeView/CMakeLists.txt3
-rw-r--r--llvm/lib/DebugInfo/CodeView/CodeViewError.cpp65
-rw-r--r--llvm/lib/DebugInfo/CodeView/StreamReader.cpp (renamed from llvm/lib/DebugInfo/PDB/Raw/StreamReader.cpp)7
-rw-r--r--llvm/lib/DebugInfo/PDB/CMakeLists.txt2
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp6
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp4
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp5
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/NameHashTable.cpp5
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp4
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp4
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp5
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp6
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp6
26 files changed, 196 insertions, 86 deletions
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/ByteStream.h b/llvm/include/llvm/DebugInfo/CodeView/ByteStream.h
index 843e43c8740..9d683b1cec6 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/ByteStream.h
+++ b/llvm/include/llvm/DebugInfo/CodeView/ByteStream.h
@@ -7,19 +7,18 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_DEBUGINFO_PDB_RAW_BYTESTREAM_H
-#define LLVM_DEBUGINFO_PDB_RAW_BYTESTREAM_H
+#ifndef LLVM_DEBUGINFO_CODEVIEW_BYTESTREAM_H
+#define LLVM_DEBUGINFO_CODEVIEW_BYTESTREAM_H
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamInterface.h"
+#include "llvm/DebugInfo/CodeView/StreamInterface.h"
#include "llvm/Support/Error.h"
#include <cstdint>
#include <memory>
namespace llvm {
-namespace pdb {
-
+namespace codeview {
class StreamReader;
class ByteStream : public StreamInterface {
@@ -53,4 +52,4 @@ private:
} // end namespace pdb
} // end namespace llvm
-#endif // LLVM_DEBUGINFO_PDB_RAW_BYTESTREAM_H
+#endif // LLVM_DEBUGINFO_CODEVIEW_BYTESTREAM_H
diff --git a/llvm/include/llvm/DebugInfo/CodeView/CodeViewError.h b/llvm/include/llvm/DebugInfo/CodeView/CodeViewError.h
new file mode 100644
index 00000000000..a3d4171f693
--- /dev/null
+++ b/llvm/include/llvm/DebugInfo/CodeView/CodeViewError.h
@@ -0,0 +1,43 @@
+//===- CodeViewError.h - 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.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_DEBUGINFO_PDB_CODEVIEW_CODEVIEWERROR_H
+#define LLVM_DEBUGINFO_PDB_CODEVIEW_CODEVIEWERROR_H
+
+#include "llvm/Support/Error.h"
+
+#include <string>
+
+namespace llvm {
+namespace codeview {
+enum class cv_error_code {
+ unspecified = 1,
+ insufficient_buffer,
+ corrupt_record,
+};
+
+/// Base class for errors originating when parsing raw PDB files
+class CodeViewError : public ErrorInfo<CodeViewError> {
+public:
+ 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;
+
+private:
+ std::string ErrMsg;
+ cv_error_code Code;
+};
+}
+}
+#endif
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/StreamInterface.h b/llvm/include/llvm/DebugInfo/CodeView/StreamInterface.h
index effeaf2605f..92c9041688e 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/StreamInterface.h
+++ b/llvm/include/llvm/DebugInfo/CodeView/StreamInterface.h
@@ -1,4 +1,4 @@
-//===- StreamInterface.h - Base interface for a PDB stream ------*- C++ -*-===//
+//===- StreamInterface.h - Base interface for a stream of data --*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -7,15 +7,15 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_DEBUGINFO_PDB_RAW_STREAMINTERFACE_H
-#define LLVM_DEBUGINFO_PDB_RAW_STREAMINTERFACE_H
+#ifndef LLVM_DEBUGINFO_CODEVIEW_STREAMINTERFACE_H
+#define LLVM_DEBUGINFO_CODEVIEW_STREAMINTERFACE_H
#include "llvm/ADT/ArrayRef.h"
#include "llvm/Support/Error.h"
#include <cstdint>
namespace llvm {
-namespace pdb {
+namespace codeview {
class StreamInterface {
public:
@@ -29,7 +29,7 @@ public:
virtual uint32_t getLength() const = 0;
};
-} // end namespace pdb
+} // end namespace codeview
} // end namespace llvm
-#endif // LLVM_DEBUGINFO_PDB_RAW_STREAMINTERFACE_H
+#endif // LLVM_DEBUGINFO_CODEVIEW_STREAMINTERFACE_H
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/StreamReader.h b/llvm/include/llvm/DebugInfo/CodeView/StreamReader.h
index 1897dfe1474..34ff725235e 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/StreamReader.h
+++ b/llvm/include/llvm/DebugInfo/CodeView/StreamReader.h
@@ -7,19 +7,19 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_DEBUGINFO_PDB_RAW_STREAMREADER_H
-#define LLVM_DEBUGINFO_PDB_RAW_STREAMREADER_H
+#ifndef LLVM_DEBUGINFO_CODEVIEW_STREAMREADER_H
+#define LLVM_DEBUGINFO_CODEVIEW_STREAMREADER_H
#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamInterface.h"
+#include "llvm/DebugInfo/CodeView/StreamInterface.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Error.h"
#include <string>
namespace llvm {
-namespace pdb {
-class StreamInterface;
+namespace codeview {
+
class StreamReader {
public:
StreamReader(const StreamInterface &S);
@@ -35,7 +35,8 @@ public:
}
template <typename T> Error readArray(MutableArrayRef<T> Array) {
- MutableArrayRef<uint8_t> Casted(reinterpret_cast<uint8_t*>(Array.data()), Array.size() * sizeof(T));
+ MutableArrayRef<uint8_t> Casted(reinterpret_cast<uint8_t *>(Array.data()),
+ Array.size() * sizeof(T));
return readBytes(Casted);
}
@@ -50,7 +51,7 @@ private:
const StreamInterface &Stream;
uint32_t Offset;
};
-}
-}
+} // namespace codeview
+} // namespace llvm
-#endif
+#endif // LLVM_DEBUGINFO_CODEVIEW_STREAMREADER_H
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStream.h b/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStream.h
index 33ac97a6553..91de6e64293 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStream.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/DbiStream.h
@@ -10,8 +10,8 @@
#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H
#define LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H
+#include "llvm/DebugInfo/CodeView/ByteStream.h"
#include "llvm/DebugInfo/PDB/PDBTypes.h"
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
#include "llvm/DebugInfo/PDB/Raw/NameHashTable.h"
@@ -62,13 +62,13 @@ private:
std::vector<ModuleInfoEx> ModuleInfos;
NameHashTable ECNames;
- ByteStream ModInfoSubstream;
- ByteStream SecContrSubstream;
- ByteStream SecMapSubstream;
- ByteStream FileInfoSubstream;
- ByteStream TypeServerMapSubstream;
- ByteStream ECSubstream;
- ByteStream DbgHeader;
+ codeview::ByteStream ModInfoSubstream;
+ codeview::ByteStream SecContrSubstream;
+ codeview::ByteStream SecMapSubstream;
+ codeview::ByteStream FileInfoSubstream;
+ codeview::ByteStream TypeServerMapSubstream;
+ codeview::ByteStream ECSubstream;
+ codeview::ByteStream DbgHeader;
std::unique_ptr<HeaderInfo> Header;
};
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h b/llvm/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h
index 2b475e4bf09..72f8b0c8667 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h
@@ -11,7 +11,7 @@
#define LLVM_DEBUGINFO_PDB_RAW_MAPPEDBLOCKSTREAM_H
#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamInterface.h"
+#include "llvm/DebugInfo/CodeView/StreamInterface.h"
#include "llvm/Support/Error.h"
#include <cstdint>
#include <vector>
@@ -21,7 +21,7 @@ namespace pdb {
class PDBFile;
-class MappedBlockStream : public StreamInterface {
+class MappedBlockStream : public codeview::StreamInterface {
public:
MappedBlockStream(uint32_t StreamIdx, const PDBFile &File);
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/ModStream.h b/llvm/include/llvm/DebugInfo/PDB/Raw/ModStream.h
index 82042e59f25..3f2b9049b46 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/ModStream.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/ModStream.h
@@ -11,8 +11,8 @@
#define LLVM_DEBUGINFO_PDB_RAW_MODSTREAM_H
#include "llvm/ADT/iterator_range.h"
+#include "llvm/DebugInfo/CodeView/ByteStream.h"
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/Support/Error.h"
@@ -35,10 +35,10 @@ private:
MappedBlockStream Stream;
- ByteStream SymbolsSubstream;
- ByteStream LinesSubstream;
- ByteStream C13LinesSubstream;
- ByteStream GlobalRefsSubstream;
+ codeview::ByteStream SymbolsSubstream;
+ codeview::ByteStream LinesSubstream;
+ codeview::ByteStream C13LinesSubstream;
+ codeview::ByteStream GlobalRefsSubstream;
};
}
}
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h b/llvm/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h
index 62c1e20b8d5..daaa40d4765 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h
@@ -12,21 +12,22 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
+#include "llvm/DebugInfo/CodeView/ByteStream.h"
#include "llvm/Support/Error.h"
#include <cstdint>
#include <vector>
namespace llvm {
-namespace pdb {
-
+namespace codeview {
class StreamReader;
+}
+namespace pdb {
class NameHashTable {
public:
NameHashTable();
- Error load(StreamReader &Stream);
+ Error load(codeview::StreamReader &Stream);
uint32_t getNameCount() const { return NameCount; }
uint32_t getHashVersion() const { return HashVersion; }
@@ -38,7 +39,7 @@ public:
ArrayRef<uint32_t> name_ids() const;
private:
- ByteStream NamesBuffer;
+ codeview::ByteStream NamesBuffer;
std::vector<uint32_t> IDs;
uint32_t Signature;
uint32_t HashVersion;
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/NameMap.h b/llvm/include/llvm/DebugInfo/PDB/Raw/NameMap.h
index b832976d08a..e124eef2d75 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/NameMap.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/NameMap.h
@@ -16,15 +16,16 @@
#include <cstdint>
namespace llvm {
-namespace pdb {
-
+namespace codeview {
class StreamReader;
+}
+namespace pdb {
class NameMap {
public:
NameMap();
- Error load(StreamReader &Stream);
+ Error load(codeview::StreamReader &Stream);
bool tryGetValue(StringRef Name, uint32_t &Value) const;
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h b/llvm/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h
index 088bcb4da31..f1d6be5895c 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h
@@ -13,7 +13,6 @@
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
#include "llvm/DebugInfo/CodeView/TypeStream.h"
#include "llvm/DebugInfo/PDB/PDBTypes.h"
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h b/llvm/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h
index 590fed735b3..bb5f418b1d5 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h
@@ -10,8 +10,8 @@
#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBSYMBOLSTREAM_H
#define LLVM_DEBUGINFO_PDB_RAW_PDBSYMBOLSTREAM_H
+#include "llvm/DebugInfo/CodeView/ByteStream.h"
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/Support/Error.h"
@@ -29,7 +29,7 @@ public:
iterator_range<codeview::SymbolIterator> getSymbols() const;
private:
- ByteStream Stream;
+ codeview::ByteStream Stream;
MappedBlockStream MappedStream;
};
}
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/TpiStream.h b/llvm/include/llvm/DebugInfo/PDB/Raw/TpiStream.h
index bca34c48051..91dd891d033 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/TpiStream.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/TpiStream.h
@@ -10,9 +10,9 @@
#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBTPISTREAM_H
#define LLVM_DEBUGINFO_PDB_RAW_PDBTPISTREAM_H
+#include "llvm/DebugInfo/CodeView/ByteStream.h"
#include "llvm/DebugInfo/CodeView/TypeStream.h"
#include "llvm/DebugInfo/PDB/PDBTypes.h"
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
@@ -47,10 +47,10 @@ private:
MappedBlockStream Stream;
HashFunctionType HashFunction;
- ByteStream RecordsBuffer;
- ByteStream TypeIndexOffsetBuffer;
- ByteStream HashValuesBuffer;
- ByteStream HashAdjBuffer;
+ codeview::ByteStream RecordsBuffer;
+ codeview::ByteStream TypeIndexOffsetBuffer;
+ codeview::ByteStream HashValuesBuffer;
+ codeview::ByteStream HashAdjBuffer;
std::unique_ptr<HeaderInfo> Header;
};
diff --git a/llvm/lib/DebugInfo/PDB/Raw/ByteStream.cpp b/llvm/lib/DebugInfo/CodeView/ByteStream.cpp
index 09b51d96871..879343afbfd 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/ByteStream.cpp
+++ b/llvm/lib/DebugInfo/CodeView/ByteStream.cpp
@@ -7,13 +7,13 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
-#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
+#include "llvm/DebugInfo/CodeView/ByteStream.h"
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include <cstring>
using namespace llvm;
-using namespace llvm::pdb;
+using namespace llvm::codeview;
ByteStream::ByteStream() {}
@@ -51,7 +51,7 @@ Error ByteStream::initialize(StreamReader &Reader, uint32_t Length) {
Error ByteStream::readBytes(uint32_t Offset,
MutableArrayRef<uint8_t> Buffer) const {
if (Data.size() < Buffer.size() + Offset)
- return make_error<RawError>(raw_error_code::insufficient_buffer);
+ return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
::memcpy(Buffer.data(), Data.data() + Offset, Buffer.size());
return Error::success();
}
@@ -59,7 +59,7 @@ Error ByteStream::readBytes(uint32_t Offset,
Error ByteStream::getArrayRef(uint32_t Offset, ArrayRef<uint8_t> &Buffer,
uint32_t Length) const {
if (Data.size() < Length + Offset)
- return make_error<RawError>(raw_error_code::insufficient_buffer);
+ return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
Buffer = Data.slice(Offset, Length);
return Error::success();
}
diff --git a/llvm/lib/DebugInfo/CodeView/CMakeLists.txt b/llvm/lib/DebugInfo/CodeView/CMakeLists.txt
index e0c7119dd91..8e7628dcf05 100644
--- a/llvm/lib/DebugInfo/CodeView/CMakeLists.txt
+++ b/llvm/lib/DebugInfo/CodeView/CMakeLists.txt
@@ -1,10 +1,13 @@
add_llvm_library(LLVMDebugInfoCodeView
+ ByteStream.cpp
+ CodeViewError.cpp
FieldListRecordBuilder.cpp
Line.cpp
ListRecordBuilder.cpp
MemoryTypeTableBuilder.cpp
MethodListRecordBuilder.cpp
RecordSerialization.cpp
+ StreamReader.cpp
SymbolDumper.cpp
TypeDumper.cpp
TypeRecord.cpp
diff --git a/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp b/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp
new file mode 100644
index 00000000000..4db6b2941a6
--- /dev/null
+++ b/llvm/lib/DebugInfo/CodeView/CodeViewError.cpp
@@ -0,0 +1,65 @@
+//===- 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 LLVM_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.";
+ }
+ 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);
+}
diff --git a/llvm/lib/DebugInfo/PDB/Raw/StreamReader.cpp b/llvm/lib/DebugInfo/CodeView/StreamReader.cpp
index ed9c9d400af..8a2926bc883 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/StreamReader.cpp
+++ b/llvm/lib/DebugInfo/CodeView/StreamReader.cpp
@@ -7,11 +7,12 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
-#include "llvm/DebugInfo/PDB/Raw/RawError.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
+
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
using namespace llvm;
-using namespace llvm::pdb;
+using namespace llvm::codeview;
StreamReader::StreamReader(const StreamInterface &S) : Stream(S), Offset(0) {}
diff --git a/llvm/lib/DebugInfo/PDB/CMakeLists.txt b/llvm/lib/DebugInfo/PDB/CMakeLists.txt
index b5053c51f3a..113a2ad0ec4 100644
--- a/llvm/lib/DebugInfo/PDB/CMakeLists.txt
+++ b/llvm/lib/DebugInfo/PDB/CMakeLists.txt
@@ -28,7 +28,6 @@ if(HAVE_DIA_SDK)
endif()
add_pdb_impl_folder(Raw
- Raw/ByteStream.cpp
Raw/DbiStream.cpp
Raw/InfoStream.cpp
Raw/MappedBlockStream.cpp
@@ -40,7 +39,6 @@ add_pdb_impl_folder(Raw
Raw/PublicsStream.cpp
Raw/RawError.cpp
Raw/RawSession.cpp
- Raw/StreamReader.cpp
Raw/SymbolStream.cpp
Raw/TpiStream.cpp)
diff --git a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
index 6b5cd212ed9..078384ebae3 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp
@@ -9,13 +9,13 @@
#include "llvm/DebugInfo/PDB/Raw/DbiStream.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
#include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
#include "llvm/DebugInfo/PDB/Raw/NameHashTable.h"
#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
using namespace llvm;
using namespace llvm::pdb;
@@ -80,7 +80,7 @@ DbiStream::DbiStream(PDBFile &File) : Pdb(File), Stream(StreamDBI, File) {
DbiStream::~DbiStream() {}
Error DbiStream::reload() {
- StreamReader Reader(Stream);
+ codeview::StreamReader Reader(Stream);
Header.reset(new HeaderInfo());
@@ -170,7 +170,7 @@ Error DbiStream::reload() {
return make_error<RawError>(raw_error_code::corrupt_file,
"Found unexpected bytes in DBI Stream.");
- StreamReader ECReader(ECSubstream);
+ codeview::StreamReader ECReader(ECSubstream);
if (auto EC = ECNames.load(ECReader))
return EC;
diff --git a/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp
index ccc4a5e6c9b..e7c8a831c73 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp
@@ -10,9 +10,9 @@
#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
using namespace llvm;
using namespace llvm::pdb;
@@ -20,7 +20,7 @@ using namespace llvm::pdb;
InfoStream::InfoStream(PDBFile &File) : Pdb(File), Stream(StreamPDB, File) {}
Error InfoStream::reload() {
- StreamReader Reader(Stream);
+ codeview::StreamReader Reader(Stream);
struct Header {
support::ulittle32_t Version;
diff --git a/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp
index dfc7bfc0f5f..c359e7757d0 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp
@@ -8,9 +8,10 @@
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/PDB/Raw/ModStream.h"
+
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
using namespace llvm;
using namespace llvm::pdb;
@@ -21,7 +22,7 @@ ModStream::ModStream(PDBFile &File, const ModInfo &Module)
ModStream::~ModStream() {}
Error ModStream::reload() {
- StreamReader Reader(Stream);
+ codeview::StreamReader Reader(Stream);
uint32_t SymbolSize = Mod.getSymbolDebugInfoByteSize();
uint32_t C11Size = Mod.getLineInfoByteSize();
diff --git a/llvm/lib/DebugInfo/PDB/Raw/NameHashTable.cpp b/llvm/lib/DebugInfo/PDB/Raw/NameHashTable.cpp
index 2005c3958db..a542a51b188 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/NameHashTable.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/NameHashTable.cpp
@@ -10,9 +10,8 @@
#include "llvm/DebugInfo/PDB/Raw/NameHashTable.h"
#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
#include "llvm/Support/Endian.h"
using namespace llvm;
@@ -78,7 +77,7 @@ static inline uint32_t HashStringV2(StringRef Str) {
NameHashTable::NameHashTable() : Signature(0), HashVersion(0), NameCount(0) {}
-Error NameHashTable::load(StreamReader &Stream) {
+Error NameHashTable::load(codeview::StreamReader &Stream) {
struct Header {
support::ulittle32_t Signature;
support::ulittle32_t HashVersion;
diff --git a/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp b/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp
index 202e7173b0e..777d93279c1 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp
@@ -9,15 +9,15 @@
#include "llvm/DebugInfo/PDB/Raw/NameMap.h"
#include "llvm/ADT/BitVector.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
using namespace llvm;
using namespace llvm::pdb;
NameMap::NameMap() {}
-Error NameMap::load(StreamReader &Stream) {
+Error NameMap::load(codeview::StreamReader &Stream) {
// This is some sort of weird string-set/hash table encoded in the stream.
// It starts with the number of bytes in the table.
diff --git a/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp
index af3cff32eb4..db66f536e5a 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp
@@ -25,12 +25,12 @@
#include "llvm/DebugInfo/PDB/Raw/PublicsStream.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/CodeView/TypeRecord.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
#include "llvm/DebugInfo/PDB/Raw/SymbolStream.h"
#include "llvm/ADT/BitVector.h"
@@ -99,7 +99,7 @@ uint32_t PublicsStream::getAddrMap() const { return Header->AddrMap; }
// we skip over the hash table which we believe contains information about
// public symbols.
Error PublicsStream::reload() {
- StreamReader Reader(Stream);
+ codeview::StreamReader Reader(Stream);
// Check stream size.
if (Reader.bytesRemaining() < sizeof(HeaderInfo) + sizeof(GSIHashHeader))
diff --git a/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp
index 6249524eddd..2037a646de7 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp
@@ -10,12 +10,11 @@
#include "llvm/DebugInfo/PDB/Raw/SymbolStream.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
#include "llvm/Support/Endian.h"
@@ -29,7 +28,7 @@ SymbolStream::SymbolStream(PDBFile &File, uint32_t StreamNum)
SymbolStream::~SymbolStream() {}
Error SymbolStream::reload() {
- StreamReader Reader(MappedStream);
+ codeview::StreamReader Reader(MappedStream);
if (Stream.initialize(Reader, MappedStream.getLength()))
return make_error<RawError>(raw_error_code::corrupt_file,
diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp
index 8ce8c01f608..99daf6e29fd 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp
@@ -10,11 +10,11 @@
#include "llvm/DebugInfo/PDB/Raw/TpiStream.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/CodeView/TypeRecord.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
#include "llvm/Support/Endian.h"
@@ -62,7 +62,7 @@ TpiStream::TpiStream(PDBFile &File, uint32_t StreamIdx)
TpiStream::~TpiStream() {}
Error TpiStream::reload() {
- StreamReader Reader(Stream);
+ codeview::StreamReader Reader(Stream);
if (Reader.bytesRemaining() < sizeof(HeaderInfo))
return make_error<RawError>(raw_error_code::corrupt_file,
@@ -98,7 +98,7 @@ Error TpiStream::reload() {
// Hash indices, hash values, etc come from the hash stream.
MappedBlockStream HS(Header->HashStreamIndex, Pdb);
- StreamReader HSR(HS);
+ codeview::StreamReader HSR(HS);
HSR.setOffset(Header->HashValueBuffer.Off);
if (auto EC =
HashValuesBuffer.initialize(HSR, Header->HashValueBuffer.Length))
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
index 4c0c0578068..9c33a000cb5 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
@@ -26,6 +26,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Config/config.h"
+#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
#include "llvm/DebugInfo/CodeView/TypeDumper.h"
#include "llvm/DebugInfo/PDB/GenericError.h"
@@ -48,7 +49,6 @@
#include "llvm/DebugInfo/PDB/Raw/PublicsStream.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
#include "llvm/DebugInfo/PDB/Raw/RawSession.h"
-#include "llvm/DebugInfo/PDB/Raw/StreamReader.h"
#include "llvm/DebugInfo/PDB/Raw/TpiStream.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ConvertUTF.h"
@@ -343,7 +343,7 @@ static Error dumpStreamData(ScopedPrinter &P, PDBFile &File) {
return Error::success();
MappedBlockStream S(DumpStreamNum, File);
- StreamReader R(S);
+ codeview::StreamReader R(S);
while (R.bytesRemaining() > 0) {
ArrayRef<uint8_t> Data;
uint32_t BytesToReadInBlock = std::min(
@@ -393,7 +393,7 @@ static Error dumpNamedStream(ScopedPrinter &P, PDBFile &File) {
P.printNumber("Index", NameStreamIndex);
MappedBlockStream NameStream(NameStreamIndex, File);
- StreamReader Reader(NameStream);
+ codeview::StreamReader Reader(NameStream);
NameHashTable NameTable;
if (auto EC = NameTable.load(Reader))
OpenPOWER on IntegriCloud