1 //===- symbolSerializer.h ---------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_DEBUGINFO_CODEVIEW_SYMBOLSERIALIZER_H 11 #define LLVM_DEBUGINFO_CODEVIEW_SYMBOLSERIALIZER_H 12 13 #include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h" 14 #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h" 15 16 #include "llvm/ADT/Optional.h" 17 #include "llvm/ADT/SmallVector.h" 18 #include "llvm/ADT/StringMap.h" 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/ADT/iterator_range.h" 21 #include "llvm/Support/Allocator.h" 22 #include "llvm/Support/BinaryByteStream.h" 23 #include "llvm/Support/BinaryStreamWriter.h" 24 #include "llvm/Support/Error.h" 25 26 namespace llvm { 27 class BinaryStreamWriter; 28 namespace codeview { 29 30 class SymbolSerializer : public SymbolVisitorCallbacks { 31 BumpPtrAllocator &Storage; 32 std::vector<uint8_t> RecordBuffer; 33 MutableBinaryByteStream Stream; 34 BinaryStreamWriter Writer; 35 SymbolRecordMapping Mapping; 36 Optional<SymbolKind> CurrentSymbol; 37 38 Error writeRecordPrefix(SymbolKind Kind) { 39 RecordPrefix Prefix; 40 Prefix.RecordKind = Kind; 41 Prefix.RecordLen = 0; 42 if (auto EC = Writer.writeObject(Prefix)) 43 return EC; 44 return Error::success(); 45 } 46 47 public: 48 template <typename SymType> 49 static CVSymbol writeOneSymbol(SymType &Sym, BumpPtrAllocator &Storage, 50 CodeViewContainer Container) { 51 CVSymbol Result; 52 Result.Type = static_cast<SymbolKind>(Sym.Kind); 53 SymbolSerializer Serializer(Storage, Container); 54 consumeError(Serializer.visitSymbolBegin(Result)); 55 consumeError(Serializer.visitKnownRecord(Result, Sym)); 56 consumeError(Serializer.visitSymbolEnd(Result)); 57 return Result; 58 } 59 60 SymbolSerializer(BumpPtrAllocator &Storage, CodeViewContainer Container); 61 62 virtual Error visitSymbolBegin(CVSymbol &Record) override; 63 virtual Error visitSymbolEnd(CVSymbol &Record) override; 64 65 #define SYMBOL_RECORD(EnumName, EnumVal, Name) \ 66 virtual Error visitKnownRecord(CVSymbol &CVR, Name &Record) override { \ 67 return visitKnownRecordImpl(CVR, Record); \ 68 } 69 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) 70 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def" 71 72 private: 73 template <typename RecordKind> 74 Error visitKnownRecordImpl(CVSymbol &CVR, RecordKind &Record) { 75 return Mapping.visitKnownRecord(CVR, Record); 76 } 77 }; 78 } 79 } 80 81 #endif 82