1#ifndef LLVM_DWP_DWP_H
2#define LLVM_DWP_DWP_H
3
4#include "DWPStringPool.h"
5#include "llvm/ADT/ArrayRef.h"
6#include "llvm/ADT/MapVector.h"
7#include "llvm/ADT/StringRef.h"
8#include "llvm/DebugInfo/DWARF/DWARFContext.h"
9#include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
10#include "llvm/MC/MCSection.h"
11#include "llvm/MC/MCStreamer.h"
12#include "llvm/Object/ObjectFile.h"
13#include "llvm/Support/Error.h"
14#include <deque>
15#include <vector>
16
17namespace llvm {
18enum OnCuIndexOverflow {
19 HardStop,
20 SoftStop,
21 Continue,
22};
23
24struct UnitIndexEntry {
25 DWARFUnitIndex::Entry::SectionContribution Contributions[8];
26 std::string Name;
27 std::string DWOName;
28 StringRef DWPName;
29};
30
31// Holds data for Skeleton, Split Compilation, and Type Unit Headers (only in
32// v5) as defined in Dwarf 5 specification, 7.5.1.2, 7.5.1.3 and Dwarf 4
33// specification 7.5.1.1.
34struct InfoSectionUnitHeader {
35 // unit_length field. Note that the type is uint64_t even in 32-bit dwarf.
36 uint64_t Length = 0;
37
38 // version field.
39 uint16_t Version = 0;
40
41 // unit_type field. Initialized only if Version >= 5.
42 uint8_t UnitType = 0;
43
44 // address_size field.
45 uint8_t AddrSize = 0;
46
47 // debug_abbrev_offset field. Note that the type is uint64_t even in 32-bit
48 // dwarf. It is assumed to be 0.
49 uint64_t DebugAbbrevOffset = 0;
50
51 // dwo_id field. This resides in the header only if Version >= 5.
52 // In earlier versions, it is read from DW_AT_GNU_dwo_id.
53 std::optional<uint64_t> Signature;
54
55 // Derived from the length of Length field.
56 dwarf::DwarfFormat Format = dwarf::DwarfFormat::DWARF32;
57
58 // The size of the Header in bytes. This is derived while parsing the header,
59 // and is stored as a convenience.
60 uint8_t HeaderSize = 0;
61};
62
63struct CompileUnitIdentifiers {
64 uint64_t Signature = 0;
65 const char *Name = "";
66 const char *DWOName = "";
67};
68
69Error write(MCStreamer &Out, ArrayRef<std::string> Inputs,
70 OnCuIndexOverflow OverflowOptValue);
71
72unsigned getContributionIndex(DWARFSectionKind Kind, uint32_t IndexVersion);
73
74Error handleSection(
75 const StringMap<std::pair<MCSection *, DWARFSectionKind>> &KnownSections,
76 const MCSection *StrSection, const MCSection *StrOffsetSection,
77 const MCSection *TypesSection, const MCSection *CUIndexSection,
78 const MCSection *TUIndexSection, const MCSection *InfoSection,
79 const object::SectionRef &Section, MCStreamer &Out,
80 std::deque<SmallString<32>> &UncompressedSections,
81 uint32_t (&ContributionOffsets)[8], UnitIndexEntry &CurEntry,
82 StringRef &CurStrSection, StringRef &CurStrOffsetSection,
83 std::vector<StringRef> &CurTypesSection,
84 std::vector<StringRef> &CurInfoSection, StringRef &AbbrevSection,
85 StringRef &CurCUIndexSection, StringRef &CurTUIndexSection,
86 std::vector<std::pair<DWARFSectionKind, uint32_t>> &SectionLength);
87
88Expected<InfoSectionUnitHeader> parseInfoSectionUnitHeader(StringRef Info);
89
90void writeStringsAndOffsets(MCStreamer &Out, DWPStringPool &Strings,
91 MCSection *StrOffsetSection,
92 StringRef CurStrSection,
93 StringRef CurStrOffsetSection, uint16_t Version);
94
95Error buildDuplicateError(const std::pair<uint64_t, UnitIndexEntry> &PrevE,
96 const CompileUnitIdentifiers &ID, StringRef DWPName);
97
98void writeIndex(MCStreamer &Out, MCSection *Section,
99 ArrayRef<unsigned> ContributionOffsets,
100 const MapVector<uint64_t, UnitIndexEntry> &IndexEntries,
101 uint32_t IndexVersion);
102
103} // namespace llvm
104#endif // LLVM_DWP_DWP_H
105

source code of llvm/include/llvm/DWP/DWP.h