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