123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- #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.
- std::optional<uint64_t> Signature;
- // 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|