summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp54
-rw-r--r--llvm/test/DebugInfo/PDB/Inputs/unknown-symbol.yaml10
-rw-r--r--llvm/test/DebugInfo/PDB/pdb-unknown-symbol.test6
3 files changed, 64 insertions, 6 deletions
diff --git a/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp b/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
index fa3f1e0b60a..21e0229a7f8 100644
--- a/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
+++ b/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
@@ -183,8 +183,47 @@ template <typename T> struct SymbolRecordImpl : public SymbolRecordBase {
mutable T Symbol;
};
+struct UnknownSymbolRecord : public SymbolRecordBase {
+ explicit UnknownSymbolRecord(codeview::SymbolKind K) : SymbolRecordBase(K) {}
+
+ void map(yaml::IO &io) override;
+
+ CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator,
+ CodeViewContainer Container) const override {
+ RecordPrefix Prefix;
+ uint32_t TotalLen = sizeof(RecordPrefix) + Data.size();
+ Prefix.RecordKind = Kind;
+ Prefix.RecordLen = TotalLen - 2;
+ uint8_t *Buffer = Allocator.Allocate<uint8_t>(TotalLen);
+ ::memcpy(Buffer, &Prefix, sizeof(RecordPrefix));
+ ::memcpy(Buffer + sizeof(RecordPrefix), Data.data(), Data.size());
+ return CVSymbol(Kind, ArrayRef<uint8_t>(Buffer, TotalLen));
+ }
+ Error fromCodeViewSymbol(CVSymbol CVS) override {
+ this->Kind = CVS.kind();
+ Data = CVS.RecordData.drop_front(sizeof(RecordPrefix));
+ return Error::success();
+ }
+
+ std::vector<uint8_t> Data;
+};
+
template <> void SymbolRecordImpl<ScopeEndSym>::map(IO &IO) {}
+void UnknownSymbolRecord::map(yaml::IO &io) {
+ yaml::BinaryRef Binary;
+ if (io.outputting())
+ Binary = yaml::BinaryRef(Data);
+ io.mapRequired("Data", Binary);
+ if (!io.outputting()) {
+ std::string Str;
+ raw_string_ostream OS(Str);
+ Binary.writeAsBinary(OS);
+ OS.flush();
+ Data.assign(Str.begin(), Str.end());
+ }
+}
+
template <> void SymbolRecordImpl<Thunk32Sym>::map(IO &IO) {
IO.mapRequired("Parent", Symbol.Parent);
IO.mapRequired("End", Symbol.End);
@@ -461,7 +500,7 @@ static inline Expected<CodeViewYAML::SymbolRecord>
fromCodeViewSymbolImpl(CVSymbol Symbol) {
CodeViewYAML::SymbolRecord Result;
- auto Impl = std::make_shared<SymbolRecordImpl<SymbolType>>(Symbol.kind());
+ auto Impl = std::make_shared<SymbolType>(Symbol.kind());
if (auto EC = Impl->fromCodeViewSymbol(Symbol))
return std::move(EC);
Result.Symbol = Impl;
@@ -472,12 +511,13 @@ Expected<CodeViewYAML::SymbolRecord>
CodeViewYAML::SymbolRecord::fromCodeViewSymbol(CVSymbol Symbol) {
#define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \
case EnumName: \
- return fromCodeViewSymbolImpl<ClassName>(Symbol);
+ return fromCodeViewSymbolImpl<SymbolRecordImpl<ClassName>>(Symbol);
#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \
SYMBOL_RECORD(EnumName, EnumVal, ClassName)
switch (Symbol.kind()) {
#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
- default: { llvm_unreachable("Unknown symbol kind!"); }
+ default:
+ return fromCodeViewSymbolImpl<UnknownSymbolRecord>(Symbol);
}
return make_error<CodeViewError>(cv_error_code::corrupt_record);
}
@@ -486,7 +526,7 @@ template <typename ConcreteType>
static void mapSymbolRecordImpl(IO &IO, const char *Class, SymbolKind Kind,
CodeViewYAML::SymbolRecord &Obj) {
if (!IO.outputting())
- Obj.Symbol = std::make_shared<SymbolRecordImpl<ConcreteType>>(Kind);
+ Obj.Symbol = std::make_shared<ConcreteType>(Kind);
IO.mapRequired(Class, *Obj.Symbol);
}
@@ -500,12 +540,14 @@ void MappingTraits<CodeViewYAML::SymbolRecord>::mapping(
#define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \
case EnumName: \
- mapSymbolRecordImpl<ClassName>(IO, #ClassName, Kind, Obj); \
+ mapSymbolRecordImpl<SymbolRecordImpl<ClassName>>(IO, #ClassName, Kind, \
+ Obj); \
break;
#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \
SYMBOL_RECORD(EnumName, EnumVal, ClassName)
switch (Kind) {
#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
- default: { llvm_unreachable("Unknown symbol kind!"); }
+ default:
+ mapSymbolRecordImpl<UnknownSymbolRecord>(IO, "UnknownSym", Kind, Obj);
}
}
diff --git a/llvm/test/DebugInfo/PDB/Inputs/unknown-symbol.yaml b/llvm/test/DebugInfo/PDB/Inputs/unknown-symbol.yaml
new file mode 100644
index 00000000000..c7a4136b88c
--- /dev/null
+++ b/llvm/test/DebugInfo/PDB/Inputs/unknown-symbol.yaml
@@ -0,0 +1,10 @@
+---
+DbiStream:
+ Modules:
+ - Module: unknown-symbol.yaml
+ Modi:
+ Records:
+ - Kind: S_ANNOTATION
+ UnknownSym:
+ Data: 123456789ABCDEF0
+...
diff --git a/llvm/test/DebugInfo/PDB/pdb-unknown-symbol.test b/llvm/test/DebugInfo/PDB/pdb-unknown-symbol.test
new file mode 100644
index 00000000000..3ef889750bc
--- /dev/null
+++ b/llvm/test/DebugInfo/PDB/pdb-unknown-symbol.test
@@ -0,0 +1,6 @@
+; RUN: llvm-pdbutil yaml2pdb -pdb=%t.pdb %p/Inputs/unknown-symbol.yaml
+; RUN: llvm-pdbutil pdb2yaml -minimal -module-syms -no-file-headers %t.pdb | FileCheck %s
+
+CHECK: - Kind: S_ANNOTATION
+CHECK: UnknownSym:
+CHECK: Data: 123456789ABCDEF0
OpenPOWER on IntegriCloud