Line data Source code
1 : //===- DebugCrossExSubsection.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_DEBUGCROSSIMPSUBSECTION_H
11 : #define LLVM_DEBUGINFO_CODEVIEW_DEBUGCROSSIMPSUBSECTION_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/BinaryStreamArray.h"
18 : #include "llvm/Support/BinaryStreamReader.h"
19 : #include "llvm/Support/BinaryStreamRef.h"
20 : #include "llvm/Support/Endian.h"
21 : #include "llvm/Support/Error.h"
22 : #include <cstdint>
23 : #include <vector>
24 :
25 : namespace llvm {
26 :
27 : namespace codeview {
28 :
29 2 : 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 2 : : 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 1 : Iterator begin() const { return References.begin(); }
64 0 : Iterator end() const { return References.end(); }
65 :
66 : private:
67 : ReferenceArray References;
68 : };
69 :
70 1 : class DebugCrossModuleImportsSubsection final : public DebugSubsection {
71 : public:
72 : explicit DebugCrossModuleImportsSubsection(
73 : DebugStringTableSubsection &Strings)
74 1 : : DebugSubsection(DebugSubsectionKind::CrossScopeImports),
75 1 : 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
|