diff options
Diffstat (limited to 'llvm/include/llvm/DWP/DWP.h')
-rw-r--r-- | llvm/include/llvm/DWP/DWP.h | 97 |
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 |