aboutsummaryrefslogtreecommitdiff
path: root/llvm/include/llvm/DWP/DWP.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include/llvm/DWP/DWP.h')
-rw-r--r--llvm/include/llvm/DWP/DWP.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/llvm/include/llvm/DWP/DWP.h b/llvm/include/llvm/DWP/DWP.h
new file mode 100644
index 000000000000..666b7add6019
--- /dev/null
+++ b/llvm/include/llvm/DWP/DWP.h
@@ -0,0 +1,97 @@
+#ifndef LLVM_DWP_DWP_H
+#define LLVM_DWP_DWP_H
+
+#include "DWPStringPool.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/MapVector.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/DebugInfo/DWARF/DWARFContext.h"
+#include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
+#include "llvm/MC/MCSection.h"
+#include "llvm/MC/MCStreamer.h"
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Support/Error.h"
+#include <deque>
+#include <vector>
+
+namespace llvm {
+struct UnitIndexEntry {
+ DWARFUnitIndex::Entry::SectionContribution Contributions[8];
+ std::string Name;
+ std::string DWOName;
+ StringRef DWPName;
+};
+
+// Holds data for Skeleton, Split Compilation, and Type Unit Headers (only in
+// v5) as defined in Dwarf 5 specification, 7.5.1.2, 7.5.1.3 and Dwarf 4
+// specification 7.5.1.1.
+struct InfoSectionUnitHeader {
+ // unit_length field. Note that the type is uint64_t even in 32-bit dwarf.
+ uint64_t Length = 0;
+
+ // version field.
+ uint16_t Version = 0;
+
+ // unit_type field. Initialized only if Version >= 5.
+ uint8_t UnitType = 0;
+
+ // address_size field.
+ uint8_t AddrSize = 0;
+
+ // debug_abbrev_offset field. Note that the type is uint64_t even in 32-bit
+ // dwarf. It is assumed to be 0.
+ uint64_t DebugAbbrevOffset = 0;
+
+ // dwo_id field. This resides in the header only if Version >= 5.
+ // In earlier versions, it is read from DW_AT_GNU_dwo_id.
+ Optional<uint64_t> Signature = None;
+
+ // Derived from the length of Length field.
+ dwarf::DwarfFormat Format = dwarf::DwarfFormat::DWARF32;
+
+ // The size of the Header in bytes. This is derived while parsing the header,
+ // and is stored as a convenience.
+ uint8_t HeaderSize = 0;
+};
+
+struct CompileUnitIdentifiers {
+ uint64_t Signature = 0;
+ const char *Name = "";
+ const char *DWOName = "";
+};
+
+Error write(MCStreamer &Out, ArrayRef<std::string> Inputs);
+
+unsigned getContributionIndex(DWARFSectionKind Kind, uint32_t IndexVersion);
+
+Error handleSection(
+ const StringMap<std::pair<MCSection *, DWARFSectionKind>> &KnownSections,
+ const MCSection *StrSection, const MCSection *StrOffsetSection,
+ const MCSection *TypesSection, const MCSection *CUIndexSection,
+ const MCSection *TUIndexSection, const MCSection *InfoSection,
+ const object::SectionRef &Section, MCStreamer &Out,
+ std::deque<SmallString<32>> &UncompressedSections,
+ uint32_t (&ContributionOffsets)[8], UnitIndexEntry &CurEntry,
+ StringRef &CurStrSection, StringRef &CurStrOffsetSection,
+ std::vector<StringRef> &CurTypesSection,
+ std::vector<StringRef> &CurInfoSection, StringRef &AbbrevSection,
+ StringRef &CurCUIndexSection, StringRef &CurTUIndexSection,
+ std::vector<std::pair<DWARFSectionKind, uint32_t>> &SectionLength);
+
+Expected<InfoSectionUnitHeader> parseInfoSectionUnitHeader(StringRef Info);
+
+void writeStringsAndOffsets(MCStreamer &Out, DWPStringPool &Strings,
+ MCSection *StrOffsetSection,
+ StringRef CurStrSection,
+ StringRef CurStrOffsetSection, uint16_t Version);
+
+Error buildDuplicateError(const std::pair<uint64_t, UnitIndexEntry> &PrevE,
+ const CompileUnitIdentifiers &ID, StringRef DWPName);
+
+void writeIndex(MCStreamer &Out, MCSection *Section,
+ ArrayRef<unsigned> ContributionOffsets,
+ const MapVector<uint64_t, UnitIndexEntry> &IndexEntries,
+ uint32_t IndexVersion);
+
+} // namespace llvm
+#endif // LLVM_DWP_DWP_H