Home | History | Annotate | Download | only in CodeView
      1 //===- DebugStringTableSubsection.h - CodeView String Table -----*- 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_DEBUGSTRINGTABLESUBSECTION_H
     11 #define LLVM_DEBUGINFO_CODEVIEW_DEBUGSTRINGTABLESUBSECTION_H
     12 
     13 #include "llvm/ADT/StringMap.h"
     14 #include "llvm/ADT/StringRef.h"
     15 #include "llvm/DebugInfo/CodeView/DebugSubsection.h"
     16 #include "llvm/Support/BinaryStreamRef.h"
     17 #include "llvm/Support/Error.h"
     18 
     19 #include <stdint.h>
     20 
     21 namespace llvm {
     22 
     23 class BinaryStreamReader;
     24 class BinaryStreamRef;
     25 class BinaryStreamWriter;
     26 
     27 namespace codeview {
     28 
     29 /// Represents a read-only view of a CodeView string table.  This is a very
     30 /// simple flat buffer consisting of null-terminated strings, where strings
     31 /// are retrieved by their offset in the buffer.  DebugStringTableSubsectionRef
     32 /// does not own the underlying storage for the buffer.
     33 class DebugStringTableSubsectionRef : public DebugSubsectionRef {
     34 public:
     35   DebugStringTableSubsectionRef();
     36 
     37   static bool classof(const DebugSubsectionRef *S) {
     38     return S->kind() == DebugSubsectionKind::StringTable;
     39   }
     40 
     41   Error initialize(BinaryStreamRef Contents);
     42   Error initialize(BinaryStreamReader &Reader);
     43 
     44   Expected<StringRef> getString(uint32_t Offset) const;
     45 
     46   bool valid() const { return Stream.valid(); }
     47 
     48   BinaryStreamRef getBuffer() const { return Stream; }
     49 
     50 private:
     51   BinaryStreamRef Stream;
     52 };
     53 
     54 /// Represents a read-write view of a CodeView string table.
     55 /// DebugStringTableSubsection owns the underlying storage for the table, and is
     56 /// capable of serializing the string table into a format understood by
     57 /// DebugStringTableSubsectionRef.
     58 class DebugStringTableSubsection : public DebugSubsection {
     59 public:
     60   DebugStringTableSubsection();
     61 
     62   static bool classof(const DebugSubsection *S) {
     63     return S->kind() == DebugSubsectionKind::StringTable;
     64   }
     65 
     66   // If string S does not exist in the string table, insert it.
     67   // Returns the ID for S.
     68   uint32_t insert(StringRef S);
     69 
     70   // Return the ID for string S.  Assumes S exists in the table.
     71   uint32_t getStringId(StringRef S) const;
     72 
     73   uint32_t calculateSerializedSize() const override;
     74   Error commit(BinaryStreamWriter &Writer) const override;
     75 
     76   uint32_t size() const;
     77 
     78   StringMap<uint32_t>::const_iterator begin() const { return Strings.begin(); }
     79 
     80   StringMap<uint32_t>::const_iterator end() const { return Strings.end(); }
     81 
     82 private:
     83   StringMap<uint32_t> Strings;
     84   uint32_t StringSize = 1;
     85 };
     86 }
     87 }
     88 
     89 #endif
     90