1 //===- DebugInlineeLinesSubsection.h ----------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGINLINEELINESSUBSECTION_H
10 #define LLVM_DEBUGINFO_CODEVIEW_DEBUGINLINEELINESSUBSECTION_H
12 #include "llvm/ADT/StringRef.h"
13 #include "llvm/DebugInfo/CodeView/CodeView.h"
14 #include "llvm/DebugInfo/CodeView/DebugSubsection.h"
15 #include "llvm/DebugInfo/CodeView/Line.h"
16 #include "llvm/DebugInfo/CodeView/TypeIndex.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"
29 class DebugChecksumsSubsection
;
31 enum class InlineeLinesSignature
: uint32_t {
32 Normal
, // CV_INLINEE_SOURCE_LINE_SIGNATURE
33 ExtraFiles
// CV_INLINEE_SOURCE_LINE_SIGNATURE_EX
36 struct InlineeSourceLineHeader
{
37 TypeIndex Inlinee
; // ID of the function that was inlined.
38 support::ulittle32_t FileID
; // Offset into FileChecksums subsection.
39 support::ulittle32_t SourceLineNum
; // First line of inlined code.
40 // If extra files present:
41 // ulittle32_t ExtraFileCount;
42 // ulittle32_t Files[];
45 struct InlineeSourceLine
{
46 const InlineeSourceLineHeader
*Header
;
47 FixedStreamArray
<support::ulittle32_t
> ExtraFiles
;
50 } // end namespace codeview
52 template <> struct VarStreamArrayExtractor
<codeview::InlineeSourceLine
> {
53 Error
operator()(BinaryStreamRef Stream
, uint32_t &Len
,
54 codeview::InlineeSourceLine
&Item
);
56 bool HasExtraFiles
= false;
61 class DebugInlineeLinesSubsectionRef final
: public DebugSubsectionRef
{
62 using LinesArray
= VarStreamArray
<InlineeSourceLine
>;
63 using Iterator
= LinesArray::Iterator
;
66 DebugInlineeLinesSubsectionRef();
68 static bool classof(const DebugSubsectionRef
*S
) {
69 return S
->kind() == DebugSubsectionKind::InlineeLines
;
72 Error
initialize(BinaryStreamReader Reader
);
73 bool hasExtraFiles() const;
75 Iterator
begin() const { return Lines
.begin(); }
76 Iterator
end() const { return Lines
.end(); }
79 InlineeLinesSignature Signature
;
80 VarStreamArray
<InlineeSourceLine
> Lines
;
83 class DebugInlineeLinesSubsection final
: public DebugSubsection
{
86 std::vector
<support::ulittle32_t
> ExtraFiles
;
87 InlineeSourceLineHeader Header
;
90 DebugInlineeLinesSubsection(DebugChecksumsSubsection
&Checksums
,
91 bool HasExtraFiles
= false);
93 static bool classof(const DebugSubsection
*S
) {
94 return S
->kind() == DebugSubsectionKind::InlineeLines
;
97 Error
commit(BinaryStreamWriter
&Writer
) const override
;
98 uint32_t calculateSerializedSize() const override
;
100 void addInlineSite(TypeIndex FuncId
, StringRef FileName
, uint32_t SourceLine
);
101 void addExtraFile(StringRef FileName
);
103 bool hasExtraFiles() const { return HasExtraFiles
; }
104 void setHasExtraFiles(bool Has
) { HasExtraFiles
= Has
; }
106 std::vector
<Entry
>::const_iterator
begin() const { return Entries
.begin(); }
107 std::vector
<Entry
>::const_iterator
end() const { return Entries
.end(); }
110 DebugChecksumsSubsection
&Checksums
;
111 bool HasExtraFiles
= false;
112 uint32_t ExtraFileCount
= 0;
113 std::vector
<Entry
> Entries
;
116 } // end namespace codeview
118 } // end namespace llvm
120 #endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGINLINEELINESSUBSECTION_H