Home | History | Annotate | Download | only in CodeView
      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