Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- DebugCrossImpSubsection.h --------------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8.  
  9. #ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGCROSSIMPSUBSECTION_H
  10. #define LLVM_DEBUGINFO_CODEVIEW_DEBUGCROSSIMPSUBSECTION_H
  11.  
  12. #include "llvm/ADT/StringMap.h"
  13. #include "llvm/ADT/StringRef.h"
  14. #include "llvm/DebugInfo/CodeView/CodeView.h"
  15. #include "llvm/DebugInfo/CodeView/DebugSubsection.h"
  16. #include "llvm/Support/BinaryStreamArray.h"
  17. #include "llvm/Support/BinaryStreamRef.h"
  18. #include "llvm/Support/Endian.h"
  19. #include "llvm/Support/Error.h"
  20. #include <cstdint>
  21. #include <vector>
  22.  
  23. namespace llvm {
  24. class BinaryStreamReader;
  25. class BinaryStreamWriter;
  26.  
  27. namespace codeview {
  28.  
  29. struct CrossModuleImportItem {
  30.   const CrossModuleImport *Header = nullptr;
  31.   FixedStreamArray<support::ulittle32_t> Imports;
  32. };
  33.  
  34. } // end namespace codeview
  35.  
  36. template <> struct VarStreamArrayExtractor<codeview::CrossModuleImportItem> {
  37. public:
  38.   using ContextType = void;
  39.  
  40.   Error operator()(BinaryStreamRef Stream, uint32_t &Len,
  41.                    codeview::CrossModuleImportItem &Item);
  42. };
  43.  
  44. namespace codeview {
  45.  
  46. class DebugStringTableSubsection;
  47.  
  48. class DebugCrossModuleImportsSubsectionRef final : public DebugSubsectionRef {
  49.   using ReferenceArray = VarStreamArray<CrossModuleImportItem>;
  50.   using Iterator = ReferenceArray::Iterator;
  51.  
  52. public:
  53.   DebugCrossModuleImportsSubsectionRef()
  54.       : DebugSubsectionRef(DebugSubsectionKind::CrossScopeImports) {}
  55.  
  56.   static bool classof(const DebugSubsectionRef *S) {
  57.     return S->kind() == DebugSubsectionKind::CrossScopeImports;
  58.   }
  59.  
  60.   Error initialize(BinaryStreamReader Reader);
  61.   Error initialize(BinaryStreamRef Stream);
  62.  
  63.   Iterator begin() const { return References.begin(); }
  64.   Iterator end() const { return References.end(); }
  65.  
  66. private:
  67.   ReferenceArray References;
  68. };
  69.  
  70. class DebugCrossModuleImportsSubsection final : public DebugSubsection {
  71. public:
  72.   explicit DebugCrossModuleImportsSubsection(
  73.       DebugStringTableSubsection &Strings)
  74.       : DebugSubsection(DebugSubsectionKind::CrossScopeImports),
  75.         Strings(Strings) {}
  76.  
  77.   static bool classof(const DebugSubsection *S) {
  78.     return S->kind() == DebugSubsectionKind::CrossScopeImports;
  79.   }
  80.  
  81.   void addImport(StringRef Module, uint32_t ImportId);
  82.  
  83.   uint32_t calculateSerializedSize() const override;
  84.   Error commit(BinaryStreamWriter &Writer) const override;
  85.  
  86. private:
  87.   DebugStringTableSubsection &Strings;
  88.   StringMap<std::vector<support::ulittle32_t>> Mappings;
  89. };
  90.  
  91. } // end namespace codeview
  92.  
  93. } // end namespace llvm
  94.  
  95. #endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGCROSSIMPSUBSECTION_H
  96.