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 Error
initialize(BinaryStreamRef Section
) {
74 return initialize(BinaryStreamReader(Section
));
77 bool valid() const { return Lines
.valid(); }
78 bool hasExtraFiles() const;
80 Iterator
begin() const { return Lines
.begin(); }
81 Iterator
end() const { return Lines
.end(); }
84 InlineeLinesSignature Signature
;
88 class DebugInlineeLinesSubsection final
: public DebugSubsection
{
91 std::vector
<support::ulittle32_t
> ExtraFiles
;
92 InlineeSourceLineHeader Header
;
95 DebugInlineeLinesSubsection(DebugChecksumsSubsection
&Checksums
,
96 bool HasExtraFiles
= false);
98 static bool classof(const DebugSubsection
*S
) {
99 return S
->kind() == DebugSubsectionKind::InlineeLines
;
102 Error
commit(BinaryStreamWriter
&Writer
) const override
;
103 uint32_t calculateSerializedSize() const override
;
105 void addInlineSite(TypeIndex FuncId
, StringRef FileName
, uint32_t SourceLine
);
106 void addExtraFile(StringRef FileName
);
108 bool hasExtraFiles() const { return HasExtraFiles
; }
109 void setHasExtraFiles(bool Has
) { HasExtraFiles
= Has
; }
111 std::vector
<Entry
>::const_iterator
begin() const { return Entries
.begin(); }
112 std::vector
<Entry
>::const_iterator
end() const { return Entries
.end(); }
115 DebugChecksumsSubsection
&Checksums
;
116 bool HasExtraFiles
= false;
117 uint32_t ExtraFileCount
= 0;
118 std::vector
<Entry
> Entries
;
121 } // end namespace codeview
123 } // end namespace llvm
125 #endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGINLINEELINESSUBSECTION_H